Find-or-create customer + post transaction in one call
Resolves the customer in this fixed priority order:
customer_id → tenant-scoped Perkstar customer
card_serial → POS barcode or legacy pass serial → customer
external_ref → (orgId, externalRef) lookup
email (case-insensitive)
phone (normalised E.164 with a legacy raw-value fallback)
First match wins. On miss, creates a customer when
create_customer_if_missing is true (the default). A missing
customer_id alone returns 404 instead of creating a replacement.
The transaction.external_transaction_id field is enforced as
permanently unique per (orgId, externalTransactionId). An exact
retry with the same canonical target, type, amount, and request fields
returns the existing transaction at HTTP 200 instead of
double-crediting, no matter how long has passed. Reusing the id for a
different request returns 409 external_transaction_id_conflict. Use
this for POS-side stable ids (Toast order #s, Shopify checkout ids,
Square payment ids). Test and live transactions cannot share the same
value; a cross-environment replay is rejected with 422. Provider-owned
prefixes such as sq_payment_ are reserved for managed integrations;
use a namespace owned by your app.
Idempotency-Key (24h replay cache) and
external_transaction_id (permanent dedupe) coexist — use
both for full robustness.
With a test credential this endpoint never creates a customer or
enrolment. Resolve an existing record and card first, then post the
isolated transaction. A missing customer or enrolment returns 404.
POST
https://dashboard.perkstar.co.uk/api/v1
/
marketplace
/
accrue
Find-or-create customer + post transaction in one call
Customer identifier block. At least ONE field must be present.
Resolution order is fixed: customer_id → card_serial → external_ref → email
→ phone. First match wins.
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"Perkstar Developers","description":"Build reliable loyalty, POS, CRM, and commerce integrations with the Perkstar API.","colors":{"primary":"#016aff","light":"#4d9cff","dark":"#0057cc"},"logo":{"light":"https://mintcdn.com/perkstar/cSs38e1N7hKdOyBb/assets/perkstar-black.png?fit=max\u0026auto=format\u0026n=cSs38e1N7hKdOyBb\u0026q=85\u0026s=9009fe116cd8146719a3c0368f5a4299","dark":"https://mintcdn.com/perkstar/cSs38e1N7hKdOyBb/assets/perkstar-white.png?fit=max\u0026auto=format\u0026n=cSs38e1N7hKdOyBb\u0026q=85\u0026s=8a71101c6fec8f57730a974146eaf51c","href":"/"},"favicon":"https://mintcdn.com/perkstar/cSs38e1N7hKdOyBb/assets/icon-192.png?fit=max\u0026auto=format\u0026n=cSs38e1N7hKdOyBb\u0026q=85\u0026s=1b1d0c7df8f8f21ff3826225b420f55b","api":{"params":{"expanded":"closed"},"playground":{"display":"interactive","proxy":false,"credentials":false},"examples":{"defaults":"required","languages":["curl","javascript","python","php"],"prefill":true,"autogenerate":true},"url":"full"},"appearance":{"default":"light"},"navbar":{"primary":{"type":"button","label":"Open dashboard","href":"https://dashboard.perkstar.co.uk"}},"search":{"prompt":"Search guides and API reference"},"seo":{"organization":{"name":"Perkstar","url":"https://perkstar.co.uk","logo":"https://dashboard.perkstar.co.uk/brand/perkstar-black.png"},"indexing":"navigable"},"contextual":{"options":["copy","download-spec","chatgpt","claude"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"perkstar","hasAudioNarration":false,"actualSubdomain":"perkstar","customDomains":["developers.perkstar.co.uk"],"gitSource":{"type":"github","owner":"themecartel","repo":"perkstar-platform","deployBranch":"main","contentDirectory":"developer-docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ad034ced3e1fa76c9a9243d","collectionId":"c4e61674-2704-4447-84da-3599dd25c8a8","liveDeploymentHistoryId":"6ad034ced3e1fa76c9a9243d","schemaVersion":"v3"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ad034ced3e1fa76c9a9243d","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"default","tag":"Integrations","count":56},{"language":"default","tag":"API reference","count":28},{"language":"default","tag":"Guides","count":21},{"language":"default","tag":"Availability and existing connections","count":16},{"language":"default","tag":"Limited and planned providers","count":16},{"language":"default","tag":"Automation","count":14},{"language":"default","tag":"Point of sale","count":10},{"language":"default","tag":"Integration recipes","count":7},{"language":"default","tag":"Make","count":7},{"language":"default","tag":"Zapier","count":7}]},"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":"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":"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":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call","slug":"/api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call","pageMetadata":{"title":"Find-or-create customer + post transaction in one call","description":"Resolves the customer in this fixed priority order:\n 1. customer_id → tenant-scoped Perkstar customer\n 2. card_serial → POS barcode or legacy pass serial → customer\n 3. external_ref → (orgId, externalRef) lookup\n 4. email (case-insensitive)\n 5. phone (normalised E.164 with a legacy raw-value fallback)\n\nFirst match wins. On miss, creates a customer when\n`create_customer_if_missing` is true (the default). A missing\n`customer_id` alone returns 404 instead of creating a replacement.\n\nThe `transaction.external_transaction_id` field is enforced as\npermanently unique per `(orgId, externalTransactionId)`. An exact\nretry with the same canonical target, type, amount, and request fields\nreturns the existing transaction at HTTP 200 instead of\ndouble-crediting, no matter how long has passed. Reusing the id for a\ndifferent request returns `409 external_transaction_id_conflict`. Use\nthis for POS-side stable ids (Toast order #s, Shopify checkout ids,\nSquare payment ids). Test and live transactions cannot share the same\nvalue; a cross-environment replay is rejected with 422. Provider-owned\nprefixes such as `sq_payment_` are reserved for managed integrations;\nuse a namespace owned by your app.\n\n`Idempotency-Key` (24h replay cache) and\n`external_transaction_id` (permanent dedupe) coexist — use\nboth for full robustness.\n\nWith a test credential this endpoint never creates a customer or\nenrolment. Resolve an existing record and card first, then post the\nisolated transaction. A missing customer or enrolment returns 404.\n","deprecated":null,"version":null,"openapi":"/api/openapi.yaml post /marketplace/accrue","href":"/api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call","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 li: \"li\",\n ol: \"ol\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Resolves the customer in this fixed priority order:\"\n }), \"\\n\", _jsxs(_components.ol, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"customer_id → tenant-scoped Perkstar customer\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"card_serial → POS barcode or legacy pass serial → customer\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"external_ref → (orgId, externalRef) lookup\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"email (case-insensitive)\"\n }), \"\\n\", _jsx(_components.li, {\n children: \"phone (normalised E.164 with a legacy raw-value fallback)\"\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"First match wins. On miss, creates a customer when\\n\", _jsx(_components.code, {\n children: \"create_customer_if_missing\"\n }), \" is true (the default). A missing\\n\", _jsx(_components.code, {\n children: \"customer_id\"\n }), \" alone returns 404 instead of creating a replacement.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The \", _jsx(_components.code, {\n children: \"transaction.external_transaction_id\"\n }), \" field is enforced as\\npermanently unique per \", _jsx(_components.code, {\n children: \"(orgId, externalTransactionId)\"\n }), \". An exact\\nretry with the same canonical target, type, amount, and request fields\\nreturns the existing transaction at HTTP 200 instead of\\ndouble-crediting, no matter how long has passed. Reusing the id for a\\ndifferent request returns \", _jsx(_components.code, {\n children: \"409 external_transaction_id_conflict\"\n }), \". Use\\nthis for POS-side stable ids (Toast order #s, Shopify checkout ids,\\nSquare payment ids). Test and live transactions cannot share the same\\nvalue; a cross-environment replay is rejected with 422. Provider-owned\\nprefixes such as \", _jsx(_components.code, {\n children: \"sq_payment_\"\n }), \" are reserved for managed integrations;\\nuse a namespace owned by your app.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"Idempotency-Key\"\n }), \" (24h replay cache) and\\n\", _jsx(_components.code, {\n children: \"external_transaction_id\"\n }), \" (permanent dedupe) coexist — use\\nboth for full robustness.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"With a test credential this endpoint never creates a customer or\\nenrolment. Resolve an existing record and card first, then post the\\nisolated transaction. A missing customer or enrolment returns 404.\"\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":"Find-or-create customer + post transaction in one call","description":"Resolves the customer in this fixed priority order:\n 1. customer_id → tenant-scoped Perkstar customer\n 2. card_serial → POS barcode or legacy pass serial → customer\n 3. external_ref → (orgId, externalRef) lookup\n 4. email (case-insensitive)\n 5. phone (normalised E.164 with a legacy raw-value fallback)\n\nFirst match wins. On miss, creates a customer when\n`create_customer_if_missing` is true (the default). A missing\n`customer_id` alone returns 404 instead of creating a replacement.\n\nThe `transaction.external_transaction_id` field is enforced as\npermanently unique per `(orgId, externalTransactionId)`. An exact\nretry with the same canonical target, type, amount, and request fields\nreturns the existing transaction at HTTP 200 instead of\ndouble-crediting, no matter how long has passed. Reusing the id for a\ndifferent request returns `409 external_transaction_id_conflict`. Use\nthis for POS-side stable ids (Toast order #s, Shopify checkout ids,\nSquare payment ids). Test and live transactions cannot share the same\nvalue; a cross-environment replay is rejected with 422. Provider-owned\nprefixes such as `sq_payment_` are reserved for managed integrations;\nuse a namespace owned by your app.\n\n`Idempotency-Key` (24h replay cache) and\n`external_transaction_id` (permanent dedupe) coexist — use\nboth for full robustness.\n\nWith a test credential this endpoint never creates a customer or\nenrolment. Resolve an existing record and card first, then post the\nisolated transaction. A missing customer or enrolment returns 404.\n","deprecated":null,"version":null,"openapi":"/api/openapi.yaml post /marketplace/accrue","href":"/api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Find-or-create customer + post transaction in one call","operationId":"marketplaceAccrue","tags":["Marketplace"],"description":"Resolves the customer in this fixed priority order:\n 1. customer_id → tenant-scoped Perkstar customer\n 2. card_serial → POS barcode or legacy pass serial → customer\n 3. external_ref → (orgId, externalRef) lookup\n 4. email (case-insensitive)\n 5. phone (normalised E.164 with a legacy raw-value fallback)\n\nFirst match wins. On miss, creates a customer when\n`create_customer_if_missing` is true (the default). A missing\n`customer_id` alone returns 404 instead of creating a replacement.\n\nThe `transaction.external_transaction_id` field is enforced as\npermanently unique per `(orgId, externalTransactionId)`. An exact\nretry with the same canonical target, type, amount, and request fields\nreturns the existing transaction at HTTP 200 instead of\ndouble-crediting, no matter how long has passed. Reusing the id for a\ndifferent request returns `409 external_transaction_id_conflict`. Use\nthis for POS-side stable ids (Toast order #s, Shopify checkout ids,\nSquare payment ids). Test and live transactions cannot share the same\nvalue; a cross-environment replay is rejected with 422. Provider-owned\nprefixes such as `sq_payment_` are reserved for managed integrations;\nuse a namespace owned by your app.\n\n`Idempotency-Key` (24h replay cache) and\n`external_transaction_id` (permanent dedupe) coexist — use\nboth for full robustness.\n\nWith a test credential this endpoint never creates a customer or\nenrolment. Resolve an existing record and card first, then post the\nisolated transaction. A missing customer or enrolment returns 404.\n","security":["ae6a47ac-3160-4036-b566-742936022c37"],"parameters":["e983ed0b-5afd-47d7-80e4-86de41731950"],"requestBody":"1ee0d07d-ca97-4d0e-98b1-41981df8b0e7","responses":{"200":"d4a3e27a-c436-4739-a2f0-5635ec16263d","201":"b75ab3fb-e2f0-438f-84fd-f52e660bee29","400":"42fccf6c-9777-4552-8282-69d573e4355d","401":"aa2b5647-c664-4e35-be0e-26f2538da032","403":"92bc2a26-b2be-43f6-b257-7887fc09ae86","404":"f644c77f-41f1-41ab-bd25-f06b110de2d7","409":"d41d4bd4-0f54-44b2-b9ea-0c687299f771","422":"30c94008-68e5-4981-a661-12eac94a0be3","429":"030fa992-27d1-44e5-b2c9-6ecf1726918f"},"method":"post","type":"path","servers":["b5c9d190-583a-4d83-b1a3-29580ce30ee1"],"path":"/marketplace/accrue","baseUrlOptions":["https://dashboard.perkstar.co.uk/api/v1"],"title":"Find-or-create customer + post transaction in one call","codeSamples":[],"requestExampleLanguages":["bash","javascript","python","php"],"requiredOnlyExamples":true,"requestExampleType":"generated","responseExampleType":"generated","prefillPlaygroundWithExample":true,"prefillPlaygroundExamples":[{"body.identifier.customer_id":"\u003cstring>","body.identifier.phone":"\u003cstring>","body.identifier.email":"jsmith@example.com","body.identifier.external_ref":"\u003cstring>","body.identifier.card_serial":"\u003cstring>","body.transaction.amount_pence":1,"body.transaction.delta":123,"body.transaction.external_transaction_id":"\u003cstring>","body.transaction.note":"\u003cstring>","body.transaction.metadata":{},"body.card_id":"\u003cstring>","body.create_customer_if_missing":true,"body.customer_fields.name":"\u003cstring>","body.customer_fields.first_name":"\u003cstring>","body.customer_fields.last_name":"\u003cstring>","body.customer_fields.email":"jsmith@example.com","body.customer_fields.phone":"\u003cstring>"}],"disableProxy":true,"urlDisplay":"full"},"dependencies":{"parameters":{"e983ed0b-5afd-47d7-80e4-86de41731950":{"in":"header","name":"Idempotency-Key","schema":{"type":"string","maxLength":255,"description":"Replay-safe request key. Repeated requests with the same value\nwithin 24h return the original response unchanged.\n","uniqueKey":"","typeLabel":"string"},"description":"Replay-safe request key. Repeated requests with the same value\nwithin 24h return the original response unchanged.\n"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["identifier","transaction"],"properties":{"identifier":{"type":"object","description":"Customer identifier block. At least ONE field must be present.\nResolution order is fixed: customer_id → card_serial → external_ref → email\n→ phone. First match wins.\n","properties":{"customer_id":{"type":"string","description":"Opaque Perkstar Customer ID. It is always scoped to the connected\nbusiness and cannot create a replacement customer when missing.\n","uniqueKey":"identifier.customer_id","typeLabel":"string"},"phone":{"type":"string","uniqueKey":"identifier.phone","typeLabel":"string"},"email":{"type":"string","format":"email","uniqueKey":"identifier.email","typeLabel":"string\u003cemail>"},"external_ref":{"type":"string","description":"Partner-supplied id (Shopify customer GID, Toast guest\nUUID). Resolves via the unique `(orgId, externalRef)`\ncustomer index.\n","uniqueKey":"identifier.external_ref","typeLabel":"string"},"card_serial":{"type":"string","description":"Stable POS barcode or legacy wallet-pass serial scanned at\nthe till. Resolves to the customer who owns the active pass.\n","uniqueKey":"identifier.card_serial","typeLabel":"string"}},"isRequired":true,"uniqueKey":"identifier","typeLabel":"object"},"transaction":{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["STAMP","REDEEM","CHECK_IN","DISCOUNT","POINTS"],"description":"Wire-level type. STAMP / REDEEM map directly. CHECK_IN\nis STAMP-on-STAMP-or-MULTIPASS. DISCOUNT is for\nCASHBACK / DISCOUNT cards (requires `amount_pence`).\nPOINTS is for POINTS cards. Card-type mismatches 422.\n","isRequired":true,"uniqueKey":"transaction.type","typeLabel":"enum\u003cstring>"},"amount_pence":{"type":"integer","minimum":0,"uniqueKey":"transaction.amount_pence","typeLabel":"integer"},"delta":{"type":"number","multipleOf":0.01,"maximum":100000,"description":"Positive count for STAMP / REDEEM (default 1). POINTS\ntransactions may use up to two decimal places.\n","uniqueKey":"transaction.delta","typeLabel":"number"},"external_transaction_id":{"type":"string","maxLength":180,"description":"Permanent dedupe key. Subsequent accrue calls with the\nsame id return the existing transaction at HTTP 200.\n","uniqueKey":"transaction.external_transaction_id","typeLabel":"string"},"note":{"type":"string","maxLength":280,"uniqueKey":"transaction.note","typeLabel":"string"},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form metadata. `metadata.locationId` is extracted\nand persisted on `Transaction.locationId` (must\nreference a Location in this org).\n","uniqueKey":"transaction.metadata","typeLabel":"object"}},"isRequired":true,"uniqueKey":"transaction","typeLabel":"object"},"card_id":{"type":"string","description":"Optional. Defaults to the org's single ACTIVE card. If\nmultiple ACTIVE cards exist, this is required (else 400\n`ambiguous_default_card`).\n","uniqueKey":"card_id","typeLabel":"string"},"create_customer_if_missing":{"type":"boolean","default":true,"uniqueKey":"create_customer_if_missing","typeLabel":"boolean"},"customer_fields":{"type":"object","description":"Fields used when create_customer_if_missing is true and no\nexisting customer matches the identifier.\n","properties":{"name":{"type":"string","description":"First-whitespace-split into first_name / last_name.","uniqueKey":"customer_fields.name","typeLabel":"string"},"first_name":{"type":"string","uniqueKey":"customer_fields.first_name","typeLabel":"string"},"last_name":{"type":"string","uniqueKey":"customer_fields.last_name","typeLabel":"string"},"email":{"type":"string","format":"email","uniqueKey":"customer_fields.email","typeLabel":"string\u003cemail>"},"phone":{"type":"string","uniqueKey":"customer_fields.phone","typeLabel":"string"}},"uniqueKey":"customer_fields","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"identifier":{"customer_id":"\u003cstring>","phone":"\u003cstring>","email":"jsmith@example.com","external_ref":"\u003cstring>","card_serial":"\u003cstring>"},"transaction":{"amount_pence":1,"delta":123,"external_transaction_id":"\u003cstring>","note":"\u003cstring>","metadata":{}},"card_id":"\u003cstring>","create_customer_if_missing":true,"customer_fields":{"name":"\u003cstring>","first_name":"\u003cstring>","last_name":"\u003cstring>","email":"jsmith@example.com","phone":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"d4a3e27a-c436-4739-a2f0-5635ec16263d":{"description":"Existing transaction returned (external_transaction_id\ndedup hit).\n","content":{"application/json":{"schema":{"type":"object","properties":{"customer":{"type":"object","properties":{"id":{"type":"string","uniqueKey":"customer.id","typeLabel":"string"},"customer_number":{"type":"integer","uniqueKey":"customer.customer_number","typeLabel":"integer"},"email":{"oneOf":[{"type":"string","uniqueKey":"customer.email.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"customer.email.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.email","typeLabel":"string | null"},"phone":{"oneOf":[{"type":"string","uniqueKey":"customer.phone.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"customer.phone.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.phone","typeLabel":"string | null"},"first_name":{"oneOf":[{"type":"string","uniqueKey":"customer.first_name.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"customer.first_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.first_name","typeLabel":"string | null"},"last_name":{"oneOf":[{"type":"string","uniqueKey":"customer.last_name.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"customer.last_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.last_name","typeLabel":"string | null"},"date_of_birth":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"customer.date_of_birth.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"customer.date_of_birth.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.date_of_birth","typeLabel":"string\u003cdate-time> | null"},"consent_marketing":{"type":"boolean","uniqueKey":"customer.consent_marketing","typeLabel":"boolean"},"consent_ad_tracking":{"type":"boolean","uniqueKey":"customer.consent_ad_tracking","typeLabel":"boolean"},"external_ref":{"oneOf":[{"type":"string","description":"Partner-supplied identifier (Shopify customer GID, Toast\nguest UUID, Square customer id, …). Unique per org. POST\n`/customers` upserts on this when supplied.\n","uniqueKey":"customer.external_ref.oneOf.0","typeLabel":"string"},{"type":"null","description":"Partner-supplied identifier (Shopify customer GID, Toast\nguest UUID, Square customer id, …). Unique per org. POST\n`/customers` upserts on this when supplied.\n","uniqueKey":"customer.external_ref.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.external_ref","typeLabel":"string | null"},"anonymized_at":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"customer.anonymized_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"customer.anonymized_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.anonymized_at","typeLabel":"string\u003cdate-time> | null"},"deleted_at":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"customer.deleted_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"customer.deleted_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.deleted_at","typeLabel":"string\u003cdate-time> | null"},"created_at":{"type":"string","format":"date-time","uniqueKey":"customer.created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","uniqueKey":"customer.updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"customer","typeLabel":"object"},"enrollment":{"type":"object","properties":{"id":{"type":"string","uniqueKey":"enrollment.id","typeLabel":"string"},"customer_id":{"type":"string","uniqueKey":"enrollment.customer_id","typeLabel":"string"},"card_id":{"type":"string","uniqueKey":"enrollment.card_id","typeLabel":"string"},"status":{"type":"string","enum":["ACTIVE","INACTIVE","REVOKED"],"uniqueKey":"enrollment.status","typeLabel":"enum\u003cstring>"},"balance":{"type":"number","multipleOf":0.01,"uniqueKey":"enrollment.balance","typeLabel":"number"},"redemptions_count":{"type":"integer","uniqueKey":"enrollment.redemptions_count","typeLabel":"integer"},"cumulative_spend_pence":{"type":"integer","uniqueKey":"enrollment.cumulative_spend_pence","typeLabel":"integer"},"bonus_points_balance":{"type":"integer","uniqueKey":"enrollment.bonus_points_balance","typeLabel":"integer"},"enrolled_at":{"type":"string","format":"date-time","uniqueKey":"enrollment.enrolled_at","typeLabel":"string\u003cdate-time>"},"last_activity_at":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"enrollment.last_activity_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"enrollment.last_activity_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrollment.last_activity_at","typeLabel":"string\u003cdate-time> | null"},"wallet_passes":{"oneOf":[{"description":"Install URLs for the Apple / Google wallet passes\nattached to this enrollment. Null when no passes have\nbeen issued yet (poll `GET /enrollments/{id}` to pick\nthem up later). Per-platform values may be null when\nthat platform's credentials aren't configured for the\norg. Always reuse these URLs — never reconstruct them.\n","type":"object","properties":{"apple":{"oneOf":[{"type":"string","description":"pkpass download URL.","uniqueKey":"enrollment.wallet_passes.oneOf.0.apple.oneOf.0","typeLabel":"string"},{"type":"null","description":"pkpass download URL.","uniqueKey":"enrollment.wallet_passes.oneOf.0.apple.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrollment.wallet_passes.oneOf.0.apple","typeLabel":"string | null"},"google":{"oneOf":[{"type":"string","description":"Freshly-signed Add-to-Wallet save link\n(`https://pay.google.com/gp/v/save/\u003cjwt>`).\n","uniqueKey":"enrollment.wallet_passes.oneOf.0.google.oneOf.0","typeLabel":"string"},{"type":"null","description":"Freshly-signed Add-to-Wallet save link\n(`https://pay.google.com/gp/v/save/\u003cjwt>`).\n","uniqueKey":"enrollment.wallet_passes.oneOf.0.google.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrollment.wallet_passes.oneOf.0.google","typeLabel":"string | null"}},"uniqueKey":"enrollment.wallet_passes.oneOf.0","typeLabel":"object"},{"description":"Install URLs for the Apple / Google wallet passes\nattached to this enrollment. Null when no passes have\nbeen issued yet (poll `GET /enrollments/{id}` to pick\nthem up later). Per-platform values may be null when\nthat platform's credentials aren't configured for the\norg. Always reuse these URLs — never reconstruct them.\n","type":"null","properties":{"apple":{"oneOf":[{"type":"string","description":"pkpass download URL."},{"type":"null","description":"pkpass download URL."}]},"google":{"oneOf":[{"type":"string","description":"Freshly-signed Add-to-Wallet save link\n(`https://pay.google.com/gp/v/save/\u003cjwt>`).\n"},{"type":"null","description":"Freshly-signed Add-to-Wallet save link\n(`https://pay.google.com/gp/v/save/\u003cjwt>`).\n"}]}},"uniqueKey":"enrollment.wallet_passes.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrollment.wallet_passes","typeLabel":"object | null"}},"uniqueKey":"enrollment","typeLabel":"object"},"transaction":{"type":"object","properties":{"id":{"type":"string","uniqueKey":"transaction.id","typeLabel":"string"},"enrollment_id":{"type":"string","uniqueKey":"transaction.enrollment_id","typeLabel":"string"},"type":{"type":"string","enum":["STAMP","REDEEM","ADJUST"],"uniqueKey":"transaction.type","typeLabel":"enum\u003cstring>"},"source":{"type":"string","enum":["SCANNER","POS","API","ADJUST","DASHBOARD","LEGACY_IMPORT","TAP"],"uniqueKey":"transaction.source","typeLabel":"enum\u003cstring>"},"delta":{"type":"number","multipleOf":0.01,"uniqueKey":"transaction.delta","typeLabel":"number"},"amount_pence":{"oneOf":[{"type":"integer","uniqueKey":"transaction.amount_pence.oneOf.0","typeLabel":"integer"},{"type":"null","uniqueKey":"transaction.amount_pence.oneOf.1","typeLabel":"null"}],"uniqueKey":"transaction.amount_pence","typeLabel":"integer | null"},"note":{"oneOf":[{"type":"string","uniqueKey":"transaction.note.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"transaction.note.oneOf.1","typeLabel":"null"}],"uniqueKey":"transaction.note","typeLabel":"string | null"},"external_id":{"oneOf":[{"type":"string","uniqueKey":"transaction.external_id.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"transaction.external_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"transaction.external_id","typeLabel":"string | null"},"external_transaction_id":{"oneOf":[{"type":"string","description":"Partner-supplied stable identifier (Toast order id,\nShopify checkout id, Square payment id). When set on\ncreate via `POST /transactions` or\n`POST /marketplace/accrue`, the unique\n`(orgId, externalTransactionId)` index makes the call\npermanently idempotent — a redelivered upstream webhook\nreturns the existing row at HTTP 200 instead of\ndouble-crediting. Provider-owned prefixes such as `sq_payment_`\nare reserved for managed integrations.\n","uniqueKey":"transaction.external_transaction_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Partner-supplied stable identifier (Toast order id,\nShopify checkout id, Square payment id). When set on\ncreate via `POST /transactions` or\n`POST /marketplace/accrue`, the unique\n`(orgId, externalTransactionId)` index makes the call\npermanently idempotent — a redelivered upstream webhook\nreturns the existing row at HTTP 200 instead of\ndouble-crediting. Provider-owned prefixes such as `sq_payment_`\nare reserved for managed integrations.\n","uniqueKey":"transaction.external_transaction_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"transaction.external_transaction_id","typeLabel":"string | null"},"reverses_transaction_id":{"oneOf":[{"type":"string","description":"Set on a compensating row created by\n`/marketplace/reverse`. Points at the original transaction\nthis row reverses. The original is reversed at most once\n(enforced by a unique constraint).\n","uniqueKey":"transaction.reverses_transaction_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Set on a compensating row created by\n`/marketplace/reverse`. Points at the original transaction\nthis row reverses. The original is reversed at most once\n(enforced by a unique constraint).\n","uniqueKey":"transaction.reverses_transaction_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"transaction.reverses_transaction_id","typeLabel":"string | null"},"reason_text":{"oneOf":[{"type":"string","description":"Operator-visible reason for a reversal (\"Customer refunded\nthe order\"). Persisted on the COMPENSATING row, not the\noriginal.\n","uniqueKey":"transaction.reason_text.oneOf.0","typeLabel":"string"},{"type":"null","description":"Operator-visible reason for a reversal (\"Customer refunded\nthe order\"). Persisted on the COMPENSATING row, not the\noriginal.\n","uniqueKey":"transaction.reason_text.oneOf.1","typeLabel":"null"}],"uniqueKey":"transaction.reason_text","typeLabel":"string | null"},"test_mode":{"type":"boolean","description":"True when posted via a `pk_test_…` key. Test rows still\nwrite to the ledger and still fire webhooks (so partner\nsandbox integrations can verify their receivers), but DO\nNOT update Customer / Card / Enrollment aggregates and\nare excluded from operator dashboard rollups.\n","uniqueKey":"transaction.test_mode","typeLabel":"boolean"},"created_at":{"type":"string","format":"date-time","uniqueKey":"transaction.created_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"transaction","typeLabel":"object"},"wallet_passes":{"oneOf":[{"type":"object","properties":{"apple":{"oneOf":[{"type":"string","uniqueKey":"wallet_passes.oneOf.0.apple.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"wallet_passes.oneOf.0.apple.oneOf.1","typeLabel":"null"}],"uniqueKey":"wallet_passes.oneOf.0.apple","typeLabel":"string | null"},"google":{"oneOf":[{"type":"string","uniqueKey":"wallet_passes.oneOf.0.google.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"wallet_passes.oneOf.0.google.oneOf.1","typeLabel":"null"}],"uniqueKey":"wallet_passes.oneOf.0.google","typeLabel":"string | null"}},"uniqueKey":"wallet_passes.oneOf.0","typeLabel":"object"},{"type":"null","properties":{"apple":{"oneOf":[{"type":"string"},{"type":"null"}]},"google":{"oneOf":[{"type":"string"},{"type":"null"}]}},"uniqueKey":"wallet_passes.oneOf.1","typeLabel":"null"}],"uniqueKey":"wallet_passes","typeLabel":"object | null"},"customer_created":{"type":"boolean","uniqueKey":"customer_created","typeLabel":"boolean"},"enrollment_created":{"type":"boolean","uniqueKey":"enrollment_created","typeLabel":"boolean"},"idempotent_replay":{"type":"boolean","description":"Set to true when the response is a replay of an existing\ntransaction (external_transaction_id dedup hit). Absent on\nfresh creates.\n","uniqueKey":"idempotent_replay","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"customer":{"id":"\u003cstring>","customer_number":123,"email":"\u003cstring>","phone":"\u003cstring>","first_name":"\u003cstring>","last_name":"\u003cstring>","date_of_birth":"2023-11-07T05:31:56Z","consent_marketing":true,"consent_ad_tracking":true,"external_ref":"\u003cstring>","anonymized_at":"2023-11-07T05:31:56Z","deleted_at":"2023-11-07T05:31:56Z","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z"},"enrollment":{"id":"\u003cstring>","customer_id":"\u003cstring>","card_id":"\u003cstring>","status":"ACTIVE","balance":123,"redemptions_count":123,"cumulative_spend_pence":123,"bonus_points_balance":123,"enrolled_at":"2023-11-07T05:31:56Z","last_activity_at":"2023-11-07T05:31:56Z","wallet_passes":{"apple":"\u003cstring>","google":"\u003cstring>"}},"transaction":{"id":"\u003cstring>","enrollment_id":"\u003cstring>","type":"STAMP","source":"SCANNER","delta":123,"amount_pence":123,"note":"\u003cstring>","external_id":"\u003cstring>","external_transaction_id":"\u003cstring>","reverses_transaction_id":"\u003cstring>","reason_text":"\u003cstring>","test_mode":true,"created_at":"2023-11-07T05:31:56Z"},"wallet_passes":{"apple":"\u003cstring>","google":"\u003cstring>"},"customer_created":true,"enrollment_created":true,"idempotent_replay":true}}},"exampleType":"generated"}},"exampleType":"generated"},"b75ab3fb-e2f0-438f-84fd-f52e660bee29":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"customer":{"type":"object","properties":{"id":{"type":"string","uniqueKey":"customer.id","typeLabel":"string"},"customer_number":{"type":"integer","uniqueKey":"customer.customer_number","typeLabel":"integer"},"email":{"oneOf":[{"type":"string","uniqueKey":"customer.email.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"customer.email.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.email","typeLabel":"string | null"},"phone":{"oneOf":[{"type":"string","uniqueKey":"customer.phone.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"customer.phone.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.phone","typeLabel":"string | null"},"first_name":{"oneOf":[{"type":"string","uniqueKey":"customer.first_name.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"customer.first_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.first_name","typeLabel":"string | null"},"last_name":{"oneOf":[{"type":"string","uniqueKey":"customer.last_name.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"customer.last_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.last_name","typeLabel":"string | null"},"date_of_birth":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"customer.date_of_birth.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"customer.date_of_birth.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.date_of_birth","typeLabel":"string\u003cdate-time> | null"},"consent_marketing":{"type":"boolean","uniqueKey":"customer.consent_marketing","typeLabel":"boolean"},"consent_ad_tracking":{"type":"boolean","uniqueKey":"customer.consent_ad_tracking","typeLabel":"boolean"},"external_ref":{"oneOf":[{"type":"string","description":"Partner-supplied identifier (Shopify customer GID, Toast\nguest UUID, Square customer id, …). Unique per org. POST\n`/customers` upserts on this when supplied.\n","uniqueKey":"customer.external_ref.oneOf.0","typeLabel":"string"},{"type":"null","description":"Partner-supplied identifier (Shopify customer GID, Toast\nguest UUID, Square customer id, …). Unique per org. POST\n`/customers` upserts on this when supplied.\n","uniqueKey":"customer.external_ref.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.external_ref","typeLabel":"string | null"},"anonymized_at":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"customer.anonymized_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"customer.anonymized_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.anonymized_at","typeLabel":"string\u003cdate-time> | null"},"deleted_at":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"customer.deleted_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"customer.deleted_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.deleted_at","typeLabel":"string\u003cdate-time> | null"},"created_at":{"type":"string","format":"date-time","uniqueKey":"customer.created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","uniqueKey":"customer.updated_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"customer","typeLabel":"object"},"enrollment":{"type":"object","properties":{"id":{"type":"string","uniqueKey":"enrollment.id","typeLabel":"string"},"customer_id":{"type":"string","uniqueKey":"enrollment.customer_id","typeLabel":"string"},"card_id":{"type":"string","uniqueKey":"enrollment.card_id","typeLabel":"string"},"status":{"type":"string","enum":["ACTIVE","INACTIVE","REVOKED"],"uniqueKey":"enrollment.status","typeLabel":"enum\u003cstring>"},"balance":{"type":"number","multipleOf":0.01,"uniqueKey":"enrollment.balance","typeLabel":"number"},"redemptions_count":{"type":"integer","uniqueKey":"enrollment.redemptions_count","typeLabel":"integer"},"cumulative_spend_pence":{"type":"integer","uniqueKey":"enrollment.cumulative_spend_pence","typeLabel":"integer"},"bonus_points_balance":{"type":"integer","uniqueKey":"enrollment.bonus_points_balance","typeLabel":"integer"},"enrolled_at":{"type":"string","format":"date-time","uniqueKey":"enrollment.enrolled_at","typeLabel":"string\u003cdate-time>"},"last_activity_at":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"enrollment.last_activity_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"enrollment.last_activity_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrollment.last_activity_at","typeLabel":"string\u003cdate-time> | null"},"wallet_passes":{"oneOf":[{"description":"Install URLs for the Apple / Google wallet passes\nattached to this enrollment. Null when no passes have\nbeen issued yet (poll `GET /enrollments/{id}` to pick\nthem up later). Per-platform values may be null when\nthat platform's credentials aren't configured for the\norg. Always reuse these URLs — never reconstruct them.\n","type":"object","properties":{"apple":{"oneOf":[{"type":"string","description":"pkpass download URL.","uniqueKey":"enrollment.wallet_passes.oneOf.0.apple.oneOf.0","typeLabel":"string"},{"type":"null","description":"pkpass download URL.","uniqueKey":"enrollment.wallet_passes.oneOf.0.apple.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrollment.wallet_passes.oneOf.0.apple","typeLabel":"string | null"},"google":{"oneOf":[{"type":"string","description":"Freshly-signed Add-to-Wallet save link\n(`https://pay.google.com/gp/v/save/\u003cjwt>`).\n","uniqueKey":"enrollment.wallet_passes.oneOf.0.google.oneOf.0","typeLabel":"string"},{"type":"null","description":"Freshly-signed Add-to-Wallet save link\n(`https://pay.google.com/gp/v/save/\u003cjwt>`).\n","uniqueKey":"enrollment.wallet_passes.oneOf.0.google.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrollment.wallet_passes.oneOf.0.google","typeLabel":"string | null"}},"uniqueKey":"enrollment.wallet_passes.oneOf.0","typeLabel":"object"},{"description":"Install URLs for the Apple / Google wallet passes\nattached to this enrollment. Null when no passes have\nbeen issued yet (poll `GET /enrollments/{id}` to pick\nthem up later). Per-platform values may be null when\nthat platform's credentials aren't configured for the\norg. Always reuse these URLs — never reconstruct them.\n","type":"null","properties":{"apple":{"oneOf":[{"type":"string","description":"pkpass download URL."},{"type":"null","description":"pkpass download URL."}]},"google":{"oneOf":[{"type":"string","description":"Freshly-signed Add-to-Wallet save link\n(`https://pay.google.com/gp/v/save/\u003cjwt>`).\n"},{"type":"null","description":"Freshly-signed Add-to-Wallet save link\n(`https://pay.google.com/gp/v/save/\u003cjwt>`).\n"}]}},"uniqueKey":"enrollment.wallet_passes.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrollment.wallet_passes","typeLabel":"object | null"}},"uniqueKey":"enrollment","typeLabel":"object"},"transaction":{"type":"object","properties":{"id":{"type":"string","uniqueKey":"transaction.id","typeLabel":"string"},"enrollment_id":{"type":"string","uniqueKey":"transaction.enrollment_id","typeLabel":"string"},"type":{"type":"string","enum":["STAMP","REDEEM","ADJUST"],"uniqueKey":"transaction.type","typeLabel":"enum\u003cstring>"},"source":{"type":"string","enum":["SCANNER","POS","API","ADJUST","DASHBOARD","LEGACY_IMPORT","TAP"],"uniqueKey":"transaction.source","typeLabel":"enum\u003cstring>"},"delta":{"type":"number","multipleOf":0.01,"uniqueKey":"transaction.delta","typeLabel":"number"},"amount_pence":{"oneOf":[{"type":"integer","uniqueKey":"transaction.amount_pence.oneOf.0","typeLabel":"integer"},{"type":"null","uniqueKey":"transaction.amount_pence.oneOf.1","typeLabel":"null"}],"uniqueKey":"transaction.amount_pence","typeLabel":"integer | null"},"note":{"oneOf":[{"type":"string","uniqueKey":"transaction.note.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"transaction.note.oneOf.1","typeLabel":"null"}],"uniqueKey":"transaction.note","typeLabel":"string | null"},"external_id":{"oneOf":[{"type":"string","uniqueKey":"transaction.external_id.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"transaction.external_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"transaction.external_id","typeLabel":"string | null"},"external_transaction_id":{"oneOf":[{"type":"string","description":"Partner-supplied stable identifier (Toast order id,\nShopify checkout id, Square payment id). When set on\ncreate via `POST /transactions` or\n`POST /marketplace/accrue`, the unique\n`(orgId, externalTransactionId)` index makes the call\npermanently idempotent — a redelivered upstream webhook\nreturns the existing row at HTTP 200 instead of\ndouble-crediting. Provider-owned prefixes such as `sq_payment_`\nare reserved for managed integrations.\n","uniqueKey":"transaction.external_transaction_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Partner-supplied stable identifier (Toast order id,\nShopify checkout id, Square payment id). When set on\ncreate via `POST /transactions` or\n`POST /marketplace/accrue`, the unique\n`(orgId, externalTransactionId)` index makes the call\npermanently idempotent — a redelivered upstream webhook\nreturns the existing row at HTTP 200 instead of\ndouble-crediting. Provider-owned prefixes such as `sq_payment_`\nare reserved for managed integrations.\n","uniqueKey":"transaction.external_transaction_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"transaction.external_transaction_id","typeLabel":"string | null"},"reverses_transaction_id":{"oneOf":[{"type":"string","description":"Set on a compensating row created by\n`/marketplace/reverse`. Points at the original transaction\nthis row reverses. The original is reversed at most once\n(enforced by a unique constraint).\n","uniqueKey":"transaction.reverses_transaction_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Set on a compensating row created by\n`/marketplace/reverse`. Points at the original transaction\nthis row reverses. The original is reversed at most once\n(enforced by a unique constraint).\n","uniqueKey":"transaction.reverses_transaction_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"transaction.reverses_transaction_id","typeLabel":"string | null"},"reason_text":{"oneOf":[{"type":"string","description":"Operator-visible reason for a reversal (\"Customer refunded\nthe order\"). Persisted on the COMPENSATING row, not the\noriginal.\n","uniqueKey":"transaction.reason_text.oneOf.0","typeLabel":"string"},{"type":"null","description":"Operator-visible reason for a reversal (\"Customer refunded\nthe order\"). Persisted on the COMPENSATING row, not the\noriginal.\n","uniqueKey":"transaction.reason_text.oneOf.1","typeLabel":"null"}],"uniqueKey":"transaction.reason_text","typeLabel":"string | null"},"test_mode":{"type":"boolean","description":"True when posted via a `pk_test_…` key. Test rows still\nwrite to the ledger and still fire webhooks (so partner\nsandbox integrations can verify their receivers), but DO\nNOT update Customer / Card / Enrollment aggregates and\nare excluded from operator dashboard rollups.\n","uniqueKey":"transaction.test_mode","typeLabel":"boolean"},"created_at":{"type":"string","format":"date-time","uniqueKey":"transaction.created_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"transaction","typeLabel":"object"},"wallet_passes":{"oneOf":[{"type":"object","properties":{"apple":{"oneOf":[{"type":"string","uniqueKey":"wallet_passes.oneOf.0.apple.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"wallet_passes.oneOf.0.apple.oneOf.1","typeLabel":"null"}],"uniqueKey":"wallet_passes.oneOf.0.apple","typeLabel":"string | null"},"google":{"oneOf":[{"type":"string","uniqueKey":"wallet_passes.oneOf.0.google.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"wallet_passes.oneOf.0.google.oneOf.1","typeLabel":"null"}],"uniqueKey":"wallet_passes.oneOf.0.google","typeLabel":"string | null"}},"uniqueKey":"wallet_passes.oneOf.0","typeLabel":"object"},{"type":"null","properties":{"apple":{"oneOf":[{"type":"string"},{"type":"null"}]},"google":{"oneOf":[{"type":"string"},{"type":"null"}]}},"uniqueKey":"wallet_passes.oneOf.1","typeLabel":"null"}],"uniqueKey":"wallet_passes","typeLabel":"object | null"},"customer_created":{"type":"boolean","uniqueKey":"customer_created","typeLabel":"boolean"},"enrollment_created":{"type":"boolean","uniqueKey":"enrollment_created","typeLabel":"boolean"},"idempotent_replay":{"type":"boolean","description":"Set to true when the response is a replay of an existing\ntransaction (external_transaction_id dedup hit). Absent on\nfresh creates.\n","uniqueKey":"idempotent_replay","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"customer":{"id":"\u003cstring>","customer_number":123,"email":"\u003cstring>","phone":"\u003cstring>","first_name":"\u003cstring>","last_name":"\u003cstring>","date_of_birth":"2023-11-07T05:31:56Z","consent_marketing":true,"consent_ad_tracking":true,"external_ref":"\u003cstring>","anonymized_at":"2023-11-07T05:31:56Z","deleted_at":"2023-11-07T05:31:56Z","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z"},"enrollment":{"id":"\u003cstring>","customer_id":"\u003cstring>","card_id":"\u003cstring>","status":"ACTIVE","balance":123,"redemptions_count":123,"cumulative_spend_pence":123,"bonus_points_balance":123,"enrolled_at":"2023-11-07T05:31:56Z","last_activity_at":"2023-11-07T05:31:56Z","wallet_passes":{"apple":"\u003cstring>","google":"\u003cstring>"}},"transaction":{"id":"\u003cstring>","enrollment_id":"\u003cstring>","type":"STAMP","source":"SCANNER","delta":123,"amount_pence":123,"note":"\u003cstring>","external_id":"\u003cstring>","external_transaction_id":"\u003cstring>","reverses_transaction_id":"\u003cstring>","reason_text":"\u003cstring>","test_mode":true,"created_at":"2023-11-07T05:31:56Z"},"wallet_passes":{"apple":"\u003cstring>","google":"\u003cstring>"},"customer_created":true,"enrollment_created":true,"idempotent_replay":true}}},"exampleType":"generated"}},"exampleType":"generated"},"42fccf6c-9777-4552-8282-69d573e4355d":{"description":"Validation failed","headers":{"X-Request-Id":{"description":"Unique id for this request. Echo this in your support tickets\nand we can trace the exact call in the audit log on the API key\ndetail page.\n","schema":{"type":"string"}},"X-API-Version":{"description":"Date-versioned schema marker. The current value is `2026-05-04`.\nBumps follow the 12-month deprecation policy documented in the\nin-dashboard docs page.\n","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total requests permitted per minute for this credential.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix-seconds timestamp when the current window refills.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","required":["type","message","code"],"properties":{"type":{"type":"string","enum":["authentication_error","permission_error","rate_limit_error","validation_error","not_found","idempotency_error","server_error"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"}},"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"authentication_error","message":"\u003cstring>","code":"\u003cstring>","param":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"aa2b5647-c664-4e35-be0e-26f2538da032":{"description":"Missing / invalid / expired API key","headers":{"X-Request-Id":{"description":"Unique id for this request. Echo this in your support tickets\nand we can trace the exact call in the audit log on the API key\ndetail page.\n","schema":{"type":"string"}},"X-API-Version":{"description":"Date-versioned schema marker. The current value is `2026-05-04`.\nBumps follow the 12-month deprecation policy documented in the\nin-dashboard docs page.\n","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total requests permitted per minute for this credential.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix-seconds timestamp when the current window refills.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","required":["type","message","code"],"properties":{"type":{"type":"string","enum":["authentication_error","permission_error","rate_limit_error","validation_error","not_found","idempotency_error","server_error"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"}},"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"authentication_error","message":"\u003cstring>","code":"\u003cstring>","param":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"92bc2a26-b2be-43f6-b257-7887fc09ae86":{"description":"API key is missing the required scope","headers":{"X-Request-Id":{"description":"Unique id for this request. Echo this in your support tickets\nand we can trace the exact call in the audit log on the API key\ndetail page.\n","schema":{"type":"string"}},"X-API-Version":{"description":"Date-versioned schema marker. The current value is `2026-05-04`.\nBumps follow the 12-month deprecation policy documented in the\nin-dashboard docs page.\n","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total requests permitted per minute for this credential.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix-seconds timestamp when the current window refills.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","required":["type","message","code"],"properties":{"type":{"type":"string","enum":["authentication_error","permission_error","rate_limit_error","validation_error","not_found","idempotency_error","server_error"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"}},"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"authentication_error","message":"\u003cstring>","code":"\u003cstring>","param":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"f644c77f-41f1-41ab-bd25-f06b110de2d7":{"description":"Resource not found","headers":{"X-Request-Id":{"description":"Unique id for this request. Echo this in your support tickets\nand we can trace the exact call in the audit log on the API key\ndetail page.\n","schema":{"type":"string"}},"X-API-Version":{"description":"Date-versioned schema marker. The current value is `2026-05-04`.\nBumps follow the 12-month deprecation policy documented in the\nin-dashboard docs page.\n","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total requests permitted per minute for this credential.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix-seconds timestamp when the current window refills.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","required":["type","message","code"],"properties":{"type":{"type":"string","enum":["authentication_error","permission_error","rate_limit_error","validation_error","not_found","idempotency_error","server_error"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"}},"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"authentication_error","message":"\u003cstring>","code":"\u003cstring>","param":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"d41d4bd4-0f54-44b2-b9ea-0c687299f771":{"description":"Validation failed","headers":{"X-Request-Id":{"description":"Unique id for this request. Echo this in your support tickets\nand we can trace the exact call in the audit log on the API key\ndetail page.\n","schema":{"type":"string"}},"X-API-Version":{"description":"Date-versioned schema marker. The current value is `2026-05-04`.\nBumps follow the 12-month deprecation policy documented in the\nin-dashboard docs page.\n","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total requests permitted per minute for this credential.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix-seconds timestamp when the current window refills.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","required":["type","message","code"],"properties":{"type":{"type":"string","enum":["authentication_error","permission_error","rate_limit_error","validation_error","not_found","idempotency_error","server_error"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"}},"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"authentication_error","message":"\u003cstring>","code":"\u003cstring>","param":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"30c94008-68e5-4981-a661-12eac94a0be3":{"description":"Validation failed","headers":{"X-Request-Id":{"description":"Unique id for this request. Echo this in your support tickets\nand we can trace the exact call in the audit log on the API key\ndetail page.\n","schema":{"type":"string"}},"X-API-Version":{"description":"Date-versioned schema marker. The current value is `2026-05-04`.\nBumps follow the 12-month deprecation policy documented in the\nin-dashboard docs page.\n","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total requests permitted per minute for this credential.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix-seconds timestamp when the current window refills.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","required":["type","message","code"],"properties":{"type":{"type":"string","enum":["authentication_error","permission_error","rate_limit_error","validation_error","not_found","idempotency_error","server_error"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"}},"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"authentication_error","message":"\u003cstring>","code":"\u003cstring>","param":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"030fa992-27d1-44e5-b2c9-6ecf1726918f":{"description":"Per-key rate limit exceeded","headers":{"X-Request-Id":{"description":"Unique id for this request. Echo this in your support tickets\nand we can trace the exact call in the audit log on the API key\ndetail page.\n","schema":{"type":"string"}},"X-API-Version":{"description":"Date-versioned schema marker. The current value is `2026-05-04`.\nBumps follow the 12-month deprecation policy documented in the\nin-dashboard docs page.\n","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total requests permitted per minute for this credential.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current 60s window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix-seconds timestamp when the current window refills.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying. Only emitted on 429 responses.\n","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","required":["type","message","code"],"properties":{"type":{"type":"string","enum":["authentication_error","permission_error","rate_limit_error","validation_error","not_found","idempotency_error","server_error"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"}},"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"authentication_error","message":"\u003cstring>","code":"\u003cstring>","param":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"ae6a47ac-3160-4036-b566-742936022c37":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"pk_live_… / pk_test_… or perk_at_…","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"b5c9d190-583a-4d83-b1a3-29580ce30ee1":{"url":"https://dashboard.perkstar.co.uk/api/v1","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"pk_live_… / pk_test_… or perk_at_…","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"api/openapi.yaml"},"subdomain":"perkstar","siteName":"Perkstar Developers","title":"Find-or-create customer + post transaction in one call - Perkstar Developers","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-15T02:05:07.787Z","originalFileLocation":"api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call.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=\"light\"}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=\"Resolves the customer in this fixed priority order: 1. customer_id → tenant-scoped Perkstar customer 2. card_serial → POS barcode or legacy pass serial → customer 3. external_ref → (orgId, externalRef) lookup 4. email (case-insensitive) 5. phone (normalised E.164 with a legacy raw-value fallback) First match wins. On miss, creates a customer when create_customer_if_missing is true (the default). A missing customer_id alone returns 404 instead of creating a replacement. The transaction.external_transaction_id field is enforced as permanently unique per (orgId, externalTransactionId). An exact retry with the same canonical target, type, amount, and request fields returns the existing transaction at HTTP 200 instead of double-crediting, no matter how long has passed. Reusing the id for a different request returns 409 external_transaction_id_conflict. Use this for POS-side stable ids (Toast order #s, Shopify checkout ids, Square payment ids). Test and live transactions cannot share the same value; a cross-environment replay is rejected with 422. Provider-owned prefixes such as sq_payment_ are reserved for managed integrations; use a namespace owned by your app. Idempotency-Key (24h replay cache) and external_transaction_id (permanent dedupe) coexist — use both for full robustness. With a test credential this endpoint never creates a customer or enrolment. Resolve an existing record and card first, then post the isolated transaction. A missing customer or enrolment returns 404.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Perkstar Developers\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/perkstar/qZOD7HSUxLh47RbK/_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/perkstar/qZOD7HSUxLh47RbK/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/perkstar/qZOD7HSUxLh47RbK/_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/perkstar/qZOD7HSUxLh47RbK/_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/perkstar/qZOD7HSUxLh47RbK/_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/perkstar/qZOD7HSUxLh47RbK/_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/perkstar/qZOD7HSUxLh47RbK/_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/perkstar/qZOD7HSUxLh47RbK/_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/perkstar/qZOD7HSUxLh47RbK/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Find-or-create customer + post transaction in one call - Perkstar Developers\">\u003cmeta data-mint-head property=\"og:description\" content=\"Resolves the customer in this fixed priority order: 1. customer_id → tenant-scoped Perkstar customer 2. card_serial → POS barcode or legacy pass serial → customer 3. external_ref → (orgId, externalRef) lookup 4. email (case-insensitive) 5. phone (normalised E.164 with a legacy raw-value fallback) First match wins. On miss, creates a customer when create_customer_if_missing is true (the default). A missing customer_id alone returns 404 instead of creating a replacement. The transaction.external_transaction_id field is enforced as permanently unique per (orgId, externalTransactionId). An exact retry with the same canonical target, type, amount, and request fields returns the existing transaction at HTTP 200 instead of double-crediting, no matter how long has passed. Reusing the id for a different request returns 409 external_transaction_id_conflict. Use this for POS-side stable ids (Toast order #s, Shopify checkout ids, Square payment ids). Test and live transactions cannot share the same value; a cross-environment replay is rejected with 422. Provider-owned prefixes such as sq_payment_ are reserved for managed integrations; use a namespace owned by your app. Idempotency-Key (24h replay cache) and external_transaction_id (permanent dedupe) coexist — use both for full robustness. With a test credential this endpoint never creates a customer or enrolment. Resolve an existing record and card first, then post the isolated transaction. A missing customer or enrolment returns 404.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Perkstar Developers\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://developers.perkstar.co.uk/api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://perkstar.mintlify.app/_mintlify/api/og/v2?division=Marketplace\u0026amp;title=Find-or-create+customer+%2B+post+transaction+in+one+call\u0026amp;description=Resolves+the+customer+in+this+fixed+priority+order%3A%0A++1.+customer_id+%E2%86%92+tenant-scoped+Perkstar+customer%0A++2.+card_serial+%E2%86%92+POS+barcode+or+legacy+pass+serial+%E2%86%92+cu\u0026amp;theme=1bd47a425785e661028d3e8d\u0026amp;signature=2f7a3c57cec15d9af32eaff0ac914981bcd731c0854a32229b57ca50013c2d4c\">\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=\"Find-or-create customer + post transaction in one call - Perkstar Developers\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Resolves the customer in this fixed priority order: 1. customer_id → tenant-scoped Perkstar customer 2. card_serial → POS barcode or legacy pass serial → customer 3. external_ref → (orgId, externalRef) lookup 4. email (case-insensitive) 5. phone (normalised E.164 with a legacy raw-value fallback) First match wins. On miss, creates a customer when create_customer_if_missing is true (the default). A missing customer_id alone returns 404 instead of creating a replacement. The transaction.external_transaction_id field is enforced as permanently unique per (orgId, externalTransactionId). An exact retry with the same canonical target, type, amount, and request fields returns the existing transaction at HTTP 200 instead of double-crediting, no matter how long has passed. Reusing the id for a different request returns 409 external_transaction_id_conflict. Use this for POS-side stable ids (Toast order #s, Shopify checkout ids, Square payment ids). Test and live transactions cannot share the same value; a cross-environment replay is rejected with 422. Provider-owned prefixes such as sq_payment_ are reserved for managed integrations; use a namespace owned by your app. Idempotency-Key (24h replay cache) and external_transaction_id (permanent dedupe) coexist — use both for full robustness. With a test credential this endpoint never creates a customer or enrolment. Resolve an existing record and card first, then post the isolated transaction. A missing customer or enrolment returns 404.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://perkstar.mintlify.app/_mintlify/api/og/v2?division=Marketplace\u0026amp;title=Find-or-create+customer+%2B+post+transaction+in+one+call\u0026amp;description=Resolves+the+customer+in+this+fixed+priority+order%3A%0A++1.+customer_id+%E2%86%92+tenant-scoped+Perkstar+customer%0A++2.+card_serial+%E2%86%92+POS+barcode+or+legacy+pass+serial+%E2%86%92+cu\u0026amp;theme=1bd47a425785e661028d3e8d\u0026amp;signature=2f7a3c57cec15d9af32eaff0ac914981bcd731c0854a32229b57ca50013c2d4c\">\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/perkstar/qZOD7HSUxLh47RbK/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Perkstar Developers\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#016aff\">\u003clink data-mint-head rel=\"canonical\" href=\"https://developers.perkstar.co.uk/api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/marketplace/find-or-create-customer-%2B-post-transaction-in-one-call.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://perkstar.co.uk/#organization\",\"name\":\"Perkstar\",\"url\":\"https://perkstar.co.uk\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://dashboard.perkstar.co.uk/brand/perkstar-black.png\"}},{\"@type\":\"WebSite\",\"@id\":\"https://developers.perkstar.co.uk#website\",\"name\":\"Perkstar Developers\",\"url\":\"https://developers.perkstar.co.uk\",\"publisher\":{\"@id\":\"https://perkstar.co.uk/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://developers.perkstar.co.uk/api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call#webpage\",\"url\":\"https://developers.perkstar.co.uk/api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call\",\"name\":\"Find-or-create customer + post transaction in one call\",\"description\":\"Resolves the customer in this fixed priority order: 1. customer_id → tenant-scoped Perkstar customer 2. card_serial → POS barcode or legacy pass serial → customer 3. external_ref → (orgId, externalRef) lookup 4. email (case-insensitive) 5. phone (normalised E.164 with a legacy raw-value fallback) First match wins. On miss, creates a customer when create_customer_if_missing is true (the default). A missing customer_id alone returns 404 instead of creating a replacement. The transaction.external_transaction_id field is enforced as permanently unique per (orgId, externalTransactionId). An exact retry with the same canonical target, type, amount, and request fields returns the existing transaction at HTTP 200 instead of double-crediting, no matter how long has passed. Reusing the id for a different request returns 409 external_transaction_id_conflict. Use this for POS-side stable ids (Toast order #s, Shopify checkout ids, Square payment ids). Test and live transactions cannot share the same value; a cross-environment replay is rejected with 422. Provider-owned prefixes such as sq_payment_ are reserved for managed integrations; use a namespace owned by your app. Idempotency-Key (24h replay cache) and external_transaction_id (permanent dedupe) coexist — use both for full robustness. With a test credential this endpoint never creates a customer or enrolment. Resolve an existing record and card first, then post the isolated transaction. A missing customer or enrolment returns 404.\",\"dateModified\":\"2026-10-15T02:05:07.787Z\",\"isPartOf\":{\"@id\":\"https://developers.perkstar.co.uk#website\"},\"breadcrumb\":{\"@id\":\"https://developers.perkstar.co.uk/api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://developers.perkstar.co.uk/api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Marketplace\",\"item\":\"https://developers.perkstar.co.uk/api-reference/marketplace/auth-check-+-org-context\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Find-or-create customer + post transaction in one call\",\"item\":\"https://developers.perkstar.co.uk/api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://developers.perkstar.co.uk/api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call#apireference\",\"headline\":\"Find-or-create customer + post transaction in one call\",\"name\":\"Find-or-create customer + post transaction in one call\",\"description\":\"Resolves the customer in this fixed priority order: 1. customer_id → tenant-scoped Perkstar customer 2. card_serial → POS barcode or legacy pass serial → customer 3. external_ref → (orgId, externalRef) lookup 4. email (case-insensitive) 5. phone (normalised E.164 with a legacy raw-value fallback) First match wins. On miss, creates a customer when create_customer_if_missing is true (the default). A missing customer_id alone returns 404 instead of creating a replacement. The transaction.external_transaction_id field is enforced as permanently unique per (orgId, externalTransactionId). An exact retry with the same canonical target, type, amount, and request fields returns the existing transaction at HTTP 200 instead of double-crediting, no matter how long has passed. Reusing the id for a different request returns 409 external_transaction_id_conflict. Use this for POS-side stable ids (Toast order #s, Shopify checkout ids, Square payment ids). Test and live transactions cannot share the same value; a cross-environment replay is rejected with 422. Provider-owned prefixes such as sq_payment_ are reserved for managed integrations; use a namespace owned by your app. Idempotency-Key (24h replay cache) and external_transaction_id (permanent dedupe) coexist — use both for full robustness. With a test credential this endpoint never creates a customer or enrolment. Resolve an existing record and card first, then post the isolated transaction. A missing customer or enrolment returns 404.\",\"url\":\"https://developers.perkstar.co.uk/api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call\",\"mainEntityOfPage\":{\"@id\":\"https://developers.perkstar.co.uk/api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call#webpage\"},\"dateModified\":\"2026-10-15T02:05:07.787Z\",\"publisher\":{\"@id\":\"https://perkstar.co.uk/#organization\"},\"isPartOf\":{\"@id\":\"https://developers.perkstar.co.uk#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Perkstar Developers\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Perkstar Developers","nav":{"global":null,"tabs":[{"tab":"Integrations","icon":"plug","pages":[{"title":"Integrations","href":"/integrations"}]},{"tab":"Guides","icon":"book-open","pages":[{"title":"Guides","href":""}]},{"tab":"API reference","icon":"brackets-curly","groups":[{"group":"Customers","pages":[{"title":"List customers","deprecated":null,"version":null,"openapi":"/api/openapi.yaml get /customers","href":"/api-reference/customers/list-customers"},{"title":"Create or upsert a customer","deprecated":null,"version":null,"openapi":"/api/openapi.yaml post /customers","href":"/api-reference/customers/create-or-upsert-a-customer"},{"title":"Get a customer","deprecated":null,"version":null,"openapi":"/api/openapi.yaml get /customers/{id}","href":"/api-reference/customers/get-a-customer"},{"title":"Anonymize (GDPR Article 17 erasure) a customer","deprecated":null,"version":null,"openapi":"/api/openapi.yaml delete /customers/{id}","href":"/api-reference/customers/anonymize-gdpr-article-17-erasure-a-customer"},{"title":"Update a customer","deprecated":null,"version":null,"openapi":"/api/openapi.yaml patch /customers/{id}","href":"/api-reference/customers/update-a-customer"}]},{"group":"Enrollments","pages":[{"title":"List enrollments","deprecated":null,"version":null,"openapi":"/api/openapi.yaml get /enrollments","href":"/api-reference/enrollments/list-enrollments"},{"title":"Create an enrollment","deprecated":null,"version":null,"openapi":"/api/openapi.yaml post /enrollments","href":"/api-reference/enrollments/create-an-enrollment"},{"title":"Get an enrollment","deprecated":null,"version":null,"openapi":"/api/openapi.yaml get /enrollments/{id}","href":"/api-reference/enrollments/get-an-enrollment"},{"title":"Update an enrollment","deprecated":null,"version":null,"openapi":"/api/openapi.yaml patch /enrollments/{id}","href":"/api-reference/enrollments/update-an-enrollment"}]},{"group":"Transactions","pages":[{"title":"List transactions","deprecated":null,"version":null,"openapi":"/api/openapi.yaml get /transactions","href":"/api-reference/transactions/list-transactions"},{"title":"Post a transaction (stamp / redeem / adjust)","deprecated":null,"version":null,"openapi":"/api/openapi.yaml post /transactions","href":"/api-reference/transactions/post-a-transaction-stamp-redeem-adjust"},{"title":"Bulk-delete every test-mode transaction for the org","deprecated":null,"version":null,"openapi":"/api/openapi.yaml delete /transactions/test","href":"/api-reference/transactions/bulk-delete-every-test-mode-transaction-for-the-org"}]},{"group":"Cards","pages":[{"title":"List cards","deprecated":null,"version":null,"openapi":"/api/openapi.yaml get /cards","href":"/api-reference/cards/list-cards"},{"title":"Get a card","deprecated":null,"version":null,"openapi":"/api/openapi.yaml get /cards/{id}","href":"/api-reference/cards/get-a-card"}]},{"group":"Webhooks","pages":[{"title":"List recent outbound events","deprecated":null,"version":null,"openapi":"/api/openapi.yaml get /events","href":"/api-reference/webhooks/list-recent-outbound-events"},{"title":"List webhooks","deprecated":null,"version":null,"openapi":"/api/openapi.yaml get /webhooks","href":"/api-reference/webhooks/list-webhooks"},{"title":"Create a webhook","deprecated":null,"version":null,"openapi":"/api/openapi.yaml post /webhooks","href":"/api-reference/webhooks/create-a-webhook"},{"title":"Get a webhook","deprecated":null,"version":null,"openapi":"/api/openapi.yaml get /webhooks/{id}","href":"/api-reference/webhooks/get-a-webhook"},{"title":"Delete a webhook","deprecated":null,"version":null,"openapi":"/api/openapi.yaml delete /webhooks/{id}","href":"/api-reference/webhooks/delete-a-webhook"},{"title":"Update a webhook","deprecated":null,"version":null,"openapi":"/api/openapi.yaml patch /webhooks/{id}","href":"/api-reference/webhooks/update-a-webhook"},{"title":"Verify a server-attested webhook delivery","deprecated":null,"version":null,"openapi":"/api/openapi.yaml post /webhooks/deliveries/verify","href":"/api-reference/webhooks/verify-a-server-attested-webhook-delivery"}]},{"group":"Locations","pages":[{"title":"List locations","deprecated":null,"version":null,"openapi":"/api/openapi.yaml get /locations","href":"/api-reference/locations/list-locations"}]},{"group":"Pushes","pages":[{"title":"Send a wallet push","deprecated":null,"version":null,"openapi":"/api/openapi.yaml post /pushes","href":"/api-reference/pushes/send-a-wallet-push"}]},{"group":"Marketplace","pages":[{"title":"Auth check + org context","description":"Confirms the API key is valid + returns the operator's org\ncontext (name, currency, timezone) and the available cards.\nFirst call every POS adapter makes on install.\n\nRequires NO specific scope — any valid (non-revoked,\nnon-expired) key works. Brute-force / rate-limit protection\nstill applies.\n","deprecated":null,"version":null,"openapi":"/api/openapi.yaml get /marketplace/ping","href":"/api-reference/marketplace/auth-check-+-org-context"},{"title":"Find-or-create customer + post transaction in one call","deprecated":null,"version":null,"openapi":"/api/openapi.yaml post /marketplace/accrue","href":"/api-reference/marketplace/find-or-create-customer-+-post-transaction-in-one-call"},{"title":"Find-or-create customer + enrolment (no transaction)","description":"Same identifier resolution + create-on-miss as\n`/marketplace/accrue`, but without posting a transaction.\n\nUsed by checkout-time signup flows (Shopify customers/create,\nToast guest-create) where the partner wants the customer on\nthe loyalty programme but doesn't have a purchase to credit\nyet. Idempotent on `(customer, card)` — repeating the call\nreturns the same enrolment at HTTP 200.\n\nThis endpoint changes live customer data and therefore rejects test\ncredentials with 403.\n","deprecated":null,"version":null,"openapi":"/api/openapi.yaml post /marketplace/enroll","href":"/api-reference/marketplace/find-or-create-customer-+-enrolment-no-transaction"},{"title":"Reverse a previously-posted transaction","deprecated":null,"version":null,"openapi":"/api/openapi.yaml post /marketplace/reverse","href":"/api-reference/marketplace/reverse-a-previously-posted-transaction"}]},{"group":"Outbound webhooks","pages":[{"title":"Receive a perkstar outbound event","version":null,"deprecated":null,"openapi":"/api/openapi.yaml webhook perkstarEvent","href":"/api-reference/outbound-webhooks/receive-a-perkstar-outbound-event"}]}]},{"tab":"SDKs","icon":"code","pages":[{"title":"SDKs","href":"/sdks/typescript"}]},{"tab":"Changelog","icon":"clock-rotate-left","pages":[{"title":"Changelog","href":"/changelog"}]}]},"title":"Find-or-create customer + post transaction in one call - Perkstar Developers","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":["c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["OpenApiReferenceProvider-WRhTSUDL.js","utils-ChMov4Kr.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-_REmC2bI.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Bp6nVRCu.js","snippetPresets-DZadmXoU.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-R3M_BF4L.js","ApiExamples-CY2WdoTl.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-DwYG-Q4l.js","shallow-BXQIGwv4.js","getApiPlaygroundDisplay-CK5nK5B9.js","CodeSnippet-TH4a2aGW.js","CodeSnippets-DwsQiOFS.js","getPastedJson-DD7kUzi_.js","icon-holE3QoJ.js","MethodPill-DUW0T8us.js","DuplicateIcon-CI_p4be-.js","createIcon-BdbRvavb.js","DynamicMarkdown-DN96a4Ur.js","SectionHeading-SCu36A9d.js","axios-vUo_bRtp.js","Markdown-CCeGv-zI.js","clsx-BGBGWFTt.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-Cv_O2fky.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-2C5OB2eV.js"]}