Core API
Resolve API
Resolution is the heart of Settla. It turns an alias into an identity plus the endpoints the calling consumer is authorized to see — filtered by privacy level, scope, and consent. It is read-only and moves no money.
POST
/v1/resolveRequires scope resolve (or *). Provide either a single alias string, or an explicit type + value pair.
Request body
| Field | Type | Description |
|---|---|---|
aliasoptional | string | The identifier to resolve, e.g. @john, +2348012345678, jo@x.com. Settla detects and normalizes the type. Provide this or type + value. |
typeoptional | string | Explicit alias type: username, phone, email, merchant_handle, payment_link. Use with value. |
valueoptional | string | The raw value when using the explicit type form, e.g. john. |
Example request
curl https://api.settla.network/v1/resolve \
-H "Authorization: Bearer sk_test_..." \
-H "Content-Type: application/json" \
-d '{"alias":"@john"}'
# explicit type form
curl https://api.settla.network/v1/resolve \
-H "Authorization: Bearer sk_test_..." \
-d '{"type":"username","value":"john"}'Response
{
"identity": "idn_2x9...",
"type": "user",
"matched_alias": { "type": "username", "value": "john" },
"endpoints": [
{ "id": "end_a1...", "type": "crypto_wallet", "address": "0x1234…abcd",
"capabilities": [ { "asset": "USDC", "network": "polygon", "rail": "onchain" } ] },
{ "id": "end_b2...", "type": "bank_account", "last4": "6789", "token": null,
"capabilities": [ { "asset": "USD", "rail": "ach" } ] }
],
"disclosure": { "consumer": "apc_...", "total_endpoints": 3, "disclosed": 2 },
"livemode": false,
"request_id": "req_7k2..."
}Privacy-aware disclosure
Resolution never returns more than you are entitled to see. Each endpoint passes a fail-closed filter before it is included:
- Environment match — a test key cannot see live data and vice versa.
- Scope — your key must carry
resolveor*, else403. - Alias privacy gate —
publicandunlistedresolve on exact match;privatereturns a uniform404;consent_requiredneeds an active grant. - Identity status — only
activeidentities resolve. - Per-endpoint privacy + consent — each endpoint is included only if active and allowed by its privacy level (and a valid
ConsentGrantforconsent_required).
Minimal disclosure
The response never reveals the existence of endpoints you cannot see — not-found and not-permitted are indistinguishable in both shape and timing.
disclosure.total_endpoints counts what the identity owns, but no detail of the hidden ones is exposed. See Privacy & Security.Per-type address projection
Bulk resolution
POST
/v1/resolve/bulkResolve up to 100 identifiers in one request. Each item carries its own status, so a single bad item never fails the batch.
curl https://api.settla.network/v1/resolve/bulk \
-H "Authorization: Bearer sk_test_..." \
-H "Content-Type: application/json" \
-d '{"items":["@john","+2348012345678",{"type":"email","value":"jo@x.com"}]}'{
"results": [
{ "alias": "@john", "status": "resolved", "identity": "idn_...", "endpoints": [ ... ] },
{ "alias": "+2348012345678", "status": "consent_pending" },
{ "alias": "jo@x.com", "status": "error",
"error": { "type": "not_found_error", "code": "alias_not_found" } }
]
}Per-item status is one of resolved, consent_pending, or error.
Errors
All errors use the canonical envelope — see Errors.