Attach an identity to an open session (multi-credential)
Attach a customer identity to an open checkout session, upgrading the session from OPEN to IDENTIFIED and merging the session’s anonymous_session_id into the resolved customer (a one-way, idempotent merge). This is the session-anchored form of the canonical POST /v1/partner/identify. It dispatches on a multi-credential discriminated union (phone, card_fingerprint, short_code, provider_customer_id, or dynamic QR) and returns a CustomerContext. It never returns a debit token or payment token: identity resolution and money movement are strictly separated. To charge, the partner calls the session’s payment sub-resource with a fresh dynamic credential. The card_fingerprint link is probationary (reversible) until the phone is verified, so a masked-PAN collision never auto-acts on money. Identify never releases a LOCKED promotional grant on its own: promo release stays gated on a verified identity plus the claim flow. Skipping identification is not this endpoint; a skip is an explicit, reason-coded, counted event on the session, never a silent default. The returned CustomerContext carries wallet_program_id and wallet_id as first-class fields so a multi-program customer is never ambiguous. An ambiguous identity returns WALLET_PROGRAM_AMBIGUOUS listing the candidates, and an unsupported credential returns CREDENTIAL_TYPE_UNSUPPORTED listing the supported set (read GET /capabilities first). Cross-enterprise identity resolution returns NOT_FOUND (no PII leak). Idempotent on the Idempotency-Key header: a retry replays the original CustomerContext.
Authorizations
POS terminal JWT minted by /auth/token; carries integrationId + terminal/cashier claims (server-trusted).
Headers
Partner-generated UUID; the ONE dedup key for all mutating endpoints. 24h TTL. Same key + same payload -> byte-identical replay; same key + different payload -> IDEMPOTENCY_KEY_REUSED (422).
Path Parameters
The checkout_session id to attach identity to. Must be OPEN or IDENTIFIED.
Body
Body for POST /checkout/sessions/{id}/identify. Resolves a customer via the multi-credential discriminated union and attaches them to the session. Returns a CustomerContext, NEVER a debit token.
Canonical request context, shared across all partner domains. merchant_id is key-enforced to a merchant the calling credential is authorized for (a platform-scoped credential acts only on its own tenants), so it is never a free-text trust field: a merchant_id outside the credential's authority is rejected rather than honored.
An identity credential used to resolve a customer, shared across all partner domains. The object is discriminated by credential_type, and the value field matching the declared credential_type is REQUIRED (enforced by per-type conditional schemas: a credential without its matching value field is invalid). The set of supported credential_type values is enumerated by GET /capabilities. New credential types are added additively: a new type appears in the GET /capabilities set without any route change. A credential_type that is not in the supported set returns CREDENTIAL_TYPE_UNSUPPORTED, and the error response lists the currently supported set.
Common request metadata shared across all Partner API domains. partner_request_id is a correlation identifier only: it appears in logs and responses for tracing but is never used as the deduplication key. Request deduplication is keyed exclusively on the Idempotency-Key header.
Disambiguate when the identity resolves to multiple wallet programs (else WALLET_PROGRAM_AMBIGUOUS).
Response
Identity resolved + attached; session is now IDENTIFIED. Returns the CustomerContext (NEVER a debit token).
The standard response envelope that every enveloped endpoint serializes through. ok is a boolean discriminator: when ok is true, the typed result is carried in data; when ok is false, a typed error object is returned instead. The meta object is uniform across the entire API surface.
The uniform response metadata block returned on every response. data_completeness_score is computed per call and reports the completeness of the returned data. decision_trace_id is present on responses that carry decision or insight output and can be used to correlate the response with its reasoning. capabilities is an additive, response-level array of hints advertising features the caller may use, and may be extended over time without notice.
The identity-resolution result. Returned by POST /identify and the session-anchored POST /checkout/sessions/{id}/identify. This object never contains a debit token, authorization token, or any artifact that permits a ledger mutation: identity resolution is read-only and cannot, by itself, move funds. The resolution_state field carries the resolution outcome (registered, pending_proof, or not_found); an ambiguous match returns WALLET_PROGRAM_AMBIGUOUS (HTTP 422). The balance field is null when resolution_state is not_found.
The typed error object returned with every non-2xx response. code is a string enum (for example WALLET_PROGRAM_AMBIGUOUS, CREDENTIAL_TYPE_UNSUPPORTED, INSUFFICIENT_FUNDS, IDEMPOTENCY_KEY_REUSED, CURRENCY_NOT_SUPPORTED), never a bare HTTP status number. Inspect code for programmatic branching, not the HTTP status. Some codes echo the valid set in details so clients can present or reconcile the accepted values: for example CREDENTIAL_TYPE_UNSUPPORTED lists the supported credential types, CURRENCY_NOT_SUPPORTED lists the supported ISO-4217 currencies, and WALLET_PROGRAM_AMBIGUOUS lists the candidate wallet_program_id values that matched the request.