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_cursoris notnull, pass it back ascursorfor the next page. It is opaque — do not parse it, and do not build one yourself. brand_idcan 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.
| Argument | Type | Meaning |
|---|---|---|
von | string (ISO timestamp) · optional | From, inclusive. Omit for all time. |
bis | string (ISO timestamp) · optional | To, inclusive. |
gruppierung | "context" | "model" | "ref" · optional | How 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.
| Argument | Type | Meaning |
|---|---|---|
asset_id | string | The 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.
| Argument | Type | Meaning |
|---|---|---|
brand_id | string | A brand in this workspace. |
prompt | string | What to draw. At least 3 characters. |
modelKey | string | Model id, e.g. flux_schnell, flux_dev. |
imageSize | string · optional | Format preset, e.g. square_hd. |
numImages | number · optional | How many; capped by the model. |
seed | number · optional | For 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
- Call
generate_image. Credits are deducted now, and you get anasset_id. - The image is produced elsewhere and stored when it arrives. This is also when it is signed.
- Poll
get_assetwith thatasset_iduntilstatusturns fromgeneratingtoready. readybrings theurland 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.
| Argument | Type | Meaning |
|---|---|---|
brand_id | string | A brand in this workspace. |
idea | string | What it should be about. |
duration_target_sec | number | Target length, 3 to 60. |
mode | "fit_to_time" | "fit_to_idea" | Hold the length, or hold the whole idea. |
aspect_ratio | "9:16" · optional | Reels are portrait only. 16:9 is not accepted. |
language_code | "de" | "en" · optional | Default: the brand's language. |
voice | string · optional | Voice name. Default Rachel. |
caption_style | string · optional | Default tiktok_karaoke. |
template_id | string · optional | An 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.