Contacts API
Store named EVM wallet contacts, reuse them in DALP operations, and keep address-book convenience separate from compliance controls.
Contacts store named EVM wallet addresses for the authenticated user. You use them to reduce copy-paste errors when operators reuse recipients in issuance, settlement, servicing, and transfer workflows. They support API and dapp address-book workflows. They do not represent identity verification, KYC status, token permissions, or transfer approval rules.
Prerequisites
You need:
- an authenticated DALP API request with access to the contacts routes
- a valid EVM wallet address for each contact
- a name from 1 to 120 characters
The dapp exposes the same primitive under Contacts. The contacts list lets you search saved names and wallets. The contact detail page shows the saved name, wallet, creation time, and update time, and lets you edit or delete the entry.
Quickstart: create a reusable contact
Create a contact by sending a name and wallet address. The platform validates the wallet as an EVM address and returns the saved contact in a response envelope.
curl -X POST https://your-platform.example.com/api/v2/contacts \
-H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Northwind Treasury",
"wallet": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F"
}'{
"data": {
"id": "8a3b8a14-8d50-4a52-a7db-2f4a7c2a8e5f",
"name": "Northwind Treasury",
"wallet": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F",
"createdAt": "2026-05-17T09:10:29.428Z",
"updatedAt": "2026-05-17T09:10:29.428Z"
},
"links": {
"self": "/v2/contacts/8a3b8a14-8d50-4a52-a7db-2f4a7c2a8e5f"
}
}If you omit id and submit a wallet that already exists in your contacts, DALP updates that existing contact name instead of creating a duplicate. If you include id, DALP updates that specific contact.
Contact model
| Field | Type | Requirement | Notes |
|---|---|---|---|
id | UUID string | Returned by DALP. Optional on upsert. | Include it only when you update a known contact. |
name | string | Required. 1 to 120 characters. | The dapp trims form input before saving. |
wallet | EVM address string | Required. | DALP normalizes and validates the address. |
createdAt | ISO 8601 timestamp | Returned by DALP. | Set when the contact is created. |
updatedAt | ISO 8601 timestamp | Returned by DALP. | Changes when the contact is updated. |
Contacts are convenience data. They do not prove that a wallet belongs to a participant, investor, custodian, or legal entity.
Endpoint reference
| Operation | Endpoint | Purpose |
|---|---|---|
| List contacts | GET /api/v2/contacts | Load a paginated contact list for the authenticated user. |
| Read contact | GET /api/v2/contacts/{id} | Load one saved contact by ID. |
| Create or update contact | POST /api/v2/contacts | Save a new contact or update an existing one. |
| Delete contact | DELETE /api/v2/contacts/{id} | Remove one saved contact. |
Existing integrations that still call /api/contacts, /api/contacts/{id}, or /api/contacts/search can continue to call those routes. New integrations should use /api/v2/contacts.
List and search contacts
Use the list endpoint for contacts screens and recipient pickers.
curl --globoff "https://your-platform.example.com/api/v2/contacts?page[offset]=0&page[limit]=50&sort=name" \
-H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx"{
"data": [
{
"id": "8a3b8a14-8d50-4a52-a7db-2f4a7c2a8e5f",
"name": "Northwind Treasury",
"wallet": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F",
"createdAt": "2026-05-17T09:10:29.428Z",
"updatedAt": "2026-05-17T09:10:29.428Z"
}
],
"meta": {
"total": 1
},
"links": {
"self": "/v2/contacts?page[offset]=0&page[limit]=50&sort=name",
"first": "/v2/contacts?page[offset]=0&page[limit]=50&sort=name",
"prev": null,
"next": null,
"last": "/v2/contacts?page[offset]=0&page[limit]=50&sort=name"
}
}You can order contacts by createdAt, updatedAt, name, or wallet. The default order is createdAt.
Use global search when an operator enters a name or wallet fragment. DALP searches the authenticated user's contact names and wallet addresses only.
curl --globoff "https://your-platform.example.com/api/v2/contacts?filter[q]=northwind" \
-H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx"Read, update, and delete one contact
Read a contact before you show a detail view or confirm a destructive action.
curl https://your-platform.example.com/api/v2/contacts/8a3b8a14-8d50-4a52-a7db-2f4a7c2a8e5f \
-H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx"{
"data": {
"id": "8a3b8a14-8d50-4a52-a7db-2f4a7c2a8e5f",
"name": "Northwind Treasury",
"wallet": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F",
"createdAt": "2026-05-17T09:10:29.428Z",
"updatedAt": "2026-05-17T09:10:29.428Z"
},
"links": {
"self": "/v2/contacts/8a3b8a14-8d50-4a52-a7db-2f4a7c2a8e5f"
}
}Update a contact by including its id in the POST /api/v2/contacts body.
curl -X POST https://your-platform.example.com/api/v2/contacts \
-H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"id": "8a3b8a14-8d50-4a52-a7db-2f4a7c2a8e5f",
"name": "Northwind Settlement Treasury",
"wallet": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F"
}'The dapp detail page uses this same update behavior. The Edit action opens a sheet with name and wallet fields, validates the wallet address, trims the submitted values, and saves the changed contact.
Delete a contact when the saved entry is no longer useful.
curl -X DELETE https://your-platform.example.com/api/v2/contacts/8a3b8a14-8d50-4a52-a7db-2f4a7c2a8e5f \
-H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx"Deleting a contact removes only the address-book entry. It does not change token balances, identities, claims, transfer approvals, custody rules, or historical transaction evidence.
Review a contact in the dapp
Operators can open a contact from the Contacts area to review its detail page before reusing the wallet address in another workflow. The detail page shows a breadcrumb back to Contacts, the contact display name, contact and address book badges, the wallet address in a copyable badge, and the created and updated timestamps.
The basic information card includes the contact edit and delete actions. Editing opens the contact sheet on the detail page. Deleting the contact refreshes the Contacts list and global search results, then returns the operator to Contacts. If the contact cannot be read, the dapp returns the operator to Contacts.
For step-by-step operator instructions, see Review address book contacts.
Errors and retry behavior
| Error | Status | What happened | State change | What to do |
|---|---|---|---|---|
INPUT_VALIDATION_FAILED | 422 | The request body does not match the contact schema, such as an invalid wallet address or a missing name. | No contact is saved. | Fix the request and retry. |
CONTACT_NOT_FOUND | 404 | DALP cannot find the requested contact in the authenticated user's contact scope. | No contact is changed. | Verify the contact ID and user scope before retrying. |
RESOURCE_ALREADY_EXISTS | 409 | You updated a contact by id to a wallet that belongs to another saved contact. | No contact is changed. | Read the existing contact and choose whether to update that entry instead. |
CONTACTS_FAILED_TO_UPSERT | 500 | DALP could not save the contact. | The request did not return a saved contact. | Retry only after checking platform status or support guidance. |
CONTACTS_FAILED_TO_LOAD_UPSERTED | 500 | DALP saved or attempted to save the contact, then could not load the saved row for the response. | The final state is uncertain from this response alone. | Read by wallet or list contacts before retrying the write. |
Production requirements
For production integrations:
- Treat a contact selection as an address lookup, not an authorization decision.
- Resolve the selected contact to its wallet address before submitting a token operation.
- Let the token operation enforce identity, compliance, freeze, approval, role, and custody checks.
- Display the wallet address at confirmation time so an operator can verify the recipient.
- Read the final token operation result from the relevant transaction, action, or servicing workflow.
This separation keeps contacts useful for operator accuracy without moving compliance decisions into address-book data.
Compliance and audit scope
Contacts are scoped to the authenticated user. They contain a display name, an EVM wallet address, and timestamps. They are not participant records, identity claims, KYC results, sanctions-screening outputs, custody mandates, or legal ownership records.
Auditors should treat contact history as operator convenience evidence only. The controls that determine whether a mint, transfer, burn, forced transfer, or servicing action can execute live on the asset, identity, approval, compliance, custody, and role paths for that operation.