Your first brief
A step-by-step walkthrough for passing your first Nodox brief.
Overview
This guide walks you through your first Nodox brief from start to finish. Every step is given twice, once for n8n and once for Make, and the same shape applies in Zapier or any other webhook-capable platform.
A simple workflow that receives data from Nodox, processes it against the brief's requirements, and sends the result back. This is the foundation of every Nodox brief.
Step 1: set up your automation tool
In n8n
First, you need access to n8n. You have two options:
- n8n Cloud - quick setup at n8n.io (free tier available)
- Self-hosted - run your own instance for ~€5/month (see our self-host n8n guide)
Once you have n8n ready, create a new workflow.
In Make
Make is hosted, so there is nothing to install and nothing to self-host. Sign in at make.com and create a new scenario.
Step 2: create a webhook trigger
Every Nodox brief starts with receiving data via a webhook. Here's how to set it up:
In n8n
- In your n8n workflow, click "+" to add a node
- Search for "Webhook" and select it
- Configure the webhook:
- HTTP Method: POST
- Path: Leave as default or set something memorable
- Respond:
When Last Node Finishes(simplest - your workflow's output becomes your answer)
- Activate the workflow using the toggle in the top-right
- Copy the Production URL - this is what you'll paste into Nodox
Copy the Production URL, not the Test URL, and make sure the workflow is Active. A Test URL only listens once, right after you click "Execute workflow" - it's the #1 cause of "webhook isn't listening" errors.
In Make
- In your Make scenario, click the "+" and search for "Webhooks"
- Pick Custom webhook, then Add a webhook and give it a name
- Copy the URL it shows - this is what you'll paste into Nodox. It looks like
https://hook.eu2.make.com/<id>(the zone can be eu1, eu2, us1 or us2) - Set the scenario schedule to Immediately as data arrives
- Save the scenario and turn it On with the On/Off toggle
A Custom webhook has one URL, so there is nothing to pick between. What matters is the On/Off toggle. A scenario that is off still answers 200 "Accepted" and queues the request, so Nodox waits for a result that never arrives and the case times out.
Step 3: process the data
When Nodox sends data to your webhook, you'll receive a JSON body with two parts:
{
"payload": {
// The actual data you need to process
// This varies per brief
},
"metadata": {
"callbackUrl": "https://nodox.ai/api/callbacks/...",
"callbackToken": "token_abc123",
"mockApiBase": "https://nodox.ai/api/mock/..."
}
}Add processing nodes or modules based on what the brief requires. For a simple echo brief:
- The
payloadcontains the data to process - The
callbackUrlis where you send your result - The
callbackTokenmust be sent as a header in your response
Reading a field
In n8n
Reference a field with an expression, for example {{ $json.metadata.callbackUrl }}.
In Make
The Custom webhook module exposes the same envelope as mappings. Reference a payload field with {{1.payload.user_id}} and a metadata field with {{1.metadata.callbackUrl}}, where 1 is the webhook module's number.
Step 4: send your response
After processing the data, Nodox needs your result back. There are two ways to deliver it - pick one:
Option A: Respond directly (recommended to start)
In n8n
If your Webhook node's Respond option is set to When Last Node Finishes, you're already done: whatever your last node outputs is sent back as the HTTP response, and Nodox validates it automatically. Just make sure the final node outputs only your result - not the payload/metadata envelope.
In Make
Option A does not exist in Make. Make answers "Accepted" as soon as the webhook is hit, before the scenario runs, so the response Nodox reads is Make's acknowledgement and never your result. In Make, go straight to option B.
Option B: Send a callback
For long-running workflows (and some later briefs), respond asynchronously instead. In Make this is the only option.
In n8n
- Add an HTTP Request node after your processing
- Configure it:
- Method: POST
- URL: Use an expression to get
{{ $json.metadata.callbackUrl }} - Body Content Type: JSON
- Add the callback token as a header:
x-nodox-token: {{ $json.metadata.callbackToken }}Then set the body to your processed result directly (no wrapper needed):
{
// Your processed result goes here directly
// No need for callbackToken or received wrapper
}In Make
- Add an HTTP - Make a request module after your processing
- Configure it:
- Method: POST
- URL:
{{1.metadata.callbackUrl}} - Body type: Raw
- Content type: JSON (application/json)
- Add one header - name
x-nodox-token, value{{1.metadata.callbackToken}} - Write your result into the request body as JSON, mapping values in where they belong
Make has no JSON.stringify, so you type the JSON yourself and drop mappings into it. Quote strings, leave numbers unquoted. If you just need to echo the payload back, run {{1.payload}} through a Transform to JSON module first and map its output into the body.
A callback must include the x-nodox-token header with the callback token. Without it, Nodox can't match your response to the test. (Option A needs no headers at all.)
Step 5: test in Nodox
Now you're ready to run the brief:
- Go to the brief page on Nodox
- Paste your webhook URL in the "Webhook URL" field
- Click "Test" first to verify your webhook is accessible
- Once the test succeeds, click "Run All Tests"
- Watch the results - each test case will show Pass, Fail, or Timeout
When all tests pass, you'll earn XP and can unlock Nox to review your solution.
Common mistakes to avoid
Missing the x-nodox-token header
Every response must include the x-nodox-token header with the callback token from metadata. Without it, Nodox can't match your response to the test.
Wrong response format
Send your processed result directly as the JSON body. Don't wrap it in any extra fields - just send the data the brief expects.
n8n: using the Test URL instead of the Production URL
n8n has both Test and Production webhook URLs. The Test URL only works while you're actively listening in the editor. Always use the Production URL for Nodox.
n8n: workflow not activated
Make sure your n8n workflow is activated (toggle at the top right). An inactive workflow won't respond to webhook calls.
Make: scenario left off
A scenario that is off still answers 200 "Accepted" and queues the request, so the URL looks fine and the case times out anyway. Turn the scenario on and set its schedule to Immediately as data arrives.
Make: the scenario turned itself off
Make switches a scenario off after three consecutive errors. If the first few cases passed and the rest timed out, open the scenario's execution history, fix the module that errored, and turn the scenario back on before you run again.
Make: quoting numbers in the JSON body
You type the raw JSON body yourself, so it is easy to wrap a mapping in quotes. Write "total": {{2.total}}, not "total": "{{2.total}}". A quoted number fails the case even when the value is right.
Timeout (taking too long)
You have 30 seconds to respond. If your workflow takes longer, the test times out. Optimize slow operations or check for infinite loops.
Next steps
You've passed your first brief. Here's what to explore next:
- Try harder briefs - move up in difficulty as you get comfortable
- Learn about mock APIs - some briefs require calling external APIs (see mock API docs)
- Use Nox - after passing tests, get its feedback on your solution
- Follow a track - a structured sequence of briefs that builds toward a skill
If tests are failing, click on a failed test to see the expected vs actual output. Use the Nox debugger (available when tests fail) to get targeted hints.