Developers

Tools

All seven tools with their arguments, what they return and what they cost.

list_brands

The brands in your workspace. Takes no arguments — and means it: passing any argument is an error.

{ "jsonrpc": "2.0", "id": 2, "method": "tools/call",
  "params": { "name": "list_brands", "arguments": {} } }
{
  "brands": [
    { "id": "fcdbdac6…", "display_name": "yourlife.ricke",
      "slug": "yourlifericke", "locale": "de", "is_active": true }
  ]
}

id is what you pass as brand_id to the generating tools.

list_leads

Enquiries from your intake forms, newest first. This is the tool that turns Ikrames into a source for your CRM.

{ "jsonrpc": "2.0", "id": 3, "method": "tools/call",
  "params": { "name": "list_leads", "arguments": { "brand_id": "fcdbdac6…" } } }
{
  "anfragen": [
    {
      "id": "8b1f…", "brand_id": "fcdbdac6…",
      "email": "[email protected]",
      "eingegangen_at": "2026-09-24T09:12:03.000Z",
      "bestaetigt_at": "2026-09-24T09:14:41.000Z",
      "formular": { "titel": "Illustrations-Anfrage", "slug": "illustration" },
      "antworten": [
        { "schluessel": "projektziel", "label": "Worum geht es?", "wert": "Ein Buchcover, Aquarell." }
      ],
      "anhaenge": { "anzahl": 2, "typen": ["application/pdf", "image/png"] }
    }
  ],
  "naechster_cursor": "MjAyNi0wOS0yNF…"
}

Arguments, all optional: brand_id narrows to one brand, seit takes an ISO timestamp and returns only enquiries from then on, cursor continues a previous page.

  • Answers carry the label the person actually read. It comes from a copy stored with the enquiry, so it stays correct even after you rename a field or delete the form.
  • Attachments are counted, not handed over. You get how many and what MIME types — never a filename, never a path, never a URL. An attachment belongs to the person who uploaded it; the only route to one is a link that lives for two minutes, and a link that survives in a CRM row would be the opposite of that. Open the enquiry in the app to see the files.
  • Pages hold 50. When naechster_cursor is not null, pass it back as cursor for the next page. It is opaque — do not parse it, and do not build one yourself.
  • brand_id can only narrow. Which brands exist at all comes from your key, not from the argument.

An unknown brand and someone else's brand answer the same.

Pass a brand_id that is not in your workspace and you get { "fehler": "unbekannt" } — the same answer you get for an id that does not exist anywhere. That is deliberate: a distinct "not allowed" would confirm the id is real, and anyone probing ids could assemble a list of other people's brands. The same holds for get_lead.

get_lead

One enquiry, same fields as list_leads.

{ "jsonrpc": "2.0", "id": 4, "method": "tools/call",
  "params": { "name": "get_lead", "arguments": { "lead_id": "8b1f…" } } }

Unknown id, or an enquiry belonging to another workspace: { "fehler": "unbekannt" }.

get_costs

What this workspace has spent, at cost. Figures are the purchase price from the provider, without margin — this is a cost report, not an invoice.

ArgumentTypeMeaning
vonstring (ISO timestamp) · optionalFrom, inclusive. Omit for all time.
bisstring (ISO timestamp) · optionalTo, inclusive.
gruppierung"context" | "model" | "ref" · optionalHow to group. Default context.
{ "jsonrpc": "2.0", "id": 3, "method": "tools/call",
  "params": { "name": "get_costs",
              "arguments": { "gruppierung": "context" } } }
{
  "zeitraum": { "von": null, "bis": null },
  "llm": [
    { "schluessel": "agent_run", "anzahl": 102, "usd": 8.098616 },
    { "schluessel": "fill_slide_generate", "anzahl": 59, "usd": 0.562623 }
  ],
  "provider": [
    { "schluessel": "mcp_image_generate", "anzahl": 2, "usd": 0.006291 }
  ],
  "summe_usd": 12.664687
}

Group by ref to see spend per generated asset rather than per feature.

