Skip to content
TriedDocs
Integrations

Run CRM sync job

Start a background job that pushes contacts and their latest call notes to a connected CRM.

POSThttps://api.tried.com.au/run-crm-sync-job

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.