Changelog
Every change to the API, dated — what shipped, what it covers, what is coming.
Changes are listed newest first. Additive changes ship inside /v1; a breaking change would arrive as /v2 with the overlap described in Versioning & deprecation. Entries dated before the public launch describe pre-release builds: until the launch date is announced here, a breaking change may still ship inside /v1 with a changelog entry and no /v2 — the 2026-10-12 concurrency header is the one such change — and the versioning policy applies in full from launch.
2026-10-13 — MCP server
@processcart/mcp, a Model Context Protocol server for Claude Desktop, Claude Code, Cursor and other MCP clients, is on npm: npx -y @processcart/mcp with your API key in PROCESSCART_API_KEY (MCP server). No API change.
- Fourteen task-shaped tools:
whoami,list_workflows,get_workflow_schema,start_run,find_runs,get_run,set_fields,complete_task,reopen_task,decide_approval,add_comment,get_activity,update_runandlist_people. Each answers Markdown for the assistant plus JSON asstructuredContent: a run answer is the whole run with itsrevision(the API's Run resource),find_runscarries one summary per run (no tasks or fields), andlist_peopleandwhoamireshape theirs too (MCP server). - Scoped to the key: the server reads
GET /v1/meat startup and offers only the tools the key's scopes allow; a read-only key, or--read-only, gets the read tools only. - Safe by construction: no admin tools and no tool that deletes a run, workflow or comment;
set_fields,update_run,reopen_taskanddecide_approval(which can overwrite, clear or send work back) carry the MCPdestructiveHint; the server tells the assistant that run content is data, never instructions; a plain-httpbase URL is accepted only for a server on the same machine; every write carries anIdempotency-Key; the write tools takeexpectedRevision(sent asExpected-Revision); errors come back as tool results with every field problem,currentRevisionon a409and the wait on a429. - Registry: the package ships its MCP Registry metadata as
com.processcart/mcp; the listing is pending.
2026-10-12 — Configuration events, Expected-Revision, partial view queries
Additive inside /v1, except for the concurrency header (the first item), which replaces If-Match and ETag — a breaking change made before the public launch, so it ships inside /v1 without a /v2 (see the note above).
Expected-RevisionreplacesIf-Match; the API sends noETag. Every Run body carriesrevision, the one version field (a new run starts at1; a finalized upload answersrun.revision). The writes that change an existing run —PATCH /v1/runs/{id},PATCH /v1/runs/{id}/fields, the four task actions, trash and restore, finalizing and removing a file — takeExpected-Revision: <revision>: a bare integer (7) or the same quoted ("7");*or no header means no precondition; anything else (a list, a weakW/"7", text, a negative or fractional number) is a 422validation_failedwitherrors[].field: "Expected-Revision". A stale value is refused with 409revision_mismatch, whose problem body names the run's current revision in the new extension membercurrentRevision. No response carries anETagheader — reads and201s included. A request that carriesIf-Matchis refused with 422validation_failed(errors[].field: "If-Match") on every authenticated operation; some hosting layers answer it with412 Precondition Failedfirst — both mean "sendExpected-Revisioninstead".Expected-RevisiontakesIf-Match's place in theIdempotency-Keyrequest fingerprint. Why: CDN layers evaluateIf-Matchagainst the response and turn a successful write into a 412 (Concurrency). This supersedes theETag/If-Matchwording of the earlier entries below.- Nine configuration events:
webhook.created/.updated/.deleted,schedule.created/.updated/.deleted,rule.created/.updated/.deleted.data.webhook,data.scheduleordata.ruleis the resource asGETreturns it (never a secret; a*.deletedevent carries the last state), and every*.updatednames what happened indata.change—settings,enabled/disabledorpaused/resumed,secret_rotated(webhooks), orauto_disabledwhen Process Cart switched it off (a webhook after a410or repeated failures, a rule after repeated failures, a schedule that ended, could not start its runs, or whose workflow was moved to Trash, archived or unpublished). They are included in*and never trigger an automation rule (Configuration events). POST /v1/viewstakes a partialquery: omitted members take the board's defaults,sort.keywithoutdirtakes the key's natural direction, and the 201 carries the complete query. OnPATCH /v1/views/{id}, aquerychanges only the members it sends (nullclearsworkflowId,assigneeordue). An unknown member ofqueryorquery.sortis now a 422unrecognized_keysinstead of being dropped (Views & exports).GET /v1/melists the workspace's status labels inorg.labels([{ id, name, color }], empty when there are none) — the idslabelsand the label filters take (Authentication).finalize.urlin an upload ticket is now an absolute URL, like everyLocation. On a host without a configured app URL,Run.url, a comment'surland a webhook'sdata.run.urlnow follow the request's origin rather than a local address.- Idempotency: answers that read the run or its setup at that moment are no longer stored for replay — 422
required_fields_unsatisfiedandfield_not_writable, 403approver_only,workflow_not_runnableandnot_allowed_for_key— so a retry with the sameIdempotency-Keyre-executes once the state is fixed (Idempotency). - Field errors: text that a number, currency or percent field cannot parse is
errors[].codeunparseable(it wasnot_finite);not_finitenow means only a non-finite JSON number. - Read-only keys: the 403 for a write now names the methods such a key may use (
GET,HEAD). - Docs: the RateLimit headers are described as they are sent — on every response to an authenticated request; a 401, a 405 or an unknown-path 404 carries none (Rate limits).
- TypeScript SDK: the
ifMatchoption is nowexpectedRevision(a number, sent asExpected-Revision);$meta.etagand theetagOfhelper are gone;$meta.revisionis set on every response that returns a run (from the body), andProcessCartError.currentRevisioncomes from the 409's body — so a write chains from the last one:expectedRevision: updated.revision(TypeScript SDK).
2026-10-12 — Schedules and automation rules
Two new resources, both additive inside /v1 (Schedules · Automation rules).
- Schedules (scope
schedules:manage):GET/POST /v1/schedules,GET/PATCH/DELETE /v1/schedules/{id},POST /v1/schedules/{id}/pause,POST /v1/schedules/{id}/resume,POST /v1/schedules/{id}/run(start a run now) andGET /v1/schedules/{id}/preview(the next occurrences). - Automation rules (scope
rules:manage):GET/POST /v1/automation-rules,GET/PATCH/DELETE /v1/automation-rules/{id},POST /v1/automation-rules/{id}/enable,POST /v1/automation-rules/{id}/disableandGET /v1/automation-rules/{id}/executions. - The Run resource gains
schedule({ id, name }of the schedule that created the run, ornull) andscheduledFor(the occurrence it was created for;nullfor every other run, including a schedule's run now). Runs a schedule creates havestartedBy: "schedule". - Actors: activity entries and event payloads can name a schedule (
{ "kind": "schedule", "scheduleId", "name" }) or an automation rule ({ "kind": "rule", "ruleId", "name" }). - Errors: the new code
schedule_ended(409); theerrors[].codeunknown_webhook;limit_reachednow also covers schedules and rules that are on per workspace;unknown_keyonenabledin a schedule or rule body points at pause / resume and enable / disable, as on webhooks. - OpenAPI: the request body of
POST /v1/runs/{id}/tasks/{key}/approveis now marked optional, as the endpoint always treated it (send none, or{}); generated clients make the argument optional.
2026-10-09 — TypeScript SDK
The official TypeScript client covers every operation with a typed method, plus cursor pagination, automatic idempotency keys, safe retries, If-Match helpers and Standard Webhooks signature verification, with request and response types generated from the OpenAPI document. Install it from npm as @processcart/sdk (TypeScript SDK).
2026-10-08 — v1, first complete build (pre-release)
The first public version of the Process Cart API.
Covered
- Workflows: list, read (summary + the published version's sections, tasks, fields and rules), per-workflow JSON Schema for starting runs and writing fields, the portable template (export), create from a template (import, published by default), update name / description / folder / key-date field / status.
- Runs: list with filters and incremental sync, start (with field values, priority, labels and due date in one transaction), read with
ETag, update the header, move to Trash and restore, the task list. - Tasks: complete, reopen, approve and reject under the engine's gates.
- Field values: set 1–200 fields in one all-or-nothing transaction; canonical + formatted on read.
- Comments and activity: list and post comments (text or rich document); the activity trail with cursor tailing.
- Files: two-phase upload to File fields, list, download URLs, remove.
- Saved views: list and read shared views, run a view's query, create, update and delete.
- Webhooks: create (secret shown once), read, update, enable, disable, rotate the secret, test, delete; the delivery log and redelivery.
- Directory: members (without email addresses) and groups.
- Exports: CSV of a workflow's runs.
- Conventions: API keys with scopes, read-only keys and allowlists; 600 requests per minute per key; RFC 9457 errors;
Idempotency-Key;ETag/If-Match;{ data, nextCursor, hasMore }pagination;updatedSince; Standard Webhooks signatures with retries. - Docs: this site, the OpenAPI 3.1 document,
llms.txt/llms-full.txtand a.mdtwin of every page.
Coming
- Recurrence schedules and automation rules — since shipped (2026-10-12 — Schedules and automation rules).
- Editing and deleting comments through the API (available in the app today).