KYC Proofs
Set Operator Key
Register the ed25519 key your proof manifests are signed with
PUT
/
customers
/
api
/
identity
/
operator-key
curl -X PUT "https://api.trusset.org/customers/api/identity/operator-key" \
-H "X-API-Key: trusset_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"publicKey": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a",
"proofVerificationEnabled": true,
"maxStalenessDays": 365
}'
const res = await fetch('https://api.trusset.org/customers/api/identity/operator-key', {
method: 'PUT',
headers: { 'X-API-Key': 'trusset_your_key_here', 'Content-Type': 'application/json' },
body: JSON.stringify({
publicKey: 'd75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a',
proofVerificationEnabled: true,
maxStalenessDays: 365
})
});
const { data } = await res.json();
if (!data.proofVerificationEnforced) {
throw new Error('This instance still files claims without checking STARKs');
}
{
"success": true,
"data": {
"operatorKey": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a",
"operatorKeySetAt": "2026-09-06T12:00:00.000Z",
"proofVerificationEnabled": true,
"proofVerificationEnforced": true,
"maxStalenessDays": 365
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-06T12:00:00.000Z"
}
}
Records the public half of the key the KYC zk-Proof Tool signs manifests with, and sets how strictly proofs are enforced on this instance.
The key is public by nature. No secret reaches this API, and the private half never leaves the machine that runs the tool.
npm run show prints the value to send here.
Body Parameters
Send any combination. Sending none is refused withNOTHING_TO_UPDATE.
string
32-byte ed25519 public key as 64 hex characters, with or without a
0x prefix. It is stored lowercased and unprefixed. Send null to clear the key. Without a key, an instance that does not enforce proofs skips the signature check.boolean
Whether this instance requires a STARK behind every leaf it files as a claim. When
true, verification needs a registered operator key and the proof in proofs for every leaf being filed, and a commitment-only leaf cannot be attested. A production instance enforces this whatever the setting says. A value that is not a boolean is ignored.integer
The staleness bound for a bundle’s batch date, in days.
PROOF_STALE is the failure for a batch date older than this. Integer between 1 and 36500. Send null to fall back to the default of 400 days.Response Fields
object
Show child attributes
Show child attributes
string
The stored key, lowercased and unprefixed, or
null.string
When it was last set, ISO 8601, or
null.boolean
What this instance asked for.
boolean
What actually applies. It is
true when the instance asked for it, and always on a production instance, whose trust anchors require proofs. Read this one, not the setting.integer
The stored bound, or
null when unset, in which case the default of 400 days applies.Rotating the key does not re-verify anything already attested. Claims filed under the old key stay on the registry. Rotate deliberately, and keep the old key with the bundles it signed.
Every change is written to the customer audit log as
PROOF_OPERATOR_KEY_UPDATED, recording whether a key was sent, whether it was cleared, and the new value of each setting sent.curl -X PUT "https://api.trusset.org/customers/api/identity/operator-key" \
-H "X-API-Key: trusset_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"publicKey": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a",
"proofVerificationEnabled": true,
"maxStalenessDays": 365
}'
const res = await fetch('https://api.trusset.org/customers/api/identity/operator-key', {
method: 'PUT',
headers: { 'X-API-Key': 'trusset_your_key_here', 'Content-Type': 'application/json' },
body: JSON.stringify({
publicKey: 'd75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a',
proofVerificationEnabled: true,
maxStalenessDays: 365
})
});
const { data } = await res.json();
if (!data.proofVerificationEnforced) {
throw new Error('This instance still files claims without checking STARKs');
}
{
"success": true,
"data": {
"operatorKey": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a",
"operatorKeySetAt": "2026-09-06T12:00:00.000Z",
"proofVerificationEnabled": true,
"proofVerificationEnforced": true,
"maxStalenessDays": 365
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-06T12:00:00.000Z"
}
}
Error Codes
| Code | HTTP | Cause |
|---|---|---|
INVALID_KEY | 400 | publicKey is not 64 hex characters |
INVALID_STALENESS | 400 | maxStalenessDays is not an integer between 1 and 36500 |
NOTHING_TO_UPDATE | 400 | None of the three fields was supplied |
INSTANCE_NOT_FOUND | 404 | The instance behind your key no longer exists |
OPERATOR_KEY_FAILED | 500 | The update could not be written |
⌘I
curl -X PUT "https://api.trusset.org/customers/api/identity/operator-key" \
-H "X-API-Key: trusset_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"publicKey": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a",
"proofVerificationEnabled": true,
"maxStalenessDays": 365
}'
const res = await fetch('https://api.trusset.org/customers/api/identity/operator-key', {
method: 'PUT',
headers: { 'X-API-Key': 'trusset_your_key_here', 'Content-Type': 'application/json' },
body: JSON.stringify({
publicKey: 'd75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a',
proofVerificationEnabled: true,
maxStalenessDays: 365
})
});
const { data } = await res.json();
if (!data.proofVerificationEnforced) {
throw new Error('This instance still files claims without checking STARKs');
}
{
"success": true,
"data": {
"operatorKey": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a",
"operatorKeySetAt": "2026-09-06T12:00:00.000Z",
"proofVerificationEnabled": true,
"proofVerificationEnforced": true,
"maxStalenessDays": 365
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-06T12:00:00.000Z"
}
}
