PL Log inOpen Studio
Preview version. Model catalog, prices, calculator and docs are live. Generation goes live at launch.

n8n, Make and Zapier

Docs: every page

The Kadraris API is ordinary REST, which means any automation platform with an HTTP step can call it. This page lists the exact field values for each of the three big platforms. Nearly every workflow fits one of two shapes:

  • Fast jobs such as chat or images. A single HTTP call does it. For images, put ?wait=60 on /v1/generate and the result arrives in the same response.
  • Slow jobs such as video or music. Start the task first. Then either check /v1/tasks/{id} in a loop, or have a second workflow catch the webhook.

First, create a key used only by your automations and cap its monthly spending in the dashboard. Should a scenario start looping by accident, the limit halts it.

n8n

Setting up the credential

Create a new credential and pick the Header Auth type. Fill it in with:

  • header name: Authorization
  • header value: Bearer sk-kd-...

Every HTTP Request node then uses it: set Authentication to Generic Credential Type, then Header Auth, then pick the credential you just made.

Chat through the OpenAI nodes

The OpenAI credential in n8n includes a Base URL field, so you can point it at Kadraris:

  • API Key: sk-kd-...
  • Base URL: https://kadraris.com/v1

Use that credential in an OpenAI Chat Model node (alone or inside an AI Agent) and select the model By ID, e.g. claude-sonnet-5, gpt-6-luna or gemini-3.6-flash.

An image from a single node

Add an HTTP Request node and set it up as follows:

OptionSetting
MethodPOST
URLhttps://kadraris.com/v1/generate?wait=60
Authenticationyour header credential from earlier
Send Bodyswitched on, JSON, Using JSON
Timeout (under Options)130000 ms, which is longer than wait

Body:

json
{
  "model": "gpt-image-2.5",
  "input": {
    "prompt": "{{ $json.prompt }}",
    "aspect_ratio": "1024x1024"
  }
}

The node returns an item with status and output. Then:

  1. Add an IF node that checks {{ $json.status }} equals succeeded. A finished task may also be failed, so do not skip this.
  2. On the true branch, place a second HTTP Request node that downloads {{ $json.output[0].url }} with Response Format set to File.
  3. Send the file to wherever you keep assets, for example Google Drive or S3.

Video, checked in a loop

text
[Start generation] -> [Wait 30 s] -> [Check task] -> [IF finished?] --true--> [Download]
                          ^                                |
                          +------------- false ------------+
Step in the diagramn8n nodeHow to set it
Start generationHTTP RequestPOST https://kadraris.com/v1/generate; the JSON has model: "seedance-2.5" plus input
Wait 30 sWaitresume after a fixed interval of 30 seconds
Check taskHTTP RequestGET {{ $('Start generation').item.json.poll_url }}, reusing the credential
IF finished?IFtwo conditions joined by OR: {{ $json.status }} = succeeded, {{ $json.status }} = failed
DownloadHTTP RequestGET {{ $json.output[0].url }} returned as a file

Wire the IF node's false output back into Wait. After the true output, add one more IF so that failed tasks take a separate error branch, for example a Slack message containing {{ $json.error.message }}.

Video, delivered by webhook

The first workflow starts the job:

json
{
  "model": "kling-3.0",
  "input": { "prompt": "{{ $json.prompt }}", "duration": 5 },
  "webhook_url": "https://your-n8n.example.com/webhook/kadraris-done-7f3a9c"
}

The second workflow handles the result:

n8n nodeHow to set it
Webhookmethod POST, path kadraris-done-7f3a9c, reply straight away; its production address is what goes into webhook_url
HTTP RequestGET https://kadraris.com/v1/tasks/{{ $json.body.id }}, authenticated with your header credential
IFcontinue only when {{ $json.status }} is succeeded
HTTP RequestGET {{ $json.output[0].url }}, saved as a file

Because the second node fetches the task again with your own key, the workflow only ever acts on data returned by the API, even if you skip signature checks. To verify x-kadraris-signature anyway, switch on the raw body option of the Webhook node and calculate the HMAC-SHA256 yourself in a Code node, as described in Webhooks. The Production URL only responds while the second workflow is active.

Make

Image or chat with the HTTP module

Use the HTTP app's Make a request module:

OptionSetting
URLhttps://kadraris.com/v1/generate?wait=60
MethodPOST
HeadersAuthorization set to Bearer sk-kd-...
Body typeRaw, content type JSON (application/json)
Request contentpaste the JSON shown next
Parse responseYes
Timeout (advanced)130
json
{
  "model": "flux-2-pro",
  "input": { "prompt": "{{1.prompt}}", "aspect_ratio": "16:9" }
}

Make puts the parsed response under data, so you read {{2.data.status}} and {{2.data.output}}. To save every image, add an Iterator over {{2.data.output}}, followed by the HTTP Get a file module fed with each item's url.

Chat uses the same module, with the URL https://kadraris.com/v1/chat/completions and this body:

json
{
  "model": "claude-sonnet-5",
  "messages": [{ "role": "user", "content": "Summarize: {{1.text}}" }]
}

You will find the reply at {{2.data.choices[1].message.content}}. The index is 1 because Make numbers array items starting from 1.

Video with a webhook

  1. Build scenario B with Custom webhook (from the Webhooks app) as its trigger, and copy the address Make gives you.
  2. In scenario A, call POST /v1/generate without wait, passing "webhook_url": "<the copied address>".
  3. Behind the trigger in scenario B, add an HTTP Make a request module doing GET https://kadraris.com/v1/tasks/{{1.id}}, with the Authorization header and response parsing turned on.
  4. Put a filter on the route so only {{2.data.status}} equal to succeeded passes.
  5. Iterate over {{2.data.output}}, download each url with Get a file, and finish with whichever module stores your files.

Scenario B must be switched on. If Make does not reply with 2xx, Kadraris sends the webhook again, so where a duplicate would cause trouble, add deduplication, for instance a Data Store keyed on the task id.

Zapier

Starting a task

In Zapier, the action to use is Custom Request from the Webhooks by Zapier app:

  • Method: POST
  • URL: https://kadraris.com/v1/generate
  • Data: the JSON that follows
  • Headers: Authorization with Bearer sk-kd-..., and Content-Type with 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/..."
}

Pull the prompt in from a previous step with the field picker. Images can be fetched in one go by adding ?wait=20 to the URL and using the result in the following step. Zapier gives up on slow requests, so keep wait low and switch to the webhook approach for anything that takes longer.

Catching the result in another Zap

  1. Trigger: Catch Hook in Webhooks by Zapier. Its URL is the one you put into webhook_url.
  2. Action: a GET request (same app) to https://kadraris.com/v1/tasks/ followed by the id from the trigger, sending Authorization with Bearer sk-kd-....
  3. Filter: let the Zap continue only if the status text is exactly succeeded.
  4. Action: upload the file to Google Drive or any other storage app, using the output URL returned by step 2.

Chat in Zapier

Another Custom Request, this time to POST https://kadraris.com/v1/chat/completions, with the headers unchanged:

json
{
  "model": "gpt-6-luna",
  "messages": [{ "role": "user", "content": "Draft a reply to this email: EMAIL BODY" }]
}

Because Zapier turns nested JSON into flat fields, the reply appears in the step output under choices, as the content of the message.

What automations cost

A workflow run is billed exactly like a direct API call. Chat is charged by tokens and media by unit, for example GPT Image 2.5 at $0.05 per image or Seedance 2.5 at from $0.261 per second. Tasks that fail cost 0. To keep scenarios from stopping on 402, schedule a regular call to GET /v1/balance and send yourself an alert whenever low_balance is true.