curl --request POST \
--url https://api.entendre.finance/v1/sources \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-API-Key: <api-key>' \
--data '
{
"name": "Treasury wallet",
"address": "0x0000000000000000000000000000000000000001",
"chain": "eth",
"type": "wallet"
}
'{
"data": {
"id": "src_507f1f77bcf86cd799439011",
"source_type": "manual_bank",
"organization_id": "org_507f1f77bcf86cd799439011",
"legal_entity_id": "le_507f1f77bcf86cd799439011",
"name": "Operating account",
"status": "active",
"created_at": "2026-08-31T12:00:00Z",
"updated_at": "2026-08-31T12:00:00Z",
"detail": {
"account_name": "Operating account",
"has_credentials": false,
"ledger_account_id": null
}
}
}{
"data": {
"id": "src_507f1f77bcf86cd799439011",
"source_type": "manual_bank",
"organization_id": "org_507f1f77bcf86cd799439011",
"legal_entity_id": "le_507f1f77bcf86cd799439011",
"name": "Operating account",
"status": "active",
"created_at": "2026-08-31T12:00:00Z",
"updated_at": "2026-08-31T12:00:00Z",
"detail": {
"account_name": "Operating account",
"has_credentials": false,
"ledger_account_id": null
}
}
}{
"data": {
"job_id": "job_wallet-sync:realtime:507f1f77bcf86cd799439011",
"message": "Import queued"
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid path, query or request body.",
"request_id": "req_example"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication is required.",
"request_id": "req_example"
}
}{
"error": {
"code": "FORBIDDEN",
"message": "Insufficient access to organization",
"request_id": "req_example"
}
}{
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Resource not found",
"request_id": "req_example"
}
}{
"error": {
"code": "CONFLICT",
"message": "The resource state does not allow this operation.",
"request_id": "req_example"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Retry after 30s.",
"request_id": "req_example"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error",
"request_id": "req_example"
}
}{
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "Service unavailable.",
"request_id": "req_example"
}
}Create source
Creates a source: a wallet, a connected provider account, a manual bank account or card, or a statement import.
curl --request POST \
--url https://api.entendre.finance/v1/sources \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-API-Key: <api-key>' \
--data '
{
"name": "Treasury wallet",
"address": "0x0000000000000000000000000000000000000001",
"chain": "eth",
"type": "wallet"
}
'{
"data": {
"id": "src_507f1f77bcf86cd799439011",
"source_type": "manual_bank",
"organization_id": "org_507f1f77bcf86cd799439011",
"legal_entity_id": "le_507f1f77bcf86cd799439011",
"name": "Operating account",
"status": "active",
"created_at": "2026-08-31T12:00:00Z",
"updated_at": "2026-08-31T12:00:00Z",
"detail": {
"account_name": "Operating account",
"has_credentials": false,
"ledger_account_id": null
}
}
}{
"data": {
"id": "src_507f1f77bcf86cd799439011",
"source_type": "manual_bank",
"organization_id": "org_507f1f77bcf86cd799439011",
"legal_entity_id": "le_507f1f77bcf86cd799439011",
"name": "Operating account",
"status": "active",
"created_at": "2026-08-31T12:00:00Z",
"updated_at": "2026-08-31T12:00:00Z",
"detail": {
"account_name": "Operating account",
"has_credentials": false,
"ledger_account_id": null
}
}
}{
"data": {
"job_id": "job_wallet-sync:realtime:507f1f77bcf86cd799439011",
"message": "Import queued"
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid path, query or request body.",
"request_id": "req_example"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication is required.",
"request_id": "req_example"
}
}{
"error": {
"code": "FORBIDDEN",
"message": "Insufficient access to organization",
"request_id": "req_example"
}
}{
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Resource not found",
"request_id": "req_example"
}
}{
"error": {
"code": "CONFLICT",
"message": "The resource state does not allow this operation.",
"request_id": "req_example"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Retry after 30s.",
"request_id": "req_example"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error",
"request_id": "req_example"
}
}{
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "Service unavailable.",
"request_id": "req_example"
}
}| Source | Send | Result |
|---|---|---|
| Wallet | type: wallet and the wallet fields | Creates the wallet source. |
| Connected exchange, bank account or card | type and connection_id. If the connection has more than one account, add external_account_id. | Returns the existing source with HTTP 200 and reused: true. It does not create a duplicate or change the legal entity. |
| Manual bank account or card | type, name, legal_entity_id, bank_name and account_number_last_four | Finds the matching account, or creates it. |
| Statement | document_id and the matching type. Optional: legal_entity_id and statement_line_ids. | Starts a statement import. Usually returns HTTP 202 with a job ID. |
expand=statement.lines. Without statement_line_ids, the import takes all eligible pending lines.
A statement import reuses a linked or matched source, such as a Plaid account, or creates a manual source. The source can appear after the response returns. To add a manual exchange account, import a statement.Authorizations
Your organization API key. Some operations also need a key that is associated with a user; their pages say so.
Headers
Unique key for this operation. Retry with the same key and request body after a timeout. Keys are retained for at least 24 hours.
1 - 255Body
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
The kind of source to create.
wallet Display name for the source.
On-chain network for a wallet source (such as eth).
On-chain address for a wallet source.
Internal wallets require a legal entity.
internal, external Legal entity (le_ prefix). Required for internal wallets.
Tag IDs (tag_…).
Wallet only; every other type ignores it.
Response
Existing connected source, resolved manual account, or synchronous statement-import result.
- Option 1
- Option 2
Show child attributes
Show child attributes