curl --request POST \
--url https://api.entendre.finance/v1/journal-entries/syncs \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"journal_entry_ids": [
"je_507f1f77bcf86cd799439011"
]
}
'const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({journal_entry_ids: ['je_507f1f77bcf86cd799439011']})
};
fetch('https://api.entendre.finance/v1/journal-entries/syncs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.entendre.finance/v1/journal-entries/syncs"
payload = { "journal_entry_ids": ["je_507f1f77bcf86cd799439011"] }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"data": {
"dry_run": true,
"confirm_count": 1,
"summary": {
"requested": 1,
"journal_entries": 1,
"failed": 0
},
"eligible": [
"je_507f1f77bcf86cd799439011"
],
"failed": []
}
}{
"data": {
"jobs": [
{
"job_id": "apid:jeid",
"display_name": "Syncing March 2026 to QuickBooks"
}
],
"jobs_count": 1
},
"message": "1 sync job(s) queued; subscribe to SSE on each job_id for progress"
}{
"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": "One or more journal IDs are absent or not visible to the authenticated tenant.",
"request_id": "req_example"
}
}{
"error": {
"code": "CONFLICT",
"message": "QuickBooks authorization expired. Reconnect the general-ledger connection and retry.",
"details": {
"auth_error": true
}
}
}{
"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"
}
}Sync journals
Sends selected posted journals to the connected general ledger.
curl --request POST \
--url https://api.entendre.finance/v1/journal-entries/syncs \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"journal_entry_ids": [
"je_507f1f77bcf86cd799439011"
]
}
'const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({journal_entry_ids: ['je_507f1f77bcf86cd799439011']})
};
fetch('https://api.entendre.finance/v1/journal-entries/syncs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.entendre.finance/v1/journal-entries/syncs"
payload = { "journal_entry_ids": ["je_507f1f77bcf86cd799439011"] }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"data": {
"dry_run": true,
"confirm_count": 1,
"summary": {
"requested": 1,
"journal_entries": 1,
"failed": 0
},
"eligible": [
"je_507f1f77bcf86cd799439011"
],
"failed": []
}
}{
"data": {
"jobs": [
{
"job_id": "apid:jeid",
"display_name": "Syncing March 2026 to QuickBooks"
}
],
"jobs_count": 1
},
"message": "1 sync job(s) queued; subscribe to SSE on each job_id for progress"
}{
"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": "One or more journal IDs are absent or not visible to the authenticated tenant.",
"request_id": "req_example"
}
}{
"error": {
"code": "CONFLICT",
"message": "QuickBooks authorization expired. Reconnect the general-ledger connection and retry.",
"details": {
"auth_error": true
}
}
}{
"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"
}
}connection_id parameter. Read the results with List journal sync jobs.
Preview a sync
Setdry_run=true to check which journals can be assigned to sync jobs. Nothing is sent to the provider. Journals without a general-ledger configuration or provider company mapping are listed in failed.
To sync, send the same journal_entry_ids and the confirm_count of the preview. confirm_count checks only the number of distinct IDs. It does not check which journals they are, or whether they changed after the preview. A preview does not guarantee that the provider accepts the journals.
Sync
A sync that queues work returns HTTP 202. If the general ledger rejects the credentials, the request returns HTTP 409 and sends no journal.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
Journals to sync. Duplicates are accepted and collapsed. The destination is resolved per journal from its legal entity; there is no connection parameter.
1 - 5000 elementsJournal ID (je_…).
Safety check. When supplied it must equal the number of distinct IDs in journal_entry_ids, otherwise the request is rejected before any journal is sent.
x >= 0Preview only. Runs the same validation and routing and reports which journals would be queued, without sending anything. Returns 200, not 202.
Attributes the sync to an agent instead of the API-key user. Must be sent together with agent_name.
1Display name of the initiating agent. Must be sent together with agent_instance_id.
1Response
Dry-run preview. Nothing was sent to the provider.
The sync result.
Show child attributes
Show child attributes