n8n, Make and Zapier
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=60on/v1/generateand 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:
| Option | Setting |
|---|---|
Method | POST |
URL | https://kadraris.com/v1/generate?wait=60 |
Authentication | your header credential from earlier |
Send Body | switched on, JSON, Using JSON |
Timeout (under Options) | 130000 ms, which is longer than wait |
Body:
{
"model": "gpt-image-2.5",
"input": {
"prompt": "{{ $json.prompt }}",
"aspect_ratio": "1024x1024"
}
}The node returns an item with status and output. Then:
- Add an IF node that checks
{{ $json.status }}equalssucceeded. A finished task may also befailed, so do not skip this. - On the true branch, place a second HTTP Request node that downloads
{{ $json.output[0].url }}withResponse Formatset toFile. - Send the file to wherever you keep assets, for example Google Drive or S3.
Video, checked in a loop
[Start generation] -> [Wait 30 s] -> [Check task] -> [IF finished?] --true--> [Download]
^ |
+------------- false ------------+| Step in the diagram | n8n node | How to set it |
|---|---|---|
| Start generation | HTTP Request | POST https://kadraris.com/v1/generate; the JSON has model: "seedance-2.5" plus input |
| Wait 30 s | Wait | resume after a fixed interval of 30 seconds |
| Check task | HTTP Request | GET {{ $('Start generation').item.json.poll_url }}, reusing the credential |
| IF finished? | IF | two conditions joined by OR: {{ $json.status }} = succeeded, {{ $json.status }} = failed |
| Download | HTTP Request | GET {{ $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:
{
"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 node | How to set it |
|---|---|
Webhook | method POST, path kadraris-done-7f3a9c, reply straight away; its production address is what goes into webhook_url |
HTTP Request | GET https://kadraris.com/v1/tasks/{{ $json.body.id }}, authenticated with your header credential |
IF | continue only when {{ $json.status }} is succeeded |
HTTP Request | GET {{ $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:
| Option | Setting |
|---|---|
URL | https://kadraris.com/v1/generate?wait=60 |
Method | POST |
Headers | Authorization set to Bearer sk-kd-... |
Body type | Raw, content type JSON (application/json) |
Request content | paste the JSON shown next |
Parse response | Yes |
Timeout (advanced) | 130 |
{
"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:
{
"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
- Build scenario B with
Custom webhook(from the Webhooks app) as its trigger, and copy the address Make gives you. - In scenario A, call
POST /v1/generatewithoutwait, passing"webhook_url": "<the copied address>". - Behind the trigger in scenario B, add an HTTP
Make a requestmodule doingGET https://kadraris.com/v1/tasks/{{1.id}}, with theAuthorizationheader and response parsing turned on. - Put a filter on the route so only
{{2.data.status}}equal tosucceededpasses. - Iterate over
{{2.data.output}}, download eachurlwithGet 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:POSTURL:https://kadraris.com/v1/generateData: the JSON that followsHeaders:AuthorizationwithBearer sk-kd-..., andContent-Typewithapplication/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
- Trigger:
Catch HookinWebhooks by Zapier. Its URL is the one you put intowebhook_url. - Action: a
GETrequest (same app) tohttps://kadraris.com/v1/tasks/followed by theidfrom the trigger, sendingAuthorizationwithBearer sk-kd-.... - Filter: let the Zap continue only if the status text is exactly
succeeded. - 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:
{
"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.























