---
title: "Start Delta Sync"
method: POST
path: "/integrations/migrations/delta-sync"
tags: ["Integrations"]
---

# Start Delta Sync

`POST /integrations/migrations/delta-sync`

## Request

- Base URL: `https://be.graph8.com/api/v1`
- URL: `https://be.graph8.com/api/v1/integrations/migrations/delta-sync`
- Auth: HTTP bearer

Import only what changed since a watermark.

OMIT `since` unless you have a reason: the app picks the last successful
watermark, which is both what you usually want and safer than guessing.
The response echoes back the watermark actually used, so read it rather
than assuming yours was accepted.

Org admin, matching the app.

## Headers

- `Authorization` string, nullable
- `X-Target-Org-Id` string, nullable

## Request body

- DeltaSyncRequest: Import only what changed since a watermark. The response echoes `since` back as ISO 8601, so the caller learns the watermark the server actually used rather than assuming its own was accepted.
  - `connection_id` string, required
  - `since` string, nullable: ISO 8601 timestamp. Omit and the app picks the last successful watermark - which is usually what you want, and always safer than guessing one.
  - `entity_types` string[], nullable: Limit to these entity types. Omit for all.
  - `recover_missing` boolean: Also re-fetch records the previous run should have imported and did not. Slower, and the reason to use it is a suspected gap rather than routine.

## Response `202`

Successful Response

- ApiResponseConnectionPayload
  - `data` ConnectionPayload, required: An open envelope for a connection, a token or a migration report. Open because the migration STATUS payload carries a per-entity progress map, a discovered-field map and a pipeline list that all grow with the providers - and because a dropped warning on a migration report reads as "nothing went wrong".
  - `pagination` PaginationMeta
    - `page` integer, required: Current page number (1-indexed)
    - `limit` integer, required: Items per page
    - `total` integer, required: Total number of items
    - `has_next` boolean, required: Whether there are more pages
    - `next_cursor` string, nullable: Opaque cursor for the next page; null when there are no more items. Pass it back as the `cursor` query param to fetch the following page without computing page numbers.
    - `total_available` integer, nullable: Search endpoints only: how many records really match, when known. Can be larger than `total`, which is capped at the 10,000 results that can be paged. For company search this is a distinct-company estimate. Null when unknown; absent outside search.
    - `total_is_lower_bound` boolean, nullable: Search endpoints only: true when more records match than `total` shows (the result set is larger than the 10,000 results that can be paged). Absent outside search.
    - `notes` string[], nullable: Search endpoints only: plain-language notes about the result, e.g. that more records match than can be paged, or that a reversed `between` range was put in order.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/graph8/apis/graph8-developer-api.md) · [All operations](https://skmtc.dev/graph8/apis/graph8-developer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/graph8/apis/graph8-developer-api/revisions/2e7cfa0ca921?raw)
