---
name: adkix
description: Makes a short adkix.ai video (reel, pub vidéo, TikTok, Instagram, YouTube) from a website, an @account or an idea, driving adkix step by step with the user's personal adkix key; checks the brand with the user, shows every step (ideas, styles, cast, script, voice, music) and asks before each spend. Without a key, signs the user up or in by email (6-digit code) from the chat. Use for adkix, "vidéo de mon site", reel, pub vidéo, video ad.
license: Proprietary. (c) 2026 adkix.ai
metadata:
  author: adkix.ai
  version: "3.1"
  homepage: "https://adkix.ai/developers"
---

# adkix — make a short video with the user

adkix.ai turns a website, an Instagram @account or a one-line idea into a short video
(15 s, 30 s or 1 min): it reads the brand, proposes story ideas and styles, draws the cast,
writes the script, records the voice, films every shot with AI and edits it with music and titles.

You are the user's director's assistant: **adkix does the work, the user decides, you show and ask.**
Three rules hold everywhere:

1. **Nothing paid without an explicit yes** to a price adkix gave you (a `quote`), in this conversation.
2. **Show every step** (what adkix proposes, with pictures when there are some) and **ask before moving on**.
3. **Never block**: a whole video takes about 20 minutes of machine time; wait with the long poll
   (`waitSec`), in the background when you can, and keep the user informed with short lines.

More detail when you need it (load only then):
- [reference/steps.md](reference/steps.md): what to show and which action to send at each of the 15 steps.
- [reference/api.md](reference/api.md): endpoints, the state, errors, limits, signed links, webhooks, MCP.
- `scripts/adkix.py` (if it sits next to this file): a stdlib Python helper that does all the calls below.

Installed as a single file? The same files are online:
https://adkix.ai/connect/adkix-skill/adkix/reference/steps.md and
https://adkix.ai/connect/adkix-skill/adkix/reference/api.md (full kit: https://adkix.ai/connect/adkix-skill.zip,
docs: https://adkix.ai/developers).

## When to use

- FR: « fais-moi une vidéo adkix », « une vidéo pour mon site », « un reel pour ma marque »,
  « une pub vidéo pour monsite.fr », « vidéo TikTok / Instagram de ma boîte »
- EN: "make an adkix video", "turn my website into a video", "video ad for my site", "reel for my brand"

## 0. Which way to talk to adkix

- **Tools named `adkix_*` are available** (the adkix MCP server): use them, not curl. Same rules:
  `adkix_run_action` answers a quote for anything paid, only `adkix_confirm_quote` spends,
  `adkix_get_content` with `waitSec: 25` waits, `adkix_view_preview` lets you look at a picture.
- **A shell is available** (Claude Code, Codex, claude.ai with code execution): use `scripts/adkix.py`
  if present, else the `ak` curl helper below. On claude.ai the sandbox must be allowed to reach
  `adkix.ai` (Settings → Capabilities → network egress / allowed domains); if calls fail with a
  network error, say so and use the fallback (last section).
- **Neither**: the fallback (brief + link).

## 1. The key (given once, never shown)

1. The key lives in `$ADKIX_API_KEY` or in the file `~/.config/adkix/key`. Test it silently:

   ```bash
   ak() { [ -n "$ADKIX_API_KEY" ] || [ -s ~/.config/adkix/key ] || { echo "no-key"; return 1; }; printf 'header = "Authorization: Bearer %s"\n' "${ADKIX_API_KEY:-$(cat ~/.config/adkix/key)}" | curl -K - "$@"; }; ak -sS -o /dev/null -w '%{http_code}\n' https://adkix.ai/api/v1/me
   ```

   (or `python3 scripts/adkix.py me`)
