n8n, Make and Zapier
Jantaris is plain REST, so any automation tool with an HTTP step can use it. This guide gives the exact settings for n8n, Make and Zapier. Two patterns cover almost everything:
- Short jobs (chat, images): one HTTP request. For images add
?wait=60to/v1/generateand the response already contains the result. - Long jobs (video, music): start the task, then either poll
/v1/tasks/{id}in a loop or receive a webhook in a second workflow.
Before you start, create a dedicated API key with a monthly spend limit in the dashboard. If an automation loops by mistake, the limit stops it.
n8n
Credential
Create a credential of type Header Auth:
| Field | Value |
|---|---|
| Name | Authorization |
| Value | Bearer sk-jt-... |
In HTTP Request nodes choose Authentication: Generic Credential Type, then Header Auth, then this credential.
Chat with the OpenAI nodes
n8n's OpenAI credential has a Base URL field. Create an OpenAI credential with:
| Field | Value |
|---|---|
| API Key | sk-jt-... |
| Base URL | https://jantaris.com/v1 |
Then use the OpenAI Chat Model node (or an AI Agent with it) and pick the model By ID, for example claude-sonnet-5, gpt-6-luna or gemini-3.8-flash.
Image in one node
HTTP Request node:
| Setting | Value |
|---|---|
| Method | POST |
| URL | https://jantaris.com/v1/generate?wait=60 |
| Authentication | Header Auth credential from above |
| Send Body | on |
| Body Content Type | JSON |
| Specify Body | Using JSON |
| Options, Timeout | 130000 (ms, longer than wait) |
JSON body:
{
"model": "gpt-image-2.5",
"input": {
"prompt": "{{ $json.prompt }}",
"aspect_ratio": "1024x1024"
}
}The output item has status and output. Map {{ $json.output[0].url }} to a second HTTP Request node with Response Format File to download the image, then save it wherever you need (Google Drive, S3, and so on). Add an IF node on {{ $json.status }} equal to succeeded before the download, because a finished task can also be failed.
Video with a polling loop
[Start generation] -> [Wait 30 s] -> [Check task] -> [IF finished?] --true--> [Download]
^ |
+------------- false ------------+| Node | Type | Settings |
|---|---|---|
| Start generation | HTTP Request | POST https://jantaris.com/v1/generate, JSON body with model: "seedance-2.5" and input |
| Wait 30 s | Wait | Resume: After Time Interval, 30 seconds |
| Check task | HTTP Request | GET {{ $('Start generation').item.json.poll_url }}, same credential |
| IF finished? | IF | {{ $json.status }} is equal to succeeded, OR is equal to failed |
| Download | HTTP Request | GET {{ $json.output[0].url }}, Response Format File |
Connect the false output of the IF node back to Wait. Put a second IF after the true branch to route failed tasks to an error path (for example a Slack message with {{ $json.error.message }}).
Video with a webhook
Workflow A starts the task:
{
"model": "kling-3.0",
"input": { "prompt": "{{ $json.prompt }}", "duration": 5 },
"webhook_url": "https://your-n8n.example.com/webhook/jantar-done-7f3a9c"
}Workflow B receives the result:
| Node | Settings |
|---|---|
| Webhook | HTTP Method POST, Path jantar-done-7f3a9c, Respond: Immediately. Copy the Production URL into webhook_url |
| HTTP Request | GET https://jantaris.com/v1/tasks/{{ $json.body.id }} with the Header Auth credential |
| IF | {{ $json.status }} equal to succeeded |
| HTTP Request | GET {{ $json.output[0].url }}, Response Format File |
The second step re-reads the task with your own key, so you act only on data that came from the API, even without verifying the signature. If you do want to verify x-jantaris-signature, turn on the Webhook node's Raw Body option and compute HMAC-SHA256 in a Code node as shown in Webhooks. Workflow B has to be active for the Production URL to work.
Make
Image or chat: HTTP "Make a request"
| Field | Value |
|---|---|
| URL | https://jantaris.com/v1/generate?wait=60 |
| Method | POST |
| Headers | Authorization = Bearer sk-jt-... |
| Body type | Raw |
| Content type | JSON (application/json) |
| Request content | JSON below |
| Parse response | Yes |
| Timeout (advanced settings) | 130 |
{
"model": "flux-2-pro",
"input": { "prompt": "{{1.prompt}}", "aspect_ratio": "16:9" }
}The parsed body lands in data: {{2.data.status}}, {{2.data.output}}. Add an Iterator on {{2.data.output}} and an HTTP Get a file module with the iterator's url to download each image.
For chat, the same module with URL https://jantaris.com/v1/chat/completions and:
{
"model": "claude-sonnet-5",
"messages": [{ "role": "user", "content": "Summarize: {{1.text}}" }]
}The answer is at {{2.data.choices[1].message.content}} (Make counts array items from 1).
Video with a webhook
- Create scenario B with the trigger Webhooks > Custom webhook. Copy its address.
- In scenario A, send
POST /v1/generatewith"webhook_url": "<that address>"and nowait. - In scenario B after the trigger, add HTTP Make a request:
GET https://jantaris.com/v1/tasks/{{1.id}}with theAuthorizationheader, Parse response Yes. - Add a filter on the route:
{{2.data.status}}equal tosucceeded. - Iterator on
{{2.data.output}}, then HTTP Get a file withurl, then your storage module.
Scenario B has to be on. Jantaris retries the webhook if Make does not answer with 2xx, so turn on dedupe logic (for example a Data Store keyed by task id) if duplicates would hurt.
Zapier
Start a task: Webhooks by Zapier, Custom Request
| Field | Value |
|---|---|
| Method | POST |
| URL | https://jantaris.com/v1/generate |
| Data | JSON below |
| Headers | Authorization = Bearer sk-jt-..., Content-Type = application/json |
{
"model": "seedance-2.5",
"input": { "prompt": "PROMPT FROM PREVIOUS STEP", "duration": 5, "aspect_ratio": "9:16" },
"webhook_url": "https://hooks.zapier.com/hooks/catch/..."
}Insert the prompt from an earlier step with Zapier's field picker. For images you can add ?wait=20 to the URL and use the result directly in the next step. Zapier cuts off slow requests, so keep wait short and use the webhook pattern for anything longer.
Receive the result: a second Zap
| Step | App and event | Settings |
|---|---|---|
| Trigger | Webhooks by Zapier, Catch Hook | Copy the hook URL into webhook_url above |
| Action | Webhooks by Zapier, GET | URL https://jantaris.com/v1/tasks/ + the id field from the trigger, header Authorization = Bearer sk-jt-... |
| Filter | Filter by Zapier | status field (Text) exactly matches succeeded |
| Action | Google Drive (or other) Upload File | File = the output URL field from the GET step |
Chat
Custom Request with POST https://jantaris.com/v1/chat/completions and the same headers:
{
"model": "gpt-6-luna",
"messages": [{ "role": "user", "content": "Write a reply to this email: EMAIL BODY" }]
}Zapier flattens nested JSON, so the answer shows up in the step output as the message content field under choices.
Costs in automations
Each run is billed like any API call: chat by tokens, media by unit (GPT Image 2.5 $0.0432 per image, Seedance 2.5 from $0.261 per second). Failed tasks cost 0. Add a scheduled check of GET /v1/balance with a notification when low_balance is true, so scenarios do not stop on 402.









