connection:data:write scope. A plain client_credentials token is a 403, and so is a connection that has been revoked, deactivated or deleted. See Access tokens.202 with {writeId, status: "pending"}. If the write cannot be queued, the answer is a 502, never an optimistic 202.Idempotency-Key with every write. Then a 502 is safe to retry with the same key: a write that did get queued is not queued twice.GET /v4/writes/{writeId} for the outcome. status moves from pending (queued) to running (sent to the connected system) and ends as succeeded, partial or failed.connection:data:write scope as the write itself. A writeId that isn't a UUID is a 400, and one from another connection is a 404.{
"writeId": "3f9c2a71-8e4b-4d15-9a06-7b1e2c3d4f58",
"operation": "work-orders:create",
"status": "succeeded",
"synced": true,
"result": {
"id": "0192f4b7-1d2e-7c3f-8a4b-5c6d7e8f9a0b",
"record": { "id": "0192f4b7-1d2e-7c3f-8a4b-5c6d7e8f9a0b", "title": "Replace conveyor belt" }
},
"resolvedRefs": [
{ "field": "asset", "given": { "_displayValue": "Pump 3" }, "matchedOn": "_displayValue" }
],
"steps": [{ "n": 1, "kind": "call", "status": "succeeded" }]
}result.id is the Makini id of the written record. Once synced is true, result.record is the record in the same shape the entity's read endpoint returns. Before that, it is the connected system's own copy of the record.steps[] is what was done in the connected system.leftovers[] is what a partial write left behind there.resolvedRefs[] is what each reference in your request resolved to.error is the error body on failure (see Errors).code and customFields are writable. The derived fields are left out too: statusCategory, lifecyclePhase, priorityLevel, operationalStatus, isCompleted and itemCount. Setting a derived field is a 422 with MAKINI_FIELD_READ_ONLY, and an unknown field is a 400.POST /v4/<entity> takes every writable field. Where an endpoint allows it, a batch is {items: [...]} with up to 100 creates, queued as one write.{id} in an update, action or delete path is the record's Makini id.| Key | Matches |
|---|---|
id | The Makini id |
_idValue | The connected system's own id. It is passed through unverified. |
_displayValue | The display name among live records |
_displayValue is matched exactly first, then ignoring case and whitespace. A polymorphic relation also needs rel, the entity it points at. A many-relation is an array of references. A bare string where a reference belongs is a 400.hold, cancel, reject and complete take a reason. Some systems have a list of reasons to pick from and some keep the reason as text; you send the same thing either way:{ "reason": { "_displayValue": "Waiting for parts" } }GET /v4/taxonomies?filter[type]=action-reason; each row's category is the action it belongs to. A name that isn't on the list is a 422 with MAKINI_REF_NOT_FOUND.reasonText, and as the reason link when it came from a list.Idempotency-Key header (up to 128 characters). A repeat with the same key within 24 hours answers 200 with the full write record, the same body GET /v4/writes/{writeId} returns, instead of queueing it again. A repeat with the same key and a different body is a 409 with MAKINI_CONFLICT.