# Syncs

## Trigger a sync run

> Queues an on-demand run of a Data Loader sync and returns identifiers for the new sync job. The\
> run is \*\*asynchronous\*\*: the response returns as soon as the job is queued. Use\
> \`GET /v1/syncJobs/{\_syncJobId}\` or \`GET /v1/syncs/{\_syncId}/syncJobs\` to poll for terminal status.\
> \
> By default the run type is \`"normal"\` (incremental delta). Pass \`runType: "resync"\` to force a\
> full re-extraction from the source, which drops the delta checkpoint and reloads all data.\
> \
> Preconditions enforced by the platform:\
> \- The sync must not be disabled (\`422 invalid\_sync\`).\
> \- There must not be a job already queued for this sync (\`409 sync\_job\_already\_queued\`).\
> \
> AI guidance:\
> \- After triggering a run, use the returned \`flowExecutionGroupId\` as a correlation key across\
> &#x20; jobs and errors.\
> \- For bulk table syncs (many tables), a single \`POST run\` creates one parent job with per-table\
> &#x20; children. Use \`GET /v1/syncJobs/{\_syncJobId}/family\` to inspect per-table progress.\
> \- To cancel a running sync, call \`PUT /v1/syncs/{\_syncId}/syncJobs/cancel\` (cancels all\
> &#x20; in-progress jobs) or \`PUT /v1/syncJobs/{\_syncJobId}/cancel\` (cancels a single job).

```json
{"openapi":"3.1.0","info":{"title":"Syncs","version":"1.0.0"},"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"SyncRunRequest":{"type":"object","description":"Optional request body for triggering a sync run. When omitted or sent as `{}`, the sync runs\nwith `runType: \"normal\"` (incremental delta). Pass `runType: \"resync\"` to force a full re-extraction\nfrom the source system, discarding the current delta checkpoint.","properties":{"runType":{"type":"string","description":"Controls whether the run is incremental or a full resync.\n- `normal` — default. Extracts only records modified since the last successful run.\n- `resync` — drops the delta checkpoint and re-extracts all records from the source.","enum":["normal","resync"],"default":"normal"}}},"SyncRunResponse":{"type":"object","description":"Response from `POST /v1/syncs/{_syncId}/run`. Contains identifiers for the newly queued sync run.\nUse `syncId` with `GET /v1/syncs/{_syncId}/syncJobs` or `flowExecutionGroupId` with\n`GET /v1/syncJobs/{_syncJobId}` to poll for run completion.","properties":{"syncId":{"type":"string","format":"objectId","readOnly":true,"description":"The sync resource id that was triggered."},"flowExecutionGroupId":{"type":"string","readOnly":true,"description":"Correlation id for this execution group. Groups the parent sync job and all child\ntable-level jobs spawned by this run."}},"required":["syncId","flowExecutionGroupId"]},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}}}},"paths":{"/v1/syncs/{_syncId}/run":{"post":{"operationId":"runSync","tags":["Syncs"],"summary":"Trigger a sync run","description":"Queues an on-demand run of a Data Loader sync and returns identifiers for the new sync job. The\nrun is **asynchronous**: the response returns as soon as the job is queued. Use\n`GET /v1/syncJobs/{_syncJobId}` or `GET /v1/syncs/{_syncId}/syncJobs` to poll for terminal status.\n\nBy default the run type is `\"normal\"` (incremental delta). Pass `runType: \"resync\"` to force a\nfull re-extraction from the source, which drops the delta checkpoint and reloads all data.\n\nPreconditions enforced by the platform:\n- The sync must not be disabled (`422 invalid_sync`).\n- There must not be a job already queued for this sync (`409 sync_job_already_queued`).\n\nAI guidance:\n- After triggering a run, use the returned `flowExecutionGroupId` as a correlation key across\n  jobs and errors.\n- For bulk table syncs (many tables), a single `POST run` creates one parent job with per-table\n  children. Use `GET /v1/syncJobs/{_syncJobId}/family` to inspect per-table progress.\n- To cancel a running sync, call `PUT /v1/syncs/{_syncId}/syncJobs/cancel` (cancels all\n  in-progress jobs) or `PUT /v1/syncJobs/{_syncJobId}/cancel` (cancels a single job).","parameters":[{"name":"_syncId","in":"path","required":true,"description":"Sync id.","schema":{"type":"string","format":"objectId"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncRunRequest"}}}},"responses":{"200":{"description":"Sync run accepted and queued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncRunResponse"}}}},"400":{"description":"Bad request. Invalid `runType` value.\nError code: `invalid_parameter`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"description":"Sync not found.\nError code: `invalid_ref`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"A sync job is already queued or running for this sync.\nError code: `sync_job_already_queued`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The sync is disabled and cannot be run.\nError code: `invalid_sync`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## List sync jobs for a sync

> Returns all sync job records for the given sync, ordered by creation time (most recent first).\
> The response wraps the array in a \`data\` field alongside a \`totalCount\`.\
> \
> Note: although the response shape suggests pagination (\`totalCount\`), the \`limit\`, \`offset\`,\
> and \`status\` query parameters are silently ignored by the server as of this writing. The\
> endpoint always returns the complete list of jobs.\
> \
> AI guidance:\
> \- Use this to build a job-history view for a single sync.\
> \- For the latest job across all syncs in an integration, use\
> &#x20; \`GET /v1/integrations/{\_integrationId}/syncJobs/latest\` instead.\
> \- To drill into per-table detail for a specific job, use\
> &#x20; \`GET /v1/syncJobs/{\_syncJobId}/family\`.

```json
{"openapi":"3.1.0","info":{"title":"Syncs","version":"1.0.0"},"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"SyncJobsResponse":{"type":"object","description":"Paginated list of sync jobs for a given sync. Contains the array of job records and a total count.\n\nNote: although the response includes `totalCount`, the `limit` and `offset` query parameters\non the list endpoint are silently ignored by the server as of this writing. The response always\nreturns all jobs.","properties":{"data":{"type":"array","description":"Array of sync job records.","items":{"$ref":"#/components/schemas/SyncJob"}},"totalCount":{"type":"integer","readOnly":true,"description":"Total number of sync jobs for this sync (across all pages)."}},"required":["data","totalCount"]},"SyncJob":{"type":"object","description":"A sync job represents one execution of a Data Loader sync. Sync jobs are read-only records\ncreated by the platform when a sync run is triggered (manually or on schedule). The job tracks\nextraction, loading, and error counts across all tables in the sync.\n\nAI guidance:\n- `numTablesSynced` reflects only the tables that actively participated in this run. For a\n  full resync it equals the total table count; for a delta run it may be lower.\n- `triggeredBy` is a free-form string like `\"user:tyler.lamparter@celigo.com\"` or `\"schedule\"`.\n- `canceledBy` is only present when `status` is `canceled`.\n- Use `GET /v1/syncJobs/{_syncJobId}/family` to drill into per-table detail.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Sync job id."},"flowExecutionGroupId":{"type":"string","readOnly":true,"description":"Correlation id grouping this job with its child table jobs."},"_integrationId":{"type":"string","format":"objectId","readOnly":true,"description":"Integration id this sync belongs to."},"_syncId":{"type":"string","format":"objectId","readOnly":true,"description":"Sync resource id."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"When the sync job record was created (queued)."},"startedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When execution actually began. Absent while the job is still queued."},"endedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When execution completed. Absent while the job is still running."},"purgeAt":{"type":"string","format":"date-time","readOnly":true,"description":"When the job record will be purged from storage."},"status":{"type":"string","readOnly":true,"description":"Current job status.","enum":["running","completed","failed","canceled"]},"numErrors":{"type":"integer","readOnly":true,"description":"Total number of errors produced across all tables in this run."},"numLoadedRecords":{"type":"integer","readOnly":true,"description":"Total number of records loaded (written) to the data warehouse."},"numExtractedRecords":{"type":"integer","readOnly":true,"description":"Total number of records extracted from the source system."},"numTablesSynced":{"type":"integer","readOnly":true,"description":"Number of tables that were synced in this run."},"triggeredBy":{"type":"string","readOnly":true,"description":"Who or what triggered this sync run (e.g. `\"user:email\"`, `\"schedule\"`)."},"canceledBy":{"type":"string","readOnly":true,"description":"Who or what canceled this run. Only present when `status` is `canceled`."},"runType":{"type":"string","readOnly":true,"description":"Whether this was a normal (delta) or full resync run.","enum":["normal","resync"]}}},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}}}},"paths":{"/v1/syncs/{_syncId}/syncJobs":{"get":{"operationId":"listSyncJobs","tags":["Syncs"],"summary":"List sync jobs for a sync","description":"Returns all sync job records for the given sync, ordered by creation time (most recent first).\nThe response wraps the array in a `data` field alongside a `totalCount`.\n\nNote: although the response shape suggests pagination (`totalCount`), the `limit`, `offset`,\nand `status` query parameters are silently ignored by the server as of this writing. The\nendpoint always returns the complete list of jobs.\n\nAI guidance:\n- Use this to build a job-history view for a single sync.\n- For the latest job across all syncs in an integration, use\n  `GET /v1/integrations/{_integrationId}/syncJobs/latest` instead.\n- To drill into per-table detail for a specific job, use\n  `GET /v1/syncJobs/{_syncJobId}/family`.","parameters":[{"name":"_syncId","in":"path","required":true,"description":"Sync id.","schema":{"type":"string","format":"objectId"}}],"responses":{"200":{"description":"List of sync jobs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncJobsResponse"}}}},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"description":"Sync not found.\nError code: `invalid_ref`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Cancel all running sync jobs for a sync

> Cancels all currently running or queued sync jobs for the given sync. This is a bulk cancel\
> that affects every in-progress job associated with the sync.\
> \
> Returns \*\*204\*\* on success with no response body. If there are no cancellable jobs (all jobs\
> are already in a terminal state), the server returns 404.\
> \
> AI guidance:\
> \- Use this for a "stop everything" action on a sync. For canceling a single specific job,\
> &#x20; use \`PUT /v1/syncJobs/{\_syncJobId}/cancel\` instead.\
> \- After calling this, poll \`GET /v1/syncs/{\_syncId}/syncJobs\` to confirm all jobs have\
> &#x20; reached \`canceled\` status.

```json
{"openapi":"3.1.0","info":{"title":"Syncs","version":"1.0.0"},"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}}},"schemas":{"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}}},"paths":{"/v1/syncs/{_syncId}/syncJobs/cancel":{"put":{"operationId":"cancelSyncJobs","tags":["Syncs"],"summary":"Cancel all running sync jobs for a sync","description":"Cancels all currently running or queued sync jobs for the given sync. This is a bulk cancel\nthat affects every in-progress job associated with the sync.\n\nReturns **204** on success with no response body. If there are no cancellable jobs (all jobs\nare already in a terminal state), the server returns 404.\n\nAI guidance:\n- Use this for a \"stop everything\" action on a sync. For canceling a single specific job,\n  use `PUT /v1/syncJobs/{_syncJobId}/cancel` instead.\n- After calling this, poll `GET /v1/syncs/{_syncId}/syncJobs` to confirm all jobs have\n  reached `canceled` status.","parameters":[{"name":"_syncId","in":"path","required":true,"description":"Sync id.","schema":{"type":"string","format":"objectId"}}],"responses":{"204":{"description":"All running sync jobs have been canceled. No response body."},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"description":"No cancellable jobs found for this sync.\nError code: `sync_jobs_not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## Get a sync job

> Returns a single sync job record. Sync jobs are read-only records created by the platform when\
> a sync run is triggered. The record includes status, timing, record counts, and error counts.\
> \
> AI guidance:\
> \- This returns the parent-level sync job. For per-table breakdown, use\
> &#x20; \`GET /v1/syncJobs/{\_syncJobId}/family\` instead.\
> \- For error details, use \`GET /v1/syncJobs/{\_syncJobId}/errors\` (note: uses \`\_parentJobId\`\
> &#x20; in the path, which is the same as \`\_syncJobId\` for parent jobs).\
> \- The \`numExtractedRecords\` and \`numLoadedRecords\` may differ if some records failed during\
> &#x20; loading — check \`numErrors\` for the gap.

```json
{"openapi":"3.1.0","info":{"title":"Syncs","version":"1.0.0"},"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"SyncJob":{"type":"object","description":"A sync job represents one execution of a Data Loader sync. Sync jobs are read-only records\ncreated by the platform when a sync run is triggered (manually or on schedule). The job tracks\nextraction, loading, and error counts across all tables in the sync.\n\nAI guidance:\n- `numTablesSynced` reflects only the tables that actively participated in this run. For a\n  full resync it equals the total table count; for a delta run it may be lower.\n- `triggeredBy` is a free-form string like `\"user:tyler.lamparter@celigo.com\"` or `\"schedule\"`.\n- `canceledBy` is only present when `status` is `canceled`.\n- Use `GET /v1/syncJobs/{_syncJobId}/family` to drill into per-table detail.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Sync job id."},"flowExecutionGroupId":{"type":"string","readOnly":true,"description":"Correlation id grouping this job with its child table jobs."},"_integrationId":{"type":"string","format":"objectId","readOnly":true,"description":"Integration id this sync belongs to."},"_syncId":{"type":"string","format":"objectId","readOnly":true,"description":"Sync resource id."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"When the sync job record was created (queued)."},"startedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When execution actually began. Absent while the job is still queued."},"endedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When execution completed. Absent while the job is still running."},"purgeAt":{"type":"string","format":"date-time","readOnly":true,"description":"When the job record will be purged from storage."},"status":{"type":"string","readOnly":true,"description":"Current job status.","enum":["running","completed","failed","canceled"]},"numErrors":{"type":"integer","readOnly":true,"description":"Total number of errors produced across all tables in this run."},"numLoadedRecords":{"type":"integer","readOnly":true,"description":"Total number of records loaded (written) to the data warehouse."},"numExtractedRecords":{"type":"integer","readOnly":true,"description":"Total number of records extracted from the source system."},"numTablesSynced":{"type":"integer","readOnly":true,"description":"Number of tables that were synced in this run."},"triggeredBy":{"type":"string","readOnly":true,"description":"Who or what triggered this sync run (e.g. `\"user:email\"`, `\"schedule\"`)."},"canceledBy":{"type":"string","readOnly":true,"description":"Who or what canceled this run. Only present when `status` is `canceled`."},"runType":{"type":"string","readOnly":true,"description":"Whether this was a normal (delta) or full resync run.","enum":["normal","resync"]}}},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}},"404-not-found":{"description":"Not found. The requested resource does not exist or is not visible to the caller.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/v1/syncJobs/{_syncJobId}":{"get":{"operationId":"getSyncJobById","tags":["Syncs"],"summary":"Get a sync job","description":"Returns a single sync job record. Sync jobs are read-only records created by the platform when\na sync run is triggered. The record includes status, timing, record counts, and error counts.\n\nAI guidance:\n- This returns the parent-level sync job. For per-table breakdown, use\n  `GET /v1/syncJobs/{_syncJobId}/family` instead.\n- For error details, use `GET /v1/syncJobs/{_syncJobId}/errors` (note: uses `_parentJobId`\n  in the path, which is the same as `_syncJobId` for parent jobs).\n- The `numExtractedRecords` and `numLoadedRecords` may differ if some records failed during\n  loading — check `numErrors` for the gap.","parameters":[{"name":"_syncJobId","in":"path","required":true,"description":"Sync job id.","schema":{"type":"string","format":"objectId"}}],"responses":{"200":{"description":"The sync job record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncJob"}}}},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"$ref":"#/components/responses/404-not-found"}}}}}}
```

## Get a sync job and its table-level children

> Returns the parent sync job with all of its per-table child jobs inlined under a \`tables\` array.\
> Each table entry contains its own status, record counts, error counts, and timing.\
> \
> A sync job family maps to one sync execution: the parent is the overall sync job and the children\
> represent each table that was synced as part of that run.\
> \
> AI guidance:\
> \- Use this for a detailed drill-down into a sync run. The parent-level counters\
> &#x20; (\`numLoadedRecords\`, \`numErrors\`, etc.) are the authoritative totals; the \`tables\[]\` entries\
> &#x20; provide the per-table breakdown.\
> \- \`tables\` may be empty if the job was canceled before any table work started.\
> \- To fetch errors for a specific table, use\
> &#x20; \`GET /v1/syncJobs/{\_parentJobId}/errors?\_childJobId={table.\_id}\`.

```json
{"openapi":"3.1.0","info":{"title":"Syncs","version":"1.0.0"},"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"SyncJobFamily":{"type":"object","description":"A sync job family consisting of the parent sync job and its per-table child jobs. Each entry in\n`tables` represents one table that was synced as part of this run, with its own status, record\ncounts, and timing.\n\nAI guidance:\n- The top-level fields mirror the parent `SyncJob` record.\n- `tables` may be empty if the job was canceled before any table work started.\n- Aggregate `numLoadedRecords` / `numErrors` across `tables[]` for a per-table breakdown;\n  the parent-level counters are the authoritative totals.","allOf":[{"$ref":"#/components/schemas/SyncJob"},{"type":"object","properties":{"tables":{"type":"array","description":"Per-table child job records for this sync run.","items":{"$ref":"#/components/schemas/SyncTableJob"}}}}]},"SyncJob":{"type":"object","description":"A sync job represents one execution of a Data Loader sync. Sync jobs are read-only records\ncreated by the platform when a sync run is triggered (manually or on schedule). The job tracks\nextraction, loading, and error counts across all tables in the sync.\n\nAI guidance:\n- `numTablesSynced` reflects only the tables that actively participated in this run. For a\n  full resync it equals the total table count; for a delta run it may be lower.\n- `triggeredBy` is a free-form string like `\"user:tyler.lamparter@celigo.com\"` or `\"schedule\"`.\n- `canceledBy` is only present when `status` is `canceled`.\n- Use `GET /v1/syncJobs/{_syncJobId}/family` to drill into per-table detail.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Sync job id."},"flowExecutionGroupId":{"type":"string","readOnly":true,"description":"Correlation id grouping this job with its child table jobs."},"_integrationId":{"type":"string","format":"objectId","readOnly":true,"description":"Integration id this sync belongs to."},"_syncId":{"type":"string","format":"objectId","readOnly":true,"description":"Sync resource id."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"When the sync job record was created (queued)."},"startedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When execution actually began. Absent while the job is still queued."},"endedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When execution completed. Absent while the job is still running."},"purgeAt":{"type":"string","format":"date-time","readOnly":true,"description":"When the job record will be purged from storage."},"status":{"type":"string","readOnly":true,"description":"Current job status.","enum":["running","completed","failed","canceled"]},"numErrors":{"type":"integer","readOnly":true,"description":"Total number of errors produced across all tables in this run."},"numLoadedRecords":{"type":"integer","readOnly":true,"description":"Total number of records loaded (written) to the data warehouse."},"numExtractedRecords":{"type":"integer","readOnly":true,"description":"Total number of records extracted from the source system."},"numTablesSynced":{"type":"integer","readOnly":true,"description":"Number of tables that were synced in this run."},"triggeredBy":{"type":"string","readOnly":true,"description":"Who or what triggered this sync run (e.g. `\"user:email\"`, `\"schedule\"`)."},"canceledBy":{"type":"string","readOnly":true,"description":"Who or what canceled this run. Only present when `status` is `canceled`."},"runType":{"type":"string","readOnly":true,"description":"Whether this was a normal (delta) or full resync run.","enum":["normal","resync"]}}},"SyncTableJob":{"type":"object","description":"A child job representing one table's extraction and load within a parent sync run. Each table\njob tracks its own record counts, error counts, and timing independently.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Child table job id."},"tableName":{"type":"string","readOnly":true,"description":"Name of the table being synced (e.g. `\"contacts\"`, `\"orders\"`)."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"When this child job was created."},"status":{"type":"string","readOnly":true,"description":"Current status of this table's sync.","enum":["running","completed","failed","canceled"]},"numErrors":{"type":"integer","readOnly":true,"description":"Number of errors encountered syncing this table."},"numLoadedRecords":{"type":"integer","readOnly":true,"description":"Number of records loaded into the warehouse for this table."},"numExtractedRecords":{"type":"integer","readOnly":true,"description":"Number of records extracted from the source for this table."},"startedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When extraction began for this table. Absent if not yet started."},"endedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When loading completed for this table. Absent if still running."}}},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}},"404-not-found":{"description":"Not found. The requested resource does not exist or is not visible to the caller.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/v1/syncJobs/{_syncJobId}/family":{"get":{"operationId":"getSyncJobFamily","tags":["Syncs"],"summary":"Get a sync job and its table-level children","description":"Returns the parent sync job with all of its per-table child jobs inlined under a `tables` array.\nEach table entry contains its own status, record counts, error counts, and timing.\n\nA sync job family maps to one sync execution: the parent is the overall sync job and the children\nrepresent each table that was synced as part of that run.\n\nAI guidance:\n- Use this for a detailed drill-down into a sync run. The parent-level counters\n  (`numLoadedRecords`, `numErrors`, etc.) are the authoritative totals; the `tables[]` entries\n  provide the per-table breakdown.\n- `tables` may be empty if the job was canceled before any table work started.\n- To fetch errors for a specific table, use\n  `GET /v1/syncJobs/{_parentJobId}/errors?_childJobId={table._id}`.","parameters":[{"name":"_syncJobId","in":"path","required":true,"description":"Sync job id (parent job).","schema":{"type":"string","format":"objectId"}}],"responses":{"200":{"description":"Sync job family (parent with per-table children).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncJobFamily"}}}},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"$ref":"#/components/responses/404-not-found"}}}}}}
```

## List errors for a sync job

> Returns an array of error records for the given parent sync job. Errors are produced during\
> extraction or loading and are scoped to individual tables.\
> \
> The response includes an \`x-total-count\` header with the total number of errors (useful when\
> filtering by child job).\
> \
> Use the \`\_childJobId\` query parameter to filter errors to a single table's child job. Without\
> it, errors across all tables in the run are returned.\
> \
> AI guidance:\
> \- The path parameter is \`\_parentJobId\` — pass the parent sync job's \`\_id\`.\
> \- To filter to a specific table, first call \`GET /v1/syncJobs/{\_syncJobId}/family\` to find\
> &#x20; the child \`\_id\` for the table, then pass it as \`?\_childJobId=\`.\
> \- Each error's \`tableName\` field also identifies the table, so you can group errors by table\
> &#x20; client-side without the query parameter.\
> \- The response is a bare JSON array, not wrapped in a \`data\` envelope.

```json
{"openapi":"3.1.0","info":{"title":"Syncs","version":"1.0.0"},"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"SyncError":{"type":"object","description":"An individual error record from a sync run. Errors are scoped to a specific table (identified by\n`tableName` and `_datasetId`) within a sync execution.\n\nAI guidance:\n- `scope` and `stage` describe where in the pipeline the error occurred (extraction vs. loading).\n- `source` indicates the system that produced the error (e.g. the source adaptor or warehouse).\n- `_parentSyncJobId` links to the parent sync job; `_childSyncJobId` links to the table-level child.\n- Use `_childSyncJobId` with the `?_childJobId=` query parameter on the errors endpoint to filter\n  errors for a single table.","properties":{"scope":{"type":"string","readOnly":true,"description":"Pipeline scope where the error occurred (e.g. `\"extract\"`, `\"load\"`)."},"source":{"type":"string","readOnly":true,"description":"System or component that produced the error."},"code":{"type":"string","readOnly":true,"description":"Machine-readable error code."},"message":{"type":"string","readOnly":true,"description":"Human-readable error message."},"_datasetId":{"type":"string","format":"objectId","readOnly":true,"description":"Dataset id associated with this error."},"_syncId":{"type":"string","format":"objectId","readOnly":true,"description":"Sync resource id."},"_parentSyncJobId":{"type":"string","format":"objectId","readOnly":true,"description":"Parent sync job id."},"_childSyncJobId":{"type":"string","format":"objectId","readOnly":true,"description":"Child (table-level) sync job id."},"flowExecutionGroupId":{"type":"string","readOnly":true,"description":"Correlation id for the execution group."},"stage":{"type":"string","readOnly":true,"description":"Pipeline stage where the error occurred."},"datasetName":{"type":"string","readOnly":true,"description":"Human-readable dataset name."},"tableName":{"type":"string","readOnly":true,"description":"Table name where the error occurred."},"occurredAt":{"type":"string","format":"date-time","readOnly":true,"description":"When the error occurred."}}},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}},"404-not-found":{"description":"Not found. The requested resource does not exist or is not visible to the caller.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/v1/syncJobs/{_parentJobId}/errors":{"get":{"operationId":"listSyncJobErrors","tags":["Syncs"],"summary":"List errors for a sync job","description":"Returns an array of error records for the given parent sync job. Errors are produced during\nextraction or loading and are scoped to individual tables.\n\nThe response includes an `x-total-count` header with the total number of errors (useful when\nfiltering by child job).\n\nUse the `_childJobId` query parameter to filter errors to a single table's child job. Without\nit, errors across all tables in the run are returned.\n\nAI guidance:\n- The path parameter is `_parentJobId` — pass the parent sync job's `_id`.\n- To filter to a specific table, first call `GET /v1/syncJobs/{_syncJobId}/family` to find\n  the child `_id` for the table, then pass it as `?_childJobId=`.\n- Each error's `tableName` field also identifies the table, so you can group errors by table\n  client-side without the query parameter.\n- The response is a bare JSON array, not wrapped in a `data` envelope.","parameters":[{"name":"_parentJobId","in":"path","required":true,"description":"Parent sync job id.","schema":{"type":"string","format":"objectId"}},{"name":"_childJobId","in":"query","required":false,"description":"Optional child (table-level) job id to filter errors to a single table.\nObtain this from the `tables[]._id` field in the job family response.","schema":{"type":"string","format":"objectId"}}],"responses":{"200":{"description":"Array of sync error records.","headers":{},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SyncError"}}}}},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"$ref":"#/components/responses/404-not-found"}}}}}}
```

## Cancel a single sync job

> Cancels a specific sync job by id. Returns \*\*204\*\* on success with no response body.\
> \
> Only jobs that are still in progress (\`running\`) can be canceled. Attempting to cancel a job\
> that is already in a terminal state (\`completed\`, \`failed\`, \`canceled\`) returns 403.\
> \
> AI guidance:\
> \- Use this to cancel a single specific job. To cancel all running jobs for a sync, prefer\
> &#x20; \`PUT /v1/syncs/{\_syncId}/syncJobs/cancel\`.\
> \- After calling this, poll \`GET /v1/syncJobs/{\_syncJobId}\` to confirm the job reaches\
> &#x20; \`canceled\` status.

```json
{"openapi":"3.1.0","info":{"title":"Syncs","version":"1.0.0"},"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}},"404-not-found":{"description":"Not found. The requested resource does not exist or is not visible to the caller.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}}},"paths":{"/v1/syncJobs/{_syncJobId}/cancel":{"put":{"operationId":"cancelSyncJob","tags":["Syncs"],"summary":"Cancel a single sync job","description":"Cancels a specific sync job by id. Returns **204** on success with no response body.\n\nOnly jobs that are still in progress (`running`) can be canceled. Attempting to cancel a job\nthat is already in a terminal state (`completed`, `failed`, `canceled`) returns 403.\n\nAI guidance:\n- Use this to cancel a single specific job. To cancel all running jobs for a sync, prefer\n  `PUT /v1/syncs/{_syncId}/syncJobs/cancel`.\n- After calling this, poll `GET /v1/syncJobs/{_syncJobId}` to confirm the job reaches\n  `canceled` status.","parameters":[{"name":"_syncJobId","in":"path","required":true,"description":"Sync job id to cancel.","schema":{"type":"string","format":"objectId"}}],"responses":{"204":{"description":"Sync job canceled successfully. No response body."},"401":{"$ref":"#/components/responses/401-unauthorized"},"403":{"description":"The sync job is already in a terminal state and cannot be canceled.\nError code: `sync_job_not_cancellable`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/404-not-found"}}}}}}
```

## Get the latest sync job for each sync in an integration

> Returns the most recent sync job for each sync resource belonging to the given integration.\
> The response is a bare JSON array with one \`SyncJob\` entry per sync.\
> \
> Returns \*\*204\*\* (no content) when no sync jobs exist for any sync in the integration.\
> \
> AI guidance:\
> \- This is the integration-level dashboard endpoint. Each entry in the array represents the\
> &#x20; latest run of a different sync within the integration.\
> \- Use the \`\_syncId\` field on each returned job to correlate back to the sync resource.\
> \- A 404 with \`sync\_job\_invalid\_integration\_id\` means the integration exists but is not\
> &#x20; sync-enabled (no Data Loader syncs configured). A 404 with \`sync\_job\_missing\_integration\`\
> &#x20; means the integration id itself does not exist.\
> \- The response is a bare array, not wrapped in a \`data\` envelope.

```json
{"openapi":"3.1.0","info":{"title":"Syncs","version":"1.0.0"},"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"SyncJob":{"type":"object","description":"A sync job represents one execution of a Data Loader sync. Sync jobs are read-only records\ncreated by the platform when a sync run is triggered (manually or on schedule). The job tracks\nextraction, loading, and error counts across all tables in the sync.\n\nAI guidance:\n- `numTablesSynced` reflects only the tables that actively participated in this run. For a\n  full resync it equals the total table count; for a delta run it may be lower.\n- `triggeredBy` is a free-form string like `\"user:tyler.lamparter@celigo.com\"` or `\"schedule\"`.\n- `canceledBy` is only present when `status` is `canceled`.\n- Use `GET /v1/syncJobs/{_syncJobId}/family` to drill into per-table detail.","properties":{"_id":{"type":"string","format":"objectId","readOnly":true,"description":"Sync job id."},"flowExecutionGroupId":{"type":"string","readOnly":true,"description":"Correlation id grouping this job with its child table jobs."},"_integrationId":{"type":"string","format":"objectId","readOnly":true,"description":"Integration id this sync belongs to."},"_syncId":{"type":"string","format":"objectId","readOnly":true,"description":"Sync resource id."},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"When the sync job record was created (queued)."},"startedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When execution actually began. Absent while the job is still queued."},"endedAt":{"type":"string","format":"date-time","readOnly":true,"description":"When execution completed. Absent while the job is still running."},"purgeAt":{"type":"string","format":"date-time","readOnly":true,"description":"When the job record will be purged from storage."},"status":{"type":"string","readOnly":true,"description":"Current job status.","enum":["running","completed","failed","canceled"]},"numErrors":{"type":"integer","readOnly":true,"description":"Total number of errors produced across all tables in this run."},"numLoadedRecords":{"type":"integer","readOnly":true,"description":"Total number of records loaded (written) to the data warehouse."},"numExtractedRecords":{"type":"integer","readOnly":true,"description":"Total number of records extracted from the source system."},"numTablesSynced":{"type":"integer","readOnly":true,"description":"Number of tables that were synced in this run."},"triggeredBy":{"type":"string","readOnly":true,"description":"Who or what triggered this sync run (e.g. `\"user:email\"`, `\"schedule\"`)."},"canceledBy":{"type":"string","readOnly":true,"description":"Who or what canceled this run. Only present when `status` is `canceled`."},"runType":{"type":"string","readOnly":true,"description":"Whether this was a normal (delta) or full resync run.","enum":["normal","resync"]}}},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}}}},"paths":{"/v1/integrations/{_integrationId}/syncJobs/latest":{"get":{"operationId":"getLatestSyncJobsForIntegration","tags":["Syncs"],"summary":"Get the latest sync job for each sync in an integration","description":"Returns the most recent sync job for each sync resource belonging to the given integration.\nThe response is a bare JSON array with one `SyncJob` entry per sync.\n\nReturns **204** (no content) when no sync jobs exist for any sync in the integration.\n\nAI guidance:\n- This is the integration-level dashboard endpoint. Each entry in the array represents the\n  latest run of a different sync within the integration.\n- Use the `_syncId` field on each returned job to correlate back to the sync resource.\n- A 404 with `sync_job_invalid_integration_id` means the integration exists but is not\n  sync-enabled (no Data Loader syncs configured). A 404 with `sync_job_missing_integration`\n  means the integration id itself does not exist.\n- The response is a bare array, not wrapped in a `data` envelope.","parameters":[{"name":"_integrationId","in":"path","required":true,"description":"Integration id.","schema":{"type":"string","format":"objectId"}}],"responses":{"200":{"description":"Array of latest sync jobs (one per sync in the integration).","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SyncJob"}}}}},"204":{"description":"No sync jobs exist for any sync in this integration."},"401":{"$ref":"#/components/responses/401-unauthorized"},"404":{"description":"Integration not found or not sync-enabled.\nError codes: `sync_job_invalid_integration_id` (integration exists but has no syncs),\n`sync_job_missing_integration` (integration does not exist).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://developer.celigo.com/api/api-reference/syncs.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
