# 10xvid documentation > 10xvid makes video ads for apps and websites from a link: it reads the site, writes a Format DNA (the plan of the ad), and its engine, Motion V1, draws every frame and checks the film before delivery. The same work is open through the 10xvid API at https://10xvid.com/api/v1, paid from a plan's credits first and a top up balance after them. --- Source: https://10xvid.com/docs # 10xvid documentation How 10xvid turns a link into video ads, the models behind it, and how to make the same videos from your own code with the API. ## How 10xvid works You give 10xvid a link to a website or an App Store page. It reads it, plans the ad, and its engine, Motion V1, draws every frame and checks the film before you see it. The same work runs in the app, where you press a button, and through the API, where your own software asks for it. 1. **Read.** 10xvid opens the link and takes in the words, the pictures, the logo, the colours and the type. 2. **Plan.** It writes a Format DNA: who the ad is for, the story in order, why they act and how it looks, all on one map you can change. 3. **Make.** Motion V1 draws the video from that plan, in each shape you ask for and in the style you choose. 4. **Check.** Every film is measured before delivery. One with a visible fault is made again from what failed. ### Concepts - **Format.** One campaign: a site read, its Format DNA, and the videos made from it. [Formats and Format DNA](/docs/concepts/formats) - **Style.** The look a video is drawn in: one of a hundred, or Pure, your site's own. [Styles](/docs/styles) - **Video.** One ad, in one or more shapes, each a finished MP4. [Videos and quality](/docs/concepts/videos) - **Credits.** What everything costs, in the app and through the API. [Credits and billing](/docs/concepts/credits) ## Choose your path - [The app](/app/) Paste a link, answer a few questions, pick styles and press Produce. No code. - [The API](/docs/api) Make the same videos from your own software, one request at a time. ## Meet the models ### Motion V1 Our first video engine, built for one job: ads for your app. - Draws every frame from your site: your words, pictures, colours and type - Vertical 9:16, square 1:1 and landscape 16:9 from one plan - 5 to 30 seconds, as a 1080p MP4 at 30 frames a second - A hundred styles, or your site's own look - Checked before delivery, and made again when it misses ### Motion V1 Flash A quicker video engine: one pass makes each video, in about five minutes once its turn comes, at its own price. - Words from your site, a voice it picks and music made for the ad - Vertical 9:16, square 1:1 and landscape 16:9 - 5 to 30 seconds [All models](/docs/models) ## Browse by capability - [Video ads](/docs/concepts/videos) Finished videos in three shapes, checked before you get them. - [Image ads](/docs/api/reference/images) Still ads from the same plan, in the same shapes. - [Styles](/docs/styles) A hundred looks to draw a video in, each with its picture. - [Format DNA](/docs/concepts/formats) The plan of an ad, part by part, kept as versions. - [Webhooks](/docs/api/webhooks) A message to your server when a video is ready. - [Credits and billing](/docs/concepts/credits) What things cost and what pays for them. ## For AI tools Every page here has a Markdown copy: add `.md` to its address, or press **Copy page** at the top. All the pages are listed in [llms.txt](/llms.txt), and all of them in one file in [llms-full.txt](/llms-full.txt), ready to hand to an assistant. --- Source: https://10xvid.com/docs/models # Models The engines that make 10xvid's videos and images: what each makes, in which shapes and lengths, and how it checks its own work. ## Flagship model ### Motion V1 A video engine built for one job: ads for your app. It reads your site, follows the Format DNA and draws every frame, then checks the film before you see it. - Draws from your real pictures, colours and type. It does not generate pixels from a prompt, so text stays sharp and your product looks like itself. - Makes vertical 9:16, square 1:1 and landscape 16:9 from one Format DNA, each laid out for its frame, not cropped - 5 to 30 seconds, as a 1080p MP4 at 30 frames a second, mixed to the loudness feeds expect - A hundred styles, or Pure, your site's own design language - A voiceover, or none ## Models overview | Model | Makes | Shapes | Length | |---|---|---|---| | Motion V1 | Video ads | 9:16, 1:1, 16:9 | 5 to 30 seconds | | Motion V1 Flash | Video ads | 9:16, 1:1, 16:9 | 5 to 30 seconds | | Image V1 | Image ads | 9:16, 1:1, 16:9 | A still PNG | You choose the engine each time you make something: in the chat or on the blueprint, through the API with `engine`. Images are made by Image V1. ## Motion V1 Motion V1 is 10xvid's flagship engine. A team of steps works on each film: a reader takes in your site, a strategist finds who the ad is for and the one idea that sells it, a director casts every shot from more than 40 designs while a critic argues back, a designer lays each shot out for every shape, an animator moves it by measure, a composer scores it, and a judge watches every frame before you do. ### What it is good for - Ads to get your app installed, from your own screens - A new feature or offer, shown in a few seconds - Testing many angles and styles at once, without filming anything ### Key features - **One link in.** Every film starts from a site it has read, never from a blank prompt. - **A plan you can change.** The Format DNA holds the hook, the story, the pace, the camera and the look. Change a part and the film follows. - **Three shapes in one run.** Each shape is composed for its frame. - **Two sites never get the same film.** A film shares at most half of its designs with another site's. ### Languages It writes in the language of your site. English is where it is tested most. ### Considerations - It uses the pictures and screens your site already shows. A physical product needs its own photos there. - There are no presenters, no avatars and no stock clips. - A video takes a while to make. Through the API, ask for it again or let a [webhook](/docs/api/webhooks) tell you when it is done. ## Motion V1 Flash A quicker video engine. One pass makes each video: it reads your site, writes the words from what your site says, picks a voice and makes music for the ad, builds the film from your screens, colours and type, looks at its frames and fixes what is broken, then renders it. ### What it is good for - Many quick versions of an ad to test - A first ad for a new app ### Key features - **About five minutes a video**, once its turn comes. Videos are made one after another. - **Your site's own words.** Nothing is invented: no reviews, ratings or results your site does not show. - **Every shape.** Vertical 9:16, square 1:1 and landscape 16:9, each made for its frame. - **A voiceover, or none.** With none, the words are on screen over music made for the ad. - **A site is read once.** Every later video of the same site starts from that reading. ### Considerations - It follows your site and your notes on the format, not the Format DNA, the hundred styles or the look setting. - It has no quality gate. It checks its own frames before it renders, and every video it makes is delivered. - It makes videos only. Images are made by Image V1. ## Image V1 The image engine. One session reads your site, sketches three ways in, chooses a kind of ad and a way of drawing it, lays the poster out as a page from your own pictures, colours and type, and checks every word on it before it is drawn. ### What it is good for - Feed and story image ads to run beside your videos - Many different static ideas to test at once ### Key features - **Judged before you see it.** A judge reads each image at 8 of 10. One under the bar is made again from what the judge said, and the better of the two is yours. - **Text that stays sharp.** Nothing is cut, covered, too small or too pale: each word is checked on the drawn picture. - **Every shape.** Vertical 9:16, square 1:1 and landscape 16:9, each laid out for its frame. - **Your blueprint when there is one.** With a blueprint, the image follows its plan. Without one, it reads your site. ### Considerations - It uses the pictures your site already shows, and the ones you add. It does not generate photos. - An image takes about eight minutes, its second pass included. ## The quality gate Every Motion V1 film is measured before delivery, then judged by a judge that does not know which film is ours. | What is checked | What it means | |---|---| | Text | Readable in the first second. Nothing clipped, overlapping or too small. | | Layout | No panel cut by the frame. Safe margins kept. | | Motion | No snaps, no jitter, nothing that lands twice. | | Sound | There, and never busier than the picture. | | Brand | Your logo where it belongs, and a clear call to action. | | Craft | Judged blind, beside films we rejected and films we admire. | A film that misses is made again from what failed, on the shot and at the second it failed. The best version is the one you get. More in [Videos and quality](/docs/concepts/videos). ## Limits | | Motion V1 | Motion V1 Flash | Image V1 | |---|---|---|---| | Made at once, for an account | 10 | 10 asked for at once, made one after another | 10 | | Styles asked for in one format | 10 | Not used | Not used | | Length | 5 to 30 seconds | 5 to 30 seconds | A still | | Shapes | 9:16, 1:1, 16:9 | 9:16, 1:1, 16:9 | 9:16, 1:1, 16:9 | --- Source: https://10xvid.com/docs/styles # Styles The hundred styles Motion V1 can draw a video in, and Pure, your site's own look, each with its picture and the id the API takes. A style is the look a video is drawn in: its lines, its colours, its type and how it moves. When you ask for a style, the whole Format DNA is written again in it, and a video is made in that style. Ask for several and you get one video in each. - **In the app**, the styles are the last step of setting a campaign up: tick the ones you want. - **Through the API**, send their ids in `styles` when you [create a format](/docs/api/reference/formats), at most 10 at a time. **Pure** is your site's own design language, as it is. Ask for no style at all and the video is made in the site's own look too. > The pictures below are small drawings of each style, for choosing. A finished video is drawn in your own colours, words and pictures. ## The styles ### Your site | Style | id | What it looks like | |---|---|---| | Pure | `pure` | Your site's own design language, as it is. | ### Hand drawn | Style | id | What it looks like | |---|---|---| | Whiteboard | `whiteboard` | Black marker drawn by hand on white. | | Chalkboard | `chalkboard` | Chalk lines on a dark board. | | Pencil sketch | `pencil-sketch` | Grey pencil lines and shading on paper. | | Ink and brush | `ink-brush` | A few black brush strokes, lots of space. | | Watercolour | `watercolour` | Soft washes of colour that bleed. | | Crayon | `crayon` | Waxy scribbles, like a child's drawing. | | Marker doodles | `marker-doodle` | Thick felt tip doodles in bright colours. | | One line | `one-line` | A single unbroken line draws everything. | | Charcoal | `charcoal` | Rough, smudged black on textured paper. | | Blueprint | `blueprint` | White technical lines on blue paper. | ### Flat | Style | id | What it looks like | |---|---|---| | Motion graphics | `flat-motion` | Clean flat shapes moving smoothly. | | Infographic | `infographic` | Charts, icons and numbers that build. | | Line icons | `outline-icons` | Thin outline icons with one highlight colour. | | Geometric | `geometric` | Circles, squares and triangles only. | | Gradients | `gradient` | Soft blurred colour fields. | | Duotone | `duotone` | Two colours and nothing else. | | Black and white | `monochrome` | Pure black and white, high contrast. | | Flat characters | `flat-characters` | Simple faceless people in flat colour. | | Layered cards | `layered` | Flat shapes stacked with soft shadows. | | Frosted glass | `glass` | Translucent panels over soft colour. | ### Type | Style | id | What it looks like | |---|---|---| | Kinetic typography | `kinetic-type` | Words that move, grow and collide. | | Typewriter | `typewriter` | Words typed live behind a blinking cursor. | | Hand lettering | `hand-lettering` | Brush script written stroke by stroke. | | Brutalist | `brutalist` | Huge raw type, hard edges, no decoration. | | Swiss grid | `swiss-grid` | A strict grid, small type, red and black. | | Letterpress | `letterpress` | Old wood type with worn ink. | | 3D letters | `block-letters` | Thick letters with depth and shadow. | | Cut out letters | `cut-letters` | Every letter cut from a different page. | | Stencil spray | `stencil` | Sprayed stencil letters on a wall. | | Word pictures | `word-pictures` | Words arranged into the shape of the thing. | ### Cartoon | Style | id | What it looks like | |---|---|---| | Cartoon | `cartoon` | Bold outlines, bright colour, big faces. | | Old cartoon | `rubber-hose` | 1930s style, noodle limbs, black and white. | | Anime | `anime` | Sharp lines, big eyes, dramatic light. | | Cute and round | `cute` | Tiny faces, blush and pastel colours. | | Comic book | `comic-book` | Panels, printed dots and speech bubbles. | | Manga | `manga` | Black ink, grey tone and speed lines. | | Stick figures | `stick-figures` | Simple line people on plain paper. | | Storybook | `storybook` | Soft painted pictures, like a children's book. | | Fifties cartoon | `mid-century` | Stylised shapes, off register colour. | | Caricature | `caricature` | Big heads and exaggerated features. | ### Craft | Style | id | What it looks like | |---|---|---| | Paper cut outs | `paper-cut` | Flat paper pieces, moved at their joints. | | Collage | `collage` | Torn paper, photos and tape, layered. | | Stop motion | `stop-motion` | Real objects moved a frame at a time. | | Clay | `clay` | Soft clay figures, fingerprints and all. | | Felt | `felt` | Stitched felt shapes. | | Origami | `origami` | Folded paper with sharp creases. | | Cardboard | `cardboard` | Corrugated card, tape and marker. | | Embroidery | `embroidery` | Thread stitched on cloth. | | Pop up book | `book-scenes` | Pages open and the scene stands up. | | Flipbook | `flipbook` | Pencil pages flicked by a thumb. | ### 3D | Style | id | What it looks like | |---|---|---| | 3D animation | `cgi` | Full 3D scenes with light and shadow. | | 3D product | `product-spin` | Your product as a turning 3D model. | | Low poly | `low-poly` | Faceted shapes built from triangles. | | Isometric | `isometric` | A small world seen from above at an angle. | | Soft 3D | `soft-shapes` | Rounded, matte shapes like toys. | | Voxel | `voxel` | Everything built from small cubes. | | Wireframe | `wireframe` | Line meshes with no surfaces. | | Liquid chrome | `chrome` | Mirror metal that flows. | | Inflatable | `inflatable` | Puffy balloon shapes. | | Miniature | `miniature` | A tiny model world, softly out of focus. | ### Screen | Style | id | What it looks like | |---|---|---| | Screen recording | `screencast` | Your real screens with a moving cursor. | | Device mockups | `device-mockups` | Your screens inside phones and laptops. | | Terminal | `terminal` | Green text on a black command line. | | Pixel art | `pixel-art` | Chunky 8 bit pixels. | | Glitch | `glitch` | A broken signal, split colours and jumps. | | Video tape | `vhs` | Scan lines, noise and a date stamp. | | Sci fi interface | `hud` | Thin lines, dials and readouts. | | ASCII | `ascii` | Pictures made of typed characters. | | Early web | `early-web` | Grey windows, bevelled buttons, pixel fonts. | | LED board | `led-board` | Dots of light on a dark board. | ### Photo | Style | id | What it looks like | |---|---|---| | Drawn over video | `footage-doodles` | Your video with animation drawn over it. | | Rotoscope | `rotoscope` | Footage traced into moving drawings. | | Moving photos | `moving-photos` | Still photos given depth and a slow camera. | | Photo cut outs | `photo-cutouts` | Photos cut out and set on flat colour. | | Halftone | `halftone` | Photos turned into printed dots. | | Double exposure | `double-exposure` | Two images blended into one. | | Film noir | `film-noir` | Black and white with hard shadows. | | Instant photos | `instant-photos` | Snapshots dropped on a table. | | Documentary | `documentary` | Slow moves over old photos and papers. | | Home movie | `home-movie` | Grainy film, light leaks and warm colour. | ### Art | Style | id | What it looks like | |---|---|---| | Art deco | `art-deco` | Gold lines, fans and symmetry. | | Bauhaus | `bauhaus` | Primary colours and simple geometry. | | Pop art | `pop-art` | Loud colour, thick outlines and dots. | | Psychedelic | `psychedelic` | Melting 1960s shapes in wild colour. | | Seventies | `seventies` | Warm stripes, sunbursts and round type. | | Eighties | `eighties` | Sunset grids and chrome type. | | Nineties | `nineties` | Squiggles, confetti shapes, clashing colour. | | Bold poster | `bold-poster` | Red and black, diagonals and shouting type. | | Woodblock print | `woodblock` | Flat colour and fine lines, like old prints. | | Art nouveau | `art-nouveau` | Flowing lines, flowers and ornate frames. | ### Abstract | Style | id | What it looks like | |---|---|---| | Liquid | `liquid` | Shapes that flow and merge. | | Particles | `particles` | Thousands of dots forming shapes. | | Ink in water | `ink-in-water` | Clouds of ink spreading. | | Paint strokes | `paint-strokes` | Thick brush marks that reveal the scene. | | Light and shadow | `light-shadow` | Window light moving across a wall. | | Morphing | `morphing` | One shape melts into the next. | | Line trails | `line-trails` | Thin lines that flow in loops. | | Kaleidoscope | `kaleidoscope` | Mirrored patterns that turn. | | Mosaic | `mosaic` | Pictures built from small tiles. | | Silhouettes | `silhouette` | Black shapes against a bright sky. | --- Source: https://10xvid.com/docs/concepts/formats # Formats and Format DNA What a format is, what its Format DNA holds, how each style becomes a variant of it, and how changes and versions work. ## A format A format is one campaign. It starts from one link and holds everything made from it: what was read from the site, the Format DNA, the styles asked for, and every video and image. In the app each format is a tile on the home screen. Through the API it is the object `format`, with an `id` you use for everything after. ## The Format DNA The Format DNA is the plan of the ad, on one map: - **Who it is for**, and the one idea that sells to them - **The story in order:** the hook, the problem, the turn, the product doing its work, and the call to action - **Why they act:** the argument and why now - **How it looks:** the camera, the pace, the colours, the type and the music It is written once the site has been read. In the app you can change any part of it before you make videos. Each update is kept as a version, so you can go back to an earlier one. Videos are always made from the version in force when they start. ## Styles and variants Each style you ask for becomes a variant of the format: a copy of its Format DNA written again, whole, in that style. A variant makes its videos in its style; the format itself makes them in the site's own look. In the app the variants are listed beside the map. Through the API each video says which `style` it was made in. ## Setting a campaign up In the app, a few questions come while the site is being read: the goal, who it is for, the one angle, references you like, and then the styles. When you press Continue on the last step, the Format DNA is written, and the videos start by themselves: one in each style you picked, or one in the site's own look when you picked none. Through the API, one request does the same: [create a format](/docs/api/reference/formats) with a link, and the reading, the Format DNA and the videos follow by themselves. ## What it costs Reading a site, building a Format DNA and each update have their own price in credits. A site you have read before is not read again, and not paid for again. See [Credits and billing](/docs/concepts/credits). --- Source: https://10xvid.com/docs/concepts/videos # Videos and quality How a video is made from a Format DNA: its shapes, its length, a voice or none, the quality gate, and what happens when one fails. ## Making a video A video is made from a format's Format DNA. In the app you press **Produce** and set: - **Length:** from 5 to 30 seconds - **Shapes:** vertical 9:16, square 1:1 or landscape 16:9, one or more - **A voice or none:** a narrated video, or one carried by type and music - **Engine:** Motion V1, or [Motion V1 Flash](/docs/models), quicker and priced on its own - **Videos or images:** films, or still image ads from the same plan Each video is its own: its own progress, its own result, and it can be stopped on its own. Through the API, [make videos](/docs/api/reference/videos) from a format that is ready. ## Shapes and files A video asked for in two shapes is made once in each, from the same plan, and each shape is composed for its frame rather than cropped. Every file is a 1080p MP4 at 30 frames a second, ready to post. Each file has its own video ID, such as `MV40XXRN514AA9-V1`. ## The quality gate Every film is measured before delivery: its text, layout, motion, sound, brand and craft. A film with a visible fault is cast again from what failed, on the shot and at the second it failed, so the best version is the one you get. The checks are listed on the [Models](/docs/models) page. ## When a video cannot be finished What it cost comes back by itself: in the app to your credits, through the API to the credits or the top up balance it came from. Its status is `failed`, and a [webhook](/docs/api/webhooks) is told with `video.failed`. ## Ratings and new versions In the app you can rate each video from one to five stars and write what should be better. **Make a new version** takes what you wrote into the Format DNA as an update and makes one new video from it. --- Source: https://10xvid.com/docs/concepts/credits # Credits and billing How credits work in the app and through the API: what uses them, how a video and its voiceover are priced, what plans include, adding credits, and what comes back. ## Credits Everything 10xvid makes uses credits: reading a site, building a Format DNA, updating it, studying a reference video, and each video and image in each shape. Styles filmed by video models, and skills such as Anime, also use credits for the models that draw, film and score them, by what those models really take. Settings in the app shows what is left and what your credits went on. A video is priced by the second, in each shape, at its engine's price: a 30 second video costs six times a 5 second one. Its voiceover is priced on its own, by the characters it speaks, and its music by its seconds, each once for the video in all its shapes. A Motion V1 Flash video can be made with no music, and then its music is not charged. Everything else is charged what it really used: a long site takes more work than a short one, so it uses more credits. When something starts, its price is set aside; when it is done, what was not used comes back, or the difference is taken, never more than you have left. [API pricing](/docs/api/pricing) has the details. A plan gives credits every month. The free first ad gives its credits once. Unused plan credits do not roll over to the next month. ## Plans Each plan includes a number of credits a month. The [pricing page](/pricing) shows the plans and what they include, and the API side of Subscription shows what each plan's credits make through the API. ## Adding credits - **Add credits** on the API side of Subscription, at $1 for 1,000. Once your plan's credits run out, they pay for what you make in the app and through the API alike, and they stay until you use them. - **Auto Top Up** adds credits from your saved card when they drop below an amount you choose, up to a monthly cap you set. ## Through the API An API call is paid from your plan's credits first, the same credits the app spends, then from the credits you added. See [API pricing](/docs/api/pricing). ## What comes back You pay only for what is delivered. Credits for anything that is not delivered come back by themselves, to where they came from. --- Source: https://10xvid.com/docs/api # The 10xvid API Make video ads from your own code: what the API does, its base address, how to authenticate, and the resources you can use. ## What it does The API makes the same videos as the app. One request with a link reads the site, writes the Format DNA and makes a video in each style you ask for. You can make more videos from a format later, make image ads, list the styles, and read your balance. Finished files come back as links you can pass straight to an ad account. ## Base address ```http https://10xvid.com/api/v1 ``` Every request and answer is JSON. Send `Content-Type: application/json` with a body. ## Authentication Send your API key with every request, as `Authorization: Bearer tenx_...`. Make keys on the [API keys](/app/api-keys) page of the app. See [Authentication and keys](/docs/api/authentication). ## Resources | Resource | What you do with it | Reference | |---|---|---| | Formats | Make one from a link, read it, list them, delete one | [Formats API](/docs/api/reference/formats) | | Videos | Make more videos from a format, read one, list them | [Videos API](/docs/api/reference/videos) | | Image ads | Make image ads from a format, read them | [Image ads API](/docs/api/reference/images) | | Styles | List the hundred styles and Pure | [Styles API](/docs/api/reference/styles) | | Account | Read your credits, balance, prices and limits | [Account API](/docs/api/reference/account) | ## How a request goes 1. `POST /formats` with a link answers at once with the format, `"status": "reading"`. 2. The site is read, then the Format DNA is written: `"status": "writing"`, then `"ready"`. 3. The videos start by themselves, each `"status": "making"`, then `"done"` with its files, or `"failed"` with what it cost given back. 4. Ask for the format again with `GET /formats/{id}`, or let a [webhook](/docs/api/webhooks) tell your server as each step ends. ## Next steps - [Quickstart](/docs/api/quickstart) Your first video through the API, from the key to the finished file. - [Authentication and keys](/docs/api/authentication) Send your key, and limit what a key may do. - [Webhooks](/docs/api/webhooks) Be told when a format or video is ready. - [API pricing](/docs/api/pricing) What calls cost, and what pays for them. --- Source: https://10xvid.com/docs/api/quickstart # Quickstart Make your first video through the API: create a key, check what pays for it, send a link, and get back the finished video with its files. This guide takes you from no key to a finished video. You need a 10xvid account. ## 1. Create an API key Open the [API keys](/app/api-keys) page in the app and press **Create key**. Give it a name, and leave it unrestricted for now. The key is shown once: copy it and keep it on your server, for example in a `.env` file. ```bash TENX_API_KEY=tenx_your_key_here ``` ## 2. Make sure something pays for it An API call is paid from your plan's credits first. With no plan, or with its credits spent, it is paid from the top up balance: open the API side of Subscription and press **Add funds**. See [API pricing](/docs/api/pricing). ## 3. Send a link Make a format from a website or an App Store page. Ask for styles by their ids from [the styles](/docs/styles), or for none to get the site's own look. cURL: ```bash curl https://10xvid.com/api/v1/formats \ -H "Authorization: Bearer $TENX_API_KEY" \ -H "Content-Type: application/json" \ -d '{"link": "https://apps.apple.com/app/id1234567890", "styles": ["whiteboard"]}' ``` JavaScript: ```js const res = await fetch('https://10xvid.com/api/v1/formats', { method: 'POST', headers: { Authorization: `Bearer ${process.env.TENX_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ link: 'https://apps.apple.com/app/id1234567890', styles: ['whiteboard'] }), }); const format = await res.json(); console.log(format.id, format.status); ``` Python: ```python import os import requests res = requests.post( "https://10xvid.com/api/v1/formats", headers={"Authorization": f"Bearer {os.environ['TENX_API_KEY']}"}, json={"link": "https://apps.apple.com/app/id1234567890", "styles": ["whiteboard"]}, ) format = res.json() print(format["id"], format["status"]) ``` The answer comes at once, with the format's `id` and `"status": "reading"`. ## 4. Get the video The site is read, the Format DNA is written and the video is made by itself. That takes a while. Ask for the format now and then until its videos are done, or add a [webhook](/docs/api/webhooks) so your server is told. cURL: ```bash curl https://10xvid.com/api/v1/formats/FORMAT_ID \ -H "Authorization: Bearer $TENX_API_KEY" ``` JavaScript: ```js async function videosOf(id) { for (;;) { const res = await fetch(`https://10xvid.com/api/v1/formats/${id}`, { headers: { Authorization: `Bearer ${process.env.TENX_API_KEY}` }, }); const format = await res.json(); if (format.status === 'failed') throw new Error(format.error); const videos = format.videos ?? []; if (videos.length >= format.videos_expected && videos.every((v) => v.status !== 'making')) return videos; await new Promise((r) => setTimeout(r, 60_000)); } } ``` Python: ```python import time def videos_of(id): while True: res = requests.get( f"https://10xvid.com/api/v1/formats/{id}", headers={"Authorization": f"Bearer {os.environ['TENX_API_KEY']}"}, ) format = res.json() if format["status"] == "failed": raise RuntimeError(format["error"]) videos = format.get("videos", []) if len(videos) >= format["videos_expected"] and all(v["status"] != "making" for v in videos): return videos time.sleep(60) ``` Each finished video has its `files`, one for each shape, with a `url` that works on its own for seven days. ```json { "id": "MV40XXRN514AA9", "object": "video", "style": "whiteboard", "status": "done", "files": [ { "video_id": "MV40XXRN514AA9-V1", "aspect": "9:16", "url": "https://10xvid.com/files/brands/.../final.mp4?dl=...", "duration": 15.04 } ] } ``` ## Next steps - [Webhooks](/docs/api/webhooks) Be told when each video is done, instead of asking. - [Make more videos](/docs/api/reference/videos) More from the same format, in more shapes. - [Restrict a key](/docs/api/authentication) Limit what a key may reach and spend. - [Errors and limits](/docs/api/errors) What each refusal means and what to do. --- Source: https://10xvid.com/docs/api/mcp # MCP: make ads from Claude Code Add 10xvid to Claude Code, or to any agent that speaks MCP, with one line, then ask for ads in plain words. ## Add it to Claude Code One line, with your own key in place of `YOUR_API_KEY`: ```bash claude mcp add --transport http 10xvid https://10xvid.com/mcp --header "Authorization: Bearer YOUR_API_KEY" ``` The key comes from the [API keys](/app/api-keys) page of the app: press **Create key** and copy it. It is shown once, and your email address must be confirmed first. Then, in Claude Code, say what you want: > make 3 vertical ads for `https://your-app.com` Claude reads your site through 10xvid, makes the videos and gives you their links when they are done. The site is read in a few minutes; each video takes about 5 to 8 minutes once its turn comes. You can say more: the shapes (vertical, square, landscape), the engine (Motion V1 Flash, the default, or Motion V1), the angle, and what the ads must say or avoid. Claude passes it on. ## Other agents Any client that speaks MCP over Streamable HTTP connects the same way: the address is `https://10xvid.com/mcp`, and the key goes in the `Authorization` header as `Bearer tenx_...`. A client that cannot set headers may put the key on the address instead, as `https://10xvid.com/mcp?key=tenx_...`; keep that address as private as the key. The server is stateless: each call is one JSON-RPC message over POST, answered at once. Nothing is streamed. ## The tools | Tool | What it does | Inputs | |---|---|---| | `make_videos` | With a link: reads the site, writes the plan of the ad and makes the videos by itself. With a format id: makes more videos from it now. | `link` or `format`; `count` (1 to 6, default 1); `aspects` (any of `9:16`, `1:1`, `16:9`, default `["9:16"]`); `engine` (`motion-v1-flash`, the default, or `motion-v1`); `voiceover`; `music` (`false` for none, with `motion-v1-flash`); `angle`; `notes` | | `read_link` | Reads a site into a format without making a video. | `link`; `angle`; `notes` | | `get_video` | One video: its status and, when it is done, its files with links that work for seven days. | `id` | | `list_videos` | The videos, newest first, of one format (with where the format stands) or of the whole account. | `format`; `limit` | | `account` | The credits left, the top up balance, what was spent this month and today's prices. | none | Each tool is a route of the [API](/docs/api): `make_videos` with a link is `POST /formats`, with a format it is `POST /formats/{id}/videos`; `read_link` is `POST /formats` with `videos: false`; `get_video` and `list_videos` are `GET /videos`; `account` is `GET /account`. What a key may reach applies the same way: a key restricted to reading cannot make videos. See [Authentication and keys](/docs/api/authentication). ## What it costs The same as the API, charged the same way: the reading of a site, the plan, and each video by the second in each shape, at the engine's own price, with its voiceover by the characters it speaks and its music by its seconds. Your plan's credits pay first, then the top up balance. Nothing is charged for a video that could not be finished. See [API pricing](/docs/api/pricing); `account` tells what is left. ## Keep the key safe The line above stores the key in Claude Code's settings on your computer. Make a key of its own for it, so you can delete it without stopping anything else, and restrict it to what the agent needs: formats and videos to write, account to read. --- Source: https://10xvid.com/docs/api/authentication # Authentication and keys How to send your API key, what a key may reach, when it runs out, and how to limit what one key may spend in a month. ## Send your key Every request carries your key, in either header: ```http Authorization: Bearer tenx_... x-api-key: tenx_... ``` A key acts as you, in your own workspace, and only on the API's routes. It never opens the app. ## Make a key Open the [API keys](/app/api-keys) page in the app and press **Create key**. Give it a name you will recognise, such as the server it runs on. The key is shown once: we keep a fingerprint of it, never the key itself. An account can have 20 keys. Your email address must be confirmed before you can make one. The list shows each key's name, its last four characters, when it was made, when it runs out and a switch. Its menu has **Edit**, **Copy key ID** and **Delete**. ## Restrict a key A key that is not restricted reaches every part of the API. Turn on **Restrict key** to choose: | Part | Levels | What it allows | |---|---|---| | Formats | No access, Read, Write | Read formats; Write also makes, continues and deletes them | | Videos | No access, Read, Write | Read videos; Write also makes them | | Image ads | No access, Read, Write | Read image ads; Write also makes them | | Styles | No access, Read | List the styles | | Account | No access, Read | Read the credits, balance and prices | A restricted key can also have a **monthly limit**: the most it may spend in a calendar month, counted in dollars at the API's prices, whichever of your credits or your balance pays. A key past its limit is refused with `402` and `"code": "limit"`. ## When a key runs out Choose **Expire after** when you make a key: never, or after a number of days. Change it at any time with **Edit**. The switch beside each key turns it off without deleting it, and on again. ## When a key is refused | Status | Code | Why | |---|---|---| | `401` | `key` | No key was sent, the key is not one, it was deleted, it is switched off, or it ran out. The `error` says which. | | `403` | `scope` | The key may not reach this part of the API. | | `402` | `limit` | The key's monthly limit cannot pay for this. | ## Keep keys safe Use a key only on your own server, never in a web page or an app people download. Give each place its own key, so one can be deleted without stopping the others. If a key leaks, delete it: it stops working at once. --- Source: https://10xvid.com/docs/api/webhooks # Webhooks Get told when a format or video you started through the API is ready or failed, and check that each message came from 10xvid. ## Add a webhook Open the [API keys](/app/api-keys/webhooks) page in the app, go to **Webhooks**, and give the address of your server. It must start with `https://`. You get a signing secret beside it. **Send test** sends a `ping` at once and shows what your server answered. Only what you started through the API tells your webhook. What you make in the app does not. ## Events | Event | When it is sent | |---|---| | `format.ready` | The Format DNA is written and passed: videos can be made from it. | | `format.failed` | The site could not be read, or the Format DNA could not be written. What it cost was given back. | | `video.done` | A video finished. Its files are in the message. | | `video.failed` | A video could not be finished. Its price was given back. | | `image.done`, `image.failed` | The same for image ads. | | `ping` | The **Send test** button. | ## The message A `POST` with a JSON body. `data.object` is the format or the video, the same as the API answers for it. ```json { "id": "evtmgn5c1a2b3c", "object": "event", "type": "video.done", "created": "2026-10-13T10:02:18.120Z", "data": { "object": { "id": "MV40XXRN514AA9", "object": "video", "status": "done", "files": [] } } } ``` Three headers come with it: | Header | What it holds | |---|---| | `X-10xvid-Signature` | `t=,v1=` | | `X-10xvid-Event` | The event, such as `video.done` | | `X-10xvid-Delivery` | The message's id, the same on every try | ## Check the signature The signature is the HMAC SHA-256 of the seconds, a full stop and the raw body, under your webhook's secret, as Stripe signs its own. Check it, and turn away a message more than five minutes old. JavaScript: ```js import crypto from 'node:crypto'; export function isFrom10xvid(body, header, secret) { const [, t, v1] = /t=(\d+),v1=([a-f0-9]{64})/.exec(header ?? '') ?? []; if (!v1 || Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; const want = crypto.createHmac('sha256', secret).update(`${t}.${body}`).digest('hex'); return crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(want)); } ``` Python: ```python import hashlib import hmac import time def is_from_10xvid(body: bytes, header: str, secret: str) -> bool: parts = dict(p.split("=", 1) for p in header.split(",") if "=" in p) t, v1 = parts.get("t", ""), parts.get("v1", "") if not t.isdigit() or abs(time.time() - int(t)) > 300: return False want = hmac.new(secret.encode(), f"{t}.".encode() + body, hashlib.sha256).hexdigest() return hmac.compare_digest(v1, want) ``` ## Answer, and tries again Answer with any `2xx`. Anything else, or no answer within 10 seconds, and the message is sent again after 1 minute, 5 minutes, 30 minutes, 2 hours and 6 hours, then given up. The last messages and what your server answered are listed under the webhook. Use `X-10xvid-Delivery` to notice a message you already handled. ## A new secret **New secret** signs every message from then on with a new one. Put it on your server before the next message arrives. --- Source: https://10xvid.com/docs/api/pricing # API pricing What API calls cost: a video by the second, a voiceover by 1,000 characters, the rest by what it used. A plan's credits pay first. ## How a call is paid 1. **Your plan's credits first**, the same credits the app spends. 2. **The credits you add** after them, when the plan's run out. Without a plan, every call is paid from the credits you add. Credits are **$1 for 1,000**. ## Prices | What | Priced by | How it is counted | |---|---|---| | Motion V1 video | The second | The length asked for, from 5 to 30 seconds (20 when none is asked), in each aspect ratio | | Motion V1 Flash video | The second | The same, at Motion V1 Flash's own price | | Voiceover | 1,000 characters | The characters it speaks, once for a video in all its aspect ratios | | Music | The second | The video's seconds, once for a video in all its aspect ratios. Optional on Motion V1 Flash (`"music": false`); Motion V1 always makes music | | Image | The image | Each image, in each aspect ratio | | Reading a site | The site | What it really used. A site you read before is not read again, and not paid for again | | Building a Format DNA | The Format DNA | What it really used | | Updating a Format DNA | The update | What it really used | | Studying a reference video | The video | What it really used | Today's prices are on the API side of Subscription in the app, and in [the account](/docs/api/reference/account) under `prices`, each with its `unit`. For example, at $0.18 a second, a 15 second Motion V1 video in 9:16 and 1:1 is 30 seconds of video, $5.40; its music, 15 seconds, and its voiceover are added once. When a step starts, its price is set aside: a video's seconds, its music, its voiceover at 12 characters a second, and for the rest what it usually takes. When it is done, a Motion V1 Flash voiceover is charged the characters it spoke (a Motion V1 voiceover stays at 12 a second), and the rest what it really used. What was set aside and not used comes back, or the difference is taken, never more than your credits hold. Before a request starts, the whole of it is checked against what can pay. When it cannot be paid, it is refused with `402` and `"code": "funds"`, and nothing starts. ## What plans include The API side of Subscription shows, plan by plan, what each plan's credits make through the API. The [pricing page](/pricing) shows the plans. ## Adding credits - **Add credits** by card, from $5 to $5,000 at a time, on the API side of Subscription. They land when the payment goes through. The account reports them in dollars, as `balance`. - **Auto Top Up** adds credits from your saved card when they drop below an amount you choose, up to a monthly cap you set. It pauses itself if a payment is refused. - Credits you add do not run out at the end of the month. They stay until you use them. Work that waited for credits carries on by itself once they land. ## Limits for one key Restrict a key and give it the most it may spend in a month. See [Authentication and keys](/docs/api/authentication). ## What comes back You pay only for what is delivered. A reading that found nothing, a Format DNA that could not be written, and a video that could not be finished come back by themselves, to the credits they came from. --- Source: https://10xvid.com/docs/api/errors # Errors and limits Every error the API returns, what it means and what to do about it, and the limits on keys, styles, videos and file links. ## The shape of an error Every error is JSON with a sentence you can show a person. Some carry a `code` your software can act on. ```json { "error": "This key may not make or delete formats. Change what it may reach on the API keys page at https://10xvid.com/app/api-keys.", "code": "scope" } ``` ## Status codes | Status | What it means | What to do | |---|---|---| | `400` | Something sent is not right. The sentence says what. | Fix the request. | | `401` | No key, or the key may not be used. | Send a key that works. | | `402` | It cannot be paid for. | Add funds, or raise the key's limit. | | `403` | The key may not reach this part of the API. | Use a key that may, or change its access. | | `404` | No such format, video or route. | Check the id or the path. | | `409` | Not yet: the format is not ready. The sentence says what it waits for. | Ask again later. | | `429` | Too many videos are being made at once, or too many calls in a minute. The sentence says which. | Start more as others finish, or wait the seconds `Retry-After` gives. | ## Codes | Code | With | Meaning | |---|---|---| | `key` | `401` | No key was sent, or it is not one, was deleted, is switched off, or ran out | | `scope` | `403` | The key may not reach this part of the API | | `funds` | `402` | Your credits and your top up balance do not cover it. `need` and `left` are in dollars. | | `limit` | `402` | The key's monthly limit cannot pay for it. `limit`, `spent` and `need` are in dollars. | | `route` | `404` | There is no such route | | `rate` | `429` | Too many calls in a minute, from your account or from one address. `Retry-After` says when to try again. | ## Limits | What | Limit | |---|---| | Videos being made at once | 10 for an account, the app and the API together. A call that would pass it gets `429`; the videos a format makes by itself start as others finish. | | Calls | 120 a minute for an account, and 300 a minute from one address. Past them a call gets `429` with `code: "rate"`. | | Styles in one format | 10 | | Videos in one call | 6 | | Shapes | 9:16, 1:1 and 16:9 | | Length | 5 to 30 seconds | | A file's link | Works for 7 days. Ask again for a fresh one. | | Keys | 20 for an account | | One top up | From $5 to $5,000 | --- Source: https://10xvid.com/docs/api/reference/formats # Formats API Create a format from a link, read and list formats, start a step that waited for funds, and delete a format with all made from it. ## Create a format `POST /api/v1/formats` Reads the site, writes the Format DNA and makes a video in each style asked for, by itself. Needs **Formats: Write**. | Field | Needed | What it is | |---|---|---| | `link` | required | The site, or the App Store or Google Play page, to make ads for. | | `styles` | optional | Style ids from the [Styles API](/docs/api/reference/styles), at most 10. A video is made in each. None: one video in the site's own look. | | `aspects` | optional | Any of `"9:16"`, `"1:1"`, `"16:9"`. Each video is made in each shape. Default `["9:16"]`. | | `length` | optional | Seconds, from 5 to 30. Default 20. A video is [priced](/docs/api/pricing) by its length. | | `voiceover` | optional | `true` for a narrated video. Default `false`. | | `music` | optional | `false` for videos with no music, with `"engine": "motion-v1-flash"` only: Motion V1 always makes music. Default `true`. Music is [priced](/docs/api/pricing) on its own. | | `goal` | optional | One of `installs`, `signups`, `sales`, `leads`, `awareness`. | | `audience` | optional | Who the ads are for, in a sentence. | | `angle` | optional | The one idea the ads are built on, in a sentence. | | `notes` | optional | Anything else the writers should know. | | `name` | optional | The product's name. Read from the site when left out. | | `videos` | optional | `false` to only read the site and write the Format DNA. Default `true`. | | `count` | optional | How many videos it makes by itself of each style, or of the site's own look, from 1 to 6. Default 1. | | `engine` | optional | `"motion-v1"` or `"motion-v1-flash"` for the videos it makes by itself. Default `"motion-v1"`. [Motion V1 Flash](/docs/models) makes videos only, at its own price. | | `reuse` | optional | A site you read before is not read again, and not paid for again. `false` reads it again. | The whole of it is checked against what can pay before anything starts. When it cannot be paid, the answer is `402` with `"code": "funds"` and nothing is made. cURL: ```bash curl https://10xvid.com/api/v1/formats \ -H "Authorization: Bearer $TENX_API_KEY" \ -H "Content-Type: application/json" \ -d '{"link": "https://typally.com", "styles": ["whiteboard", "clay"], "aspects": ["9:16", "1:1"], "length": 15}' ``` JavaScript: ```js const res = await fetch('https://10xvid.com/api/v1/formats', { method: 'POST', headers: { Authorization: `Bearer ${process.env.TENX_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ link: 'https://typally.com', styles: ['whiteboard', 'clay'], aspects: ['9:16', '1:1'], length: 15 }), }); const format = await res.json(); ``` Python: ```python res = requests.post( "https://10xvid.com/api/v1/formats", headers={"Authorization": f"Bearer {os.environ['TENX_API_KEY']}"}, json={"link": "https://typally.com", "styles": ["whiteboard", "clay"], "aspects": ["9:16", "1:1"], "length": 15}, ) format = res.json() ``` The answer is `201` with the format: ```json { "id": "typally-com-mgn4x2a1", "object": "format", "name": "Typally", "link": "https://typally.com/", "status": "reading", "error": null, "styles": ["whiteboard", "clay"], "aspects": ["9:16", "1:1"], "engine": "motion-v1", "voiceover": false, "music": true, "length": 15, "videos_expected": 2, "created": "2026-10-13T09:12:04.551Z" } ``` ## The format object | Field | What it is | |---|---| | `id` | The format's id. | | `object` | Always `format`. | | `name` | The product's name, as read from the site or sent. | | `link` | The link it was made from. | | `status` | `reading`, `writing`, `ready`, `waiting` or `failed`. See below. | | `error` | What went wrong, in a sentence, when `status` is `failed` or `waiting`. | | `styles` | The styles asked for. | | `aspects` | The shapes its videos are made in. | | `engine` | The engine its videos are made with: `motion-v1` or `motion-v1-flash`. | | `voiceover` | Whether its videos are narrated. | | `music` | Whether its videos have music. | | `length` | The length of its videos in seconds, or `null` when none was asked: then they are 20 seconds. | | `videos_expected` | How many videos it makes by itself: `count` in each style, `count` with none, or 0 when asked for none. | | `created` | When it was made. | | `videos` | Its videos, newest first. Only in `GET /formats/{id}`. | | Status | What it means | |---|---| | `reading` | The site is being read. | | `writing` | The Format DNA is being written. | | `ready` | Videos can be made from it. The ones asked for start by themselves, each once its style is written. | | `waiting` | A step could not be paid for when it was due. Add funds and it carries on by itself, or call `continue`. | | `failed` | The site could not be read, or the Format DNA could not be written. What it cost was given back. | ## Get a format `GET /api/v1/formats/{id}` The format with its `videos`. Needs **Formats: Read**. ## List formats `GET /api/v1/formats` Your formats, newest first. Needs **Formats: Read**. | Query | What it is | |---|---| | `limit` | How many, from 1 to 100. Default 20. | | `before` | Only formats made before this moment, as an ISO date or milliseconds. Use the last one's `created` for the next page. | ```json { "object": "list", "data": [ { "id": "typally-com-mgn4x2a1", "object": "format", "status": "ready" } ], "has_more": false } ``` ## Continue a format `POST /api/v1/formats/{id}/continue` Starts the step that waited for funds, once they are there. A format that waits nothing is answered as it is. Needs **Formats: Write**. ## Delete a format `DELETE /api/v1/formats/{id}` Stops its work and deletes it, with its styles, its videos and its images. It cannot be undone. Needs **Formats: Write**. ```json { "id": "typally-com-mgn4x2a1", "object": "format", "deleted": true } ``` --- Source: https://10xvid.com/docs/api/reference/videos # Videos API Make more videos from a ready format, read one video and its files with their links, and list your videos newest first. ## Make videos `POST /api/v1/formats/{id}/videos` Makes more videos from a format that is `ready`. Needs **Videos: Write**. | Field | Needed | What it is | |---|---|---| | `style` | optional | One of the styles the format was made with. None: the format in the site's own look. | | `count` | optional | How many videos, 1 to 6. Default 1. Each is its own video with its own id. | | `aspects` | optional | Any of `"9:16"`, `"1:1"`, `"16:9"`. Default: the format's. | | `voiceover` | optional | `true` or `false`. Default: the format's. | | `music` | optional | `false` for no music, with `"engine": "motion-v1-flash"` only. Default: the format's. | | `engine` | optional | `"motion-v1"` or `"motion-v1-flash"`. Default: `"motion-v1"`. [Motion V1 Flash](/docs/models) makes videos only, at its own price, and does not use `style`. | cURL: ```bash curl https://10xvid.com/api/v1/formats/FORMAT_ID/videos \ -H "Authorization: Bearer $TENX_API_KEY" \ -H "Content-Type: application/json" \ -d '{"style": "whiteboard", "count": 2, "aspects": ["9:16", "1:1"]}' ``` JavaScript: ```js const res = await fetch(`https://10xvid.com/api/v1/formats/${formatId}/videos`, { method: 'POST', headers: { Authorization: `Bearer ${process.env.TENX_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ style: 'whiteboard', count: 2, aspects: ['9:16', '1:1'] }), }); const { data: videos } = await res.json(); ``` Python: ```python res = requests.post( f"https://10xvid.com/api/v1/formats/{format_id}/videos", headers={"Authorization": f"Bearer {os.environ['TENX_API_KEY']}"}, json={"style": "whiteboard", "count": 2, "aspects": ["9:16", "1:1"]}, ) videos = res.json()["data"] ``` The answer is `202` with the new videos, each `"status": "making"`. A format that is not ready answers `409` with what it waits for. ## The video object ```json { "id": "MV40XXRN514AA9", "object": "video", "format": "typally-com-mgn4x2a1", "style": "whiteboard", "status": "done", "aspects": ["9:16", "1:1"], "engine": "motion-v1", "voiceover": false, "music": true, "length": 15, "created": "2026-10-13T09:20:41.003Z", "finished": "2026-10-13T10:02:17.912Z", "error": null, "files": [ { "video_id": "MV40XXRN514AA9-V1", "aspect": "9:16", "url": "https://10xvid.com/files/brands/.../final.mp4?dl=...", "poster": "https://10xvid.com/files/brands/.../poster.jpg?dl=...", "width": 1080, "height": 1920, "duration": 15.04, "title": "Write while you talk" } ] } ``` | Field | What it is | |---|---| | `id` | The video's id. | | `object` | Always `video`. | | `format` | The format it was made from. | | `style` | The style it was made in, or `null` for the site's own look. | | `status` | `making`, `done`, `failed` or `stopped`. | | `progress` | From 0 to 1, while it is `making`. | | `aspects` | The shapes it is made in. | | `engine` | `motion-v1` or `motion-v1-flash`: which made it; `image-v1` on an image. | | `voiceover`, `music`, `length` | As it was made. | | `created`, `finished` | When it started and ended. | | `error` | A sentence when it `failed`. What it cost was given back. | | `files` | One for each finished shape. Empty until then. | Each file: | Field | What it is | |---|---| | `video_id` | The file's own id, as the app shows it. | | `aspect` | `9:16`, `1:1` or `16:9`. | | `url` | The MP4. It works on its own, with no key, for seven days. Ask for the video again for a fresh link. | | `poster` | A still of it, on the same terms. | | `width`, `height`, `duration` | In pixels and seconds. | | `title` | Its title, when it has one. | ## Get a video `GET /api/v1/videos/{id}` One video. The video's `id` or one of its files' `video_id` works. Needs **Videos: Read**. ## List videos `GET /api/v1/videos` Your videos, newest first. Needs **Videos: Read**. | Query | What it is | |---|---| | `format` | Only this format's videos. | | `limit` | How many, from 1 to 100. Default 20. | | `before` | Only videos made before this moment, as an ISO date or milliseconds. | --- Source: https://10xvid.com/docs/api/reference/images # Image ads API Make still image ads from a ready format in the shapes you need, then read one or list them all, each with links to its files. ## Make image ads `POST /api/v1/formats/{id}/images` Makes still image ads from a format that is `ready`, from the same Format DNA as its videos. Needs **Image ads: Write**. | Field | Needed | What it is | |---|---|---| | `style` | optional | One of the styles the format was made with. None: the site's own look. | | `count` | optional | How many images, 1 to 6. Default 1. | | `aspects` | optional | Any of `"9:16"`, `"1:1"`, `"16:9"`. Default: the format's. | ```bash curl https://10xvid.com/api/v1/formats/FORMAT_ID/images \ -H "Authorization: Bearer $TENX_API_KEY" \ -H "Content-Type: application/json" \ -d '{"count": 3, "aspects": ["1:1"]}' ``` The answer is `202` with a list holding the batch being made, one object with `"object": "image"`. Each image is charged in each shape. ## The image object The same as the [video object](/docs/api/reference/videos), with `"object": "image"` and no `voiceover` or `length`. Each file has `image_id`, `aspect`, `url`, `width` and `height`. ## Get image ads `GET /api/v1/images/{id}` Needs **Image ads: Read**. ## List image ads `GET /api/v1/images` Newest first, with `format`, `limit` and `before` as for videos. Needs **Image ads: Read**. --- Source: https://10xvid.com/docs/api/reference/styles # Styles API List the hundred styles and Pure with their ids, names, families and pictures, to choose the look of the videos a format makes. ## List styles `GET /api/v1/styles` Every style a format can be made in, in the gallery's order, Pure first. Needs **Styles: Read**. ```bash curl https://10xvid.com/api/v1/styles \ -H "Authorization: Bearer $TENX_API_KEY" ``` ```json { "object": "list", "data": [ { "id": "pure", "object": "style", "name": "Pure", "family": "Your site", "description": "Your site's own design language, as it is.", "picture": "https://10xvid.com/media/styles/pure.webp" }, { "id": "whiteboard", "object": "style", "name": "Whiteboard", "family": "Hand drawn", "description": "Black marker drawn by hand on white.", "picture": "https://10xvid.com/media/styles/whiteboard.webp" } ] } ``` | Field | What it is | |---|---| | `id` | What to send in `styles` when you [create a format](/docs/api/reference/formats). | | `name` | Its name, as the app shows it. | | `family` | The family it belongs to. | | `description` | What it looks like, in a line. | | `picture` | A small drawing of it. | All of them, with their pictures, are on the [Styles](/docs/styles) page. --- Source: https://10xvid.com/docs/api/reference/account # Account API Read your account through the API: the credits left, the top up balance, today's prices, the limits, and what this key has spent. ## Get the account `GET /api/v1/account` Needs **Account: Read**. ```bash curl https://10xvid.com/api/v1/account \ -H "Authorization: Bearer $TENX_API_KEY" ``` ```json { "object": "account", "email": "you@example.com", "plan": "studio", "credits": { "left": 191500, "included": 250000, "resets": "2026-11-01T00:00:00.000Z" }, "balance": { "usd": 42.5 }, "spent_this_month": { "usd": 17.68 }, "key": { "id": "keymgn5c1a2b8f3e0d", "scopes": "all", "limit": null, "spent_this_month": { "usd": 6.4 } }, "prices": { "read_site": { "usd": 2.3, "credits": 2298, "unit": "site", "per": "each site", "name": "Reading a site" }, "format_dna": { "usd": 0.25, "credits": 250, "unit": "format_dna", "per": "each Format DNA", "name": "Building a Format DNA" }, "video": { "usd": 0.18, "credits": 180, "unit": "second", "per": "each second of video, in each aspect ratio", "name": "Making a video" }, "lite_video": { "usd": 0.07, "credits": 70, "unit": "second", "per": "each second of video, in each aspect ratio", "name": "Making a Motion V1 Flash video" }, "voiceover": { "usd": 2.19, "credits": 2190, "unit": "1000_characters", "per": "each 1,000 characters spoken", "name": "Voiceover" }, "music": { "usd": 0.04, "credits": 40, "unit": "second", "per": "each second of video", "name": "Music" } }, "limits": { "videos_at_once": 10, "styles_per_format": 10, "videos_per_call": 6 }, "images": true, "docs": "https://10xvid.com/docs/api" } ``` | Field | What it is | |---|---| | `credits` | Your plan's credits: what is `left`, what the plan `included`, and when they come back. They pay before the balance. | | `balance` | The top up balance, in dollars. | | `spent_this_month` | What the top up balance paid for this calendar month. | | `key` | The key that asked: its id, what it may reach (`all`, or each part and its level), its monthly limit, and what it spent this month. | | `prices` | What one of each thing costs today, in dollars and credits, for one `unit`: `video` and `lite_video` (a video made by Motion V1 Flash) a `second` in each aspect ratio, `voiceover` 1,000 characters (`1000_characters`), `music` a `second` of video, `image` an image, and `read_site`, `format_dna`, `format_update` and `reference_video` one of each, on average (each is charged what it really used). See [API pricing](/docs/api/pricing). | | `limits` | Videos made at once for the account, styles in one format, and videos in one call. | | `images` | Whether image ads can be made. | The prices in the example are only an example: read them from your own account. --- Source: https://10xvid.com/docs/changelog # Changelog What changed in the 10xvid API, its engine and these docs, newest first, so an integration knows what it can use and when. ## October 23, 2026 ### Motion V1 Flash - **Its name.** The second engine is Motion V1 Flash, with `"engine": "motion-v1-flash"` on the [API](/docs/api/reference/formats) and in [MCP](/docs/api/mcp). The names it had before, `motion-v1-lite` and `motion-v1-flash`, are still taken; answers say `motion-v1-flash`. ### Music on its own - **Music.** A video's music is priced on its own, by the second (`music` in [the account](/docs/api/reference/account)). Ask for none with `"music": false` on [formats](/docs/api/reference/formats) and [videos](/docs/api/reference/videos), with Motion V1 Flash: then it is not charged. Motion V1 always makes music. ### Videos priced by the second - **By the second.** A video is priced by its length, in each shape: `video` and `lite_video` in [the account](/docs/api/reference/account) are prices for a second. A video with no `length` asked is 20 seconds. - **Voiceover on its own.** A voiceover is priced by 1,000 characters (`voiceover`), counted once for a video in all its shapes. - **Units in the price list.** Each entry of `prices` says its `unit` and its price in `credits` beside `usd`. See [API pricing](/docs/api/pricing). ## October 16, 2026 ### Styles, and one app - **Styles.** Under Apps in [the new 10xvid](/app/agent), rows of ways to film an ad: UGC (a selfie review, a street interview, a podcast clip), hooks (the look up, your phone in first person) and product films (cinematic, in the hand, a desk demo). Each is filmed by a video model with its own sound, from the words on your product's site, in a few minutes. Open one, pick your product or paste its link, and it is made in a chat of that project. - **One app.** The new 10xvid is the only one: the old screens are gone, and their addresses open the matching screen in the new app. The plan, invoices and the owners' console open inside it. ## October 15, 2026 ### The agent, and MCP - **A chat that makes ads.** Open [the new 10xvid](/app/#/agent), paste a link, and the agent looks at the site, asks where the ad will run, and makes it with Motion V1 Flash. Your videos appear in the chat as they are made; say what to change and it makes a new version. - **MCP.** Make ads from Claude Code or any agent that speaks MCP: one line to add `https://10xvid.com/mcp` with your API key. See [MCP](/docs/api/mcp). - **Projects, Apps, Brand, Blueprint.** The new 10xvid has a rail of sections beside its chats: Apps (each one prompt), Projects (every product you made ads for), Brand (what the site says about it, to correct), and on each project a Blueprint tab with the plan of the ad, every part of it yours to change. Ask for Motion V1 in a chat and the blueprint is written first; the videos follow by themselves. ## October 14, 2026 ### Motion V1 Flash - **A second engine.** Motion V1 Flash makes a video in one pass, in about five minutes once its turn comes, at its own price. Choose it under **Produce** in the app, or with `"engine": "motion-v1-flash"` when you [make videos](/docs/api/reference/videos). See [Models](/docs/models). - **Its price** is `lite_video` in [the account](/docs/api/reference/account). ## October 13, 2026 ### The 10xvid API - **The API is open.** Make formats from a link, more videos and image ads from them, list the styles and read the account, at `https://10xvid.com/api/v1`. See the [quickstart](/docs/api/quickstart). - **API keys** have a page of their own in the app, with a switch for each key, an end date, and access by part of the API with a monthly limit. - **Paying for calls.** A plan's credits pay first, the top up balance in dollars after them, with Add funds and Auto Top Up. - **Webhooks** tell your server when a format or video you started through the API is ready or failed, signed with your secret. - **File links** in every answer work on their own for seven days. ### These docs - The documentation opens, with the models, the hundred styles, the concepts, the API guides and the reference. Every page has a Markdown copy, and [llms.txt](/llms.txt) lists them all for AI tools.