API 1.0.1
Released September 13, 2026
This release makes it practical to keep Zapa portals in sync with the systems your firm already runs: portals can carry your own record IDs, every webhook tells you which external record it concerns, and tasks can be created and fulfilled end-to-end over the API.
Two changes affect existing integrations. Review Breaking and behavior changes before upgrading.
Highlights
External system IDs on portals
A portal can now store one identifier per external system (for example your CRM customer ID or tax-software client ID) and be looked up by it.
GET /api/v1/portals?externalSystem={system}&externalId={id}returns the matching portal (as a one-element array) or[]. Both parameters are required together.PATCH /api/v1/portals/{portalId}acceptsexternalSystemIdsas a merge-patch: keys you send are set, anullvalue removes that key, keys you omit are untouched. The response echoes the full merged map.- Each
(system, id)pair is unique within an organization. Assigning a pair that already belongs to another portal returns409 Conflict. - Validation: system names are 1–100 printable characters, values 1–256 characters, at most 50 systems per portal.
curl -X PATCH https://api.zapaportal.com/api/v1/portals/PORTAL_ID \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "externalSystemIds": { "QuickBooks": "cust_12345", "OldCRM": null } }'
Webhook payloads
- Every portal-scoped event (
portal.created,portal.workflow_changed,file.uploaded,file.signed,task.created,task.completed,guest.invited) now includesexternal_system_ids— the portal's current map, or{}when none are set — so receivers can route events without an extra API call. file.uploadedincludestask_idwhen the upload was attached to a task (empty otherwise).task.completedincludesaction_type,status,attached_files, and, when a File Request was fulfilled by an upload, the completingfile_id.task.completednow fires when a task is marked done in the Zapa web app, not only through the API, and when a client fulfils a File Request by uploading a document (see below).
Tasks over REST
POST /api/v1/portals/{portalId}/tasksnow honors:assigned_guest_ids/assigned_member_ids— validated against the portal's guests and the organization's members; display names are resolved server-side.send_reminder— whentrue, Zapa emails assignees about the task. Requiresdue_date(a request withsend_reminder: trueand nodue_datereturns400).
- Task status values are case-insensitive;
open,done,completed, andclosedare accepted. PATCH /api/v1/tasks/{taskId}no longer clears assignees or comments when other fields are updated.
File uploads attached to tasks
POST /api/v1/portals/{portalId}/files and POST /api/v1/portals/{portalId}/files/complete accept an
optional task_id. The uploaded file is attached to that task (which must belong to the same
portal). When a guest uploads to an open File Request, the task is completed automatically and
a single task.completed event fires with the file_id. Uploads by team members attach the file
but leave the task open.
Refresh token rotation
Refresh tokens are now single-use and their lifetime slides:
- Every
grant_type=refresh_tokenresponse includes a newrefresh_token. Store it and discard the old one. - The previous token is accepted again for about 60 seconds (in case the rotation response was lost) and then returns the same successor. Presenting it after that window is treated as token theft: the entire token chain is revoked and the user must re-authorize.
- Each rotation restarts the 30-day lifetime, so an integration that refreshes at least once every 30 days stays connected indefinitely.
Breaking and behavior changes
client_secretis required on refresh. Clients created under Settings → API Settings must sendclient_secretwithgrant_type=refresh_token. Refreshes without it now return401 invalid_client. The quickstart has always shown the secret on refresh; integrations that omitted it must add it.- Refresh tokens rotate. Integrations that reuse the same refresh token indefinitely will be
disconnected after the grace window described above. Persist the
refresh_tokenfrom every token response. task.completedfires more often. Completions made in the web app and File Request auto-completions now emit events. Receivers should already be idempotent onX-Webhook-Delivery-Id; make sure downstream automations tolerate the additional volume.assigned_guest_names/assigned_member_nameson task create are ignored — names are looked up from the IDs.
Zapier integration 1.0.1
- New search: Find Portal by External ID.
- Update Portal gains an External System IDs field (leave a value blank to remove that system).
- Upload File gains an optional Task field.
- Create Task gains Task Type and Send Reminders fields.
- Trigger output includes the new payload fields above (
external_system_ids,task_id,action_type,attached_files,file_id,status). - Connections stay alive across refresh-token rotation.
Existing Zaps are migrated automatically; no action is required from Zap owners.
Documentation
- The webhook verification sample in the Developer Quickstart
now verifies the HMAC over the raw request body with a constant-time comparison, checks the
timestampfor replay protection, and reads event fields from the top level of the payload (there is no nesteddataobject). - New Working with external system IDs section in the quickstart.