Resend the verification SMS (rate-limited, attempt-capped, SMS-bomb guarded)
Resends the enrollment verification SMS for a customer whose wallet identity is still in the PENDING_PROOF state. This is a transactional message and is not subject to a marketing consent gate.
Identify the target by wallet_user_id or by phone (E.164, normalized identically to the enrollment-initiate request).
The target must be in PENDING_PROOF. A wallet identity that is already VERIFIED needs no further verification link and is rejected with VALIDATION_ERROR.
Send limits: a maximum of 3 sends per rolling 24-hour window, with a minimum interval of 60 seconds between sends. Each successful resend mints a fresh single-use verification token and invalidates the previously issued token. A send that exceeds the per-window cap is rejected with details.retry_after_seconds indicating when the next send is permitted.
This endpoint is idempotent on the Idempotency-Key header. A retried resend submitted within the 60-second floor replays the prior dispatch rather than counting as a new send.
A target that belongs to a different tenant returns 404.
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).
Body
Body for POST /enroll/resend. Target by wallet_user_id OR phone (at least one required).
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.
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.
The PENDING_PROOF wallet identity to resend to.
E.164 phone (normalized identically to initiate), alternative to wallet_user_id.
Response
Fresh verification SMS dispatched (or idempotent replay within the 60s floor).
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.
Result of POST /enroll/resend.
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.