Sandbox is available at https://api.sandbox.casepathiq.com. Ask your Integration administrator for a scoped Sandbox key; no IP allowlist setup or Microsoft sign-in is needed for API requests. Use synthetic data only.
CASE_PATH_IQ_API_KEY; never paste it into a command or shell history, and keep shell tracing disabled. The examples pass it to curl through standard input so it does not appear in curl’s process arguments. Use synthetic data only.
1
Set your sandbox values
SANDBOX is the Client code for the developer test Integration. Use the Client code supplied with your key if it differs.Keep the client reference ID stable. It must be unique within your Source integration and Client and contain 1–128 characters from A-Z, a-z, 0-9, period, underscore, and hyphen. Do not put names, account numbers, or other personal data in it.2
Create a Matter
If-None-Match: * says this Matter must not already exist. A first successful request returns 201 Created, a Location header, an ETag, and the current partner-facing Matter representation.If the client reference ID already has a Matter, the request returns 412 Precondition Failed without changing anything — read it and reconcile instead of replaying the create.For a Matter with several liable Parties, add another entry to parties[] with isPrimaryLiable: false and its own correspondence address. One instructed file stays one Matter, and debt.outstandingAmount stays the single total.3
Keep the server-owned identifiers
Persist these response fields with your integration record:
Every response also includes
X-Request-Id for support correlation and Cache-Control: no-store.Use the incremental synchronization guide to capture and advance a run-level watermark.4
Retry a lost response safely
If the connection drops during a create, do not replay it blindly. Retrying with
If-None-Match: * returns 412 once a Matter exists at that client reference ID — but that is not proof the create was yours, so GET the Matter and reconcile its ownership and content before carrying on.For an update, send the same PUT with the same If-Match tag. That returns 200 OK with the same sourceRevisionId and unchanged updatedAt only while the tag is still current — that is, while your first attempt did not commit. If it did commit, it minted a new tag, so the retry carries a stale one and returns 412. A stale tag is also what you get when another writer intervened. So a 412 here does not tell you which happened: GET the Matter, compare it with what you sent, and re-send only if your update is genuinely not there.Do not add an Idempotency-Key or a caller revision; the precondition is the ordering mechanism.5
Update it conditionally
etag value exactly as returned, including the quote characters that are part of the value — so "m1-7f3a9c2b" is sent as If-Match: "m1-7f3a9c2b".Omitting If-Match returns 428 Precondition Required. A stale tag returns 412 Precondition Failed. Neither mutates anything.6
Read the current Matter
7
Pull changed Matter state
updatedSince is required and inclusive. Follow nextPageToken until it is null; that final page also carries syncedThrough, the boundary for your next run. Store it only once every page has been applied, and send it back unchanged as the next updatedSince — do not add an overlap of your own.Each item carries etag, lifecycle and payments, so you can reconcile a paused or closed Matter and its observed payments from the list page, and issue a detail GET only where etag differs from the tag you stored.