Skip to content

n8n, Make.com & Zapier recipes

FreeInd is a plain REST API, so any automation tool that can send an HTTP request can drive it. These recipes create a generation, wait for it, and collect the output — replace the API key, workspace id, and model id with your own.

The pattern (any tool)

Every integration follows the same three calls: POST /v1/generations to start a job, GET /v1/generations/:id to poll until the status is terminal (succeeded, failed, cancelled, expired), then download the assets from outputAssetIds. Pass an Idempotency-Key header on create so retries in an automation never double-charge.

Prefer webhooks for long jobs

Video renders can take minutes. Instead of polling, register a webhook endpoint (POST /v1/webhooks) subscribed to generation.completed and generation.failed, and point it at your n8n/Make/Zapier catch hook. FreeInd retries failed deliveries with backoff and signs every request — see Webhooks.

n8n

Install the workflow below (n8n 1.x) or rebuild it in three nodes: a Webhook trigger, an HTTP Request that creates the generation, and a Wait + HTTP Request poll loop. Add a Header Auth credential with Authorization: Bearer fi_live_… instead of inlining the key.

Importable workflow (Webhook → Create generation)json
{
  "name": "FreeInd — generate + collect",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "freeind-generate",
        "responseMode": "lastNode"
      },
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [220, 300],
      "webhookId": "freeind-generate"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://free.ind.in/v1/generations",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            { "name": "Authorization", "value": "Bearer fi_live_..." },
            { "name": "Content-Type", "value": "application/json" }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ workspaceId: $json.workspaceId, modelId: $json.modelId, params: { mode: 'text_to_image', prompt: $json.prompt } }) }}"
      },
      "name": "Create generation",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [460, 300]
    }
  ],
  "connections": {
    "Webhook": { "main": [[{ "node": "Create generation", "type": "main", "index": 0 }]] }
  },
  "settings": { "executionOrder": "v1" }
}

Add the poll loop

After the HTTP Request node, add a Wait node (5 seconds) followed by another HTTP Request that reads the generation. Connect it to an IF node that loops back to the Wait while the status is non-terminal:

Poll and collectbash
# Wait node: 5 seconds, then repeat the HTTP Request below
GET https://free.ind.in/v1/generations/{{ $('Create generation').item.json.id }}?workspaceId={{ $('Webhook').item.json.workspaceId }}
Authorization: Bearer fi_live_...

# IF node condition — repeat while status is non-terminal:
{{ ['queued','reserved','submitted','running'].includes($json.status) }}

# After the IF node, fetch the outputs:
POST https://free.ind.in/v1/assets?workspaceId=<workspace-id>
# or read $json.outputAssetIds from the generation detail response

Make.com

Make has no native FreeInd app — use the built-in HTTP module. A scenario needs five steps; the Repeater (or a filter on the router) handles polling:

Scenario outlinebash
1. HTTP > Make a request  (Create a generation)
   URL          POST https://free.ind.in/v1/generations
   Headers      Authorization: Bearer fi_live_...
                Content-Type:  application/json
   Body type    Raw / JSON
   Body         {"workspaceId":"<id>","modelId":"<id>",
                 "params":{"mode":"text_to_image","prompt":"a red fox in snow"}}

2. Sleep  (5 seconds)

3. HTTP > Make a request  (Check status)
   URL          GET https://free.ind.in/v1/generations/{{1.id}}?workspaceId=<id>

4. Repeater / filter  — continue when
   {{3.status}} in ["queued","reserved","submitted","running"]

5. HTTP > Make a request  (Download the output)
   Use the outputAssetIds from step 3 with GET /v1/assets/:id/download

For long video jobs, replace steps 2–4 with a FreeInd webhook pointed at a Webhooks > Custom webhook module. The webhook payload includes the same fields as the generation detail endpoint.

Zapier

Zapier works best in two halves because code steps have short time limits. Use Webhooks by Zapier > Catch Hook as the trigger, a Code by Zapier step to create the generation and poll for a few seconds, then a second Zap triggered by FreeInd's generation.completed webhook for the final asset.

Code by Zapier — create + short polljavascript
// Code by Zapier — Run JavaScript (Node 18+)
// Trigger: Webhooks by Zapier > Catch Hook, or your own form/trigger.
const API_KEY = process.env.FREEIND_API_KEY ?? 'fi_live_...';
const WORKSPACE_ID = '00000000-0000-4000-8000-000000000000';
const BASE = 'https://free.ind.in/v1';

const headers = {
  Authorization: `Bearer ${API_KEY}`,
  'Content-Type': 'application/json',
};

const create = await fetch(`${BASE}/generations`, {
  method: 'POST',
  headers,
  body: JSON.stringify({
    workspaceId: WORKSPACE_ID,
    modelId: '00000000-0000-4000-8000-000000000001',
    params: { mode: 'text_to_image', prompt: inputData.prompt ?? 'a red fox in snow' },
  }),
});
const generation = await create.json();
if (!create.ok) throw new Error(generation.error?.message ?? 'create failed');

// Zapier code steps are capped (~10s free / 30s paid): poll briefly, then
// hand the id to a second Zap/step so long video jobs finish asynchronously.
let status = generation.status;
for (let attempt = 0; attempt < 5 && ['queued', 'reserved', 'submitted', 'running'].includes(status); attempt++) {
  await new Promise((resolve) => setTimeout(resolve, 2000));
  const check = await fetch(`${BASE}/generations/${generation.id}?workspaceId=${WORKSPACE_ID}`, { headers });
  status = (await check.json()).status;
}

return { generationId: generation.id, status };

Finish asynchronously with a webhook

Register the Zapier catch hook in FreeIndbash
# Webhooks by Zapier > Catch Hook URL goes into FreeInd as a webhook endpoint:
POST https://free.ind.in/v1/webhooks
Authorization: Bearer fi_live_...

{
  "workspaceId": "<workspace-id>",
  "url": "https://hooks.zapier.com/hooks/catch/…",
  "events": ["generation.completed", "generation.failed"]
}

# Verify X-FreeInd-Signature in the Zap code step using the signing secret
# shown once at creation (see /docs/webhooks).

Code step limits

Zapier code steps time out on long jobs. Treat the poll code above as a fast-path for images and audio, and let the webhook Zap deliver videos.

More

The same pattern works in Power Automate, Windmill, Activepieces, or a cron job with curl. The interactive reference for every endpoint and field is at https://free.ind.in/api/docs, and copy-paste curl/JS/Python examples live in Code examples.

Cookies keep FreeInd working. Optional analytics require your permission; ads for free accounts are served by Google, which shows its own consent message where required. Read our cookie policy.