Skip to main content
Writes go to the same company-scoped route as reads:
The payload goes under data:
Which data models support writes depends on the integration. Attempting an unsupported write returns 400 naming the integration and data model. You can check field-level support in our coverage tool.
Writes require a healthy connectionIf the connection is expired or disconnected the write is rejected before it reaches the platform. See Error Handling.

Synchronous writes

Writes are synchronous by default. Latency depends on the integration — we add only the overhead of mapping and logging.
Some calls take much longer than othersThis comes from the integration itself: a single unified write sometimes requires several calls to the platform.

Asynchronous writes

Pass run_async=true as a query parameter:
The response returns a sync_id. Track it with GET /v4/core/companies/{companyId}/syncs, or subscribe to the SYNC_COMPLETED webhook. We recommend async for large datasets — rate limiting and retries are handled for you.

Batch writes

Send data as an array of objects. All records in the batch share one sync_id.
Batches require run_async=trueSending more than one record with run_async=false (or omitted) returns 400. Either pass run_async=true or send one record per request.
One data model per request. To write 10 invoices and 10 bills, call the invoices endpoint and the bills endpoint separately.

Uploading documents

Documents use a dedicated endpoint, POST /v4/core/companies/{companyId}/documents, and accept either a multipart file upload or a base64-encoded file in the JSON body. Each document attaches to a parent record via document_type and document_type_id.