active. They appear as a map on the customer object, keyed by field name, with each entry describing its status and which capabilities it affects. Requirements are only shown for capabilities that have been requested, and when a requirement is satisfied it disappears from the map.
Identity verification runs asynchronously. After you submit the required information, Coinbase evaluates it, and the affected capabilities transition out of pending once verification completes.
Requirements map
requirements is keyed by field name; the key itself is the requirement:
Requirement statuses
When verification passes, the requirement is removed from the map entirely. Requirements in
due or rejected need action from you; pending requirements are being processed asynchronously.
Which capabilities require which requirements
You never have to hard-code this mapping — a customer’srequirements map only ever lists what their requested capabilities still need, and each entry’s impact array names the capabilities it is blocking. The table below is provided as a planning reference for what to collect up front.
Most capabilities share a common baseline set. tradeCrypto requires additional due-diligence information on top of that baseline.
This mapping is determined by Coinbase’s compliance policy and is subject to change — requirements may be added, removed, or re-scoped to different capabilities over time, and they can vary by the customer’s jurisdiction. Always treat the live
requirements map on the customer object (and the API reference) as the source of truth rather than this table.Resolving requirements
Every field-based requirement is resolved by submitting the corresponding field underindividual via PUT /v2/customers/{customerId}. The two non-field requirements — tos and taxAttestation — are resolved with their own arrays.
Requirement keys use canonical field names that map to the address shape in the request body:
addressSubdivision resolves with individual.address.state, and addressPostalCode resolves with individual.address.postCode.The resolution loop
A typical pattern: submit outstanding requirements, then wait for the affected capability to leavepending.
customers.capability.changed webhook instead of polling.
Terms of Service
When atos requirement is present, requirements.tos.tosVersions[] lists each Terms of Service version the customer must still accept, with a stable versionId, the languages it is published in, and a url to render (append ?lang=<tag> for a specific translation).
- Render each version’s
urlto the customer and capture acceptance. - Submit one acceptance per required version:
language must be one of the version’s languages, or the request is rejected with unsupported_tos_language. When new versions are published, only the new versionIds appear in tosVersions[] — submit acceptances for just those.
Tax attestations
Some capabilities require a tax attestation. When ataxAttestation requirement is present, requirements.taxAttestation.taxForms[] lists the forms the customer must complete (for example, us_w9). Submit one taxAttestations entry per required form:
form; the example above shows IRS Form W-9. Tax attestations are ingestion-only and never returned on read.
Rejected requirements
A requirement withstatus: rejected means the submitted value failed verification. Collect the field from the customer again and resubmit it via PUT /v2/customers/{customerId}. Resubmitting a corrected value starts a new verification.
What you cannot resolve
Some capabilities becomeinactive because of a terminal compliance decision (for example, a sanctions watchlist match). These cannot be unlocked through the API, and no requirement resubmission will clear them.
Ongoing monitoring
Compliance does not stop at onboarding. Coinbase continuously monitors customers and may flag one for KYC re-verification. When that happens you receive acustomers.kyc_refresh.flagged webhook carrying a deadline; capabilities may remain active until the deadline and are disabled afterward until the customer resubmits the requested information. A customers.kyc_refresh.completed webhook is emitted once the refresh is satisfied.
Testing in sandbox
In sandbox and test environments, Coinbase recognizes magic SSN values that force a deterministic verification outcome so you can exercise each capability state end-to-end without real PII. Submit them asindividual.fullSsn (or individual.ssnLast4).
The recoverable decline (
...0001) is the only outcome you can retry — resubmitting a passing value starts a new verification and can activate the capability. The block (...0002) is terminal: resubmitting a passing SSN afterward does not lift it.