Confirm Receipt
The in-app way for a receiver to claim a player-to-player send. The receiver confirms in their own app with a device signature instead of typing a claim code. This applies to sends only — a self-transfer has no second person to confirm.
/api/sdk/send/{id}/confirm-receipt
Receiver confirms an incoming send; the funds are credited and the send completes
Authenticated with the RECEIVER's player token
The token is minted by the receiving game for the receiver. The receiver's enrolled phone must match the one the send was addressed to.
Authorization: Bearer <receiver's player token>Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| device_fingerprint | string | Yes | Which enrolled device is confirming |
| device_signal | object | Yes | Signature over the action — see Device Enrollment |
| biometric_verified | boolean | If stepped up | Honest result of the step-up, when required |
Success Response
{
"status": "completed",
"transaction_id": "TX_send789",
"amount_received": "90.00"
}How the receiver discovers an incoming send
The receiver's app polls GET /api/sdk/transfers/pending. An incoming send appears as an item withkind: "receiving_confirm" (amount, source game, expiry). Render the confirm prompt from that, then call this endpoint.
Other responses to handle
| Status | Meaning / what to do |
|---|---|
| 403 not_intended_receiver | This player/phone isn't the addressed recipient |
| 404 receiving_tenant_unavailable | The receiving game can't be resolved right now — retry shortly |
| 409 receiver_not_enrolled_use_claim_code | No account in the receiving game yet — fall back to the claim-code flow |
| 400 no_registered_device_key | This receiver has no enrolled device key — register the device first (Device Enrollment) |
| 202 STEP_UP_REQUIRED | May be returned when risk step-up is enabled for your game — run biometric / PIN, then retry with biometric_verified: true. A no-op when the flag is off. |
| 503 sdk_verification_disabled | In-app verification is off (feature / flag) for this game — fall back to the claim-code flow |
| 401 SIGNAL_* | Bad/stale/replayed signature — re-sign with a fresh device_signal |
| 400 (cannot be confirmed) | Already resolved — treat as "already done" |
Receivers without the app are unaffected
A receiver who isn't enrolled (no account/app in the receiving game) simply uses the existing claim-code flow — the send still completes. In-app confirm is the upgrade for enrolled receivers, not a requirement for everyone.