curl --request POST \
--url https://api.sand.etherfuse.com/ramp/customer/{customer_id}/verification/import \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"shareToken": "_act-sbx-jwt-eyJhbGciOi...",
"additionalInfo": {
"curp": "XEXX010101HNEXXXA4"
}
}
'const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
shareToken: '_act-sbx-jwt-eyJhbGciOi...',
additionalInfo: {curp: 'XEXX010101HNEXXXA4'}
})
};
fetch('https://api.sand.etherfuse.com/ramp/customer/{customer_id}/verification/import', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sand.etherfuse.com/ramp/customer/{customer_id}/verification/import"
payload = {
"shareToken": "_act-sbx-jwt-eyJhbGciOi...",
"additionalInfo": { "curp": "XEXX010101HNEXXXA4" }
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"customerId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "in_progress",
"requirements": [
{
"type": "personal_data",
"status": "satisfied",
"requiresLaunch": false
},
{
"type": "identity_document",
"status": "satisfied",
"requiresLaunch": false
},
{
"type": "occupation",
"status": "pending",
"requiresLaunch": false
},
{
"type": "selfie",
"status": "satisfied",
"requiresLaunch": true
},
{
"type": "customer_agreement",
"status": "pending",
"requiresLaunch": false
}
]
}The verification session could not be imported: share token has expiredThis customer's verification is approved, denied, or in review; a new session cannot replace it<string>Import a verified session
Import a verification the customer already passed on the partner’s own Sumsub level, handed over as a share token. Prerequisites, and what does and doesn’t transfer: KYC Sumsub Shared Token.
Answers 200, not 202: the import is committed before the response, which carries the same requirements breakdown as GET /ramp/customer/{customer_id}/kyc?requirements=true.
That breakdown covers the identity stage only. Send what it lists, then wait for kyc_updated and read the requirements again: proof_of_address and customer_agreement appear only when the customer reaches their stages. See Requirements unlock in stages.
Only shareToken is accepted. The verification level and the customer’s identity are ours to decide. The token is a credential; it is never logged and appears in no response.
No country is sent: it is read from the shared verification and used to route the customer. The customer’s registered userInfo.email is required and is set on the imported applicant.
Nothing is trusted wholesale. Everything imported is re-checked against Etherfuse’s own requirements, so a session approved in the partner’s account is not automatically approved here.
Importing again. If the customer’s verification has not reached review, a new import replaces it, for example after an earlier import left documents missing. Once the customer is approved, denied, or in review, the import returns 409.
curl --request POST \
--url https://api.sand.etherfuse.com/ramp/customer/{customer_id}/verification/import \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"shareToken": "_act-sbx-jwt-eyJhbGciOi...",
"additionalInfo": {
"curp": "XEXX010101HNEXXXA4"
}
}
'const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
shareToken: '_act-sbx-jwt-eyJhbGciOi...',
additionalInfo: {curp: 'XEXX010101HNEXXXA4'}
})
};
fetch('https://api.sand.etherfuse.com/ramp/customer/{customer_id}/verification/import', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sand.etherfuse.com/ramp/customer/{customer_id}/verification/import"
payload = {
"shareToken": "_act-sbx-jwt-eyJhbGciOi...",
"additionalInfo": { "curp": "XEXX010101HNEXXXA4" }
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"customerId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "in_progress",
"requirements": [
{
"type": "personal_data",
"status": "satisfied",
"requiresLaunch": false
},
{
"type": "identity_document",
"status": "satisfied",
"requiresLaunch": false
},
{
"type": "occupation",
"status": "pending",
"requiresLaunch": false
},
{
"type": "selfie",
"status": "satisfied",
"requiresLaunch": true
},
{
"type": "customer_agreement",
"status": "pending",
"requiresLaunch": false
}
]
}The verification session could not be imported: share token has expiredThis customer's verification is approved, denied, or in review; a new session cannot replace it<string>Authorizations
API key sent in the Authorization header.
Path Parameters
The customer (child org) ID. Must belong to the caller's organization or a direct child.
Body
A verification session the partner already completed with the same provider, handed over as a share token they created for us. No other fields are accepted.
The single-use, short-lived share token created for the verified applicant, targeting Etherfuse's client id.
"_act-sbx-jwt-eyJhbGciOi..."
Information a shared session does not bring across. Custom fields on your own verification level are not copied when you share an applicant.
Show child attributes
Show child attributes
Response
The session was imported. requirements lists what is still outstanding. If we could not read the requirements, we leave the field out; read GET /ramp/customer/{customer_id}/kyc?requirements=true instead.
The outcome of importing a verification session.
not_started, in_progress, submitted, approved, denied What is still outstanding after the import: the same breakdown GET /ramp/customer/{customer_id}/kyc?requirements=true returns. Left out if we could not read the requirements after the import.
Show child attributes
Show child attributes