Run Auto-Match
POST/api/ledger/reconciliation/auto-match
Link the auto-match pairs confirmed from Preview Auto-Match. Send a matches array of {entry_id, remote_type, remote_id} rows; the eligible set is recomputed and only the intersection is linked, so a pairing that has since become ineligible is skipped rather than force-linked. Returns the number of links forged; each is recorded linked_stale so the next sync pushes an Update. An empty matches array links nothing.
Any valid API token can call this endpoint — no specific scope required. Manage tokens.
Authentication: Requires Bearer token + accounting.sync permission.
Body fields:
connection_id(integer, required) — the accounting connection.matches(array, required) — confirmed pairs; each{entry_id, remote_type, remote_id}. May be empty.matches[].entry_id(integer, required) — the SKU ledger entry to link.matches[].remote_type(string, required) — provider document type, e.g.qbo_invoice,xero_invoice.matches[].remote_id(string, required) — the provider document id.from/to(Y-m-d, optional) — window override; defaults to the connection's reconcile window.
Request
Responses
- 200
- 401
- 403
- 422
- 429
OK
Response Headers
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden — the token lacks a required scope, the endpoint is not available to API tokens, or the user behind the token lacks the permission. A human must adjust the token scopes or user permissions; do not retry.
Validation failed — the body is a field → messages map (Laravel shape) or the platform envelope with a stable machine-readable code. Fix the payload and resubmit.
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.