Developers

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 pathWhat it doesCost
POST /projectsA project with 4 concepts: {title | youtubeUrl, description, niche, style, script, layout, faceless, personaId}Free
POST /projects/{id}/concepts4 more concepts, different from the ones it hasFree
GET /projects, GET /projects/{id}Your projects; one project with its images and designsFree
DELETE /projects/{id}Deletes a project, its images and designsFree
POST /generationsRenders 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 /recreateA 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}/editA 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, /downloadStatus and details; every version of an image; a download linkFree
GET /generations?projectId=Your latest imagesFree
POST /scoreAI critique: {generationId}, {key} (an upload) or {youtubeUrl}, with an optional titleFree
POST /titles8 title ideas: {topic, description, projectId}Free
POST /descriptionA description, hashtags and tags: {title, about, keywords, links, chapters, projectId}Free
POST /youtube/lookupA public video's title, channel and detected niche: {url}Free
GET /personas, GET /faces, POST /personas/{id}/facesYour 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 linkFree
POST /files/upload-url, /files/confirm, /files/download-urlUpload an image (a reference, or a thumbnail to score) straight to storageFree
GET /meYour credits, plan and whether your email is confirmedFree

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

  1. POST /files/upload-url with {"filename": "ref.jpg", "contentType": "image/jpeg", "sizeBytes": 123456} (JPG, PNG or WebP, up to 10 MB).
  2. PUT the bytes to the returned uploadUrl with the same Content-Type. The size is signed into the link.
  3. POST /files/confirm with {"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:

StatuserrorMeaning
401invalid_api_keyThe key is wrong or was revoked
402no_creditsNot enough credits for the request
403verify_emailThe account's email isn't confirmed yet
403plan_requiredSeveral images per request need a paid plan
403not_available_with_api_keyAccount, billing and key management are only in the app
422content_refusedThe request goes against the content rules
429rate_limitedToo many requests: wait a minute (see Retry-After)
503capacity, ai_busyTry 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

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.

Get a key

Create a free account, confirm your email, and add a key under Account.

Open your account