A provider link can exist while its stored credential is unreadable — rotated,
revoked, or written under an identity we can’t read. That stays invisible until
your first real charge fails. This check resolves the credential, so you find out
now. It never reads the secret’s value.
Not a simulation. It signs a webhook.test event and puts it through the normal
pipeline, and your endpoint must return 2xx.This is the check that replaces clicking through the buyer page in a frame: it
exercises your signature verification and raw-body handling headlessly.
It delivers to every active endpoint, not just one — so an endpoint that
silently rejects deliveries can’t hide behind a healthy one. Each run therefore
sends a webhook.test to all of them, production included. Don’t wire this into
something that runs frequently.
When it fails, the remediation matches the actual status:
Status
What it usually means
401 / 403
Rejected before verifying. Auth, CSRF or WAF middleware is blocking our POST — we send an alyte-signature header, not your app’s session or CSRF token
404
No route there. Check the path and that it accepts POST
5xx
Your handler errored — check its logs. Real deliveries retry with backoff, but this check is one-shot and reports a failure: fix it before a real purchase depends on it
400
Usually signature verification. Verify over the raw request bytes — a JSON body parser breaks a valid signature
unreachable
Check DNS, public HTTPS, and that you respond within 10 seconds
The day before your first drop, nothing is on sale — and that is exactly when
people run this for the first time. catalog_sellablewarns in that case
rather than failing, and says “this is normal before a drop”, so ok stays
true. An agent will queue a watch and buy when sales open.It only fails if the shop has no tiers at all, which really does mean there is
nothing to sell.
A queued agent watch only fires when we see availableCount ≥ the quantity it
wants. If your stock update never reached us, we still see 0, and the watch
silently never fires at the drop.This warns when a tier is on sale and we see zero. It stays quiet for tiers
whose sale hasn’t opened yet — those are legitimately zero.
our event log is append-only and is the billing source of truth, so a test
purchase would bill you for a test, permanently;
it would move your own sales totals, success rate and purchase-attempt counts —
the numbers you’re checking;
a hold decrements real stock, so a test could make a real ticket unsellable.
A run writes no event, no purchase attempt, no payment intent, and no hold.So a green run does not prove a charge will authorize. It proves the wiring a
charge depends on is in place. The scope field in the response says so.
Worth knowing so a green run isn’t read as broader than it is. Each of these
comes from a real integration that hit it:
That your tierId mapping is current. We can’t see your side. If your
mapping table is stale, a purchase can fulfil the wrong tier — resolve
fulfilment on tierId and quantity from the payment row, never by matching
the amount to a price.
That buyerRef resolves to a real buyer on your side. If that mapping is
missing, tickets can silently land on a fallback account.
That your embed origin is registered for the framed modal. Without it the
authorize page redirects instead of framing.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Alyte","description":"Sell to AI shopping agents — safely. Alyte enforces the buyer's mandate server-side and settles on your own PSP.","colors":{"primary":"#0F766E","light":"#2DD4BF","dark":"#115E59"},"logo":{"light":"https://mintcdn.com/alyte/zYPVEfYM19CTXhPe/images/alyte-lockup-node-teal.webp?fit=max\u0026auto=format\u0026n=zYPVEfYM19CTXhPe\u0026q=85\u0026s=c4801890c6a8513cc24fd83c61be4cf8","dark":"https://mintcdn.com/alyte/zYPVEfYM19CTXhPe/images/alyte-lockup-node-white.webp?fit=max\u0026auto=format\u0026n=zYPVEfYM19CTXhPe\u0026q=85\u0026s=41468f54c007cd474ab4f49099b77db9","href":"https://alytegen.com"},"favicon":"https://mintcdn.com/alyte/BZL4f73XKlkywFem/favicon.svg?fit=max\u0026auto=format\u0026n=BZL4f73XKlkywFem\u0026q=85\u0026s=779eb8caa2f4893510fda1316c49c5e8","footer":{"socials":{}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"alyte","hasAudioNarration":false,"actualSubdomain":"alyte","customDomains":[],"gitSource":{"type":"github","owner":"chris-alytegen","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"feedback":{"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6aebd3771b42271a81b4b3db","clientVersion":"0.0.4088","searchFilterCounts":[{"language":"default","tag":"API Reference","count":102},{"language":"default","tag":"API","count":102},{"language":"default","tag":"integration","count":45},{"language":"default","tag":"buyer","count":27},{"language":"default","tag":"Guides","count":23},{"language":"default","tag":"ticketing","count":10},{"language":"default","tag":"Selling and fulfilling","count":9},{"language":"default","tag":"Start here","count":6},{"language":"default","tag":"The buyer hand-off","count":5},{"language":"default","tag":"acp","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","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":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","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":"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":"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":"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":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","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":"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":"workos-sso-scim","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},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"guides/self-test","slug":"/guides/self-test","pageMetadata":{"title":"Test your integration","description":"Prove your wiring works with one API call — no browser, no test purchase","href":"/guides/self-test"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Prove your wiring works with one API call — no browser, no test purchase\"\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,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`One call tells you whether an agent purchase would reach you, and what to fix if\nit wouldn’t.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $ALYTE_BASE_URL`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/v1/integration/merchants/`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$MERCHANT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/selftest`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$ALYTE_API_TOKEN`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Or press `,_jsx(_components.strong,{children:`Test your integration`}),` on the Website integration page of your\nconsole. Both run exactly the same checks.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-you-get-back`,children:`What you get back`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`12`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`12`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"ok\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"checks\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"psp_linked\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"title\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Payment provider connected\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"status\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"pass\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"detail\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"1 provider(s) linked and the credential resolves: stripe.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"webhook_delivers\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"title\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Webhook accepted a signed delivery\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"status\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"fail\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"detail\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://yourshop.example/hooks/alyte did not (status=pending, HTTP 403)\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"remediation\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Your endpoint rejected the request before verifying it (401/403)…\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ],`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"scope\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Configuration and delivery only. No purchase is attempted…\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`ok`}),` is `,_jsx(_components.code,{children:`false`}),` if `,_jsx(_components.strong,{children:`any`}),` check fails. A `,_jsx(_components.code,{children:`warn`}),` never fails the run.`]}),`\n`,_jsx(Heading,{level:`2`,id:`the-checks`,children:`The checks`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Check`}),_jsx(_components.th,{children:`What it proves`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`shop_exists`})}),_jsx(_components.td,{children:`The shop id is yours`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`psp_linked`})}),_jsxs(_components.td,{children:[`A payment provider is linked `,_jsx(_components.strong,{children:`and its stored credential can actually be read`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`catalog_sellable`})}),_jsx(_components.td,{children:`Something is buyable right now — or, if nothing has opened yet, that you simply have not launched (a warn, not a failure)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`stock_present`})}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`(warn)`}),` No tier is on sale while we see zero stock`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`webhook_registered`})}),_jsx(_components.td,{children:`You have at least one active endpoint`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`webhook_delivers`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Every`}),` active endpoint accepts a real signed delivery`]})]})]})]}),`\n`,_jsxs(Heading,{level:`3`,id:`psp_linked-checks-more-than-“is-it-linked”`,children:[_jsx(_components.code,{children:`psp_linked`}),` checks more than “is it linked”`]}),`\n`,_jsx(_components.p,{children:`A provider link can exist while its stored credential is unreadable — rotated,\nrevoked, or written under an identity we can’t read. That stays invisible until\nyour first real charge fails. This check resolves the credential, so you find out\nnow. It never reads the secret’s value.`}),`\n`,_jsxs(Heading,{level:`3`,id:`webhook_delivers-sends-a-real-delivery`,children:[_jsx(_components.code,{children:`webhook_delivers`}),` sends a real delivery`]}),`\n`,_jsxs(_components.p,{children:[`Not a simulation. It signs a `,_jsx(_components.code,{children:`webhook.test`}),` event and puts it through the normal\npipeline, and your endpoint must return 2xx.`]}),`\n`,_jsx(_components.p,{children:`This is the check that replaces clicking through the buyer page in a frame: it\nexercises your signature verification and raw-body handling headlessly.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`It delivers to `,_jsx(_components.strong,{children:`every active endpoint`}),`, not just one — so an endpoint that\nsilently rejects deliveries can’t hide behind a healthy one. Each run therefore\nsends a `,_jsx(_components.code,{children:`webhook.test`}),` to all of them, production included. Don’t wire this into\nsomething that runs frequently.`]})}),`\n`,_jsxs(_components.p,{children:[`When it fails, the remediation matches the `,_jsx(_components.strong,{children:`actual`}),` status:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Status`}),_jsx(_components.th,{children:`What it usually means`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`401 / 403`}),_jsxs(_components.td,{children:[`Rejected before verifying. Auth, CSRF or WAF middleware is blocking our POST — we send an `,_jsx(_components.code,{children:`alyte-signature`}),` header, not your app’s session or CSRF token`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`404`}),_jsx(_components.td,{children:`No route there. Check the path and that it accepts POST`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`5xx`}),_jsx(_components.td,{children:`Your handler errored — check its logs. Real deliveries retry with backoff, but this check is one-shot and reports a failure: fix it before a real purchase depends on it`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`400`}),_jsxs(_components.td,{children:[`Usually signature verification. Verify over the `,_jsx(_components.strong,{children:`raw`}),` request bytes — a JSON body parser breaks a valid signature`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`unreachable`}),_jsx(_components.td,{children:`Check DNS, public HTTPS, and that you respond within 10 seconds`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`pre-launch-shops-are-not-broken-shops`,children:`Pre-launch shops are not broken shops`}),`\n`,_jsxs(_components.p,{children:[`The day before your first drop, nothing is on sale — and that is exactly when\npeople run this for the first time. `,_jsx(_components.code,{children:`catalog_sellable`}),` `,_jsx(_components.strong,{children:`warns`}),` in that case\nrather than failing, and says “this is normal before a drop”, so `,_jsx(_components.code,{children:`ok`}),` stays\n`,_jsx(_components.code,{children:`true`}),`. An agent will queue a watch and buy when sales open.`]}),`\n`,_jsxs(_components.p,{children:[`It only `,_jsx(_components.em,{children:`fails`}),` if the shop has no tiers at all, which really does mean there is\nnothing to sell.`]}),`\n`,_jsxs(Heading,{level:`3`,id:`stock_present-is-a-warning-worth-reading`,children:[_jsx(_components.code,{children:`stock_present`}),` is a warning worth reading`]}),`\n`,_jsxs(_components.p,{children:[`A queued agent watch only fires when we see `,_jsx(_components.code,{children:`availableCount`}),` ≥ the quantity it\nwants. If your stock update never reached us, we still see `,_jsx(_components.code,{children:`0`}),`, and the watch\nsilently never fires at the drop.`]}),`\n`,_jsxs(_components.p,{children:[`This warns when a tier is `,_jsx(_components.strong,{children:`on sale and we see zero`}),`. It stays quiet for tiers\nwhose sale hasn’t opened yet — those are legitimately zero.`]}),`\n`,_jsx(Heading,{level:`2`,id:`it-never-buys-anything`,children:`It never buys anything`}),`\n`,_jsx(_components.p,{children:`That’s a guarantee, not a limitation:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`our event log is append-only and is the `,_jsx(_components.strong,{children:`billing source of truth`}),`, so a test\npurchase would bill you for a test, permanently;`]}),`\n`,_jsx(_components.li,{children:`it would move your own sales totals, success rate and purchase-attempt counts —\nthe numbers you’re checking;`}),`\n`,_jsx(_components.li,{children:`a hold decrements real stock, so a test could make a real ticket unsellable.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`A run writes no event, no purchase attempt, no payment intent, and no hold.`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`So a green run does not prove a charge will authorize.`}),` It proves the wiring a\ncharge depends on is in place. The `,_jsx(_components.code,{children:`scope`}),` field in the response says so.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-it-does-not-check`,children:`What it does NOT check`}),`\n`,_jsx(_components.p,{children:`Worth knowing so a green run isn’t read as broader than it is. Each of these\ncomes from a real integration that hit it:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`That your `,_jsx(_components.code,{children:`tierId`}),` mapping is current.`]}),` We can’t see your side. If your\nmapping table is stale, a purchase can fulfil the wrong tier — resolve\nfulfilment on `,_jsx(_components.code,{children:`tierId`}),` and `,_jsx(_components.code,{children:`quantity`}),` from the payment row, never by matching\nthe amount to a price.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`That `,_jsx(_components.code,{children:`buyerRef`}),` resolves to a real buyer on your side.`]}),` If that mapping is\nmissing, tickets can silently land on a fallback account.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`That your embed origin is registered`}),` for the framed modal. Without it the\nauthorize page redirects instead of framing.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`when-to-run-it`,children:`When to run it`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`After first setup, before you expect an agent purchase.`}),`\n`,_jsx(_components.li,{children:`After rotating a webhook secret or a provider key.`}),`\n`,_jsx(_components.li,{children:`After changing your webhook URL or its middleware.`}),`\n`,_jsxs(_components.li,{children:[`When a buyer says an agent didn’t buy — together with\n`,_jsx(_components.a,{href:`/guides/first-integration`,children:`the watch lookup in Your first integration`}),`.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Test your integration","description":"Prove your wiring works with one API call — no browser, no test purchase","href":"/guides/self-test"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What you get back","slug":"what-you-get-back","depth":2,"children":[]},{"title":"The checks","slug":"the-checks","depth":2,"children":[{"title":"psp_linked checks more than “is it linked”","slug":"psp_linked-checks-more-than-“is-it-linked”","depth":3,"children":[]},{"title":"webhook_delivers sends a real delivery","slug":"webhook_delivers-sends-a-real-delivery","depth":3,"children":[]},{"title":"Pre-launch shops are not broken shops","slug":"pre-launch-shops-are-not-broken-shops","depth":3,"children":[]},{"title":"stock_present is a warning worth reading","slug":"stock_present-is-a-warning-worth-reading","depth":3,"children":[]}]},{"title":"It never buys anything","slug":"it-never-buys-anything","depth":2,"children":[]},{"title":"What it does NOT check","slug":"what-it-does-not-check","depth":2,"children":[]},{"title":"When to run it","slug":"when-to-run-it","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"alyte","siteName":"Alyte","title":"Test your integration - Alyte","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-14T07:19:48.722Z","originalFileLocation":"guides/self-test.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=\"Prove your wiring works with one API call — no browser, no test purchase\">\u003cmeta data-mint-head name=\"application-name\" content=\"Alyte\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/alyte/_6KiA9xTSyg78EnN/_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/alyte/_6KiA9xTSyg78EnN/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/alyte/_6KiA9xTSyg78EnN/_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/alyte/_6KiA9xTSyg78EnN/_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/alyte/_6KiA9xTSyg78EnN/_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/alyte/_6KiA9xTSyg78EnN/_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/alyte/_6KiA9xTSyg78EnN/_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/alyte/_6KiA9xTSyg78EnN/_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/alyte/_6KiA9xTSyg78EnN/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Test your integration - Alyte\">\u003cmeta data-mint-head property=\"og:description\" content=\"Prove your wiring works with one API call — no browser, no test purchase\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Alyte\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://alyte.mintlify.app/guides/self-test\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://alyte.mintlify.site/_mintlify/api/og/v2?division=Selling+and+fulfilling\u0026amp;title=Test+your+integration\u0026amp;description=Prove+your+wiring+works+with+one+API+call+%E2%80%94+no+browser%2C+no+test+purchase\u0026amp;theme=ce031e5908e28e8d97a02809\u0026amp;signature=171d5e6690452a52b932cb535f1b30af05404f14f81ee75af4a255f0d5724f64\">\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=\"Test your integration - Alyte\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Prove your wiring works with one API call — no browser, no test purchase\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://alyte.mintlify.site/_mintlify/api/og/v2?division=Selling+and+fulfilling\u0026amp;title=Test+your+integration\u0026amp;description=Prove+your+wiring+works+with+one+API+call+%E2%80%94+no+browser%2C+no+test+purchase\u0026amp;theme=ce031e5908e28e8d97a02809\u0026amp;signature=171d5e6690452a52b932cb535f1b30af05404f14f81ee75af4a255f0d5724f64\">\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/alyte/_6KiA9xTSyg78EnN/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Alyte\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0F766E\">\u003clink data-mint-head rel=\"canonical\" href=\"https://alyte.mintlify.app/guides/self-test\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/self-test.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://alyte.mintlify.app/#organization\",\"name\":\"Alyte\",\"url\":\"https://alyte.mintlify.app\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/alyte/zYPVEfYM19CTXhPe/images/alyte-lockup-node-teal.webp?fit=max\u0026auto=format\u0026n=zYPVEfYM19CTXhPe\u0026q=85\u0026s=c4801890c6a8513cc24fd83c61be4cf8\"}},{\"@type\":\"WebSite\",\"@id\":\"https://alyte.mintlify.app#website\",\"name\":\"Alyte\",\"url\":\"https://alyte.mintlify.app\",\"publisher\":{\"@id\":\"https://alyte.mintlify.app/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://alyte.mintlify.app/guides/self-test#webpage\",\"url\":\"https://alyte.mintlify.app/guides/self-test\",\"name\":\"Test your integration\",\"description\":\"Prove your wiring works with one API call — no browser, no test purchase\",\"dateModified\":\"2026-10-14T07:19:48.722Z\",\"isPartOf\":{\"@id\":\"https://alyte.mintlify.app#website\"},\"breadcrumb\":{\"@id\":\"https://alyte.mintlify.app/guides/self-test#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://alyte.mintlify.app/guides/self-test#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Alyte\",\"item\":\"https://alyte.mintlify.app\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Test your integration\",\"item\":\"https://alyte.mintlify.app/guides/self-test\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://alyte.mintlify.app/guides/self-test#article\",\"headline\":\"Test your integration\",\"name\":\"Test your integration\",\"description\":\"Prove your wiring works with one API call — no browser, no test purchase\",\"url\":\"https://alyte.mintlify.app/guides/self-test\",\"mainEntityOfPage\":{\"@id\":\"https://alyte.mintlify.app/guides/self-test#webpage\"},\"dateModified\":\"2026-10-14T07:19:48.722Z\",\"publisher\":{\"@id\":\"https://alyte.mintlify.app/#organization\"},\"isPartOf\":{\"@id\":\"https://alyte.mintlify.app#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Alyte\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Alyte","nav":{"global":null,"tabs":[{"tab":"Guides","groups":[{"group":"Start here","pages":[{"title":"What Alyte does","mode":"wide","href":""},{"title":"Getting access","href":"/guides/getting-access"},{"title":"Console and API keys","href":"/guides/console-api-keys"},{"title":"Quickstart","href":"/guides/quickstart"},{"title":"Your first integration","href":"/guides/first-integration"},{"title":"What's new","href":"/guides/changelog"}]},{"group":"The buyer hand-off","pages":[{"title":"Bring your own auth","href":"/guides/buyer-sessions"},{"title":"Embedded authorize","href":"/guides/embedded-authorize"},{"title":"Buyer purchases inside your chat","href":"/guides/chat-consent"},{"title":"Browser access and CORS","href":"/guides/browser-api"},{"title":"Conversational shopfront","description":"Wire a chat assistant to agent-governed buying — the chat proposes, the buyer disposes","href":"/guides/conversational-shopfront"}]},{"group":"Selling and fulfilling","pages":[{"title":"Test your integration","href":"/guides/self-test"},{"title":"Connect Adyen (sandbox)","description":"Link an Adyen test account to a shop: the credentials, the two origin lists that are easy to confuse, the signed webhook, what the console checks on save, and how Adyen payments report.","href":"/guides/connect-adyen"},{"title":"Inventory \u0026 fulfilment","href":"/guides/inventory-and-fulfilment"},{"title":"Shared inventory and venue locations","href":"/guides/shared-inventory"},{"title":"Early access and membership","href":"/guides/access-rules"},{"title":"Ticket limits per customer","href":"/guides/purchase-limits"},{"title":"Webhooks","href":"/guides/webhooks"},{"title":"What an agent purchase actually does","href":"/guides/lifecycle"},{"title":"Errors","href":"/guides/errors"}]},{"group":"For agent developers","pages":[{"title":"The agent buy path","href":"/guides/agent-buy"},{"title":"Getting discovered","href":"/guides/discovery"},{"title":"Signed requests (bring your own agent)","href":"/guides/signed-requests"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/catalog/list-merchants-tenant-scoped-catalogue"}]}]},"basePath":"","title":"Test your integration - Alyte","buildId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","deploymentId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","dynamics":[],"chunks":[]}