curl --request POST \
--url https://api-sb.meld.io/crypto/onramp/requirements-sessions/{id}/actions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"version": 1,
"operation": "READ"
}
'{
"expiresAt": "2023-11-07T05:31:56Z",
"next": [
{
"code": "<string>",
"kind": "SUBMIT",
"serviceProviders": [
"<string>"
],
"stepId": "<string>",
"type": "<string>",
"expiresAt": "2023-11-07T05:31:56Z",
"fields": [
{
"key": "<string>",
"allowedValues": [
"<string>"
],
"fieldType": "<string>",
"jsonSchema": "<string>",
"label": "<string>"
}
],
"level": "NONE",
"reason": "<string>",
"url": "<string>"
}
],
"pollAfterMs": 4000,
"providers": [
{
"eligible": true,
"requirements": [
{
"action": {
"body": {},
"event": "<string>",
"expiresAt": "2026-11-04T15:45:00Z",
"method": "<string>",
"nextStep": "NONE",
"path": "<string>",
"refresh": {
"body": {},
"method": "<string>",
"path": "<string>"
},
"type": "CALL",
"url": "<string>"
},
"code": "<string>",
"currentLevel": "NONE",
"dependsOn": [
"<string>"
],
"errorCodes": [
"<string>"
],
"level": "NONE",
"missingFields": [
{
"allowedValues": [
"<string>"
],
"fieldType": "<string>",
"jsonSchema": "<string>",
"key": "<string>",
"label": "<string>",
"providerCode": "<string>",
"source": "SUMSUB"
}
],
"process": {
"automaticSubmissionRetryAllowed": true,
"code": "<string>",
"endpoint": "<string>",
"method": "<string>",
"pollIntervalMs": 123,
"pollTimeoutMs": 123,
"protocol": "<string>",
"type": "<string>"
},
"processStates": [
{
"code": "<string>",
"model": "<string>",
"reason": "<string>",
"status": "<string>",
"submittable": true
}
],
"processes": [
"<string>"
],
"reason": "<string>",
"satisfiedFields": [
"<string>"
],
"status": "REQUIRED",
"timing": "PRE_ORDER",
"type": "VERIFICATION",
"url": "<string>"
}
],
"serviceProvider": "<string>",
"status": "READY"
}
],
"status": "READY",
"version": 1,
"waitingOn": [
{
"code": "<string>",
"serviceProviders": [
"<string>"
],
"stepId": "<string>",
"type": "<string>",
"event": "<string>"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "<string>",
"errors": [
"<string>"
],
"message": "<string>",
"requestId": "<string>",
"serviceProviderDetails": {
"code": "5034",
"message": "Digital currency and blockchain combination is restricted for customer's country"
},
"timestamp": "2026-08-14T09:41:22.482+00:00"
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}Run a requirements session action
Called by the Meld SDK, not by your backend. Meld.ensureReady posts READ to get the session’s plan, and RUN_STEP to run one step of it, with the session token as the bearer. A web page reaches it through your actionProxyUrl proxy, because the Meld API accepts it from a browser only on Meld’s own origins; native apps call it directly. READ changes nothing and takes no X-Idempotency-Key. RUN_STEP takes a new X-Idempotency-Key for each run of a step. Requests are at most 64 KiB, a READ answer at most 256 KiB, and every response carries Cache-Control: no-store. Error bodies are {version, code}, with fieldErrors on a RUN_STEP 400.
curl --request POST \
--url https://api-sb.meld.io/crypto/onramp/requirements-sessions/{id}/actions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"version": 1,
"operation": "READ"
}
'{
"expiresAt": "2023-11-07T05:31:56Z",
"next": [
{
"code": "<string>",
"kind": "SUBMIT",
"serviceProviders": [
"<string>"
],
"stepId": "<string>",
"type": "<string>",
"expiresAt": "2023-11-07T05:31:56Z",
"fields": [
{
"key": "<string>",
"allowedValues": [
"<string>"
],
"fieldType": "<string>",
"jsonSchema": "<string>",
"label": "<string>"
}
],
"level": "NONE",
"reason": "<string>",
"url": "<string>"
}
],
"pollAfterMs": 4000,
"providers": [
{
"eligible": true,
"requirements": [
{
"action": {
"body": {},
"event": "<string>",
"expiresAt": "2026-11-04T15:45:00Z",
"method": "<string>",
"nextStep": "NONE",
"path": "<string>",
"refresh": {
"body": {},
"method": "<string>",
"path": "<string>"
},
"type": "CALL",
"url": "<string>"
},
"code": "<string>",
"currentLevel": "NONE",
"dependsOn": [
"<string>"
],
"errorCodes": [
"<string>"
],
"level": "NONE",
"missingFields": [
{
"allowedValues": [
"<string>"
],
"fieldType": "<string>",
"jsonSchema": "<string>",
"key": "<string>",
"label": "<string>",
"providerCode": "<string>",
"source": "SUMSUB"
}
],
"process": {
"automaticSubmissionRetryAllowed": true,
"code": "<string>",
"endpoint": "<string>",
"method": "<string>",
"pollIntervalMs": 123,
"pollTimeoutMs": 123,
"protocol": "<string>",
"type": "<string>"
},
"processStates": [
{
"code": "<string>",
"model": "<string>",
"reason": "<string>",
"status": "<string>",
"submittable": true
}
],
"processes": [
"<string>"
],
"reason": "<string>",
"satisfiedFields": [
"<string>"
],
"status": "REQUIRED",
"timing": "PRE_ORDER",
"type": "VERIFICATION",
"url": "<string>"
}
],
"serviceProvider": "<string>",
"status": "READY"
}
],
"status": "READY",
"version": 1,
"waitingOn": [
{
"code": "<string>",
"serviceProviders": [
"<string>"
],
"stepId": "<string>",
"type": "<string>",
"event": "<string>"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "<string>",
"errors": [
"<string>"
],
"message": "<string>",
"requestId": "<string>",
"serviceProviderDetails": {
"code": "5034",
"message": "Digital currency and blockchain combination is restricted for customer's country"
},
"timestamp": "2026-08-14T09:41:22.482+00:00"
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}{
"code": "INVALID_REQUEST",
"version": 1,
"fieldErrors": [
{
"key": "email",
"reason": "REQUIRED"
}
]
}Authorizations
Headers
Path Parameters
Body
READ, or RUN_STEP for one step of next. Any member the operation or the step's kind doesn't take is 400 INVALID_REQUEST
Response
READ: the plan. RUN_STEP: what running the step left to do
- RequirementsSnapshot
- RequirementsRunOutcome
READ: every session provider's checklist, and the plan across them
With readyWhen ALL: BLOCKED when any provider is, READY when all are, ACTION_REQUIRED when next has steps or a provider has a step to act on, WAITING when only waitingOn is left, UNDETERMINED otherwise. With ANY: READY when one provider is, BLOCKED only when all are. An open set
READY, ACTION_REQUIRED, WAITING, BLOCKED, UNDETERMINED