curl --request POST \
--url https://api.entendre.finance/v1/connections \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-API-Key: <api-key>' \
--data '
{
"provider": "kraken",
"name": "Kraken main",
"legal_entity_ids": [
"le_507f1f77bcf86cd799439011"
],
"api_key": "ek_live_...",
"api_secret": "..."
}
'const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'X-API-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
provider: 'kraken',
name: 'Kraken main',
legal_entity_ids: ['le_507f1f77bcf86cd799439011'],
api_key: 'ek_live_...',
api_secret: '...'
})
};
fetch('https://api.entendre.finance/v1/connections', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.entendre.finance/v1/connections"
payload = {
"provider": "kraken",
"name": "Kraken main",
"legal_entity_ids": ["le_507f1f77bcf86cd799439011"],
"api_key": "ek_live_...",
"api_secret": "..."
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"data": {
"id": "con_507f1f77bcf86cd799439011",
"organization_id": "org_507f1f77bcf86cd799439011",
"provider": "quickbooks",
"auth_method": "oauth",
"name": "QuickBooks accounting",
"status": "pending_setup",
"external_account_id": null,
"legal_entity_ids": [
"le_507f1f77bcf86cd799439011"
],
"source_ids": [],
"capabilities": [
"import_transactions"
],
"authorization_attempt": {
"id": "auth_507f1f77bcf86cd799439011",
"status": "pending",
"setup_url": "https://app.entendre.finance/settings/integrations",
"expires_at": "2026-08-31T12:10:00Z",
"error": null
},
"created_at": "2026-08-31T12:00:00Z",
"guidance": {
"allowed_actions": [],
"warnings": [],
"version": "v_example"
},
"revocation_error": null,
"retained_resources": [
"transactions"
],
"etag": "\"v_example\""
}
}{
"data": {
"id": "con_507f1f77bcf86cd799439011",
"organization_id": "org_507f1f77bcf86cd799439011",
"provider": "quickbooks",
"auth_method": "oauth",
"name": "QuickBooks accounting",
"status": "pending_setup",
"external_account_id": null,
"legal_entity_ids": [
"le_507f1f77bcf86cd799439011"
],
"source_ids": [],
"capabilities": [
"import_transactions"
],
"authorization_attempt": {
"id": "auth_507f1f77bcf86cd799439011",
"status": "pending",
"setup_url": "https://app.entendre.finance/settings/integrations",
"expires_at": "2026-08-31T12:10:00Z",
"error": null
},
"created_at": "2026-08-31T12:00:00Z",
"guidance": {
"allowed_actions": [],
"warnings": [],
"version": "v_example"
},
"revocation_error": null,
"retained_resources": [
"transactions"
],
"etag": "\"v_example\""
}
}{
"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"
}
}Connect provider
Connects an exchange, Plaid, Ramp or general-ledger provider.
curl --request POST \
--url https://api.entendre.finance/v1/connections \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-API-Key: <api-key>' \
--data '
{
"provider": "kraken",
"name": "Kraken main",
"legal_entity_ids": [
"le_507f1f77bcf86cd799439011"
],
"api_key": "ek_live_...",
"api_secret": "..."
}
'const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'X-API-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
provider: 'kraken',
name: 'Kraken main',
legal_entity_ids: ['le_507f1f77bcf86cd799439011'],
api_key: 'ek_live_...',
api_secret: '...'
})
};
fetch('https://api.entendre.finance/v1/connections', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.entendre.finance/v1/connections"
payload = {
"provider": "kraken",
"name": "Kraken main",
"legal_entity_ids": ["le_507f1f77bcf86cd799439011"],
"api_key": "ek_live_...",
"api_secret": "..."
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"data": {
"id": "con_507f1f77bcf86cd799439011",
"organization_id": "org_507f1f77bcf86cd799439011",
"provider": "quickbooks",
"auth_method": "oauth",
"name": "QuickBooks accounting",
"status": "pending_setup",
"external_account_id": null,
"legal_entity_ids": [
"le_507f1f77bcf86cd799439011"
],
"source_ids": [],
"capabilities": [
"import_transactions"
],
"authorization_attempt": {
"id": "auth_507f1f77bcf86cd799439011",
"status": "pending",
"setup_url": "https://app.entendre.finance/settings/integrations",
"expires_at": "2026-08-31T12:10:00Z",
"error": null
},
"created_at": "2026-08-31T12:00:00Z",
"guidance": {
"allowed_actions": [],
"warnings": [],
"version": "v_example"
},
"revocation_error": null,
"retained_resources": [
"transactions"
],
"etag": "\"v_example\""
}
}{
"data": {
"id": "con_507f1f77bcf86cd799439011",
"organization_id": "org_507f1f77bcf86cd799439011",
"provider": "quickbooks",
"auth_method": "oauth",
"name": "QuickBooks accounting",
"status": "pending_setup",
"external_account_id": null,
"legal_entity_ids": [
"le_507f1f77bcf86cd799439011"
],
"source_ids": [],
"capabilities": [
"import_transactions"
],
"authorization_attempt": {
"id": "auth_507f1f77bcf86cd799439011",
"status": "pending",
"setup_url": "https://app.entendre.finance/settings/integrations",
"expires_at": "2026-08-31T12:10:00Z",
"error": null
},
"created_at": "2026-08-31T12:00:00Z",
"guidance": {
"allowed_actions": [],
"warnings": [],
"version": "v_example"
},
"revocation_error": null,
"retained_resources": [
"transactions"
],
"etag": "\"v_example\""
}
}{
"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"
}
}| Provider | Send | Next step |
|---|---|---|
| Exchange | api_key, api_secret and, where required, a passphrase | None. |
| Plaid | A public_token from Plaid Link, or start the hosted setup | Finish the setup before you select a bank source. |
| Ramp | The supported credentials, or start the hosted setup | None. |
| QuickBooks, Xero, NetSuite | redirect_url or subdomain | Open the returned data.redirect_url to give consent. Set up NetSuite for your organization first. |
| Campfire, DualEntry | api_key | Entendre checks the credentials and starts the accounting import. Campfire needs a USD legal entity and can return warning fields for a partial import. |
auth_method. Credentials are never returned. For a hosted setup, complete the returned authorization attempt before it expires. Then use List connections to confirm the connection and get its connection_ids and source_ids.
To reauthorize a general-ledger connection, call this operation again.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
- Exchange
- Bank
- Card
- Rain
- QuickBooks (OAuth)
- Xero (OAuth)
- NetSuite (OAuth)
- DualEntry (API key)
- Campfire (API key)
An exchange venue. Credentials are supplied inline; there is no hosted setup for an exchange.
The exchange venue in lower case, such as kraken or binance. For QuickBooks, Xero, NetSuite, Campfire and DualEntry, use the general-ledger request body.
"kraken"
Display name. Required for an exchange connection.
1 - 500Exactly one legal entity. An exchange connection scopes to a single entity.
1 elementLegal entity ID (le_…).
Venue API key.
1Venue API secret.
1Venue API passphrase. Required for coinbase, coinbase_exchange, coinbase_prime, coinbase_international and kucoin; omitting it there fails with 400.
1Registered HTTPS dashboard URL to return to after hosted setup.
"https://app.entendre.finance/settings/integrations"
Response
OAuth consent URL for a hosted GL provider (data.redirect_url).
- Option 1
- Option 2
The connection.
Show child attributes
Show child attributes