Why this matters
Every business runs on more apps than n8n has nodes for: a niche CRM, a booking tool, a supplier portal, the accounting add-on your bookkeeper likes. If an app has an API, the HTTP Request node lets n8n read from it and write to it anyway, so it stops being an island that someone copies data out of by hand.
In this module you help Harbor Lane Marketing, a small agency whose CRM has an API. You pull the client list into n8n with a GET request, ask for just one client with a query parameter, then send a follow-up note back to the CRM with a POST. The "CRM" is JSONPlaceholder, a free public practice API with fake people, so you can do every step for real with no key.
What you’ll build
A three-node workflow: a manual trigger, an HTTP Request that GETs one client from the CRM by username, and a second HTTP Request that POSTs a note with that client's email filled in by an expression.
You also know the four settings that every API call comes down to: method, URL, query parameters and body, plus where a real app's key goes.
What you need
- Nothing to start the practiceThe editor and the API calls are a practice copy. Harbor Lane Marketing is made up and the clients are JSONPlaceholder test data.
- An n8n account, to do it for realSign up with this link (affiliate link: I may earn a commission, at no cost to you).
- No API keyJSONPlaceholder is free and open. It answers a POST but never saves it, so nothing you send goes anywhere.
Concepts
3 ideas you’ll use in the practice.
An API is a door, a request is a message
An API is a door an app opens for other software. An HTTP request is a message sent to it with three parts: a method (what you want), a URL (where) and sometimes a body (the data you send).
The app answers with data, usually as JSON. n8n turns each record in the answer into one item, and the next node runs once per item.
GET reads, POST writes
GET asks for data and changes nothing, so it is safe to try as often as you like. POST sends data in the body, usually to create something: a contact, a note, a task. The HTTP method is the first box in the node.
Query parameters narrow a GET down, like ?username=Samantha. Each API lists the ones it accepts in its docs.
Expressions fill in each item's data
Drag a field from the INPUT panel onto a parameter and n8n writes an expression such as {{ $json.email }}. It means "this item's email", so the same node sends the right email for every client that comes through.
A real API also needs to know who you are. That goes under Authentication as a saved credential, never typed into the URL or the body.
Practice
Do every step yourself in a practice copy of the real tool. It checks your work, and “Do it for me” finishes any step you get stuck on.
Do it for real
Now repeat it in your own account. Tick each step as you go.
Downloads
- n8n Intermediate cheat sheet (PDF)HTTP Request settings, expressions, branching and error handling on one page.
Quick check
3 questions to check you’ve got it.
1. You want a list of clients from a CRM and must not change anything. Which method?
- GET
- POST
- DELETE
Show the answer
GET. GET reads data and changes nothing. POST creates something, DELETE removes it.
2. Your GET returns every client but you only need one. What do you add?
- A body field
- A query parameter the API supports, like username
- A second trigger
Show the answer
A query parameter the API supports, like username. Query parameters go on the end of the address and tell the API which records to send back.
3. Why use {{ $json.email }} instead of typing Nathan@yesenia.net into the body?
- It is shorter
- It fills in each item's own email, so one node works for every client
- n8n does not allow typed values
Show the answer
It fills in each item's own email, so one node works for every client. An expression reads the item coming in. A typed value would send the same email every time.
What a Webhook Is, in Plain Words
You can pull data in from any app. Next, flip it around: let other apps push data to n8n the moment something happens, with a webhook.
Start module 5 →