Connect Moxo AI to Atlas Labs
To receive Atlas Labs events in Moxo AI (app.moxo.com), give a flow template a Webhook trigger with the None (secret URL) option, publish it, subscribe the copied URL with POST /webhooks, then map the fields, add a condition on type and re-send the ping with POST /webhooks/{id}/test. We tested this on 19 Oct 2026: each office.sales_order.received event from a fictional sandbox started a flow in Moxo. Moxo's Webhook step cannot send the Atlas Labs key, so calls the other way go through a Make, n8n or Zapier webhook that adds it.
19 Oct 2026. We built the template below in a Moxo AI workspace (app.moxo.com) and subscribed its webhook URL to a fictional Atlas Labs sandbox. Moxo answered each office.sales_order.received delivery with 201, and each started a flow with a To-Do waiting for the reviewer. Moxo also runs an older product, Moxo Classic; this page is about Moxo AI. | At a glance | Value |
|---|---|
| Atlas Labs → Moxo | Flow templates → your template → Trigger → Customize → Webhook → Add → None (secret URL) |
| Field mapping | Required. Without it Moxo answers 400 VALIDATION_ERROR (“Unrecognized keys”) to the Atlas Labs body. Flow name = Atlas Labs sales order + Data / Sales Order Id, Description = Links / Self |
| Filter | Conditions → Match all of the following → Property type, Operator is, Value office.sales_order.received, so the webhook.test ping is answered 200 and skipped |
| Moxo → Atlas Labs | Moxo's Webhook step → a webhook trigger in Make, n8n or Zapier → that tool calls Atlas Labs with the key |
| Where the key goes | In the Make, n8n or Zapier step that calls Atlas Labs: Authorization: Bearer lab_off_YOUR_KEY. The key never enters Moxo, and never goes in a URL (Atlas Labs rejects and revokes a key it finds in a URL). |
| Atlas Labs delivery | Public HTTPS on port 443; a 2xx answer from Moxo counts as delivered. The webhook URL's host is api.moxo.com. |
lab_off_YOUR_KEY. After you start a sandbox, the “Connect it” panel shows the same values with your real keys. secret URL, no Moxo auth header
Moxo envelope
How do I start a Moxo flow from an Atlas Labs event?
- Create the template. In Moxo AI open Flow templates → + Create template. The builder opens as “Untitled template”; click the name and type
Atlas Labs test: sales order received. - Add a role. Under Human roles click + Add role, type
Reviewerand press Enter. Click the role chip → Who fills this role → Person → Search people and pick yourself. The chip then reads “Fixed: [your name]”. - Add a To-Do. On the canvas click + → To-Do. Set Name to
Review new Atlas Labs sales orderand Assignees toReviewer, then Save. - Open the trigger settings. On the Trigger card click Customize >. The “Flow start configuration” panel lists Manual start, Start link, Webhook (“Triggered by an external system via API”) and Connected app. Click Add beside Webhook.
- Choose the verification. In the Webhook dialog, under “How we verify each request”, choose None (secret URL). The dialog says the URL contains a secret token and no additional authentication headers are required. That suits Atlas Labs, which sends a fixed Standard Webhooks request and cannot add Moxo headers. The Signature option expects an
X-Moxo-Signatureheader that Atlas Labs does not produce. - Copy the URL. Click Your webhook URL → Copy webhook URL. It has the form
https://api.moxo.com/v1/webhooks/incoming/<templateId>/<token>. Treat it like a password: anyone holding it can start flows from this template. - Save and publish. Click Save, then Publish. The banner reads “[template name] is live! Anyone can now start flows from it.” The URL answered as soon as the template was published. Manual start stays on beside Webhook.
- Subscribe the URL in Atlas Labs. Subscribing sends a verification ping at once. With no mapping saved yet, Moxo answers it with
400, and the subscription showsverification_failed. That is expected here: Moxo keeps the rejected body as the sample for the next step.Either sandbox key works. Save the
secretfrom the response; it is shown once. In Moxo, the Webhook dialog's Delivery log shows the failed ping as “Failed”,VALIDATION_ERROR.curl Subscribe the Moxo URL run against the live API on19 Oct 2026curl -sS -X POST https://automationatlas.io/labs/api/v1/webhooks \ -H "Authorization: Bearer lab_off_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"url": "https://api.moxo.com/v1/webhooks/incoming/<templateId>/<token>", "events": ["office.sales_order.received"]}' - Set up the field mapping. Reopen the Webhook dialog (Flow templates → your template → Edit → Trigger Customize), then Field mapping → Set up mapping. In “Webhook field mapping” the sample request options are Use generated sample, Paste your own and Capture live. Moxo had already loaded the Atlas Labs body it rejected (“
11fields found”), so you can pick fields straight away. Fill the Moxo fields, mixing typed text with fields from the + picker:- Flow name
Atlas Labs sales order+ Data / Sales Order Id- Description
- Links / Self
- Due date
- left empty
Use literal text plus one field. The wizard drops a typed space between two field tokens, so a name built from Id and Type came out as one run-together word. Click Validate mapping (“It looks good. Here is what Moxo would create.”; it does not start a flow), then Save mapping. The dialog then shows “Field mapping: Detected JSON webhook”.
- Add a condition. Open Conditions (“Checks raw incoming payload paths before mapping”) → Match all of the following → + Condition. Set Property
type(pick it from the sample), Operator is, Valueoffice.sales_order.received. The row shows “Passes” and the section “Saved”. Without it, thewebhook.testping would start a flow of its own. - Send the ping again. The mapping is saved now, so Moxo accepts the body. Re-send the ping and read the answer.
The test call returns
202(queued); Moxo's answer is thestatus_codein the deliveries list. With the condition in place Moxo answers the ping200and logs it “Skipped”, and any2xxturns the subscriptionactive.curl Re-send the ping, read the deliveries run against the live API on19 Oct 2026curl -sS -X POST https://automationatlas.io/labs/api/v1/webhooks/WEBHOOK_ID/test \ -H "Authorization: Bearer lab_off_YOUR_KEY" curl -sS https://automationatlas.io/labs/api/v1/webhooks/WEBHOOK_ID/deliveries \ -H "Authorization: Bearer lab_off_YOUR_KEY" - Check the result in Moxo. Moxo answered each
office.sales_order.receiveddelivery with201. The template page lists the new flows under Recent Flows as “In Progress”. A flow shows a “Flow start” node with a Webhook chip and the To-Do “Review new Atlas Labs sales order”, waiting for the reviewer with an Act button. In the Delivery log (filters All, Failed, Skipped, Succeeded) each entry reads “Succeeded”, then “Created flow [flow id]”, then the Atlas Labs JSON.
How do I call Atlas Labs from Moxo?
Atlas Labs needs an Authorization: Bearer header holding one of the two sandbox keys (lab_fac_ for /factory/*, lab_off_ for /office/*). Moxo AI's Webhook automation step (added from the canvas + under Automations) has fields for Name, URL, “Include data from step”, Context and two toggles, and no method, header, authentication or body fields. It POSTs Moxo's standard event envelope, plus any Context key and value pairs you add. Moxo's own tooltip on the URL field points to the REST API step “if you need a different HTTP method, custom headers, or a custom body shape”, and that step was not available on the plan used for this guide. So the Webhook step cannot carry the key, and a key placed in a URL is rejected and revoked.
- Create a webhook trigger in Make, n8n or Zapier. Make: a Custom webhook. n8n: a Webhook node. Zapier: Webhooks by Zapier → Catch Raw Hook. Copy its URL. The Atlas Labs half of each is on the Make, n8n and Zapier pages.
- Add the Moxo step. In a Moxo flow template click + → Automations → Webhook. Paste the URL into URL. Under Context click + Add field and add the values the Atlas Labs call needs; Moxo sends them in the webhook payload, and their values can reference earlier steps. Leave Block the workflow if this step fails on (the default) if the flow should halt when Moxo cannot reach the hook.
- Call Atlas Labs from the middle tool. Add an HTTP step that sets
Authorization: Bearer lab_off_YOUR_KEY(orlab_fac_YOUR_KEYfor Factory routes) andContent-Type: application/json. On a write, set anIdempotency-Keythat is stable per Moxo event, the same on any retry. The key stays in that tool and never enters Moxo.
Moxo's API reference also documents per-template outgoing webhooks, with events such as flow.started, step.completed and flow.completed, an X-Webhook-Signature header and a Moxo event envelope as the body. The URL they post to can be the Make, n8n or Zapier hook from the first step above.
Common errors
| You see | Why, and the fix |
|---|---|
Moxo's Delivery log shows Failed, VALIDATION_ERROR, Unrecognized keys: "id", "type", "created_at", "sim_date", "sandbox_id", "system", "simulation", "data", "links"; Atlas Labs' /deliveries shows status_code 400 | No field mapping is saved. Without one, Moxo accepts only its own body (name, description, dueAt, roleAssignments, fieldValues). Open Webhook → Field mapping → Set up mapping, map Flow name and Description, then send POST/webhooks/{id}/test again. |
Subscription verification_failed, last_error_class http_4xx | The same cause: the verification ping reached Moxo before the mapping existed. Save the mapping and the condition, then POST/webhooks/{id}/test; a 2xx answer turns the subscription active. |
Flow named evt_…office.sales_order.received, no space | The wizard dropped a typed space between two field tokens. Use literal text plus one field: Atlas Labs sales order + Data / Sales Order Id. |
A flow started by the webhook.test ping | No condition. Add Property type, Operator is, Value office.sales_order.received; the ping is then answered 200 and logged “Skipped”. |
403 wrong_system | On the Make, n8n or Zapier call: the wrong key for the route. /factory/* wants lab_fac_, /office/* wants lab_off_. |
Gotchas
- Moxo AI, not Moxo Classic. The steps here are for app.moxo.com and were written in Moxo AI. Moxo Classic (getstarted.moxo.com) is a separate product.
- The URL is the secret. With None (secret URL), the token in the path is the only protection. Do not paste the URL into chats or screenshots, and delete the subscription when you are done (
DELETE /webhooks/{id}). - Published templates only. Moxo's API reference says the webhook starts flows from a published template. In the test, the URL answered as soon as the template was published.
Questions people ask
- Can Atlas Labs call Moxo directly?
- Yes, for Moxo AI. A template with a Webhook trigger set to None (secret URL) and a saved field mapping accepted the Atlas Labs events in our
19 Oct 2026test, answering201. The other two options, Signature and API key, need headers (X-Moxo-Signature, andX-API-Keyin Moxo's API reference) that Atlas Labs does not send. - Can Moxo call Atlas Labs directly?
- Not with Moxo AI's Webhook step: it has no header or method settings, so it cannot send the
Authorization: Bearerkey, and the REST API step was not available on the plan used for this guide. Send from Moxo to a Make, n8n or Zapier webhook and let that tool call Atlas Labs. - Why does Moxo reject the first ping?
- Subscribing sends a verification ping at once. Without a saved field mapping Moxo rejects the Atlas Labs body with
VALIDATION_ERROR. Save the mapping, then sendPOST /webhooks/{id}/test. - Does Zapier's Moxo app work with Moxo AI?
- No. The app (zapier.com/apps/moxo) is for Moxo Classic, the former Moxtra product, and uses its workspace, binder and transaction objects, and its listing points to the Moxtra-based app. Moxo AI users should use the routes above.
Sources (checked 19 Oct 2026): the Moxo AI interface at app.moxo.com, tested on 19 Oct 2026 against a fictional Atlas Labs sandbox; Moxo's API reference at api.moxo.com/docs; zapier.com/apps/moxo. Atlas Labs facts from the API source, observed live.