The Clickframe API
Everything the studio does, from your own code: thumbnail concepts, AI images in four formats, recreating a reference thumbnail's style, AI edits at a spot or inside a painted area, AI scores, titles and descriptions. It is the same API the app uses, with the same credits, limits and safety checks.
Base URL
https://clickframe-api.norvane-studio.com/v1
JSON over HTTPS. Authenticate with Authorization: Bearer cf_live_…. Create keys under Account → API keys (a confirmed email is needed; up to 5 keys).
Quick start
1. Create a project from a title or a YouTube link. It comes back with four concepts (free):
curl -s https://clickframe-api.norvane-studio.com/v1/projects \
-H "Authorization: Bearer $CLICKFRAME_KEY" -H "Content-Type: application/json" \
-d '{"title": "I took an ice bath every day for 30 days"}'
2. Render a concept (1 credit). Pass one of the project's concepts, or your own {"scene", "headline"}:
curl -s https://clickframe-api.norvane-studio.com/v1/generations \
-H "Authorization: Bearer $CLICKFRAME_KEY" -H "Content-Type: application/json" \
-d '{"projectId": "PROJECT_ID", "concept": {"scene": "a man in an ice bath in a snowy forest", "headline": "DAY 30"},
"aspect": "16:9", "textMode": "image"}'
3. Poll the image until status is succeeded (about 10 seconds) or failed (the credit is refunded):
curl -s https://clickframe-api.norvane-studio.com/v1/generations/GENERATION_ID -H "Authorization: Bearer $CLICKFRAME_KEY"
4. Get a download link (valid for 15 minutes):
curl -s https://clickframe-api.norvane-studio.com/v1/generations/GENERATION_ID/download -H "Authorization: Bearer $CLICKFRAME_KEY"
Images are 1376×768 for 16:9. With "textMode": "image" the model paints the headline and Clickframe reads it back: textOk says whether the spelling is right. With "layer" (the default) the picture has no text and room for it, for the editor at https://clickframe.norvane-studio.com/app#/e/GENERATION_ID.
Endpoints
| Method and path | What it does | Cost |
|---|---|---|
POST /projects | A project with 4 concepts: {title | youtubeUrl, description, niche, style, script, layout, faceless, personaId} | Free |
POST /projects/{id}/concepts | 4 more concepts, different from the ones it has | Free |
GET /projects, GET /projects/{id} | Your projects; one project with its images and designs | Free |
DELETE /projects/{id} | Deletes a project, its images and designs | Free |
POST /generations | Renders a concept: {projectId, concept, aspect, style, textMode, textStyle, layout, noPerson, personaId, extra}. Paid plans can add count (2–4 takes) or styles (one image per style) | 1 credit per image |
POST /recreate | A new thumbnail in the style of a reference: {projectId, reference: {key} | {youtubeUrl}, match: "layout" | "style", subject, headline, textMode, aspect, personaId, noPerson} | 1 credit |
POST /generations/{id}/edit | A new version of an image. One of: {instruction}, {instruction, point: {x, y}}, {instruction, mask}, {expression}, {text: {words, style}}, {removeText: true}, {fixes: [...]} | 1 credit |
GET /generations/{id}, /versions, /download | Status and details; every version of an image; a download link | Free |
GET /generations?projectId= | Your latest images | Free |
POST /score | AI critique: {generationId}, {key} (an upload) or {youtubeUrl}, with an optional title | Free |
POST /titles | 8 title ideas: {topic, description, projectId} | Free |
POST /description | A description, hashtags and tags: {title, about, keywords, links, chapters, projectId} | Free |
POST /youtube/lookup | A public video's title, channel and detected niche: {url} | Free |
GET /personas, GET /faces, POST /personas/{id}/faces | Your personas (your own photos) and reaction faces; make faces {expressions: [...]} | Faces: 1 credit each |
GET /designs, GET /designs/{id} | Designs saved in the editor, with an export link | Free |
POST /files/upload-url, /files/confirm, /files/download-url | Upload an image (a reference, or a thumbnail to score) straight to storage | Free |
GET /me | Your credits, plan and whether your email is confirmed | Free |
The options and their allowed values (styles, layouts, text styles, expressions, formats) are listed by GET https://clickframe-api.norvane-studio.com/public/catalog, which needs no key.
Edits at a spot or inside an area
A point is where the change goes, as fractions of the image ({"x": 0.7, "y": 0.4}). A mask is an area painted with brush strokes; only that area changes and the rest of the picture comes back exactly as it was:
{"instruction": "replace the mug with a glass of orange juice",
"mask": {"strokes": [{"r": 0.05, "points": [[0.62, 0.55], [0.68, 0.57], [0.71, 0.62]]},
{"r": 0.02, "erase": true, "points": [[0.66, 0.5]]}]}}
Points are fractions of the image's width and height; r is the brush radius as a fraction of the width (0.002 to 0.3). Up to 300 strokes and 6,000 points.
Recreate from a reference
Give a public YouTube link, or upload an image first and pass its key. match: "layout" follows its composition, colours and lighting; "style" only its colours, lighting and finish. The new image never copies the reference's people, logos, brand names or words. Only use references you have the right to use.
{"projectId": "PROJECT_ID", "reference": {"youtubeUrl": "https://www.youtube.com/watch?v=VIDEO_ID"},
"match": "layout", "headline": "DAY 30", "textMode": "image"}
Uploading an image
POST /files/upload-urlwith{"filename": "ref.jpg", "contentType": "image/jpeg", "sizeBytes": 123456}(JPG, PNG or WebP, up to 10 MB).PUTthe bytes to the returneduploadUrlwith the sameContent-Type. The size is signed into the link.POST /files/confirmwith{"key": "…"}, then use the key.
Errors and limits
Errors are JSON: {"error": "no_credits", "message": "You're out of credits."} with an HTTP status. The common ones:
| Status | error | Meaning |
|---|---|---|
| 401 | invalid_api_key | The key is wrong or was revoked |
| 402 | no_credits | Not enough credits for the request |
| 403 | verify_email | The account's email isn't confirmed yet |
| 403 | plan_required | Several images per request need a paid plan |
| 403 | not_available_with_api_key | Account, billing and key management are only in the app |
| 422 | content_refused | The request goes against the content rules |
| 429 | rate_limited | Too many requests: wait a minute (see Retry-After) |
| 503 | capacity, ai_busy | Try again later |
Limits per account: 30 images per 10 minutes, 40 concept or text requests and 40 scores per hour; per key, 1,200 requests per hour, polling included. Identical image requests within 2 minutes return the same image without charging again.
Keys and safety
- A key acts as your account and spends your credits. Keep it on a server, never in a web page or an app you ship. Revoke a key under Account and it stops working at once.
- We store only a hash of each key, and show it once, when you create it.
- Keys can't change your account, billing, connected apps or keys.
- The content rules and the terms apply to everything made through the API.
FAQ
Does the API cost extra?
No. Images use your normal credits (1 per image or AI edit); concepts, scores, titles and descriptions are free.
Is there an MCP server for AI assistants?
Yes: use Clickframe in Claude, ChatGPT and other AI apps. It signs in with OAuth instead of a key.
Can I get webhooks when an image is ready?
Not yet. Poll GET /generations/{id} every two or three seconds; most images are ready in about 10 seconds.