Complete sign-in with the code from the sign-in email, or with the link_token the email’s link
carries. Returns the shopper, the customer record and a session. A link needs no email.
A code is valid for 15 minutes, is accepted 5 times and works once; a link_token is single-use and
shares its code’s expiry and attempts. A wrong, expired, used or unknown code answers
400 invalid_code with no reason, and an address without an account answers the same way. This
endpoint never creates an account.
Secret key required. This endpoint requires a secret key (tybrite_sk_*). Publishable keys
answer 403 forbidden. Account calls are made from a server, which then holds the shopper’s session.
Attempt limits: with a secret key, past 10 attempts for one email address from one store in
15 minutes, the call is slowed to one attempt every 30 seconds; other calls for that address
answer 429 rate_limited with a Retry-After header giving the seconds until the next attempt is
accepted. With a publishable key, attempts are limited per calling address: 20 per address and email,
and 60 per address, in 15 minutes. Across every store and address, past 20 attempts for one
email the call is slowed to one every 30 seconds. Every attempt counts, successful or not,
and an address with no account is treated identically.
{
"error": {
"code": "passwordless_disabled",
"message": "This store does not offer sign-in by emailed code."
}
}
{
"error": {
"code": "rate_limited",
"message": "Too many requests for this API key. Please slow down and try again shortly.",
"remaining": 0,
"reset": 1706198400
}
}
{
"error": {
"code": "passwordless_disabled",
"message": "This store does not offer sign-in by emailed code."
}
}
{
"error": {
"code": "rate_limited",
"message": "Too many requests for this API key. Please slow down and try again shortly.",
"remaining": 0,
"reset": 1706198400
}
}
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"Galactic Core API Documentation","colors":{"primary":"#3b82f6","light":"#60a5fa","dark":"#3b82f6"},"logo":{"light":"https://mintcdn.com/tybritelabs/9cNSmgnBxs-QU_UC/branding/gc-long-blue.png?fit=max\u0026auto=format\u0026n=9cNSmgnBxs-QU_UC\u0026q=85\u0026s=88d64ea989973d874ed73437459487f7","dark":"https://mintcdn.com/tybritelabs/9cNSmgnBxs-QU_UC/branding/gc-long-white.png?fit=max\u0026auto=format\u0026n=9cNSmgnBxs-QU_UC\u0026q=85\u0026s=051cafe35073e2d41a7bfb963b3ad22b"},"favicon":"https://mintcdn.com/tybritelabs/9cNSmgnBxs-QU_UC/favicon.svg?fit=max\u0026auto=format\u0026n=9cNSmgnBxs-QU_UC\u0026q=85\u0026s=83f32264cd55e429e1a14f9d0ee78689","navbar":{"links":[{"href":"https://gc.tybritelabs.com/dashboard","label":"Dashboard"}],"primary":{"type":"button","label":"Get Started","href":"/quickstart"}},"footer":{"socials":{"github":"https://github.com/tybrite","twitter":"https://twitter.com/tybrite","linkedin":"https://linkedin.com/company/tybrite"}},"contextual":{"options":["copy","view","chatgpt","claude","cursor"],"display":"header"},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Dashboard","icon":"gauge","href":"https://gc.tybritelabs.com/dashboard"},{"anchor":"GitHub","icon":"github","href":"https://github.com/tybrite"},{"anchor":"Support","icon":"envelope","href":"mailto:support@tybrite.com"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"tybritelabs","hasAudioNarration":false,"actualSubdomain":"tybritelabs","customDomains":["docs.tybritelabs.com"],"gitSource":{"type":"github","owner":"tybrite","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ad0fd97d63b31e6ddb49a7c","collectionId":"0b2cb80c-c342-4abb-a26c-884012e5280a","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad0fd97d63b31e6ddb49a7c"},"entitlements":{},"buildId":"6adf091ed7cf896c8ad79534","clientVersion":"0.0.3966","searchFilterCounts":[{"language":"default","tag":"API Reference","count":208},{"language":"default","tag":"TypeScript SDK","count":36},{"language":"default","tag":"Getting Started","count":35},{"language":"default","tag":"Agent","count":29},{"language":"default","tag":"Sandbox","count":13},{"language":"default","tag":"Marketplace","count":12},{"language":"default","tag":"Authentication","count":12},{"language":"default","tag":"B2B","count":12},{"language":"default","tag":"Discovery","count":11},{"language":"default","tag":"Cart \u0026 Wishlist","count":11}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/authentication/verify-a-sign-in-code","slug":"/api-reference/authentication/verify-a-sign-in-code","pageMetadata":{"title":"Verify a sign-in code","description":"Complete sign-in with the code from the sign-in email, or with the `link_token` the email's link\ncarries. Returns the shopper, the customer record and a session. A link needs no `email`.\n\nA code is valid for 15 minutes, is accepted 5 times and works once; a `link_token` is single-use and\nshares its code's expiry and attempts. A wrong, expired, used or unknown code answers\n`400 invalid_code` with no reason, and an address without an account answers the same way. This\nendpoint never creates an account.\n\n**Secret key required.** This endpoint requires a secret key (`tybrite_sk_*`). Publishable keys\nanswer `403 forbidden`. Account calls are made from a server, which then holds the shopper's session.\n\n**Attempt limits:** with a secret key, past 10 attempts for one email address from one store in\n15 minutes, the call is slowed to one attempt every 30 seconds; other calls for that address\nanswer `429 rate_limited` with a `Retry-After` header giving the seconds until the next attempt is\naccepted. With a publishable key, attempts are limited per calling address: 20 per address and email,\nand 60 per address, in 15 minutes. Across every store and address, past 20 attempts for one\nemail the call is slowed to one every 30 seconds. Every attempt counts, successful or not,\nand an address with no account is treated identically.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/auth/verify-otp","href":"/api-reference/authentication/verify-a-sign-in-code","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Complete sign-in with the code from the sign-in email, or with the \", _jsx(_components.code, {\n children: \"link_token\"\n }), \" the email’s link\\ncarries. Returns the shopper, the customer record and a session. A link needs no \", _jsx(_components.code, {\n children: \"email\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A code is valid for 15 minutes, is accepted 5 times and works once; a \", _jsx(_components.code, {\n children: \"link_token\"\n }), \" is single-use and\\nshares its code’s expiry and attempts. A wrong, expired, used or unknown code answers\\n\", _jsx(_components.code, {\n children: \"400 invalid_code\"\n }), \" with no reason, and an address without an account answers the same way. This\\nendpoint never creates an account.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Secret key required.\"\n }), \" This endpoint requires a secret key (\", _jsx(_components.code, {\n children: \"tybrite_sk_*\"\n }), \"). Publishable keys\\nanswer \", _jsx(_components.code, {\n children: \"403 forbidden\"\n }), \". Account calls are made from a server, which then holds the shopper’s session.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Attempt limits:\"\n }), \" with a secret key, past 10 attempts for one email address from one store in\\n15 minutes, the call is slowed to one attempt every 30 seconds; other calls for that address\\nanswer \", _jsx(_components.code, {\n children: \"429 rate_limited\"\n }), \" with a \", _jsx(_components.code, {\n children: \"Retry-After\"\n }), \" header giving the seconds until the next attempt is\\naccepted. With a publishable key, attempts are limited per calling address: 20 per address and email,\\nand 60 per address, in 15 minutes. Across every store and address, past 20 attempts for one\\nemail the call is slowed to one every 30 seconds. Every attempt counts, successful or not,\\nand an address with no account is treated identically.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Verify a sign-in code","description":"Complete sign-in with the code from the sign-in email, or with the `link_token` the email's link\ncarries. Returns the shopper, the customer record and a session. A link needs no `email`.\n\nA code is valid for 15 minutes, is accepted 5 times and works once; a `link_token` is single-use and\nshares its code's expiry and attempts. A wrong, expired, used or unknown code answers\n`400 invalid_code` with no reason, and an address without an account answers the same way. This\nendpoint never creates an account.\n\n**Secret key required.** This endpoint requires a secret key (`tybrite_sk_*`). Publishable keys\nanswer `403 forbidden`. Account calls are made from a server, which then holds the shopper's session.\n\n**Attempt limits:** with a secret key, past 10 attempts for one email address from one store in\n15 minutes, the call is slowed to one attempt every 30 seconds; other calls for that address\nanswer `429 rate_limited` with a `Retry-After` header giving the seconds until the next attempt is\naccepted. With a publishable key, attempts are limited per calling address: 20 per address and email,\nand 60 per address, in 15 minutes. Across every store and address, past 20 attempts for one\nemail the call is slowed to one every 30 seconds. Every attempt counts, successful or not,\nand an address with no account is treated identically.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/auth/verify-otp","href":"/api-reference/authentication/verify-a-sign-in-code","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/tybritelabs/af1ac4e439492905/sync.js"],"openApiReferenceData":{"operation":{"operationId":"verifyOtp","tags":["Authentication"],"summary":"Verify a sign-in code","description":"Complete sign-in with the code from the sign-in email, or with the `link_token` the email's link\ncarries. Returns the shopper, the customer record and a session. A link needs no `email`.\n\nA code is valid for 15 minutes, is accepted 5 times and works once; a `link_token` is single-use and\nshares its code's expiry and attempts. A wrong, expired, used or unknown code answers\n`400 invalid_code` with no reason, and an address without an account answers the same way. This\nendpoint never creates an account.\n\n**Secret key required.** This endpoint requires a secret key (`tybrite_sk_*`). Publishable keys\nanswer `403 forbidden`. Account calls are made from a server, which then holds the shopper's session.\n\n**Attempt limits:** with a secret key, past 10 attempts for one email address from one store in\n15 minutes, the call is slowed to one attempt every 30 seconds; other calls for that address\nanswer `429 rate_limited` with a `Retry-After` header giving the seconds until the next attempt is\naccepted. With a publishable key, attempts are limited per calling address: 20 per address and email,\nand 60 per address, in 15 minutes. Across every store and address, past 20 attempts for one\nemail the call is slowed to one every 30 seconds. Every attempt counts, successful or not,\nand an address with no account is treated identically.\n","security":["f6ab5e18-0772-47a4-8044-b78785dd760c"],"requestBody":"ac967a31-cbe0-461b-acae-f65448246046","responses":{"200":"8e717eef-52b6-4303-ad58-c817b7376284","400":"c1efa08b-862f-4b37-b92c-a7f61b0dbc28","401":"8e3b93f9-ca64-49cc-bcf8-3f80af5113b0","403":"7b13ab92-6e26-4f0f-9f39-fd18fe81ce3d","429":"a5993012-5bf4-4aae-8193-1dcdd016b743","500":"c1ebb356-5561-435c-9ad9-5716b124ba44"},"method":"post","type":"path","servers":["62901a8b-054a-46ad-9e18-4cc277f3085e"],"path":"/v1/auth/verify-otp","baseUrlOptions":["https://api.tybritelabs.com"],"title":"Verify a sign-in code","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Send `email` with `code`, or `link_token` alone.","properties":{"email":{"type":"string","format":"email","description":"Customer email address. Required with `code`.","example":"john.doe@example.com","uniqueKey":"email","typeLabel":"string\u003cemail>"},"code":{"type":"string","pattern":"^[0-9]{6}$","description":"The six-digit code from the sign-in email.","example":"123456","uniqueKey":"code","typeLabel":"string"},"link_token":{"type":"string","description":"The `link_token` query parameter of the sign-in link. Replaces `email` and `code`.","uniqueKey":"link_token","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"example":{"email":"john.doe@example.com","code":"123456"},"examples":{"Example":{"title":"Example","value":{"email":"john.doe@example.com","code":"123456"}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"8e717eef-52b6-4303-ad58-c817b7376284":{"description":"Signed in","headers":{"Tybrite-Environment":{"description":"Confirms which environment your API key resolved to. Use this to verify that test keys\nare hitting sandbox data and live keys are hitting production data.\n\n- `production` — requests are scoped to live data; real orders, customers, and payments\n- `sandbox` — requests are scoped to isolated test data; no real money is moved\n\nPresent on every authenticated response, including error responses.\n","schema":{"type":"string","enum":["production","sandbox"]},"example":"sandbox"}},"content":{"application/json":{"schema":{"type":"object","description":"A successful sign-in, sign-up verification or password reset.","required":["message","user","customer","session"],"properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"user":{"type":"object","description":"The shopper's sign-in identity.","properties":{"id":{"type":"string","format":"uuid","description":"The shopper identity. It is the `sub` of the store's sign-in token.","isRequired":true,"uniqueKey":"user.id","typeLabel":"string\u003cuuid>"},"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"user.email","typeLabel":"string\u003cemail>"},"email_confirmed":{"type":"boolean","description":"Whether the shopper has proven control of the address with a one-time code or link.","isRequired":true,"uniqueKey":"user.email_confirmed","typeLabel":"boolean"},"email_verified":{"type":"boolean","description":"Same value as `email_confirmed`. A marketplace links purchases made as a guest with this address to the account only when this is true.","isRequired":true,"uniqueKey":"user.email_verified","typeLabel":"boolean"},"has_password":{"type":"boolean","description":"Whether the account has a password. An account created without one signs in by emailed code and can set a password with `POST /v1/auth/password/change`.","isRequired":true,"uniqueKey":"user.has_password","typeLabel":"boolean"}},"required":["id","email","email_confirmed","email_verified","has_password"],"isRequired":true,"uniqueKey":"user","typeLabel":"object"},"customer":{"oneOf":[{"type":"object","description":"The shopper's customer record at this store. `null` when the key belongs to a marketplace, where a shopper holds an account without a per-store record.","properties":{"id":{"type":"string","format":"uuid","uniqueKey":"customer.oneOf.0.id","typeLabel":"string\u003cuuid>"},"name":{"type":"string","uniqueKey":"customer.oneOf.0.name","typeLabel":"string"},"email":{"type":"string","format":"email","uniqueKey":"customer.oneOf.0.email","typeLabel":"string\u003cemail>"},"phone":{"type":"string","uniqueKey":"customer.oneOf.0.phone","typeLabel":"string"},"address":{"oneOf":[{"type":"string","description":"The customer's address, or null if not on file.","uniqueKey":"customer.oneOf.0.address.oneOf.0","typeLabel":"string"},{"type":"null","description":"The customer's address, or null if not on file.","uniqueKey":"customer.oneOf.0.address.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.oneOf.0.address","typeLabel":"string | null"},"status":{"type":"string","enum":["active","inactive"],"uniqueKey":"customer.oneOf.0.status","typeLabel":"enum\u003cstring>"},"custom_fields":{"type":"array","description":"The merchant's own fields on this record, with their values. Only fields the merchant published\nappear here. The merchant controls the names and how many exist, so render the array rather than\nreading fixed keys.\n","items":{"type":"object","description":"One merchant-defined field and its value on a record. Definitions are authored by the merchant (or by\ntheir platform operator), so the set varies per store and per entity.\n","properties":{"field_name":{"type":"string","description":"The machine name. Stable across edits to the label, so this is the one to key off in code.","example":"buyer_po","uniqueKey":"customer.oneOf.0.custom_fields.items.[INDEX].field_name","typeLabel":"string"},"field_label":{"type":"string","description":"What the merchant calls this field. The string to display.","example":"Buyer PO number","uniqueKey":"customer.oneOf.0.custom_fields.items.[INDEX].field_label","typeLabel":"string"},"field_type":{"type":"string","enum":["text","textarea","number","boolean","select","multiselect","date","json","dimensions","weight"],"description":"The shape of `value`: `multiselect` is an array of strings; `json`, `dimensions` and `weight` are\nobjects; the rest are scalars, and a `number` arrives as a number rather than as text.\n","example":"text","uniqueKey":"customer.oneOf.0.custom_fields.items.[INDEX].field_type","typeLabel":"enum\u003cstring>"},"unit_type":{"oneOf":[{"type":"string","description":"The unit a numeric or measurement field is expressed in, when the merchant set one.","example":null,"uniqueKey":"customer.oneOf.0.custom_fields.items.[INDEX].unit_type.oneOf.0","typeLabel":"string"},{"type":"null","description":"The unit a numeric or measurement field is expressed in, when the merchant set one.","example":null,"uniqueKey":"customer.oneOf.0.custom_fields.items.[INDEX].unit_type.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.oneOf.0.custom_fields.items.[INDEX].unit_type","typeLabel":"string | null"},"value":{"description":"The stored value, in the shape implied by `field_type`. Null when the field is defined but has no\nvalue on this record — which is distinct from the field not existing.\n","example":"PO-2026-0819","uniqueKey":"customer.oneOf.0.custom_fields.items.[INDEX].value","typeLabel":"any"}},"uniqueKey":"customer.oneOf.0.custom_fields.items.[INDEX]","typeLabel":"object"},"uniqueKey":"customer.oneOf.0.custom_fields","typeLabel":"object[]"},"tier":{"type":"string","description":"The customer's loyalty/spend tier, derived from their purchase history. New\ncustomers start at `bronze`.\n","enum":["bronze","silver","gold","platinum"],"example":"bronze","uniqueKey":"customer.oneOf.0.tier","typeLabel":"enum\u003cstring>"},"join_date":{"type":"string","format":"date","uniqueKey":"customer.oneOf.0.join_date","typeLabel":"string\u003cdate>"},"external_id":{"oneOf":[{"type":"string","description":"Optional identifier from an external identity provider (Auth0, Clerk, Cognito,\nFirebase, NextAuth, etc). Unique per store + environment. Set this when you\nmanage authentication outside Galactic Core and need a stable handle to map\nyour upstream user back to the Galactic Core customer record.\n","example":"auth0|66a3f8c2b1d9c204a1f7e3d1","uniqueKey":"customer.oneOf.0.external_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional identifier from an external identity provider (Auth0, Clerk, Cognito,\nFirebase, NextAuth, etc). Unique per store + environment. Set this when you\nmanage authentication outside Galactic Core and need a stable handle to map\nyour upstream user back to the Galactic Core customer record.\n","example":"auth0|66a3f8c2b1d9c204a1f7e3d1","uniqueKey":"customer.oneOf.0.external_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.oneOf.0.external_id","typeLabel":"string | null"},"marketing_consent":{"type":"boolean","description":"Whether the customer has opted in to marketing email. Defaults to false (opt-in).\nSet this from your storefront's email opt-in checkbox at sign-up, checkout, or in\nthe customer's account preferences. When true, the customer is eligible to be\nsubscribed to email in the store's connected marketing tools. It does not cover\nSMS; see `sms_consent`.\n","default":false,"example":true,"uniqueKey":"customer.oneOf.0.marketing_consent","typeLabel":"boolean"},"sms_consent":{"type":"boolean","description":"Whether the customer has opted in to marketing text messages. A separate opt-in\nfrom `marketing_consent`, and only settable for a customer with a phone number.\nDefaults to false.\n","default":false,"example":false,"uniqueKey":"customer.oneOf.0.sms_consent","typeLabel":"boolean"},"total_purchases":{"type":"integer","uniqueKey":"customer.oneOf.0.total_purchases","typeLabel":"integer"},"last_purchase":{"oneOf":[{"type":"string","format":"date-time","description":"Timestamp of the customer's most recent purchase, or null if they have not purchased yet.","uniqueKey":"customer.oneOf.0.last_purchase.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Timestamp of the customer's most recent purchase, or null if they have not purchased yet.","uniqueKey":"customer.oneOf.0.last_purchase.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.oneOf.0.last_purchase","typeLabel":"string\u003cdate-time> | null"},"store_credit_balance":{"type":"number","description":"The customer's total redeemable store-credit balance. Store credit is\nissued when a customer accepts a store-credit offer on a return, and can\nbe applied at checkout (see `apply_store_credit` on `POST /v1/orders`).\n","example":25,"uniqueKey":"customer.oneOf.0.store_credit_balance","typeLabel":"number"},"created_at":{"type":"string","format":"date-time","uniqueKey":"customer.oneOf.0.created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","uniqueKey":"customer.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"store_metrics":{"oneOf":[{"type":"object","description":"Aggregated purchase metrics for the customer, or null until they have purchase history.","properties":{"total_purchases":{"type":"integer","uniqueKey":"customer.oneOf.0.store_metrics.oneOf.0.total_purchases","typeLabel":"integer"},"total_spent":{"type":"number","uniqueKey":"customer.oneOf.0.store_metrics.oneOf.0.total_spent","typeLabel":"number"},"first_purchase_date":{"type":"string","uniqueKey":"customer.oneOf.0.store_metrics.oneOf.0.first_purchase_date","typeLabel":"string"},"last_purchase_date":{"type":"string","uniqueKey":"customer.oneOf.0.store_metrics.oneOf.0.last_purchase_date","typeLabel":"string"},"status":{"type":"string","uniqueKey":"customer.oneOf.0.store_metrics.oneOf.0.status","typeLabel":"string"},"preferred_store":{"type":"string","uniqueKey":"customer.oneOf.0.store_metrics.oneOf.0.preferred_store","typeLabel":"string"}},"uniqueKey":"customer.oneOf.0.store_metrics.oneOf.0","typeLabel":"object"},{"type":"null","description":"Aggregated purchase metrics for the customer, or null until they have purchase history.","properties":{"total_purchases":{"type":"integer"},"total_spent":{"type":"number"},"first_purchase_date":{"type":"string"},"last_purchase_date":{"type":"string"},"status":{"type":"string"},"preferred_store":{"type":"string"}},"uniqueKey":"customer.oneOf.0.store_metrics.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.oneOf.0.store_metrics","typeLabel":"object | null"},"environment":{"type":"string","enum":["production","sandbox"],"description":"Whether this customer record belongs to the live or test environment.","example":"production","uniqueKey":"customer.oneOf.0.environment","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"customer.oneOf.0","typeLabel":"object"},{"type":"null","description":"The shopper's customer record at this store. `null` when the key belongs to a marketplace, where a shopper holds an account without a per-store record.","isRequired":true,"uniqueKey":"customer.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"customer","typeLabel":"object | null"},"session":{"type":"object","description":"A shopper's session with the store: a short-lived sign-in token and a refresh token. Store both values and replace them on every refresh.","required":["access_token","refresh_token","expires_in","expires_at","token_type"],"properties":{"access_token":{"type":"string","description":"The store's sign-in token. Sent as the `x-auth-token` header on customer-self endpoints. It is accepted only by the store (and environment) that issued it.","isRequired":true,"uniqueKey":"session.access_token","typeLabel":"string"},"refresh_token":{"type":"string","description":"Opaque token that begins with `gcsr_`. It is valid for 30 days from its last use and for one use: `POST /v1/auth/refresh` returns a replacement, and presenting an earlier one again ends the whole session.","isRequired":true,"uniqueKey":"session.refresh_token","typeLabel":"string"},"expires_in":{"type":"integer","description":"Lifetime of `access_token` in seconds (900).","example":900,"isRequired":true,"uniqueKey":"session.expires_in","typeLabel":"integer"},"expires_at":{"type":"integer","description":"Unix time at which `access_token` stops being accepted.","isRequired":true,"uniqueKey":"session.expires_at","typeLabel":"integer"},"token_type":{"type":"string","enum":["shopper"],"description":"Always `shopper`.","isRequired":true,"uniqueKey":"session.token_type","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"session","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"message":"Signed in","user":{"id":"633e7cb6-00c6-4aac-b03c-c3d70d64e25c","email":"john.doe@example.com","email_confirmed":true,"email_verified":true,"has_password":true},"customer":{"id":"de11e44b-78e5-4940-ad54-cac237d5d30d","name":"John Doe","email":"john.doe@example.com","phone":"+12125550142","tier":"bronze","total_purchases":0,"created_at":"2026-06-20T13:47:38.831799+00:00"},"session":{"access_token":"eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2MzNlN2NiNiJ9.\u003credacted-signature>","refresh_token":"gcsr_Zm9vYmFyYmF6cXV4MTIzNDU2Nzg5MGFiY2RlZmdoaWo","expires_in":900,"expires_at":1781967759,"token_type":"shopper"}},"examples":{"Example":{"title":"Example","value":{"message":"Signed in","user":{"id":"633e7cb6-00c6-4aac-b03c-c3d70d64e25c","email":"john.doe@example.com","email_confirmed":true,"email_verified":true,"has_password":true},"customer":{"id":"de11e44b-78e5-4940-ad54-cac237d5d30d","name":"John Doe","email":"john.doe@example.com","phone":"+12125550142","tier":"bronze","total_purchases":0,"created_at":"2026-06-20T13:47:38.831799+00:00"},"session":{"access_token":"eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2MzNlN2NiNiJ9.\u003credacted-signature>","refresh_token":"gcsr_Zm9vYmFyYmF6cXV4MTIzNDU2Nzg5MGFiY2RlZmdoaWo","expires_in":900,"expires_at":1781967759,"token_type":"shopper"}}}},"exampleType":"examples"}},"exampleType":"examples"},"c1efa08b-862f-4b37-b92c-a7f61b0dbc28":{"description":"`invalid_code` when the code or link is not accepted; `invalid_request` when the body lacks `email` and `code`, or `link_token`.","headers":{"Tybrite-Environment":{"description":"Confirms which environment your API key resolved to. Use this to verify that test keys\nare hitting sandbox data and live keys are hitting production data.\n\n- `production` — requests are scoped to live data; real orders, customers, and payments\n- `sandbox` — requests are scoped to isolated test data; no real money is moved\n\nPresent on every authenticated response, including error responses.\n","schema":{"type":"string","enum":["production","sandbox"]},"example":"sandbox"}},"content":{"application/json":{"schema":{"oneOf":[{"type":"object","description":"The code or link was not accepted. On `POST /v1/auth/register/verify`, `details.reason` states why. The other endpoints that take a code never add a reason, because an address without an account receives no code and a reason would show which addresses have accounts.","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_code"],"isRequired":true,"uniqueKey":"oneOf.0.error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.error.message","typeLabel":"string"},"details":{"type":"object","required":["reason"],"properties":{"reason":{"type":"string","enum":["expired","too_many_attempts","wrong"],"description":"`expired` is a code past its 15 minutes, `too_many_attempts` is a code that has been tried 5 times, and `wrong` is any other mismatch.","isRequired":true,"uniqueKey":"oneOf.0.error.details.reason","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.0.error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.0.error","typeLabel":"object"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_request","isRequired":true,"uniqueKey":"oneOf.1.error.code","typeLabel":"string"},"message":{"type":"string","example":"Missing required field","isRequired":true,"uniqueKey":"oneOf.1.error.message","typeLabel":"string"},"details":{"type":"string","example":"The 'email' field is required","uniqueKey":"oneOf.1.error.details","typeLabel":"string"},"hint":{"type":"string","description":"Additional guidance on how to resolve the error.","uniqueKey":"oneOf.1.error.hint","typeLabel":"string"},"available_stock":{"type":"integer","description":"Current stock level (present on insufficient_stock errors).","uniqueKey":"oneOf.1.error.available_stock","typeLabel":"integer"},"current_cart_quantity":{"type":"integer","description":"Quantity already in cart (present on insufficient_stock errors).","uniqueKey":"oneOf.1.error.current_cart_quantity","typeLabel":"integer"},"limit":{"type":"integer","description":"Rate limit ceiling (present on rate_limited / quota_exceeded errors).","uniqueKey":"oneOf.1.error.limit","typeLabel":"integer"},"remaining":{"type":"integer","description":"Requests remaining in the current window (present on rate_limited / quota_exceeded errors).","uniqueKey":"oneOf.1.error.remaining","typeLabel":"integer"},"reset":{"type":"integer","description":"Unix timestamp when the rate limit / quota window resets (present on rate_limited / quota_exceeded errors).","uniqueKey":"oneOf.1.error.reset","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"oneOf.1.error","typeLabel":"object"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"invalid_code","message":"That code is not valid. Check it, or ask for a new one."}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_code","message":"That code is not valid. Check it, or ask for a new one."}}}},"exampleType":"examples"}},"exampleType":"examples"},"8e3b93f9-ca64-49cc-bcf8-3f80af5113b0":{"description":"Authentication failed - invalid or missing API key","headers":{"Tybrite-Environment":{"description":"Confirms which environment your API key resolved to. Use this to verify that test keys\nare hitting sandbox data and live keys are hitting production data.\n\n- `production` — requests are scoped to live data; real orders, customers, and payments\n- `sandbox` — requests are scoped to isolated test data; no real money is moved\n\nPresent on every authenticated response, including error responses.\n","schema":{"type":"string","enum":["production","sandbox"]},"example":"sandbox"}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_request","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Missing required field","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"string","example":"The 'email' field is required","uniqueKey":"error.details","typeLabel":"string"},"hint":{"type":"string","description":"Additional guidance on how to resolve the error.","uniqueKey":"error.hint","typeLabel":"string"},"available_stock":{"type":"integer","description":"Current stock level (present on insufficient_stock errors).","uniqueKey":"error.available_stock","typeLabel":"integer"},"current_cart_quantity":{"type":"integer","description":"Quantity already in cart (present on insufficient_stock errors).","uniqueKey":"error.current_cart_quantity","typeLabel":"integer"},"limit":{"type":"integer","description":"Rate limit ceiling (present on rate_limited / quota_exceeded errors).","uniqueKey":"error.limit","typeLabel":"integer"},"remaining":{"type":"integer","description":"Requests remaining in the current window (present on rate_limited / quota_exceeded errors).","uniqueKey":"error.remaining","typeLabel":"integer"},"reset":{"type":"integer","description":"Unix timestamp when the rate limit / quota window resets (present on rate_limited / quota_exceeded errors).","uniqueKey":"error.reset","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"unauthorized","message":"Missing or invalid Authorization header"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthorized","message":"Missing or invalid Authorization header"}}}},"exampleType":"examples"}},"exampleType":"examples"},"7b13ab92-6e26-4f0f-9f39-fd18fe81ce3d":{"description":"`passwordless_disabled` when the store does not offer sign-in by emailed code, or `forbidden` when the call was made with a publishable key.","headers":{"Tybrite-Environment":{"description":"Confirms which environment your API key resolved to. Use this to verify that test keys\nare hitting sandbox data and live keys are hitting production data.\n\n- `production` — requests are scoped to live data; real orders, customers, and payments\n- `sandbox` — requests are scoped to isolated test data; no real money is moved\n\nPresent on every authenticated response, including error responses.\n","schema":{"type":"string","enum":["production","sandbox"]},"example":"sandbox"}},"content":{"application/json":{"schema":{"oneOf":[{"type":"object","description":"An authentication refusal. `invalid_credentials` is the single answer to a sign-in with an unknown address, a wrong password, or an account that cannot sign in. `password_reset_required` is returned only after the correct password and means the account must set a new one. `invalid_token` means the `x-auth-token` is not a valid sign-in token for this store. `invalid_refresh_token` means the session has ended. `passwordless_disabled` means the store does not offer sign-in by emailed code.","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_credentials","password_reset_required","invalid_token","invalid_refresh_token","passwordless_disabled"],"isRequired":true,"uniqueKey":"oneOf.0.error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.error.message","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.0.error","typeLabel":"object"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_request","isRequired":true,"uniqueKey":"oneOf.1.error.code","typeLabel":"string"},"message":{"type":"string","example":"Missing required field","isRequired":true,"uniqueKey":"oneOf.1.error.message","typeLabel":"string"},"details":{"type":"string","example":"The 'email' field is required","uniqueKey":"oneOf.1.error.details","typeLabel":"string"},"hint":{"type":"string","description":"Additional guidance on how to resolve the error.","uniqueKey":"oneOf.1.error.hint","typeLabel":"string"},"available_stock":{"type":"integer","description":"Current stock level (present on insufficient_stock errors).","uniqueKey":"oneOf.1.error.available_stock","typeLabel":"integer"},"current_cart_quantity":{"type":"integer","description":"Quantity already in cart (present on insufficient_stock errors).","uniqueKey":"oneOf.1.error.current_cart_quantity","typeLabel":"integer"},"limit":{"type":"integer","description":"Rate limit ceiling (present on rate_limited / quota_exceeded errors).","uniqueKey":"oneOf.1.error.limit","typeLabel":"integer"},"remaining":{"type":"integer","description":"Requests remaining in the current window (present on rate_limited / quota_exceeded errors).","uniqueKey":"oneOf.1.error.remaining","typeLabel":"integer"},"reset":{"type":"integer","description":"Unix timestamp when the rate limit / quota window resets (present on rate_limited / quota_exceeded errors).","uniqueKey":"oneOf.1.error.reset","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"oneOf.1.error","typeLabel":"object"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"passwordless_disabled","message":"This store does not offer sign-in by emailed code."}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"passwordless_disabled","message":"This store does not offer sign-in by emailed code."}}}},"exampleType":"examples"}},"exampleType":"examples"},"a5993012-5bf4-4aae-8193-1dcdd016b743":{"description":"Too many requests. Two distinct `429` codes: `rate_limited` (an abuse throttle — too many requests too fast; carries an `X-RateLimit-Scope: abuse` header and is NOT counted against your monthly quota) and `quota_exceeded` (your plan's monthly request allowance is reached).","headers":{"Tybrite-Environment":{"description":"Confirms which environment your API key resolved to. Use this to verify that test keys\nare hitting sandbox data and live keys are hitting production data.\n\n- `production` — requests are scoped to live data; real orders, customers, and payments\n- `sandbox` — requests are scoped to isolated test data; no real money is moved\n\nPresent on every authenticated response, including error responses.\n","schema":{"type":"string","enum":["production","sandbox"]},"example":"sandbox"},"Retry-After":{"description":"Seconds until the limit that refused the request resets. Sent with `rate_limited`.","schema":{"type":"integer"},"example":540}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_request","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Missing required field","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"string","example":"The 'email' field is required","uniqueKey":"error.details","typeLabel":"string"},"hint":{"type":"string","description":"Additional guidance on how to resolve the error.","uniqueKey":"error.hint","typeLabel":"string"},"available_stock":{"type":"integer","description":"Current stock level (present on insufficient_stock errors).","uniqueKey":"error.available_stock","typeLabel":"integer"},"current_cart_quantity":{"type":"integer","description":"Quantity already in cart (present on insufficient_stock errors).","uniqueKey":"error.current_cart_quantity","typeLabel":"integer"},"limit":{"type":"integer","description":"Rate limit ceiling (present on rate_limited / quota_exceeded errors).","uniqueKey":"error.limit","typeLabel":"integer"},"remaining":{"type":"integer","description":"Requests remaining in the current window (present on rate_limited / quota_exceeded errors).","uniqueKey":"error.remaining","typeLabel":"integer"},"reset":{"type":"integer","description":"Unix timestamp when the rate limit / quota window resets (present on rate_limited / quota_exceeded errors).","uniqueKey":"error.reset","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"rate_limited","message":"Too many requests for this API key. Please slow down and try again shortly.","remaining":0,"reset":1706198400}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"rate_limited","message":"Too many requests for this API key. Please slow down and try again shortly.","remaining":0,"reset":1706198400}}}},"exampleType":"examples"}},"exampleType":"examples"},"c1ebb356-5561-435c-9ad9-5716b124ba44":{"description":"Internal server error","headers":{"Tybrite-Environment":{"description":"Confirms which environment your API key resolved to. Use this to verify that test keys\nare hitting sandbox data and live keys are hitting production data.\n\n- `production` — requests are scoped to live data; real orders, customers, and payments\n- `sandbox` — requests are scoped to isolated test data; no real money is moved\n\nPresent on every authenticated response, including error responses.\n","schema":{"type":"string","enum":["production","sandbox"]},"example":"sandbox"}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_request","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Missing required field","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"string","example":"The 'email' field is required","uniqueKey":"error.details","typeLabel":"string"},"hint":{"type":"string","description":"Additional guidance on how to resolve the error.","uniqueKey":"error.hint","typeLabel":"string"},"available_stock":{"type":"integer","description":"Current stock level (present on insufficient_stock errors).","uniqueKey":"error.available_stock","typeLabel":"integer"},"current_cart_quantity":{"type":"integer","description":"Quantity already in cart (present on insufficient_stock errors).","uniqueKey":"error.current_cart_quantity","typeLabel":"integer"},"limit":{"type":"integer","description":"Rate limit ceiling (present on rate_limited / quota_exceeded errors).","uniqueKey":"error.limit","typeLabel":"integer"},"remaining":{"type":"integer","description":"Requests remaining in the current window (present on rate_limited / quota_exceeded errors).","uniqueKey":"error.remaining","typeLabel":"integer"},"reset":{"type":"integer","description":"Unix timestamp when the rate limit / quota window resets (present on rate_limited / quota_exceeded errors).","uniqueKey":"error.reset","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"server_error","message":"An unexpected error occurred"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"server_error","message":"An unexpected error occurred"}}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"f6ab5e18-0772-47a4-8044-b78785dd760c":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"**API Key Authentication**\n \nUse your API key in the Authorization header:\n```\nAuthorization: Bearer tybrite_sk_live_YOUR_KEY\n```\n \n**Key Types:**\n \n**Secret Keys (Server-Side Only):**\n- Format: `tybrite_sk_live_*` (production) or `tybrite_sk_test_*` (sandbox)\n- Full read/write access to all endpoints\n- ⚠️ NEVER expose in client-side code or public repositories\n- Required for: every write a shopper does not make for themselves, authentication, payment verification, AI recommendations\n \n**Publishable Keys (Client-Safe):**\n- Format: `tybrite_pk_live_*` (production) or `tybrite_pk_test_*` (sandbox)\n- Catalogue reads, plus the actions a shopper takes for themselves\n- ✅ Safe for client-side JavaScript, mobile apps, and public code\n- Allowed for: browsing products, search, CMS content, pricing queries, cart and wishlist,\n reviews, storefront events, and the Agent API's quotes, cart drafts and checkout intents\n \n**Endpoint-Specific Requirements:**\n- **Authentication endpoints** (`/v1/auth/*`): Secret key required\n- **Payment verification** (`POST /v1/payments/verify`): Secret key required\n- **AI Recommendations** (`POST /v1/recommendations`): Secret key required\n- **Semantic Search** (`POST /v1/search`): Both key types allowed (read-only operation)\n- **Shopper actions** (cart, wishlist, reviews, storefront events, Agent API quotes, cart drafts and checkout intents): Both key types allowed\n- **All other write operations**: Secret key required\n- **All read operations**: Both key types allowed\n \nUsing a publishable key for restricted operations returns 403 Forbidden.\n","scopes":[],"schemeName":"BearerAuth"}}},"servers":{"62901a8b-054a-46ad-9e18-4cc277f3085e":{"url":"https://api.tybritelabs.com","description":"Production API"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"**API Key Authentication**\n \nUse your API key in the Authorization header:\n```\nAuthorization: Bearer tybrite_sk_live_YOUR_KEY\n```\n \n**Key Types:**\n \n**Secret Keys (Server-Side Only):**\n- Format: `tybrite_sk_live_*` (production) or `tybrite_sk_test_*` (sandbox)\n- Full read/write access to all endpoints\n- ⚠️ NEVER expose in client-side code or public repositories\n- Required for: every write a shopper does not make for themselves, authentication, payment verification, AI recommendations\n \n**Publishable Keys (Client-Safe):**\n- Format: `tybrite_pk_live_*` (production) or `tybrite_pk_test_*` (sandbox)\n- Catalogue reads, plus the actions a shopper takes for themselves\n- ✅ Safe for client-side JavaScript, mobile apps, and public code\n- Allowed for: browsing products, search, CMS content, pricing queries, cart and wishlist,\n reviews, storefront events, and the Agent API's quotes, cart drafts and checkout intents\n \n**Endpoint-Specific Requirements:**\n- **Authentication endpoints** (`/v1/auth/*`): Secret key required\n- **Payment verification** (`POST /v1/payments/verify`): Secret key required\n- **AI Recommendations** (`POST /v1/recommendations`): Secret key required\n- **Semantic Search** (`POST /v1/search`): Both key types allowed (read-only operation)\n- **Shopper actions** (cart, wishlist, reviews, storefront events, Agent API quotes, cart drafts and checkout intents): Both key types allowed\n- **All other write operations**: Secret key required\n- **All read operations**: Both key types allowed\n \nUsing a publishable key for restricted operations returns 403 Forbidden.\n","scopes":[],"schemeName":"BearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"**API Key Authentication**\n \nUse your API key in the Authorization header:\n```\nAuthorization: Bearer tybrite_sk_live_YOUR_KEY\n```\n \n**Key Types:**\n \n**Secret Keys (Server-Side Only):**\n- Format: `tybrite_sk_live_*` (production) or `tybrite_sk_test_*` (sandbox)\n- Full read/write access to all endpoints\n- ⚠️ NEVER expose in client-side code or public repositories\n- Required for: every write a shopper does not make for themselves, authentication, payment verification, AI recommendations\n \n**Publishable Keys (Client-Safe):**\n- Format: `tybrite_pk_live_*` (production) or `tybrite_pk_test_*` (sandbox)\n- Catalogue reads, plus the actions a shopper takes for themselves\n- ✅ Safe for client-side JavaScript, mobile apps, and public code\n- Allowed for: browsing products, search, CMS content, pricing queries, cart and wishlist,\n reviews, storefront events, and the Agent API's quotes, cart drafts and checkout intents\n \n**Endpoint-Specific Requirements:**\n- **Authentication endpoints** (`/v1/auth/*`): Secret key required\n- **Payment verification** (`POST /v1/payments/verify`): Secret key required\n- **AI Recommendations** (`POST /v1/recommendations`): Secret key required\n- **Semantic Search** (`POST /v1/search`): Both key types allowed (read-only operation)\n- **Shopper actions** (cart, wishlist, reviews, storefront events, Agent API quotes, cart drafts and checkout intents): Both key types allowed\n- **All other write operations**: Secret key required\n- **All read operations**: Both key types allowed\n \nUsing a publishable key for restricted operations returns 403 Forbidden.\n","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BearerAuth","name":"Authorization"}],"title":"BearerAuth"}]},"originalFileLocation":"openapi.yaml"},"subdomain":"tybritelabs","siteName":"Galactic Core API Documentation","title":"Verify a sign-in code - Galactic Core API Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-26T08:02:48.896Z","originalFileLocation":"api-reference/authentication/verify-a-sign-in-code.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Complete sign-in with the code from the sign-in email, or with the link_token the email\u0026#x27;s link carries. Returns the shopper, the customer record and a session. A link needs no email. A code is valid for 15 minutes, is accepted 5 times and works once; a link_token is single-use and shares its code\u0026#x27;s expiry and attempts. A wrong, expired, used or unknown code answers 400 invalid_code with no reason, and an address without an account answers the same way. This endpoint never creates an account. Secret key required. This endpoint requires a secret key (tybrite_sk_*). Publishable keys answer 403 forbidden. Account calls are made from a server, which then holds the shopper\u0026#x27;s session. Attempt limits: with a secret key, past 10 attempts for one email address from one store in 15 minutes, the call is slowed to one attempt every 30 seconds; other calls for that address answer 429 rate_limited with a Retry-After header giving the seconds until the next attempt is accepted. With a publishable key, attempts are limited per calling address: 20 per address and email, and 60 per address, in 15 minutes. Across every store and address, past 20 attempts for one email the call is slowed to one every 30 seconds. Every attempt counts, successful or not, and an address with no account is treated identically.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Galactic Core API Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/tybritelabs/d0xYWWdjx3Q9ZfW_/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/tybritelabs/d0xYWWdjx3Q9ZfW_/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/tybritelabs/d0xYWWdjx3Q9ZfW_/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/tybritelabs/d0xYWWdjx3Q9ZfW_/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/tybritelabs/d0xYWWdjx3Q9ZfW_/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/tybritelabs/d0xYWWdjx3Q9ZfW_/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/tybritelabs/d0xYWWdjx3Q9ZfW_/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/tybritelabs/d0xYWWdjx3Q9ZfW_/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/tybritelabs/d0xYWWdjx3Q9ZfW_/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Verify a sign-in code - Galactic Core API Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Complete sign-in with the code from the sign-in email, or with the link_token the email\u0026#x27;s link carries. Returns the shopper, the customer record and a session. A link needs no email. A code is valid for 15 minutes, is accepted 5 times and works once; a link_token is single-use and shares its code\u0026#x27;s expiry and attempts. A wrong, expired, used or unknown code answers 400 invalid_code with no reason, and an address without an account answers the same way. This endpoint never creates an account. Secret key required. This endpoint requires a secret key (tybrite_sk_*). Publishable keys answer 403 forbidden. Account calls are made from a server, which then holds the shopper\u0026#x27;s session. Attempt limits: with a secret key, past 10 attempts for one email address from one store in 15 minutes, the call is slowed to one attempt every 30 seconds; other calls for that address answer 429 rate_limited with a Retry-After header giving the seconds until the next attempt is accepted. With a publishable key, attempts are limited per calling address: 20 per address and email, and 60 per address, in 15 minutes. Across every store and address, past 20 attempts for one email the call is slowed to one every 30 seconds. Every attempt counts, successful or not, and an address with no account is treated identically.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Galactic Core API Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.tybritelabs.com/api-reference/authentication/verify-a-sign-in-code\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://tybritelabs.mintlify.app/_mintlify/api/og/v2?division=Authentication\u0026amp;title=Verify+a+sign-in+code\u0026amp;description=Complete+sign-in+with+the+code+from+the+sign-in+email%2C+or+with+the+%60link_token%60+the+email%27s+link%0Acarries.+Returns+the+shopper%2C+the+customer+record+and+a+session\u0026amp;theme=b0c5a7325a83e0755b69afc3\u0026amp;signature=3b3ff0304241286d20d47da3fec69955ebf5b184d609b1df65c87851822cd588\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Verify a sign-in code - Galactic Core API Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Complete sign-in with the code from the sign-in email, or with the link_token the email\u0026#x27;s link carries. Returns the shopper, the customer record and a session. A link needs no email. A code is valid for 15 minutes, is accepted 5 times and works once; a link_token is single-use and shares its code\u0026#x27;s expiry and attempts. A wrong, expired, used or unknown code answers 400 invalid_code with no reason, and an address without an account answers the same way. This endpoint never creates an account. Secret key required. This endpoint requires a secret key (tybrite_sk_*). Publishable keys answer 403 forbidden. Account calls are made from a server, which then holds the shopper\u0026#x27;s session. Attempt limits: with a secret key, past 10 attempts for one email address from one store in 15 minutes, the call is slowed to one attempt every 30 seconds; other calls for that address answer 429 rate_limited with a Retry-After header giving the seconds until the next attempt is accepted. With a publishable key, attempts are limited per calling address: 20 per address and email, and 60 per address, in 15 minutes. Across every store and address, past 20 attempts for one email the call is slowed to one every 30 seconds. Every attempt counts, successful or not, and an address with no account is treated identically.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://tybritelabs.mintlify.app/_mintlify/api/og/v2?division=Authentication\u0026amp;title=Verify+a+sign-in+code\u0026amp;description=Complete+sign-in+with+the+code+from+the+sign-in+email%2C+or+with+the+%60link_token%60+the+email%27s+link%0Acarries.+Returns+the+shopper%2C+the+customer+record+and+a+session\u0026amp;theme=b0c5a7325a83e0755b69afc3\u0026amp;signature=3b3ff0304241286d20d47da3fec69955ebf5b184d609b1df65c87851822cd588\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/tybritelabs/d0xYWWdjx3Q9ZfW_/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Galactic Core API Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3b82f6\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.tybritelabs.com/api-reference/authentication/verify-a-sign-in-code\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/authentication/verify-a-sign-in-code.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.tybritelabs.com/#organization\",\"name\":\"Galactic Core API Documentation\",\"url\":\"https://docs.tybritelabs.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/tybritelabs/9cNSmgnBxs-QU_UC/branding/gc-long-blue.png?fit=max\u0026auto=format\u0026n=9cNSmgnBxs-QU_UC\u0026q=85\u0026s=88d64ea989973d874ed73437459487f7\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.tybritelabs.com#website\",\"name\":\"Galactic Core API Documentation\",\"url\":\"https://docs.tybritelabs.com\",\"publisher\":{\"@id\":\"https://docs.tybritelabs.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.tybritelabs.com/api-reference/authentication/verify-a-sign-in-code#webpage\",\"url\":\"https://docs.tybritelabs.com/api-reference/authentication/verify-a-sign-in-code\",\"name\":\"Verify a sign-in code\",\"description\":\"Complete sign-in with the code from the sign-in email, or with the link_token the email's link carries. Returns the shopper, the customer record and a session. A link needs no email. A code is valid for 15 minutes, is accepted 5 times and works once; a link_token is single-use and shares its code's expiry and attempts. A wrong, expired, used or unknown code answers 400 invalid_code with no reason, and an address without an account answers the same way. This endpoint never creates an account. Secret key required. This endpoint requires a secret key (tybrite_sk_*). Publishable keys answer 403 forbidden. Account calls are made from a server, which then holds the shopper's session. Attempt limits: with a secret key, past 10 attempts for one email address from one store in 15 minutes, the call is slowed to one attempt every 30 seconds; other calls for that address answer 429 rate_limited with a Retry-After header giving the seconds until the next attempt is accepted. With a publishable key, attempts are limited per calling address: 20 per address and email, and 60 per address, in 15 minutes. Across every store and address, past 20 attempts for one email the call is slowed to one every 30 seconds. Every attempt counts, successful or not, and an address with no account is treated identically.\",\"dateModified\":\"2026-10-26T08:02:48.896Z\",\"isPartOf\":{\"@id\":\"https://docs.tybritelabs.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.tybritelabs.com/api-reference/authentication/verify-a-sign-in-code#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.tybritelabs.com/api-reference/authentication/verify-a-sign-in-code#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Authentication\",\"item\":\"https://docs.tybritelabs.com/api-reference/authentication/register-customer-account\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Verify a sign-in code\",\"item\":\"https://docs.tybritelabs.com/api-reference/authentication/verify-a-sign-in-code\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.tybritelabs.com/api-reference/authentication/verify-a-sign-in-code#apireference\",\"headline\":\"Verify a sign-in code\",\"name\":\"Verify a sign-in code\",\"description\":\"Complete sign-in with the code from the sign-in email, or with the link_token the email's link carries. Returns the shopper, the customer record and a session. A link needs no email. A code is valid for 15 minutes, is accepted 5 times and works once; a link_token is single-use and shares its code's expiry and attempts. A wrong, expired, used or unknown code answers 400 invalid_code with no reason, and an address without an account answers the same way. This endpoint never creates an account. Secret key required. This endpoint requires a secret key (tybrite_sk_*). Publishable keys answer 403 forbidden. Account calls are made from a server, which then holds the shopper's session. Attempt limits: with a secret key, past 10 attempts for one email address from one store in 15 minutes, the call is slowed to one attempt every 30 seconds; other calls for that address answer 429 rate_limited with a Retry-After header giving the seconds until the next attempt is accepted. With a publishable key, attempts are limited per calling address: 20 per address and email, and 60 per address, in 15 minutes. Across every store and address, past 20 attempts for one email the call is slowed to one every 30 seconds. Every attempt counts, successful or not, and an address with no account is treated identically.\",\"url\":\"https://docs.tybritelabs.com/api-reference/authentication/verify-a-sign-in-code\",\"mainEntityOfPage\":{\"@id\":\"https://docs.tybritelabs.com/api-reference/authentication/verify-a-sign-in-code#webpage\"},\"dateModified\":\"2026-10-26T08:02:48.896Z\",\"publisher\":{\"@id\":\"https://docs.tybritelabs.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.tybritelabs.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Galactic Core API Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Galactic Core API Documentation","nav":{"global":{"anchors":[{"anchor":"Dashboard","icon":"gauge","href":"https://gc.tybritelabs.com/dashboard"},{"anchor":"GitHub","icon":"github","href":"https://github.com/tybrite"},{"anchor":"Support","icon":"envelope","href":"mailto:support@tybrite.com"}]},"tabs":[{"tab":"Getting Started","pages":[{"title":"Getting Started","href":""}]},{"tab":"API Reference","groups":[{"group":"Reference","pages":[{"title":"Introduction","href":"/api-reference/introduction"}]},{"group":"System","pages":[{"title":"API information","deprecated":null,"version":null,"openapi":"/openapi.yaml get /","href":"/api-reference/system/api-information"},{"title":"Health check","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/health","href":"/api-reference/system/health-check"},{"title":"Get comprehensive store information","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/store/info","href":"/api-reference/system/get-comprehensive-store-information"}]},{"group":"Store","pages":[{"title":"Get the store profile","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/store/profile","href":"/api-reference/store/get-the-store-profile"},{"title":"List published policies","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/store/policies","href":"/api-reference/store/list-published-policies"},{"title":"Get a published policy","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/store/policies/{slug}","href":"/api-reference/store/get-a-published-policy"}]},{"group":"Products","pages":[{"title":"List products with filtering and pagination","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/products","href":"/api-reference/products/list-products-with-filtering-and-pagination"},{"title":"List brands","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/brands","href":"/api-reference/products/list-brands"},{"title":"List the values a product list can be filtered by","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/products/facets","href":"/api-reference/products/list-the-values-a-product-list-can-be-filtered-by"},{"title":"Get product by ID or variant ID","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/products/{id}","href":"/api-reference/products/get-product-by-id-or-variant-id"},{"title":"Get product by SEO-friendly slug","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/products/by-slug/{slug}","href":"/api-reference/products/get-product-by-seo-friendly-slug"},{"title":"Get a variant's specifications","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/products/{id}/specifications","href":"/api-reference/products/get-a-variants-specifications"},{"title":"Get a product's custom fields","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/products/{id}/custom-fields","href":"/api-reference/products/get-a-products-custom-fields"},{"title":"List product specifications","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/product-specifications","href":"/api-reference/products/list-product-specifications"},{"title":"List product collections","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/product-collections","href":"/api-reference/products/list-product-collections"},{"title":"Get product collection by ID","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/product-collections/{id}","href":"/api-reference/products/get-product-collection-by-id"},{"title":"Get items in a product collection","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/product-collections/{id}/items","href":"/api-reference/products/get-items-in-a-product-collection"}]},{"group":"Taxonomy","pages":[{"title":"List categories","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/categories","href":"/api-reference/taxonomy/list-categories"},{"title":"Get category","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/categories/{id}","href":"/api-reference/taxonomy/get-category"},{"title":"List subcategories","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/subcategories","href":"/api-reference/taxonomy/list-subcategories"},{"title":"Get subcategory by ID","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/subcategories/{id}","href":"/api-reference/taxonomy/get-subcategory-by-id"}]},{"group":"Orders","pages":[{"title":"List orders","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/orders","href":"/api-reference/orders/list-orders"},{"title":"Create order","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/orders","href":"/api-reference/orders/create-order"},{"title":"Get order details","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/orders/{id}","href":"/api-reference/orders/get-order-details"},{"title":"Update order","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /v1/orders/{id}","href":"/api-reference/orders/update-order"},{"title":"Reserve stock for checkout","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/checkout/reserve","href":"/api-reference/orders/reserve-stock-for-checkout"}]},{"group":"Payments","pages":[{"title":"Get available payment methods","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/payments/methods","href":"/api-reference/payments/get-available-payment-methods"},{"title":"Initialize payment","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/payments/initialize","href":"/api-reference/payments/initialize-payment"},{"title":"Verify payment status","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/payments/verify","href":"/api-reference/payments/verify-payment-status"}]},{"group":"Cart \u0026 Wishlist","pages":[{"title":"Get cart","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/cart","href":"/api-reference/cart-\u0026-wishlist/get-cart"},{"title":"Clear cart","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/cart","href":"/api-reference/cart-\u0026-wishlist/clear-cart"},{"title":"Add to cart","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/cart/items","href":"/api-reference/cart-\u0026-wishlist/add-to-cart"},{"title":"Remove cart item","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/cart/items/{id}","href":"/api-reference/cart-\u0026-wishlist/remove-cart-item"},{"title":"Update cart item","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /v1/cart/items/{id}","href":"/api-reference/cart-\u0026-wishlist/update-cart-item"},{"title":"Merge carts","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/cart/merge","href":"/api-reference/cart-\u0026-wishlist/merge-carts"},{"title":"Get wishlist","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/wishlist","href":"/api-reference/cart-\u0026-wishlist/get-wishlist"},{"title":"Add to wishlist","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/wishlist","href":"/api-reference/cart-\u0026-wishlist/add-to-wishlist"},{"title":"Remove from wishlist","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/wishlist/{id}","href":"/api-reference/cart-\u0026-wishlist/remove-from-wishlist"},{"title":"Move wishlist item to cart","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/wishlist/move-to-cart","href":"/api-reference/cart-\u0026-wishlist/move-wishlist-item-to-cart"},{"title":"Ask to be told when a variant is back in stock","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/variants/{id}/notify-when-available","href":"/api-reference/cart-\u0026-wishlist/ask-to-be-told-when-a-variant-is-back-in-stock"}]},{"group":"Marketplace","pages":[{"title":"Check out a multi-merchant cart","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/cart/checkout","href":"/api-reference/marketplace/check-out-a-multi-merchant-cart"},{"title":"Quote a multi-merchant checkout","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/cart/checkout/quote","href":"/api-reference/marketplace/quote-a-multi-merchant-checkout"},{"title":"Get the signed-in shopper's unified marketplace profile","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/customers/me","href":"/api-reference/marketplace/get-the-signed-in-shoppers-unified-marketplace-profile"},{"title":"Get the signed-in shopper's marketplace wallet","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/customers/me/wallet","href":"/api-reference/marketplace/get-the-signed-in-shoppers-marketplace-wallet"},{"title":"Get marketplace information","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/marketplace/info","href":"/api-reference/marketplace/get-marketplace-information"},{"title":"Get placements for a slot","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/marketplace/ad-slots/{slot_key}","href":"/api-reference/marketplace/get-placements-for-a-slot"},{"title":"Log an ad impression or click","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/marketplace/ad-events","href":"/api-reference/marketplace/log-an-ad-impression-or-click"},{"title":"List operator-curated merchandising sections","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/marketplace/collections","href":"/api-reference/marketplace/list-operator-curated-merchandising-sections"},{"title":"Get one curated section with its members","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/marketplace/collections/{slug}","href":"/api-reference/marketplace/get-one-curated-section-with-its-members"}]},{"group":"Recommendations","pages":[{"title":"Get product recommendations","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/recommendations","href":"/api-reference/recommendations/get-product-recommendations"}]},{"group":"Discovery","pages":[{"title":"Most-viewed products (windowed)","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/discovery/most-viewed","href":"/api-reference/discovery/most-viewed-products-windowed"},{"title":"Most-added-to-cart products (windowed)","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/discovery/most-added-to-cart","href":"/api-reference/discovery/most-added-to-cart-products-windowed"},{"title":"Best-converting products (windowed)","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/discovery/best-converting","href":"/api-reference/discovery/best-converting-products-windowed"}]},{"group":"Events","pages":[{"title":"Record a storefront product event","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/events","href":"/api-reference/events/record-a-storefront-product-event"}]},{"group":"Tax","pages":[{"title":"Preview tax for a cart before checkout","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/tax/preview","href":"/api-reference/tax/preview-tax-for-a-cart-before-checkout"}]},{"group":"Analytics","pages":[{"title":"Record a storefront analytics event","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/analytics/collect","href":"/api-reference/analytics/record-a-storefront-analytics-event"}]},{"group":"Agent","pages":[{"title":"List the agent tools","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/agent/capabilities","href":"/api-reference/agent/list-the-agent-tools"},{"title":"Search by constraints","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/search","href":"/api-reference/agent/search-by-constraints"},{"title":"Turn a request into search constraints","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/interpret","href":"/api-reference/agent/turn-a-request-into-search-constraints"},{"title":"Get a product dossier","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/agent/products/{id}/context","href":"/api-reference/agent/get-a-product-dossier"},{"title":"Compare products","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/compare","href":"/api-reference/agent/compare-products"},{"title":"Check a product against constraints","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/fit","href":"/api-reference/agent/check-a-product-against-constraints"},{"title":"Find alternatives to a product","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/alternatives","href":"/api-reference/agent/find-alternatives-to-a-product"},{"title":"Price a basket","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/quote","href":"/api-reference/agent/price-a-basket"},{"title":"Create a cart draft","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/cart-drafts","href":"/api-reference/agent/create-a-cart-draft"},{"title":"Draft a cart from an intent","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/cart-drafts/from-intent","href":"/api-reference/agent/draft-a-cart-from-an-intent"},{"title":"Get a cart draft","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/agent/cart-drafts/{id}","href":"/api-reference/agent/get-a-cart-draft"},{"title":"Add a draft to the shopper's cart","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/cart-drafts/{id}/apply","href":"/api-reference/agent/add-a-draft-to-the-shoppers-cart"},{"title":"Get insights on a cart","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/agent/cart-insights","href":"/api-reference/agent/get-insights-on-a-cart"},{"title":"Get the shopper's personalisation consent","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/agent/me/consent","href":"/api-reference/agent/get-the-shoppers-personalisation-consent"},{"title":"Grant or revoke personalisation consent","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/me/consent","href":"/api-reference/agent/grant-or-revoke-personalisation-consent"},{"title":"Get the shopper's own context","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/agent/me/context","href":"/api-reference/agent/get-the-shoppers-own-context"},{"title":"Get wishlist insights","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/agent/me/wishlist-insights","href":"/api-reference/agent/get-wishlist-insights"},{"title":"Get reorder suggestions","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/agent/me/reorder-suggestions","href":"/api-reference/agent/get-reorder-suggestions"},{"title":"Get an order's status","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/agent/orders/{id}/status","href":"/api-reference/agent/get-an-orders-status"},{"title":"Request a return for an order","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/orders/{id}/returns","href":"/api-reference/agent/request-a-return-for-an-order"},{"title":"List the shopper's standing instructions","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/agent/me/mandates","href":"/api-reference/agent/list-the-shoppers-standing-instructions"},{"title":"Create a standing instruction","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/me/mandates","href":"/api-reference/agent/create-a-standing-instruction"},{"title":"Cancel a standing instruction","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/me/mandates/{id}/cancel","href":"/api-reference/agent/cancel-a-standing-instruction"},{"title":"Create a checkout intent","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/checkout-intents","href":"/api-reference/agent/create-a-checkout-intent"},{"title":"Get a checkout intent","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/agent/checkout-intents/{id}","href":"/api-reference/agent/get-a-checkout-intent"},{"title":"Confirm a checkout intent","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/checkout-intents/{id}/confirm","href":"/api-reference/agent/confirm-a-checkout-intent"},{"title":"Cancel a checkout intent","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/agent/checkout-intents/{id}/cancel","href":"/api-reference/agent/cancel-a-checkout-intent"},{"title":"Get the store's policies","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/agent/store-policies","href":"/api-reference/agent/get-the-stores-policies"},{"title":"Get AI credit usage","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/agent/usage","href":"/api-reference/agent/get-ai-credit-usage"}]},{"group":"Search","pages":[{"title":"Simple text search","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/search","href":"/api-reference/search/simple-text-search"},{"title":"Semantic search","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/search","href":"/api-reference/search/semantic-search"},{"title":"Type-ahead suggestions","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/search/autocomplete","href":"/api-reference/search/type-ahead-suggestions"}]},{"group":"Authentication","pages":[{"title":"Register customer account","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/auth/register","href":"/api-reference/authentication/register-customer-account"},{"title":"Confirm a new account","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/auth/register/verify","href":"/api-reference/authentication/confirm-a-new-account"},{"title":"Resend the confirmation email","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/auth/register/resend","href":"/api-reference/authentication/resend-the-confirmation-email"},{"title":"Login with email and password","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/auth/login","href":"/api-reference/authentication/login-with-email-and-password"},{"title":"Logout current session","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/auth/logout","href":"/api-reference/authentication/logout-current-session"},{"title":"Send a sign-in code","description":"Send a one-time sign-in code, and a link carrying it, to an address that has an account. Any\naccount can sign in this way, with or without a password. The code is six digits and is valid for 15\nminutes. The call answers `202` with the same body for every address; an address without an account\nreceives no email and no account is created. The shopper completes sign-in with\n`POST /v1/auth/verify-otp`.\n\nSign-in by code is on for every store unless the merchant switches it off; `store.auth.passwordless`\nin the store information reports the setting. When it is off, the call answers\n`403 passwordless_disabled`.\n\n`redirect_to` names the storefront page that receives the shopper from the email, which appends\n`?link_token=\u003ctoken>` to it. It must be on one of the store's allowed storefront origins; otherwise\nit is ignored and the email carries the code only.\n\nAt most one email per address is sent every 60 seconds and five an hour; a call past that is\nanswered `202` and sends nothing.\n\n**Secret key required.** This endpoint requires a secret key (`tybrite_sk_*`). Publishable keys\nanswer `403 forbidden`. Account calls are made from a server, which then holds the shopper's session.\n\n**Attempt limits:** with a secret key, past 5 attempts for one email address from one store in\n15 minutes, the call is slowed to one attempt every 60 seconds; other calls for that address\nanswer `429 rate_limited` with a `Retry-After` header giving the seconds until the next attempt is\naccepted. With a publishable key, attempts are limited per calling address: 20 per address and email,\nand 60 per address, in 15 minutes. Across every store and address, past 10 attempts for one\nemail the call is slowed to one every 60 seconds. Every attempt counts, successful or not,\nand an address with no account is treated identically.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/auth/magic-link","href":"/api-reference/authentication/send-a-sign-in-code"},{"title":"Verify a sign-in code","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/auth/verify-otp","href":"/api-reference/authentication/verify-a-sign-in-code"},{"title":"Request a password reset","description":"Send a password reset code, and a link carrying it, to an address that has an account. The call\nanswers `202` with the same body for every address; an address without an account receives no\nemail. The shopper completes the reset with `POST /v1/auth/password/reset`. The code is six digits\nand is valid for 15 minutes.\n\n`redirect_to` names the storefront page that receives the shopper from the email, which appends\n`?link_token=\u003ctoken>` to it. It must be on one of the store's allowed storefront origins; otherwise\nit is ignored and the email carries the code only.\n\n**Secret key required.** This endpoint requires a secret key (`tybrite_sk_*`). Publishable keys\nanswer `403 forbidden`. Account calls are made from a server, which then holds the shopper's session.\n\n**Attempt limits:** with a secret key, past 5 attempts for one email address from one store in\n15 minutes, the call is slowed to one attempt every 60 seconds; other calls for that address\nanswer `429 rate_limited` with a `Retry-After` header giving the seconds until the next attempt is\naccepted. With a publishable key, attempts are limited per calling address: 20 per address and email,\nand 60 per address, in 15 minutes. Across every store and address, past 10 attempts for one\nemail the call is slowed to one every 60 seconds. Every attempt counts, successful or not,\nand an address with no account is treated identically.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/auth/password/forgot","href":"/api-reference/authentication/request-a-password-reset"},{"title":"Reset a password","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/auth/password/reset","href":"/api-reference/authentication/reset-a-password"},{"title":"Change or set a password","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/auth/password/change","href":"/api-reference/authentication/change-or-set-a-password"},{"title":"Refresh access token","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/auth/refresh","href":"/api-reference/authentication/refresh-access-token"},{"title":"Get current user","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/auth/me","href":"/api-reference/authentication/get-current-user"}]},{"group":"Customers","pages":[{"title":"Create customer","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/customers","href":"/api-reference/customers/create-customer"},{"title":"Get customer details","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/customers/{id}","href":"/api-reference/customers/get-customer-details"},{"title":"Update customer","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /v1/customers/{id}","href":"/api-reference/customers/update-customer"},{"title":"List a shopper's saved addresses","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/customers/{id}/addresses","href":"/api-reference/customers/list-a-shoppers-saved-addresses"},{"title":"Save a new address","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/customers/{id}/addresses","href":"/api-reference/customers/save-a-new-address"},{"title":"Delete a saved address","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/customers/{id}/addresses/{addressId}","href":"/api-reference/customers/delete-a-saved-address"},{"title":"Update a saved address","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /v1/customers/{id}/addresses/{addressId}","href":"/api-reference/customers/update-a-saved-address"}]},{"group":"Gift Cards","pages":[{"title":"List gift cards","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/gift-cards","href":"/api-reference/gift-cards/list-gift-cards"},{"title":"Check gift card balance","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/gift-cards/check","href":"/api-reference/gift-cards/check-gift-card-balance"}]},{"group":"Promotions","pages":[{"title":"List promotions","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/promotions","href":"/api-reference/promotions/list-promotions"},{"title":"Get promotion details","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/promotions/{id}","href":"/api-reference/promotions/get-promotion-details"},{"title":"Calculate a promotion's discount for a cart","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/promotions/{id}/calculate","href":"/api-reference/promotions/calculate-a-promotions-discount-for-a-cart"},{"title":"Find the best promotion for a cart","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/promotions/calculate-best","href":"/api-reference/promotions/find-the-best-promotion-for-a-cart"}]},{"group":"Campaigns","pages":[{"title":"List running campaigns","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/campaigns","href":"/api-reference/campaigns/list-running-campaigns"},{"title":"Get a running campaign","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/campaigns/{id}","href":"/api-reference/campaigns/get-a-running-campaign"}]},{"group":"CMS","pages":[{"title":"List blog posts","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/posts","href":"/api-reference/cms/list-blog-posts"},{"title":"Get blog post by slug","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/posts/{slug}","href":"/api-reference/cms/get-blog-post-by-slug"},{"title":"Most-read blog posts","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/posts/trending","href":"/api-reference/cms/most-read-blog-posts"},{"title":"Posts related to this one","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/posts/{slug}/related","href":"/api-reference/cms/posts-related-to-this-one"},{"title":"List lookbooks","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/lookbooks","href":"/api-reference/cms/list-lookbooks"},{"title":"Get lookbook details by slug","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/lookbooks/{slug}","href":"/api-reference/cms/get-lookbook-details-by-slug"},{"title":"Subscribe an email to the store's newsletter","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/newsletter/subscribe","href":"/api-reference/cms/subscribe-an-email-to-the-stores-newsletter"},{"title":"Get a lead form","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/lead-forms/{slug}","href":"/api-reference/cms/get-a-lead-form"},{"title":"Get a lead form token","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/lead-forms/{slug}/token","href":"/api-reference/cms/get-a-lead-form-token"},{"title":"Submit a lead form","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/lead-forms/{slug}/submit","href":"/api-reference/cms/submit-a-lead-form"}]},{"group":"Pricing","pages":[{"title":"Get prices for multiple products with dynamic pricing and multi-currency support","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/prices/products","href":"/api-reference/pricing/get-prices-for-multiple-products-with-dynamic-pricing-and-multi-currency-support"},{"title":"Get single product pricing with dynamic pricing and multi-currency support","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/prices/products/{id}","href":"/api-reference/pricing/get-single-product-pricing-with-dynamic-pricing-and-multi-currency-support"},{"title":"Get product pricing by SEO-friendly slug with dynamic pricing and multi-currency support","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/prices/products/by-slug/{slug}","href":"/api-reference/pricing/get-product-pricing-by-seo-friendly-slug-with-dynamic-pricing-and-multi-currency-support"}]},{"group":"Messaging","pages":[{"title":"List message threads","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/messaging/threads","href":"/api-reference/messaging/list-message-threads"},{"title":"Get thread details","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/messaging/threads/{id}","href":"/api-reference/messaging/get-thread-details"},{"title":"Update thread","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /v1/messaging/threads/{id}","href":"/api-reference/messaging/update-thread"},{"title":"Get messages in a thread","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/messaging/threads/{id}/messages","href":"/api-reference/messaging/get-messages-in-a-thread"},{"title":"Send a message to a thread","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/messaging/threads/{id}/messages","href":"/api-reference/messaging/send-a-message-to-a-thread"},{"title":"Start a new conversation","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/messaging/conversations","href":"/api-reference/messaging/start-a-new-conversation"},{"title":"Mark thread as read","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/messaging/threads/{id}/read","href":"/api-reference/messaging/mark-thread-as-read"},{"title":"Delete message","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/messaging/messages/{id}","href":"/api-reference/messaging/delete-message"},{"title":"Edit message","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /v1/messaging/messages/{id}","href":"/api-reference/messaging/edit-message"},{"title":"Subscribe to a thread's new messages in realtime (WebSocket)","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/messaging/threads/{id}/subscribe","href":"/api-reference/messaging/subscribe-to-a-threads-new-messages-in-realtime-websocket"}]},{"group":"Shipping","pages":[{"title":"Get shipping zones and pricing tiers","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/shipping/zones","href":"/api-reference/shipping/get-shipping-zones-and-pricing-tiers"},{"title":"Calculate shipping fee","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/shipping/calculate","href":"/api-reference/shipping/calculate-shipping-fee"},{"title":"Track a shipment","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/shipping/tracking/{carrier}/{number}","href":"/api-reference/shipping/track-a-shipment"}]},{"group":"GC Connect","pages":[{"title":"Validate an authorization request","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/connect/authorize","href":"/api-reference/gc-connect/validate-an-authorization-request"},{"title":"Approve the authorization (merchant consent)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/connect/authorize","href":"/api-reference/gc-connect/approve-the-authorization-merchant-consent"},{"title":"Exchange authorization code for API keys","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/connect/token","href":"/api-reference/gc-connect/exchange-authorization-code-for-api-keys"},{"title":"Revoke a store connection","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/connect/revoke","href":"/api-reference/gc-connect/revoke-a-store-connection"},{"title":"List active store connections","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/connect/sessions","href":"/api-reference/gc-connect/list-active-store-connections"}]},{"group":"Reviews","pages":[{"title":"List reviews for a product","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/reviews","href":"/api-reference/reviews/list-reviews-for-a-product"},{"title":"Submit a product review","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/reviews","href":"/api-reference/reviews/submit-a-product-review"},{"title":"Get a single review","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/reviews/{id}","href":"/api-reference/reviews/get-a-single-review"},{"title":"Delete your own review","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/reviews/{id}","href":"/api-reference/reviews/delete-your-own-review"},{"title":"Mark a review as helpful","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/reviews/{id}/helpful","href":"/api-reference/reviews/mark-a-review-as-helpful"}]},{"group":"Returns","pages":[{"title":"List return reason codes","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/returns/reasons","href":"/api-reference/returns/list-return-reason-codes"},{"title":"Check whether an order can still be returned","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/returns/eligibility","href":"/api-reference/returns/check-whether-an-order-can-still-be-returned"},{"title":"Get the customer's store credit balance","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/returns/store-credit","href":"/api-reference/returns/get-the-customers-store-credit-balance"},{"title":"List the signed-in customer's returns","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/returns","href":"/api-reference/returns/list-the-signed-in-customers-returns"},{"title":"Lodge a return","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/returns","href":"/api-reference/returns/lodge-a-return"},{"title":"Get one of the customer's returns","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/returns/{id}","href":"/api-reference/returns/get-one-of-the-customers-returns"},{"title":"Accept a store credit offer","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/returns/{id}/accept-credit","href":"/api-reference/returns/accept-a-store-credit-offer"},{"title":"Request a refund instead of store credit","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/returns/{id}/request-refund","href":"/api-reference/returns/request-a-refund-instead-of-store-credit"}]},{"group":"Disputes","pages":[{"title":"List dispute reason codes","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/disputes/reasons","href":"/api-reference/disputes/list-dispute-reason-codes"},{"title":"List the shopper's disputes","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/disputes","href":"/api-reference/disputes/list-the-shoppers-disputes"},{"title":"Open a dispute","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/disputes","href":"/api-reference/disputes/open-a-dispute"},{"title":"Get a dispute","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/disputes/{id}","href":"/api-reference/disputes/get-a-dispute"},{"title":"Cancel a dispute","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/disputes/{id}/cancel","href":"/api-reference/disputes/cancel-a-dispute"},{"title":"Add a message to a dispute","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/disputes/{id}/messages","href":"/api-reference/disputes/add-a-message-to-a-dispute"}]},{"group":"B2B","pages":[{"title":"List your requests for quote","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/b2b/rfqs","href":"/api-reference/b2b/list-your-requests-for-quote"},{"title":"Request a quote","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/b2b/rfqs","href":"/api-reference/b2b/request-a-quote"},{"title":"Get one of your RFQs","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/b2b/rfqs/{id}","href":"/api-reference/b2b/get-one-of-your-rfqs"},{"title":"Get a quote addressed to you","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/b2b/quotes/{id}","href":"/api-reference/b2b/get-a-quote-addressed-to-you"},{"title":"Accept a quote","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/b2b/quotes/{id}/accept","href":"/api-reference/b2b/accept-a-quote"},{"title":"Reject a quote","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/b2b/quotes/{id}/reject","href":"/api-reference/b2b/reject-a-quote"},{"title":"List your purchase orders","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/b2b/purchase-orders","href":"/api-reference/b2b/list-your-purchase-orders"},{"title":"Get one of your purchase orders","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/b2b/purchase-orders/{id}","href":"/api-reference/b2b/get-one-of-your-purchase-orders"},{"title":"List your invoices","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/b2b/invoices","href":"/api-reference/b2b/list-your-invoices"},{"title":"Get one of your invoices","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/b2b/invoices/{id}","href":"/api-reference/b2b/get-one-of-your-invoices"},{"title":"Start paying an invoice","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/b2b/invoices/{id}/pay","href":"/api-reference/b2b/start-paying-an-invoice"},{"title":"Place a wholesale order directly (self-serve checkout)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/b2b/orders","href":"/api-reference/b2b/place-a-wholesale-order-directly-self-serve-checkout"}]},{"group":"Webhooks","pages":[{"title":"List webhook endpoints","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/webhook_endpoints","href":"/api-reference/webhooks/list-webhook-endpoints"},{"title":"Create a webhook endpoint","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/webhook_endpoints","href":"/api-reference/webhooks/create-a-webhook-endpoint"},{"title":"Get a webhook endpoint","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/webhook_endpoints/{id}","href":"/api-reference/webhooks/get-a-webhook-endpoint"},{"title":"Delete a webhook endpoint","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/webhook_endpoints/{id}","href":"/api-reference/webhooks/delete-a-webhook-endpoint"},{"title":"Update a webhook endpoint","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /v1/webhook_endpoints/{id}","href":"/api-reference/webhooks/update-a-webhook-endpoint"},{"title":"Send a test event","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/webhook_endpoints/{id}/test","href":"/api-reference/webhooks/send-a-test-event"},{"title":"List webhook events","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/webhook_events","href":"/api-reference/webhooks/list-webhook-events"},{"title":"Get a webhook event","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/webhook_events/{id}","href":"/api-reference/webhooks/get-a-webhook-event"},{"title":"Retry a webhook event","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/webhook_events/{id}/retry","href":"/api-reference/webhooks/retry-a-webhook-event"}]},{"group":"Ingestion","pages":[{"title":"Ingest a batch of products","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/ingest/products","href":"/api-reference/ingestion/ingest-a-batch-of-products"},{"title":"Get a sample product feed","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/ingest/sample","href":"/api-reference/ingestion/get-a-sample-product-feed"},{"title":"Validate a product feed (no writes)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/ingest/test","href":"/api-reference/ingestion/validate-a-product-feed-no-writes"}]},{"group":"Feeds","pages":[{"title":"Public catalog feed (JSON)","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/feeds/{store}/products.json","href":"/api-reference/feeds/public-catalog-feed-json"},{"title":"Public catalog feed (XML)","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/feeds/{store}/products.xml","href":"/api-reference/feeds/public-catalog-feed-xml"},{"title":"Store summary for AI assistants (llms.txt)","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/feeds/{store}/llms.txt","href":"/api-reference/feeds/store-summary-for-ai-assistants-llmstxt"},{"title":"Full catalog for AI assistants (llms-full.txt)","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/feeds/{store}/llms-full.txt","href":"/api-reference/feeds/full-catalog-for-ai-assistants-llms-fulltxt"},{"title":"How an AI assistant connects to a store (agent.json)","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/feeds/{store}/agent.json","href":"/api-reference/feeds/how-an-ai-assistant-connects-to-a-store-agentjson"}]},{"group":"Sandbox","pages":[{"title":"Reset your sandbox data","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/sandbox/reset","href":"/api-reference/sandbox/reset-your-sandbox-data"},{"title":"Reset your sandbox data (alias)","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/sandbox/data","href":"/api-reference/sandbox/reset-your-sandbox-data-alias"},{"title":"Fast-forward sandbox time","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/sandbox/time","href":"/api-reference/sandbox/fast-forward-sandbox-time"},{"title":"Replay a sandbox webhook event","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/sandbox/webhooks/replay","href":"/api-reference/sandbox/replay-a-sandbox-webhook-event"},{"title":"Create a sandbox promotion","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/sandbox/seed/promotion","href":"/api-reference/sandbox/create-a-sandbox-promotion"},{"title":"Create a sandbox gift card","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/sandbox/seed/gift-card","href":"/api-reference/sandbox/create-a-sandbox-gift-card"},{"title":"Create a sandbox campaign","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/sandbox/seed/campaign","href":"/api-reference/sandbox/create-a-sandbox-campaign"},{"title":"Create a sandbox B2B buyer account","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/sandbox/seed/b2b-buyer-account","href":"/api-reference/sandbox/create-a-sandbox-b2b-buyer-account"},{"title":"Create a sandbox dynamic-pricing rule","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/sandbox/seed/pricing-rule","href":"/api-reference/sandbox/create-a-sandbox-dynamic-pricing-rule"},{"title":"List sandbox stock levels","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/sandbox/stock","href":"/api-reference/sandbox/list-sandbox-stock-levels"},{"title":"Set sandbox stock levels","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/sandbox/stock","href":"/api-reference/sandbox/set-sandbox-stock-levels"},{"title":"Remove every sandbox stock level","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/sandbox/stock","href":"/api-reference/sandbox/remove-every-sandbox-stock-level"},{"title":"Remove one sandbox stock level","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/sandbox/stock/{variant_id}","href":"/api-reference/sandbox/remove-one-sandbox-stock-level"}]}]},{"tab":"TypeScript SDK","pages":[{"title":"TypeScript SDK","href":"/sdk/introduction"}]},{"tab":"Workflow Examples","pages":[{"title":"Workflow Examples","href":"/workflows/introduction"}]}]},"title":"Verify a sign-in code - Galactic Core API Documentation","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":["c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["OpenApiReferenceProvider-DKJwRUt2.js","utils-CWD_VS3u.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-oFjciODD.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-C76WsxC3.js","snippetPresets-DvPMxpX_.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-7TwLLapg.js","ApiExamples-CuNQfndH.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BVFpVUoF.js","shallow-t59Jg5Kr.js","getApiPlaygroundDisplay-C_JZ4amX.js","CodeSnippet-CLRDnx_h.js","CodeSnippets-C2myU4kc.js","getPastedJson-B-JaVXw7.js","icon-BA-iDhH3.js","MethodPill-D4qZABFp.js","DuplicateIcon-THIDKO1O.js","createIcon-CYYJwgFd.js","DynamicMarkdown-UGQuxDKp.js","SectionHeading-jYELb23h.js","axios-vUo_bRtp.js","Markdown-DKsLa3wy.js","clsx-CefdjKz2.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BaREnp3o.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-sgx_0XzF.js"]}