Guide: Zapier, Make and n8n
Step-by-step HTTP setups for Zapier, Make and n8n. Poll for new SOPs and assignments, assign SOPs, and create SOPs from Markdown.
On this page
There’s no SOPCompass app in the Zapier, Make or n8n directories yet. Their generic HTTP tools work with the API today.
Common setup
- One key per workflow, named after it (for example
Zap: new hire onboarding), so revoking one doesn’t break the others. Read only unless the workflow writes. - Headers on every request:
Authorization:Bearer sc_live_...Content-Type:application/json(onPOSTrequests)
- Never put the key in the URL or a query parameter. It is refused with
401 key_in_url, and you’ll have to revoke it. - Create keys from an admin account that will stay an admin. If the key’s creator is removed or demoted, the key stops working with
401 creator_not_adminand every workflow using it fails.
Zapier
Use Webhooks by Zapier, a built-in app available on Zapier’s paid plans.
Trigger: new SOP
Use the Retrieve Poll event:
| Setting | Value |
|---|---|
| URL | https://app.sopcompass.com/api/v1/sops?limit=100 |
| Headers | Authorization = Bearer sc_live_... |
| Key | data |
| Deduplication key | id |
Zapier remembers the ids it has seen and fires once for each SOP when it first appears. Limits of this approach:
- It fires on new SOPs, not edits: an edited SOP keeps its
id. - It reads only the first page, and
GET /sopslists the oldest changes first. It works while the workspace has at most 100 SOPs. For larger workspaces, add a filter such aslibrary_idto keep the list under 100, or use the scheduled approach below.
Trigger: SOPs changed in the last hour
For edits, or workspaces with more than 100 SOPs:
- Schedule by Zapier: every hour.
- Formatter by Zapier, Date / Time, Add/Subtract Time:
-1 hourfrom{{zap_meta_human_now}}, output formatYYYY-MM-DDTHH:mm:ss, time zone UTC. - Webhooks by Zapier, GET: URL
https://app.sopcompass.com/api/v1/sops, query stringupdated_since= the Formatter output followed by a literalZ(so the time is read as UTC) andlimit=100, theAuthorizationheader as above. - Looping by Zapier over
datato act on each SOP.
Make the steps after it safe to run twice for the same SOP (update by id), since a change right at the boundary can be seen by two runs.
Trigger: new assignment
Retrieve Poll on https://app.sopcompass.com/api/v1/assignments?limit=100, key data, deduplication key id. Assignments are listed newest first, so the first page always holds the newest ones.
Action: assign an SOP
Webhooks by Zapier, Custom Request:
| Setting | Value |
|---|---|
| Method | POST |
| URL | https://app.sopcompass.com/api/v1/assignments |
| Headers | Authorization = Bearer sc_live_..., Content-Type = application/json |
| Data | the JSON below, with fields mapped from earlier steps |
{
"sop_id": "5b7e9d1a-2c4f-4e6b-8a1d-3c5e7f9a0b03",
"email": "new.cleaner@example.com",
"due_on": "2026-10-01",
"note": "Assigned automatically by Zapier"
}A rerun of the same Zap answers 422 already_assigned instead of assigning twice. The assignee isn’t emailed, so add an email or Slack step if they should be told.
Action: create an SOP
Custom Request, POST to https://app.sopcompass.com/api/v1/sops, same headers, with:
{
"library_id": "4a6c8e0b-2d4f-4a1c-8e3a-5c7e9b1d3f07",
"title": "Close a client site for the night",
"markdown": "## Equipment\n\n1. Empty the mop buckets\n\n## Lock up\n\n- Set the alarm"
}When mapping multi-line text into the JSON, make sure line breaks arrive as \n and quotes are escaped, or the request fails with 400 invalid_json. See Create an SOP for the Markdown supported.
Make
Use the HTTP app’s Make a request module.
| Setting | Value |
|---|---|
| URL | https://app.sopcompass.com/api/v1/sops |
| Method | GET |
| Headers | Authorization = Bearer sc_live_... |
| Query String | updated_since = {{formatDate(addHours(now; -1); "YYYY-MM-DDTHH:mm:ss[Z]"; "UTC")}}, limit = 100 |
| Parse response | Yes |
Schedule the scenario every hour and add an Iterator on data. For POST requests, set Body type to Raw, Content type to JSON (application/json), and put the JSON in Request content.
Add an error handler to the module (for example Break, with automatic retries) so a 429 or 500 is retried after a pause instead of stopping the scenario.
n8n
Use the HTTP Request node.
- Credential: create a Header Auth credential with name
Authorizationand valueBearer sc_live_.... Keeping the key in a credential keeps it out of workflow exports. - Authentication: Generic Credential Type, Header Auth, the credential above.
- URL:
https://app.sopcompass.com/api/v1/sops. - Send Query Parameters:
updated_since={{ $now.minus({ hours: 1 }).toUTC().toISO() }},limit=100. - Follow with Split Out on
data.
For assignments, use POST, Send Body with JSON, and the body shown in the Zapier section. Under Options, Pagination can follow next_cursor: set the cursor query parameter to {{ $response.body.next_cursor }} and complete when {{ !$response.body.has_more }}.
Enable Retry On Fail on the node for 429 and 500 responses.