get_asset

Fetch one generated image: its status and, once it is finished, a time-limited address.

ArgumentTypeMeaning
asset_idstringThe id returned by generate_image.
{ "jsonrpc": "2.0", "id": 4, "method": "tools/call",
  "params": { "name": "get_asset",
              "arguments": { "asset_id": "1f6d8b22…" } } }
{
  "asset_id": "1f6d8b22…",
  "status": "ready",
  "origin": "ai_generated",
  "url": "https://…supabase.co/…?token=…",
  "markierung": { "c2pa_signed": true, "visible_label": false }
}

While the image is still being produced, url and markierung are null and status is generating. An unknown id and someone else's id both return the same error — see Errors.

generate_image

Generate an image from a prompt. Costs credits. Runs asynchronously: the call returns as soon as the job is accepted, not when the image exists.

ArgumentTypeMeaning
brand_idstringA brand in this workspace.
promptstringWhat to draw. At least 3 characters.
modelKeystringModel id, e.g. flux_schnell, flux_dev.
imageSizestring · optionalFormat preset, e.g. square_hd.
numImagesnumber · optionalHow many; capped by the model.
seednumber · optionalFor repeatable output.
{ "jsonrpc": "2.0", "id": 5, "method": "tools/call",
  "params": { "name": "generate_image",
              "arguments": { "brand_id": "fcdbdac6…",
                             "prompt": "a quiet harbour at dawn",
                             "modelKey": "flux_schnell" } } }
{
  "asset_id": "1f6d8b22…",
  "status": "generating",
  "fal_request_id": "…",
  "cost_credits": 1,
  "new_balance": 4988,
  "hinweis": "Fertigstellung mit get_asset abfragen (status wird 'ready')."
}

The asynchronous flow

  1. Call generate_image. Credits are deducted now, and you get an asset_id.
  2. The image is produced elsewhere and stored when it arrives. This is also when it is signed.
  3. Poll get_asset with that asset_id until status turns from generating to ready.
  4. ready brings the url and the marking state.

There is no callback and no streaming progress. Poll at a human pace — a few seconds apart is plenty.

If the job cannot be submitted, the credits are returned automatically and the call reports the failure. You are not charged for a generation that never started.

create_composition

Plan and assemble a reel draft from an idea.

The draft itself is not charged. Rendering it later costs no credits either — it counts against the render minutes of your plan. (This page said "costs credits — a language-model plan plus speech synthesis" until October 2026. Nothing was ever deducted for it; the plan is only measured, and the speech in the assembly has no deduction.)

The result is a composition inside your workspace. It is not a publishable post; turning it into one happens in Ikrames.

ArgumentTypeMeaning
brand_idstringA brand in this workspace.
ideastringWhat it should be about.
duration_target_secnumberTarget length, 3 to 60.
mode"fit_to_time" | "fit_to_idea"Hold the length, or hold the whole idea.
aspect_ratio"9:16" · optionalReels are portrait only. 16:9 is not accepted.
language_code"de" | "en" · optionalDefault: the brand's language.
voicestring · optionalVoice name. Default Rachel.
caption_stylestring · optionalDefault tiktok_karaoke.
template_idstring · optionalAn existing composition template.
{ "jsonrpc": "2.0", "id": 6, "method": "tools/call",
  "params": { "name": "create_composition",
              "arguments": { "brand_id": "fcdbdac6…",
                             "idea": "three pricing mistakes founders make",
                             "duration_target_sec": 30,
                             "mode": "fit_to_time" } } }
{
  "composition_id": "c41b90e7…",
  "total_duration_frames": 900,
  "estimated_duration_sec": 29.4,
  "exceeds_target": false,
  "plan": { "…": "the scene plan that was built" },
  "hinweis": "Komposition angelegt, noch nicht veroeffentlichbar — …"
}

The app splits this into a free preview and a paid assembly, because a person wants to look at the plan before spending. An agent cannot look at anything, so both steps happen in one call; the returned plan shows what was built.

Was this helpful?