PL Log inCreate account
Launching in October 2026. Accounts, model catalog, calculator and docs are live. Studio is available in preview; generation is awaiting activation.

n8n, Make and Zapier

All documentation pages

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=60 to /v1/generate and 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:

FieldValue
NameAuthorization
ValueBearer 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:

FieldValue
API Keysk-jt-...
Base URLhttps://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:

SettingValue
MethodPOST
URLhttps://jantaris.com/v1/generate?wait=60
AuthenticationHeader Auth credential from above
Send Bodyon
Body Content TypeJSON
Specify BodyUsing JSON
Options, Timeout130000 (ms, longer than wait)

JSON body:

json
{
  "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

text
[Start generation] -> [Wait 30 s] -> [Check task] -> [IF finished?] --true--> [Download]
                          ^                                |
                          +------------- false ------------+
NodeTypeSettings
Start generationHTTP RequestPOST https://jantaris.com/v1/generate, JSON body with model: "seedance-2.5" and input
Wait 30 sWaitResume: After Time Interval, 30 seconds
Check taskHTTP RequestGET {{ $('Start generation').item.json.poll_url }}, same credential
IF finished?IF{{ $json.status }} is equal to succeeded, OR is equal to failed
DownloadHTTP RequestGET {{ $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:

json
{
  "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:

NodeSettings
WebhookHTTP Method POST, Path jantar-done-7f3a9c, Respond: Immediately. Copy the Production URL into webhook_url
HTTP RequestGET https://jantaris.com/v1/tasks/{{ $json.body.id }} with the Header Auth credential
IF{{ $json.status }} equal to succeeded
HTTP RequestGET {{ $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"

FieldValue
URLhttps://jantaris.com/v1/generate?wait=60
MethodPOST
HeadersAuthorization = Bearer sk-jt-...
Body typeRaw
Content typeJSON (application/json)
Request contentJSON below
Parse responseYes
Timeout (advanced settings)130
json
{
  "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:

json
{
  "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

  1. Create scenario B with the trigger Webhooks > Custom webhook. Copy its address.
  2. In scenario A, send POST /v1/generate with "webhook_url": "<that address>" and no wait.
  3. In scenario B after the trigger, add HTTP Make a request: GET https://jantaris.com/v1/tasks/{{1.id}} with the Authorization header, Parse response Yes.
  4. Add a filter on the route: {{2.data.status}} equal to succeeded.
  5. Iterator on {{2.data.output}}, then HTTP Get a file with url, 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

FieldValue
MethodPOST
URLhttps://jantaris.com/v1/generate
DataJSON below
HeadersAuthorization = Bearer sk-jt-..., Content-Type = application/json
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

StepApp and eventSettings
TriggerWebhooks by Zapier, Catch HookCopy the hook URL into webhook_url above
ActionWebhooks by Zapier, GETURL https://jantaris.com/v1/tasks/ + the id field from the trigger, header Authorization = Bearer sk-jt-...
FilterFilter by Zapierstatus field (Text) exactly matches succeeded
ActionGoogle Drive (or other) Upload FileFile = the output URL field from the GET step

Chat

Custom Request with POST https://jantaris.com/v1/chat/completions and the same headers:

json
{
  "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.