Make and other tools — call a service with an HTTP step
Updated 2026-11-13
How to call a service from Make or any other automation tool that has an HTTP step: the exact request to build, how to read the results, and the errors to handle.
When to use this
SpreadAPI has ready-made connections for n8n, Zapier and Power Automate. Every other tool can call a service through its generic HTTP step, for example the HTTP module in Make. A service is a normal web API: you send input values and get the calculated outputs back as JSON.
Before you start
- The service must be published.
- You need the service ID. It is part of every address under API → Code and is shown under API → Automation → Power Automate as Service ID.
- If the service requires a token, have a token ready. Create one under API → Access (Zugriff); it is shown only once. See Tokens and access.
Tip: API → Code → cURL shows a complete, working request for your service. Most tools can import a cURL command or let you copy its parts.
The request
Set up the HTTP step with these values:
| Setting | Value |
|---|---|
| Method | POST |
| Address (URL) | https://spreadapi.io/api/v1/services/YOUR_SERVICE_ID/execute?flatten=true |
| Header | Content-Type: application/json |
| Header (protected services only) | Authorization: Bearer YOUR_TOKEN_HERE |
| Body type | JSON (raw) |
| Body | {"inputs": { … }} with one entry per input |
| Parse the response | Yes, as JSON |
Example body:
{
"inputs": {
"amount": 1000,
"rate": 0.05,
"region": "EU",
"express": true
}
}Rules for the inputs:
- Use the input's name, not its title. Names are not case-sensitive.
- Send numbers as numbers, yes/no values as
trueorfalse, text in quotes. - Send percentages as decimals:
0.05for 5%. See Percentages and formats. - You may leave out optional inputs; the service then uses their defaults.
Reading the results
With flatten=true in the address, the answer contains result: one entry per output, keyed by the output's name. This is the easiest form to map in an automation tool.
{
"service": { "id": "YOUR_SERVICE_ID", "name": "Price calculator", "description": null },
"inputs": [ … ],
"outputs": [
{ "name": "total", "title": "Total", "value": 1050 },
{ "name": "interest", "title": "Interest", "value": 50 }
],
"metadata": { … },
"result": {
"total": 1050,
"interest": 50
}
}In later steps, refer to result.total, result.interest and so on.
Without flatten=true the answer has no result; you then read the values from the outputs list, where each entry has name, title and value. An output that is a cell range has a list of rows as its value. The full answer is described in The API response.
Steps in Make
- Add an HTTP module that makes a request to your scenario.
- Enter the address, choose the method
POST, and add the headers from the table above. - Choose a raw body of type JSON and enter
{"inputs": { … }}. Map values from earlier modules into it. - Turn on parsing of the response.
- Run the module once. The fields under
resultare then available for the following modules.
Other tools work the same way: Webhooks by Zapier, the HTTP Request node in n8n, the HTTP action in Power Automate, and any tool that can send a POST request with a JSON body.
A simpler variant: GET
If a tool can only open an address, put the inputs into the address:
https://spreadapi.io/api/v1/services/YOUR_SERVICE_ID/execute?amount=1000&rate=0.05®ion=EU
For a protected service, add &token=YOUR_TOKEN_HERE. The answer is the same JSON with the outputs list. With &_format=csv or &_format=plain you get the results as CSV or as plain text instead. See Call a service over the API.
Prefer POST in automation tools: the token stays out of the address, and flatten=true gives you results by name.
Errors to handle
| Status | Meaning | What to do |
|---|---|---|
| 400 | A missing or invalid input, or a missing, wrong or expired token. message says which | Correct the value or the token. See Input errors and Token errors |
| 404 | "Service not found or not published" | Check the service ID and publish the service |
| 429 | More than 1,000 calls per minute for this service, or "Monthly call limit reached" | Slow the scenario down, or see Limit errors |
| 500 | The calculation could not be completed | Try again; if it stays, see Contact support |
An error answer is JSON with error and message. Most tools stop the run on a status of 400 or higher; use the tool's error handling if the run should continue.
Limits
- Each request is one call of your service and counts toward the calls of your plan. A service takes at most 1,000 calls per minute. See Call limits.
- If your scenario processes many rows, each row is one request. To compare several sets of values in one request, see Batch calls.
For developers and agents
POST https://spreadapi.io/api/v1/services/{serviceId}/execute?flatten=true
Content-Type: application/json
Authorization: Bearer {token} (protected services only)
{"inputs": {"<input name>": <value>, …}}As cURL:
curl -X POST "https://spreadapi.io/api/v1/services/YOUR_SERVICE_ID/execute?flatten=true" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
-d '{"inputs": {"amount": 1000, "rate": 0.05}}'Exact behaviour:
- The body must contain an
inputsobject. Without it the answer is400witherror: "INVALID_REQUEST"and the messageRequest body must contain "inputs" object. - On POST, send the token in the
Authorizationheader. The?token=parameter belongs to GET calls. flatten=trueis read from the address of a POST call and addsresult({ "<output name>": <value> }; an output without a value isnull).service,inputs,outputsandmetadataare returned in both cases.- Successful answers to POST calls carry the headers
X-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Reset. A429for the per-minute limit haserror: "RATE_LIMIT_EXCEEDED"; a429for the month haserror: "Monthly call limit reached"andcode: "CALL_LIMIT_REACHED". - A
400from the calculation haserror,message,serviceId, theinputsyou sent anddetails. - GET: every query parameter that does not start with
_is an input, excepttoken.trueandfalsebecome yes/no values, numeric text becomes a number. - To learn a service's inputs and outputs before building the request, read its discovery address
https://spreadapi.io/d/{serviceId}; see The discovery address.
FAQ
How do I call my service from Make?
Use Make's HTTP module with the method POST, the address https://spreadapi.io/api/v1/services/YOUR_SERVICE_ID/execute?flatten=true, the header Content-Type: application/json and the body {"inputs": { … }}. Turn on response parsing and map the fields under result.
Is there a SpreadAPI app for Make?
Make connects through its generic HTTP module, as described on this page. Ready-made connections exist for n8n, Zapier and Power Automate.
What does the HTTP request need to look like?
A POST to https://spreadapi.io/api/v1/services/YOUR_SERVICE_ID/execute with Content-Type: application/json and the body {"inputs": {"name": value}}. For a protected service add the header Authorization: Bearer YOUR_TOKEN_HERE.
What does flatten=true do?
It adds result to the answer: an object with one entry per output, keyed by the output's name. That lets you map result.total directly instead of searching the outputs list.
Where does the token go in an HTTP step?
Into a header named Authorization with the value Bearer YOUR_TOKEN_HERE. On a GET call you can instead add &token=YOUR_TOKEN_HERE to the address.
Where do I find my service ID?
It is the part after /services/ in the addresses under API → Code, and it is shown as Service ID under API → Automation → Power Automate.
My HTTP step gets a 400. What is wrong?
The service refused the call: an input is missing or invalid, or the token is missing, wrong or expired. Read message in the answer; it names the cause.
My HTTP step gets a 404. What is wrong?
The service ID in the address is wrong, or the service is not published. Check the address and publish the service.
How do I send a percentage or a yes/no value?
Send a percentage as a decimal (0.05 for 5%) and a yes/no value as true or false, without quotes. Numbers also go without quotes.
Can I call the service with a plain link instead of a JSON body?
Yes. Use GET and put the inputs into the address: …/execute?amount=1000&rate=0.05, plus &token=YOUR_TOKEN_HERE for a protected service.
As an agent, what is the minimal request to run a calculation?
POST https://spreadapi.io/api/v1/services/{serviceId}/execute?flatten=true with Content-Type: application/json, Authorization: Bearer {token} for a protected service, and the body {"inputs": {…}}. Read the values from result, keyed by output name.
As an agent, how do I find the input names of a service?
Read GET https://spreadapi.io/d/{serviceId}, which lists inputs and outputs with name, title and type. Use the names as keys in inputs.