Needs keys Live sync needs a token for the CRM. In mock mode the job runs the same way but records each operation instead of sending it, and returns stable mock_ IDs.
Starts a sync job and returns at once with 202 Accepted. Poll Get CRM sync job for the result. For each contact the job creates or updates the CRM contact (with the mapped fields) and, when sync_calls is on, adds a note for the contact's latest ended call with its summary, duration and disconnection reason.
Request#
| Field | Type | Required | Description |
|---|---|---|---|
provider |
string | Yes | One of hubspot, salesforce, dynamics365, gohighlevel, zoho. The workspace must have an enabled connection for it. |
kind |
string | No | full (default) syncs every contact, up to 10,000, when the connection's sync_contacts is on. contact syncs only contact_ids. |
contact_ids |
string[] | With kind: contact |
Up to 1000 contact IDs. With kind: full they limit the job to those contacts. |
Example request#
curl -X POST https://api.tried.com.au/run-crm-sync-job \
-H "Authorization: Bearer $TRIED_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "provider": "hubspot", "kind": "contact", "contact_ids": ["contact_2f7a9c1e4b8d6053a2f9c7e1"] }'const res = await fetch("https://api.tried.com.au/run-crm-sync-job", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.TRIED_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
provider: "hubspot",
kind: "contact",
contact_ids: ["contact_2f7a9c1e4b8d6053a2f9c7e1"],
}),
});
const job = await res.json();import os, requests
res = requests.post(
"https://api.tried.com.au/run-crm-sync-job",
headers={"Authorization": f"Bearer {os.environ['TRIED_API_KEY']}"},
json={
"provider": "hubspot",
"kind": "contact",
"contact_ids": ["contact_2f7a9c1e4b8d6053a2f9c7e1"],
},
)
job = res.json()Response#
202 Accepted
{
"job_id": "crm_sync_5b2e8f1a7c4d9036e1b5a8f2",
"provider": "hubspot",
"kind": "contact",
"status": "pending",
"stats": { "contact_ids": ["contact_2f7a9c1e4b8d6053a2f9c7e1"] },
"error": null,
"mock": false,
"created_timestamp": 1792397000000,
"completed_timestamp": null
}| Field | Type | Description |
|---|---|---|
status |
string | pending when created, then running, then complete or failed. |
stats |
object | Holds the requested contact_ids (or null) until the job finishes. See Get CRM sync job for the final counts. |
mock |
boolean | Whether the job runs in mock mode. |
Errors#
| Status | When |
|---|---|
400 |
Body fails validation (for example an unknown provider), contact_ids is required for kind contact, or The <provider> connection is disabled. |
401 |
Missing or invalid API key. |
403 |
The key's IP allowlist or scopes reject the request. This route needs the admin scope. Dashboard members are read-only. |
404 |
No <provider> CRM connection. |
429 |
Rate limit exceeded. See Rate limits. |
See Errors for the body format.
Retell compatibility#
Retell uses POST /run-sync-job with no body and returns 201. Tried uses POST /run-crm-sync-job, takes the CRM and contact scope in the body, and returns 202 with a job object.