2. `404` on `/me`: the API is off on adkix's side, go straight to the fallback (last section).
   `no-key`, or `401`: **sign the user up (or in) from here, by email** — no website, no copy-paste of a key:
   1. Ask, in their language: « Pour te connecter à adkix, quel est ton email ? (et ton prénom si tu
      n'as pas encore de compte) ». Same path for a new account and an existing one.
   2. `python3 scripts/adkix.py signup <email> [--name <prénom>] [--lang fr|en|es]`, or with curl
      (no key needed, keep the `requestId` for step 4, it is not a secret):

      ```bash
      curl -sS -X POST https://adkix.ai/api/v1/auth/start -H 'content-type: application/json' -d '{"email":"<email>","name":"<prénom>","lang":"fr"}'
      ```

   3. Tell them: « Je t'ai envoyé un code à 6 chiffres par mail (de adkix.ai) : donne-le-moi. » The code
      lives 15 min, one use; 5 wrong codes kill it (`expired`: start again at step 2). 3 mails per hour max.
   4. `python3 scripts/adkix.py verify <code>` saves the key to `~/.config/adkix/key` (600) without
      printing it. With curl, the answer holds the key: send it straight to the file, never to the screen:

      ```bash
      mkdir -p ~/.config/adkix && (umask 077; curl -sS -X POST https://adkix.ai/api/v1/auth/verify -H 'content-type: application/json' -d '{"requestId":"<requestId>","code":"<code>"}' | python3 -c 'import json,sys,os; d=json.load(sys.stdin); k=d.pop("key",None); k and open(os.path.expanduser("~/.config/adkix/key"),"w").write(k); print(json.dumps(d))')
      ```

   5. A new account gets its welcome credits (`balance` in the answer) and a verified email. Then test again.
   No shell, or the user prefers the site: « Ouvre https://adkix.ai/compte → Clés API → Créer une clé, puis
   lance dans TON terminal (pas ici) :
   `mkdir -p ~/.config/adkix && (umask 077; printf 'Colle ta clé adkix puis Entrée : '; read -rs K; printf %s "$K" > ~/.config/adkix/key; chmod 600 ~/.config/adkix/key; echo; echo OK)` ».
   The key does not go through the chat. Then test again.
3. If the user pastes the key in the chat anyway: write it to the file
   (`mkdir -p ~/.config/adkix && (umask 077; printf %s '<key>' > ~/.config/adkix/key)`), never repeat it,
   and advise them to revoke it later on https://adkix.ai/compte and create a new one.
4. Never print the key: no `echo`, no `cat` on its own, never in your messages, never in a file you
   show. Every Bash call defines `ak` again (curl reads the header from stdin, so the key never appears
   in the process arguments):

   ```bash
   ak() { [ -n "$ADKIX_API_KEY" ] || [ -s ~/.config/adkix/key ] || { echo "no-key"; return 1; }; printf 'header = "Authorization: Bearer %s"\n' "${ADKIX_API_KEY:-$(cat ~/.config/adkix/key)}" | curl -K - "$@"; }; ak -sS -H 'content-type: application/json' https://adkix.ai/api/v1/...
   ```

5. No key and the user does not want one: use the fallback (last section).

`GET /api/v1/me` → `{ id, name, balance, plan, freeVideo }`. New accounts get 1 000 free credits once
their e-mail is confirmed (enough for a first video): mention it if `balance` is low. `freeVideo:
"available"` (old offer, rare): the first video (15 s, from a site) is free; offer it with `offer: "free"`.

## 2. Short interview, then create

Ask at most 3 short questions in one message, only for what is unknown, each with a default so the
user can answer "ok": the source (site, @account or one sentence), the goal, the length (15 s / 30 s /
1 min, default 30 s), the format (vertical 9:16 by default, or YouTube 16:9), the language (default:
the user's). Never invent facts about the business.

```bash
ak() { [ -n "$ADKIX_API_KEY" ] || [ -s ~/.config/adkix/key ] || { echo "no-key"; return 1; }; printf 'header = "Authorization: Bearer %s"\n' "${ADKIX_API_KEY:-$(cat ~/.config/adkix/key)}" | curl -K - "$@"; }; ak -sS -X POST -H 'content-type: application/json' \
  https://adkix.ai/api/v1/contents -d '{
  "source": { "url": "joespasta.fr" },
  "offer": "paid",
  "igConsent": false,
  "brief": { "duration": 30, "language": "fr", "platforms": ["instagram","tiktok"],
             "note": "Histoire, pas une pub. Fin : Réserve ta table sur joespasta.fr" } }'
```

- `source` is `{ "url": … }` (a site or an @account; `igConsent: true` only if the user agreed that
  adkix reads that account) or `{ "idea": "Une pizzeria de quartier à Lyon" }` (no site).
- `offer: "free"` only when `freeVideo` is `"available"`. Its refusals come with a `reason`: say it as is.
- The answer (`201`) is `{ contentId, projectId, webUrl, state }`. Give the user `webUrl`: the same
  content is on adkix, they can follow or take over there at any moment. Creating reads the site
  (one small AI call, no quote); nothing else starts.

## 3. The loop: read, show, ask, act

Read the state: `GET /api/v1/contents/<id>?waitSec=25`. It answers at once if something moved, else
after 25 s at most. Main fields: `step`, `busy` (a task runs), `error`, `notice`, `balance`, `context`
(what adkix shows at this step), `actions` (what you may send now, with their args in `hint`),
`suggested` (adkix's default next click and its price), `previews` (`url` needs the key, `shareUrl`
opens in any browser for 24 h), `pendingQuote`, `video`, `pollAfterSec`.

### Waiting without blocking

When `busy` is not null, wait with ONE command that loops on `waitSec=25`, prints only changes and
stops as soon as the user has something to see or decide (at most 9 minutes per command):

```bash
ak() { [ -n "$ADKIX_API_KEY" ] || [ -s ~/.config/adkix/key ] || { echo "no-key"; return 1; }; printf 'header = "Authorization: Bearer %s"\n' "${ADKIX_API_KEY:-$(cat ~/.config/adkix/key)}" | curl -K - "$@"; }; ID=<contentId>; last=""; end=$((SECONDS+540))
until [ $SECONDS -ge $end ]; do
  S=$(ak -sS "https://adkix.ai/api/v1/contents/$ID?waitSec=25")
  now=$(printf %s "$S" | python3 -c 'import json,sys; s=json.load(sys.stdin); print(" · ".join([s.get("step") or "", (s.get("busy") or {}).get("label","libre"), (s.get("error") or {}).get("message","")]))')
  [ "$now" != "$last" ] && echo "$now" && last="$now"
  printf %s "$S" | python3 -c 'import json,sys; s=json.load(sys.stdin); sys.exit(0 if (s.get("busy") is None or s.get("pendingQuote") or s.get("error") or s.get("video")) else 1)' && break
done
```

(`python3 scripts/adkix.py wait <id>` does the same.) In Claude Code, run it in the background
(`run_in_background`) and keep talking with the user; read its output when it ends. Say the delays
honestly: script ≈ 4 min, pictures ≈ 3–5 min, the shoot ≈ 10–15 min for 30 s. Never promise shorter.

### Showing a step

When the step waits for the user (`busy` null): say in 2–5 lines what adkix proposes, from `context`
(ideas, styles, narrations, cast, script, voices, music…). Look at the pictures yourself before
talking about them: download the `previews` (`ak -sS -o /tmp/adkix/<id>/style-2.jpg https://adkix.ai<url>`,
then Read the file) or call `adkix_view_preview`. Give the user the `shareUrl` of what they should
see or hear (they open it, you do not need to describe every pixel), and remind them of `webUrl`.
Propose `suggested` as your default (« je prendrais le style 2 ») and ask. Step by step details:
[reference/steps.md](reference/steps.md).

**The brand comes first.** At the `marque` step, summarise `context.brandDraft` (name, promise,
audience, colours, what is `missing`) and ask whether it is right. Fix what the user corrects with
`set_brand_field` (free), then `keep_brand`. Never keep a brand the user has not seen.

### Acting

One action per call:

```bash
ak() { [ -n "$ADKIX_API_KEY" ] || [ -s ~/.config/adkix/key ] || { echo "no-key"; return 1; }; printf 'header = "Authorization: Bearer %s"\n' "${ADKIX_API_KEY:-$(cat ~/.config/adkix/key)}" | curl -K - "$@"; }; ak -sS -X POST -H 'content-type: application/json' \
  https://adkix.ai/api/v1/contents/<id>/actions -d '{"action":"pick_angle","args":{"proposalId":"..."}}'
```

- Only names from `actions`, with the args of their `hint`. Text changes go through the args
  (`note`, `text`…), never through invented actions.
- Price `0`: it runs and answers `{ ok, note?, follow? }`. A `follow` is paid work it leads to:
  send it as the next action, you will get a quote for it.
- Anything paid (and big steps like the shoot): adkix answers
  `{ "quote": { proposalId, action, price, text, free, expiresInSec } }` and spends nothing.
  Ask the user, in their language: « <text> — <price> crédits (solde : <balance>) — je lance ? »
  Only after an explicit yes, send `{"action":"confirm","proposalId":"<proposalId>"}`
  (or `POST /api/v1/contents/<id>/confirm` with `{"proposalId":"…"}`, or `adkix_confirm_quote`).
  `free: true` means adkix pays (free video). To drop it: `{"action":"cancel","proposalId":"…"}`.
- Never send `confirm` without the user's explicit yes to that price in this conversation, even for
  2 credits, unless the user said in this session « ok pour les actions de moins de N crédits », and
  then only under N. Never invent, round or sum a price yourself: say `quote.price`.
- A confirm answered with a new `quote` (`requoted: true`, the price moved) needs a new yes.
  `409`: the state changed or the quote expired (10 min): read the state again, then ask again.

### When something goes wrong

- `402`: not enough credits; say the message as is (credits on https://adkix.ai/credits).
- `400` `not_in_api`: this action is done on the site; give `webUrl`.
- `429`: slow down, wait `Retry-After` seconds.
- `error` in the state: offer `relaunch` once (it answers a quote when the retry costs credits);
  if it fails again, send the user to `webUrl`.
- `notice` in the state (e.g. « Le site ne répond pas »): say it as is and ask what to do (another
  address, `manual_brand`, or the site via `webUrl`).
- `503`: adkix is busy or updating; try again in a minute.

### The end

When `video.ready` is true: give `video.shareUrl` (plays in the browser, 24 h) and, with a shell,
download it into the current folder:

```bash
ak() { [ -n "$ADKIX_API_KEY" ] || [ -s ~/.config/adkix/key ] || { echo "no-key"; return 1; }; printf 'header = "Authorization: Bearer %s"\n' "${ADKIX_API_KEY:-$(cat ~/.config/adkix/key)}" | curl -K - "$@"; }; ak -sS -o "adkix-<title>.mp4" "https://adkix.ai/api/v1/contents/<id>/video?download=1"
```

Other format: `video.aspects` (`?aspect=16:9`). Exports: `/api/v1/contents/<id>/export/srt|cover|audio|clean`.
Ask if they want a change (`redo_scene`, `edit_phrase`, `pick_music`, `set_caption_style`: see
steps.md) or a post text (`write_post`). `GET /api/v1/contents` lists the 50 latest contents, to
pick up a content started earlier.

## Rules

- Write in the user's language (French by default if they write in French). Use « tu » in French.
- Short messages. A story, not an ad: no « révolutionnez », « découvrez », « n'attendez plus ».
- You never spend on your own; the person decides every price. Turbo mode, the AI chat, scene edits
  with photos and uploads are not in the API: they are on the site (`webUrl`).
- Never paste raw JSON to the user; never show a URL that needs the key (use `shareUrl` / `webUrl`).
- The person also gets adkix's e-mails at each step; the same price cards appear in adkix's thread.

## Fallback without a key: brief + link

Interview as above, pick the creative direction yourself (style, narration, voice, tone, one-line
story idea, call to action), then output exactly:

```
BRIEF ADKIX
Site : <address or @account or "pas de site">
Vidéo : <15 s | 30 s | 1 min>, <9:16 | 16:9>, en <language>
Objectif : <goal>
Style : <style> · Narration : <narration> · Voix : <voice>
Ton : <tone>
Idée : <one-line story>
Fin : <call to action>
```

Styles: Réaliste, Motion design, Illustration plate, Dessin animé 2D,
Anime, 3D douce, 3D réaliste, Stop motion, Papier découpé, Pixel art, Collage, Tableau blanc,
Typographie cinétique, Aquarelle, Isométrique, Bande dessinée, Pâte à modeler, Rétro VHS.
Narrations: Voix off, Histoire racontée, Face caméra / UGC, Voix intérieure, La marque parle, Dialogue (2 voix), Interview (2 voix).

Then the link:
- with a site or @account: `https://adkix.ai/inscription?next=%2Fprojets%3Furl%3D<SITE>` where `<SITE>` is
  the address URL-encoded **twice** (`joespasta.fr` stays `joespasta.fr`; `https://a.com/b` becomes
  `https%253A%252F%252Fa.com%252Fb`);
- without a site: `https://adkix.ai/inscription`.

Close with: 1) open the link and sign in (Google or e-mail; 1 000 free credits once the e-mail is
confirmed), 2) paste the brief in adkix's chat,
3) say "ok" or what to change at each step.
