Pending Approvals
List Pending Verifications
KYC approvals waiting for your wallet to register them on chain
GET
/
customers
/
api
/
identity
/
pending
curl "https://api.trusset.org/customers/api/identity/pending?status=PENDING&limit=50" \
-H "X-API-Key: trusset_your_key_here"
const response = await fetch(
'https://api.trusset.org/customers/api/identity/pending?status=PENDING&limit=50',
{ headers: { 'X-API-Key': 'trusset_your_key_here' } }
);
const { data } = await response.json();
for (const row of data.rows) {
console.log(row.id, row.walletAddress, row.source, row.error ?? 'never attempted');
}
{
"success": true,
"data": {
"rows": [
{
"id": "cmg1u7k3p0004l80h2f9s6d1x",
"instanceId": "cmfz3k8q20001jr08w5n2x7cv",
"walletAddress": "0x96c5822784130360f904372b83e130be4a1894d6",
"investorType": 1,
"kycHash": "0xd815320690e956adfd07197c275b560561fbf5aab2d633d3d46db748c468d0af",
"softExpiry": "2027-03-27T14:03:11.000Z",
"hardExpiry": "2027-09-28T14:03:11.000Z",
"source": "SUMSUB",
"sourceRef": "cmg1u6x0d0002l80h8r4v2k9q",
"status": "PENDING",
"txHash": null,
"signedBy": null,
"error": null,
"metadata": {
"applicantId": "68d93f0c2b7e4a1f9c5d8e21",
"idLinkId": "cmg1u6x0d0002l80h8r4v2k9q",
"country": "DEU",
"investorTypeName": "RETAIL",
"notifyEmail": "[email protected]",
"issuerName": "Example Issuer AG",
"residencyClaim": {
"dataHash": "0xbd549c840e3415871bfba8d089cfbf49b7529d3c767c211b623552e15a0e669c",
"expiry": 1822140191
}
},
"createdAt": "2026-09-28T14:03:11.482Z",
"updatedAt": "2026-09-28T14:03:11.482Z",
"confirmedAt": null
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 1,
"totalPages": 1
}
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-30T10:00:00.000Z"
}
}
Lists the KYC approvals your instance has not yet put on chain. When a customer passes KYC through an ID link or a hosted verification service, Trusset computes the
A Sumsub approval from a country that the customer’s verification profile blocks is refused and never queued.
Other keys, such as
kycHash, investor type, expiries and residency claim, then queues a row here. Nothing is signed until your wallet signs it.
Work the queue in two steps. Build Pending Registration returns the transactions, and Confirm Pending Registration records them once mined. Dismiss Pending Verification closes a row without registering it.
Where rows come from
source | Queued when | sourceRef |
|---|---|---|
SUMSUB | Sumsub approves the customer of an ID link that names a wallet, and the wallet is not yet verified on your register | The ID link id |
VERIFICATION_SERVICE | Sumsub approves a customer who checked out through a hosted verification service | The checkout id |
REGISTER_SWITCH | Your instance moved to a different register. Every verified customer that is not archived and has a kycHash is queued for the new one | Your instance id |
REGISTER_SWITCH rows are not checked until the build.
The expiries are fixed when the row is queued: 180 days soft and 365 days hard, unless a hosted verification service sets its own. For a SUMSUB row whose verification profile sets reverifyDays, the hard expiry is that many days, and the soft expiry is 180 days or reverifyDays, whichever is shorter. They do not move while the row waits.
A wallet has at most one PENDING row. A new approval for the same wallet refreshes that row, replacing its hash, expiries and metadata, instead of adding a second.
A row also closes when its wallet is verified through Verify Identity or Batch Verify. It then reads CONFIRMED, with metadata.resolvedBy set to DIRECT_VERIFY or BATCH_VERIFY. Closed rows are kept and stay listable by status.
Query Parameters
string
default:"PENDING"
PENDING, CONFIRMED or DISMISSED, in any case. Any other value returns no rows, and no single value lists every status at once.integer
default:"1"
Page number. Values below 1 read as 1. A value that is not a number fails with
PENDING_LIST_FAILED.integer
default:"50"
Rows per page, capped at 200. Values below 1 read as 1. A value that is not a number fails with
PENDING_LIST_FAILED.Response Fields
object
array
Show child attributes
Show child attributes
string
The row. Pass it to Build, Confirm and Dismiss.
string
Your instance.
string
The customer’s wallet, lowercased.
integer
The investor type to register, as the register’s number:
1 retail, 2 professional, 3 eligible counterparty. It comes from the customer’s verification profile.string
The hash to register, computed at approval, or
null.string
ISO 8601, or
null.string
ISO 8601, or
null.string
SUMSUB, VERIFICATION_SERVICE or REGISTER_SWITCH.string
The ID link, checkout or instance the row came from.
string
PENDING, CONFIRMED or DISMISSED.string
The transaction the row was confirmed with, or
null.string
The wallet that signed that transaction, or
null.string
Why the most recent confirm left the row queued, or
null. Read it on PENDING rows.object
What the approval carried. The keys the queue acts on are listed below.
string
When the row was queued, ISO 8601.
string
When it last changed, ISO 8601.
string
When it confirmed, ISO 8601, or
null.object
Show child attributes
Show child attributes
string
The customer’s country, normally ISO 3166-1 alpha-3. The build checks it against the verification profile’s blocked countries, and an ERC-3643 register stores it.
string
The verification profile key, such as
RETAIL. A customer record that the confirm creates takes it as its investor type.object
dataHash and expiry, in Unix seconds, of the RESIDENCY claim to file. Present on SUMSUB and VERIFICATION_SERVICE rows that carried a country.string
The customer’s ONCHAINID on an ERC-3643 register, once recorded by Confirm ONCHAINID.
string
Where the customer is told that the registration completed.
SUMSUB and VERIFICATION_SERVICE rows only.string
DIRECT_VERIFY or BATCH_VERIFY when another endpoint closed the row.applicantId, idLinkId, checkoutId and name, describe where the approval came from. A confirm uses them to fill in a customer record it creates, and to run its follow-ups.
curl "https://api.trusset.org/customers/api/identity/pending?status=PENDING&limit=50" \
-H "X-API-Key: trusset_your_key_here"
const response = await fetch(
'https://api.trusset.org/customers/api/identity/pending?status=PENDING&limit=50',
{ headers: { 'X-API-Key': 'trusset_your_key_here' } }
);
const { data } = await response.json();
for (const row of data.rows) {
console.log(row.id, row.walletAddress, row.source, row.error ?? 'never attempted');
}
{
"success": true,
"data": {
"rows": [
{
"id": "cmg1u7k3p0004l80h2f9s6d1x",
"instanceId": "cmfz3k8q20001jr08w5n2x7cv",
"walletAddress": "0x96c5822784130360f904372b83e130be4a1894d6",
"investorType": 1,
"kycHash": "0xd815320690e956adfd07197c275b560561fbf5aab2d633d3d46db748c468d0af",
"softExpiry": "2027-03-27T14:03:11.000Z",
"hardExpiry": "2027-09-28T14:03:11.000Z",
"source": "SUMSUB",
"sourceRef": "cmg1u6x0d0002l80h8r4v2k9q",
"status": "PENDING",
"txHash": null,
"signedBy": null,
"error": null,
"metadata": {
"applicantId": "68d93f0c2b7e4a1f9c5d8e21",
"idLinkId": "cmg1u6x0d0002l80h8r4v2k9q",
"country": "DEU",
"investorTypeName": "RETAIL",
"notifyEmail": "[email protected]",
"issuerName": "Example Issuer AG",
"residencyClaim": {
"dataHash": "0xbd549c840e3415871bfba8d089cfbf49b7529d3c767c211b623552e15a0e669c",
"expiry": 1822140191
}
},
"createdAt": "2026-09-28T14:03:11.482Z",
"updatedAt": "2026-09-28T14:03:11.482Z",
"confirmedAt": null
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 1,
"totalPages": 1
}
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-30T10:00:00.000Z"
}
}
Error Codes
| Code | HTTP | Cause |
|---|---|---|
NOT_FOUND | 404 | The instance behind your key is archived or no longer exists |
PENDING_LIST_FAILED | 500 | The queue could not be read, or page or limit is not a number |
⌘I
curl "https://api.trusset.org/customers/api/identity/pending?status=PENDING&limit=50" \
-H "X-API-Key: trusset_your_key_here"
const response = await fetch(
'https://api.trusset.org/customers/api/identity/pending?status=PENDING&limit=50',
{ headers: { 'X-API-Key': 'trusset_your_key_here' } }
);
const { data } = await response.json();
for (const row of data.rows) {
console.log(row.id, row.walletAddress, row.source, row.error ?? 'never attempted');
}
{
"success": true,
"data": {
"rows": [
{
"id": "cmg1u7k3p0004l80h2f9s6d1x",
"instanceId": "cmfz3k8q20001jr08w5n2x7cv",
"walletAddress": "0x96c5822784130360f904372b83e130be4a1894d6",
"investorType": 1,
"kycHash": "0xd815320690e956adfd07197c275b560561fbf5aab2d633d3d46db748c468d0af",
"softExpiry": "2027-03-27T14:03:11.000Z",
"hardExpiry": "2027-09-28T14:03:11.000Z",
"source": "SUMSUB",
"sourceRef": "cmg1u6x0d0002l80h8r4v2k9q",
"status": "PENDING",
"txHash": null,
"signedBy": null,
"error": null,
"metadata": {
"applicantId": "68d93f0c2b7e4a1f9c5d8e21",
"idLinkId": "cmg1u6x0d0002l80h8r4v2k9q",
"country": "DEU",
"investorTypeName": "RETAIL",
"notifyEmail": "[email protected]",
"issuerName": "Example Issuer AG",
"residencyClaim": {
"dataHash": "0xbd549c840e3415871bfba8d089cfbf49b7529d3c767c211b623552e15a0e669c",
"expiry": 1822140191
}
},
"createdAt": "2026-09-28T14:03:11.482Z",
"updatedAt": "2026-09-28T14:03:11.482Z",
"confirmedAt": null
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 1,
"totalPages": 1
}
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-30T10:00:00.000Z"
}
}
