{"openapi":"3.1.0","info":{"title":"HitCanvas API","version":"2.9.2","description":"A creative brief in, a finished YouTube thumbnail out. POST /v1/thumbnails is the public API: describe the video, say the words, and get back a picture with the headline painted in — nothing to set, measure or render. Around it: niche studies, concepts, headlines and reviews (Ideas); the library the thumbnails are kept in; brand kits, saved people and client spaces for context.\n\nWhat is Studio-only: AI-plus-text creation (a background the Studio sets real type over), layered editing, canvas controls, font choice and the Studio's own render and export. The operations that serve those — tagged Advanced, marked deprecated, x-hitcanvas-audience: studio — stay for integrations that built on them, and answer with a Deprecation: true header; they are not part of new public guidance and will not be restricted or removed without the published compatibility path.\n\nThe path is versioned (/v1); this document's version tracks additive changes within it. Every error is one shape (ApiError). Every response carries x-request-id.\n\nUnits, for the advanced surface: clearBelow, clearAbove and words are fractions of the frame (0–1); focal-region bounds are percentages (0–100); a design's coordinates are canvas pixels on a 1280 × 720 frame.\n\nYouTube: an API customer authenticates to HitCanvas with a HitCanvas API key and nothing else. They never connect a YouTube account, hand over Google OAuth credentials, or talk to the YouTube Data API: every piece of public YouTube data that research, niche analysis or generation needs — POST /v1/study, GET /v1/videos — HitCanvas fetches itself, with its own YouTube Data API credentials. Google OAuth exists only inside the Studio, where a signed-in person may connect their own channel for things only their account can do, such as picking one of their existing thumbnails to review; that connection is not part of the public API and is never required for generating thumbnails. The /v1/youtube operations that expose Studio connections are session-only: a key is refused. Contract 2.7.0 made that so; the youtube:read scope it replaced no longer exists, and a key that held it lost nothing it could use.\n\nAuth: an API key as a bearer token works everywhere marked key-or-session. Routes marked session are Studio operations — they need a signed-in browser session, and some need an owner or admin.\n\nScopes: a key holds scopes (x-hitcanvas-scope on each operation says which one it needs) and may be limited to certain client spaces; GET /v1/keys shows both, POST /v1/keys and PATCH /v1/keys/{id} set them. A key made before scopes existed is unrestricted — every scope, every space — and stays so until an owner narrows it; nothing changes for it. A refused call is a 403 with code key_scope_denied or key_space_denied."},"servers":[{"url":"https://app.hitcanvas.com"}],"tags":[{"name":"Thumbnails","description":"The public API: a brief in, a finished thumbnail out. Each counts against the workspace's monthly allowance."},{"name":"Ideas","description":"What to make: the niche studied, concepts, headlines, and a review of a finished thumbnail. Studies and ideas count against their own allowances."},{"name":"Jobs","description":"The same work, answered with a 202 and finished after."},{"name":"Library","description":"Every thumbnail the workspace has made, kept as it was made."},{"name":"Brand kits"},{"name":"Personas","description":"Saved people. Photos need recorded consent."},{"name":"Spaces","description":"Client spaces: an agency's clients, each with its own library, kits and personas."},{"name":"Videos","description":"Published videos watched against their channel's typical video: public data, read by HitCanvas with its own YouTube credentials. No YouTube account of yours is involved."},{"name":"Workspace"},{"name":"Advanced","description":"Studio-facing: the engine directly, layered designs, fonts, server rendering. Deprecated for new integrations, served for existing ones under the compatibility path."},{"name":"Meta"}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"A key from the console, sent as Authorization: Bearer <key>. Keys belong to the workspace and are limited to 60 calls a minute."},"session":{"type":"apiKey","in":"cookie","name":"better-auth.session_token","description":"A signed-in Studio session."}},"schemas":{"GenerateRequest":{"type":"object","properties":{"mode":{"type":"string","enum":["layout","full"],"description":"full paints the words into the picture: the public path, which POST /v1/thumbnails wraps. layout returns a background and measurements for words the caller sets — the Studio's engine, kept for existing integrations (see the compatibility notice)."},"topic":{"type":"string","minLength":3,"maxLength":1500},"headline":{"default":"","type":"string","maxLength":80},"tagline":{"type":"string","maxLength":60},"style":{"default":"bold","type":"string","enum":["bold","cinematic","clean","illustrated","neon","gilded","photo"]},"textSide":{"default":"left","description":"Where the words go. In full mode the model paints them there; in layout mode the caller sets them there.","type":"string","enum":["left","right","bottom","center"]},"words":{"description":"Layout mode only: how much of the frame the headline will fill once set, as fractions. Studio-only.","type":"object","properties":{"width":{"type":"number","minimum":0.05,"maximum":1},"height":{"type":"number","minimum":0.05,"maximum":1}},"required":["width","height"]},"insist":{"description":"Layout mode only: a second attempt at a composition that left the words nowhere to go. Studio-only.","type":"boolean"},"finish":{"type":"string","enum":["none","rawGold","gold","chrome","fire","ice","foil","stone"]},"font":{"type":"string","enum":["condensed","tall","wide","geometric","slab","serif","rounded","comic","brush","marker","script","tech"]},"accent":{"type":"string","enum":["condensed","tall","wide","geometric","slab","serif","rounded","comic","brush","marker","script","tech"]},"tilt":{"type":"number","minimum":-12,"maximum":12},"model":{"type":"string","enum":["openai/gpt-image-2.5-flare","openai/gpt-image-2.5-sunburst","openai/gpt-image-2","openai/gpt-image-1-mini","bfl/flux-pro-1.1","bfl/flux-2-pro","bytedance/seedream-4.5"]},"expression":{"type":"string","maxLength":200},"intensity":{"type":"string","enum":["subtle","clear","extreme"]},"pose":{"type":"string","maxLength":200},"hostLook":{"type":"string","maxLength":1000},"featuredLook":{"type":"string","maxLength":1000},"role":{"type":"string","enum":["subject","host","none"]},"hostAt":{"type":"string","enum":["left","right","center"]},"compare":{"type":"null"},"compareKind":{"anyOf":[{"type":"string","enum":["versus","answers","shadow","beforeAfter","thought"]},{"type":"null"}]},"compareImagines":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"compareSeam":{"anyOf":[{"type":"string","enum":["lightning","crack","light","torn","cut","smoke","line","slantLeft","slantRight"]},{"type":"null"}]},"concept":{"type":"object","properties":{"title":{"type":"string","maxLength":60,"description":"Three or four words naming the idea."},"emotion":{"type":"string","maxLength":240,"description":"The subject's expression, specific enough to act: which feeling, how strong, what the eyes and mouth are doing."},"pose":{"type":"string","maxLength":320,"description":"One or two sentences: what the subject is doing with their body, hands and gaze, and how they are framed."},"background":{"type":"string","maxLength":420,"description":"Where they are and what is behind them: setting, props, light, colour. Name the two or three specific objects that prove the video's claim and say what state each is in, chosen from what this topic and this place actually contain — never the generic furniture of an office or a desk unless the video is about one. A vague word like messy or busy proves nothing, and a picture of a mood cannot be told apart from any other video's. No text or logos."}},"required":["title","emotion","pose","background"]},"faces":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"string","maxLength":6000000,"pattern":"^data:image\\/(jpeg|png|webp);base64,"}},"featured":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"string","maxLength":6000000,"pattern":"^data:image\\/(jpeg|png|webp);base64,"}},"permission":{"type":"boolean"},"niche":{"type":"object","properties":{"palette":{"type":"object","properties":{"hook":{"type":"object","properties":{"hex":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"name":{"type":"string","description":"A plain colour name, like \"bright yellow\"."}},"required":["hex","name"],"description":"Colour of the loudest word or line."},"body":{"type":"object","properties":{"hex":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"name":{"type":"string","description":"A plain colour name, like \"bright yellow\"."}},"required":["hex","name"],"description":"Colour of the rest of the headline."},"accent":{"type":"object","properties":{"hex":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"name":{"type":"string","description":"A plain colour name, like \"bright yellow\"."}},"required":["hex","name"],"description":"A second highlight colour used for a closing line or key word."},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Outline colour around the lettering."},"strokeWidth":{"type":"integer","minimum":0,"maximum":16,"description":"Outline weight on a 1280x720 canvas: 0 none, 6 medium, 12 heavy."}},"required":["hook","body","accent","stroke","strokeWidth"],"description":"Headline colours that would look at home among these thumbnails."},"lettering":{"type":"object","properties":{"font":{"type":"string","enum":["condensed","tall","wide","geometric","slab","serif","rounded","comic","brush","marker","script","tech"],"description":"The character of the typeface most winners use: condensed (heavy impact-style), tall (thin narrow all-caps), wide (broad heavy grotesque), geometric (round modern black sans), slab (heavy slab serif), serif (high-contrast display serif), rounded (soft chunky friendly), comic (comic-book lettering), brush (heavy painted dry-brush capitals), marker (felt-tip hand lettering), script (flowing cursive), tech (squared sci-fi or gaming)."},"uppercase":{"type":"boolean","description":"Whether the headline is set in all capitals."},"shadow":{"type":"boolean","description":"Whether the lettering carries a drop shadow or glow."},"gradient":{"type":"string","enum":["none","rawGold","gold","chrome","fire","ice","foil","stone"],"description":"If the letters are filled with something other than flat colour: gold (smooth gold gradient), foil (textured gold foil with bands of shine and sparkles), chrome, fire, ice, or stone (white lettering that is weathered, chipped or speckled). Otherwise none."},"glow":{"anyOf":[{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},{"type":"null"}],"description":"If a coloured glow sits behind the lettering, its colour; otherwise null."},"tilt":{"type":"number","minimum":-12,"maximum":12,"description":"How far the headline is tilted, in degrees: negative rises to the right, 0 is level."},"boxColor":{"anyOf":[{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},{"type":"null"}],"description":"If the winners set words on a solid coloured box or banner, that box's colour; otherwise null."}},"required":["font","uppercase","shadow","gradient","glow","tilt","boxColor"],"description":"How the headline lettering is set."},"picture":{"type":"string","maxLength":1500},"taglines":{"type":"object","properties":{"count":{"type":"number"},"of":{"type":"number"},"words":{"type":"number"},"examples":{"type":"array","items":{"type":"string"}},"font":{"type":["string","null"]},"fontKind":{"type":"string","enum":["condensed","tall","wide","geometric","slab","serif","rounded","comic","brush","marker","script","tech"]},"uppercase":{"type":"boolean"},"box":{"type":"boolean"}},"required":["count","of","words","examples"]}},"required":["palette","lettering","picture"]},"keep":{"default":true,"type":"boolean"},"study":{"type":"object","properties":{"niche":{"type":"string","maxLength":120},"days":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["niche","days"]}},"required":["mode","topic"]},"StudyRequest":{"type":"object","properties":{"niche":{"type":"string","minLength":3,"maxLength":120},"days":{"default":90,"type":"integer","minimum":7,"maximum":365},"region":{"default":"US","type":"string","pattern":"^[A-Za-z]{2}$"}},"required":["niche"]},"DirectRequest":{"type":"object","properties":{"topic":{"type":"string","minLength":3,"maxLength":1500},"headline":{"default":"","type":"string","maxLength":80},"style":{"default":"bold","type":"string","enum":["bold","cinematic","clean","illustrated","neon","gilded","photo"]},"expression":{"type":"string","maxLength":200},"role":{"type":"string","enum":["subject","host","none"]},"hostAt":{"type":"string","enum":["left","right","center"]},"niche":{"type":"string","maxLength":1500}},"required":["topic"]},"HeadlinesRequest":{"type":"object","properties":{"topic":{"type":"string","minLength":3,"maxLength":1500},"words":{"type":"integer","minimum":1,"maximum":20},"summary":{"type":"string","maxLength":1500},"titles":{"maxItems":12,"type":"array","items":{"type":"string","maxLength":120}},"taglines":{"type":"object","properties":{"words":{"type":"integer","minimum":0,"maximum":20},"examples":{"maxItems":5,"type":"array","items":{"type":"string","maxLength":80}}},"required":["words","examples"]}},"required":["topic"]},"ReviewRequest":{"type":"object","properties":{"libraryItemId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"image":{"type":"string","maxLength":6000000,"pattern":"^data:image\\/(jpeg|png|webp);base64,"},"headline":{"type":"string","maxLength":200},"brief":{"type":"object","properties":{"summary":{"type":"string","description":"Two or three sentences on what these thumbnails have in common and why it earns the click."},"textSide":{"type":"string","enum":["left","right","bottom","center"],"description":"Where the headline most often sits."},"words":{"type":"integer","minimum":0,"maximum":20,"description":"Typical number of words on the thumbnail."},"fontName":{"type":["string","null"]},"secondFontName":{"type":["string","null"]},"fontWhy":{"type":"string"},"taglines":{"type":"object","properties":{"count":{"type":"number"},"of":{"type":"number"},"words":{"type":"number"},"examples":{"type":"array","items":{"type":"string"}},"font":{"type":["string","null"]},"fontKind":{"type":"string","enum":["condensed","tall","wide","geometric","slab","serif","rounded","comic","brush","marker","script","tech"]},"uppercase":{"type":"boolean"},"box":{"type":"boolean"}},"required":["count","of","words","examples"]},"wordsMix":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"of":{"type":"number"}},"required":["min","max","of"]},"palette":{"type":"object","properties":{"hook":{"type":"object","properties":{"hex":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"name":{"type":"string","description":"A plain colour name, like \"bright yellow\"."}},"required":["hex","name"],"description":"Colour of the loudest word or line."},"body":{"type":"object","properties":{"hex":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"name":{"type":"string","description":"A plain colour name, like \"bright yellow\"."}},"required":["hex","name"],"description":"Colour of the rest of the headline."},"accent":{"type":"object","properties":{"hex":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"name":{"type":"string","description":"A plain colour name, like \"bright yellow\"."}},"required":["hex","name"],"description":"A second highlight colour used for a closing line or key word."},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Outline colour around the lettering."},"strokeWidth":{"type":"integer","minimum":0,"maximum":16,"description":"Outline weight on a 1280x720 canvas: 0 none, 6 medium, 12 heavy."}},"required":["hook","body","accent","stroke","strokeWidth"],"description":"Headline colours that would look at home among these thumbnails."},"lettering":{"type":"object","properties":{"font":{"type":"string","enum":["condensed","tall","wide","geometric","slab","serif","rounded","comic","brush","marker","script","tech"],"description":"The character of the typeface most winners use: condensed (heavy impact-style), tall (thin narrow all-caps), wide (broad heavy grotesque), geometric (round modern black sans), slab (heavy slab serif), serif (high-contrast display serif), rounded (soft chunky friendly), comic (comic-book lettering), brush (heavy painted dry-brush capitals), marker (felt-tip hand lettering), script (flowing cursive), tech (squared sci-fi or gaming)."},"uppercase":{"type":"boolean","description":"Whether the headline is set in all capitals."},"shadow":{"type":"boolean","description":"Whether the lettering carries a drop shadow or glow."},"gradient":{"type":"string","enum":["none","rawGold","gold","chrome","fire","ice","foil","stone"],"description":"If the letters are filled with something other than flat colour: gold (smooth gold gradient), foil (textured gold foil with bands of shine and sparkles), chrome, fire, ice, or stone (white lettering that is weathered, chipped or speckled). Otherwise none."},"glow":{"anyOf":[{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},{"type":"null"}],"description":"If a coloured glow sits behind the lettering, its colour; otherwise null."},"tilt":{"type":"number","minimum":-12,"maximum":12,"description":"How far the headline is tilted, in degrees: negative rises to the right, 0 is level."},"boxColor":{"anyOf":[{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},{"type":"null"}],"description":"If the winners set words on a solid coloured box or banner, that box's colour; otherwise null."}},"required":["font","uppercase","shadow","gradient","glow","tilt","boxColor"],"description":"How the headline lettering is set."},"shade":{"type":"object","properties":{"side":{"type":"string","enum":["none","left","right","bottom","center","full"],"description":"Where the picture is darkened behind the words so they read: usually the side the words sit on, none if the pictures are left bright."},"strength":{"type":"number","minimum":0,"maximum":1,"description":"How dark: 0.3 subtle, 0.6 clear, 0.9 nearly black."}},"required":["side","strength"],"description":"The darkening behind the headline."},"style":{"type":"string","enum":["bold","cinematic","clean","illustrated","neon","gilded","photo"],"description":"Which picture style fits these thumbnails best: bold (saturated, punchy), cinematic (moody film still), clean (minimal studio), illustrated (vector art), neon (dark with neon glow), photo (natural photoreal)."},"role":{"type":"string","enum":["subject","host","none"],"description":"The part the person plays in most of these thumbnails. host: the person PRESENTS the video, a creator or commentator addressing the viewer, set beside or in front of a separate visual that is what the video is about. subject: the person IS what the video is about. That includes anyone who is not the presenter, an athlete in uniform, a guest, a public figure, whatever logos, scores or graphics sit beside them, and it includes a creator who is simply inside one ordinary scene. none: most of these thumbnails have no person in them at all."},"roleMix":{"type":"object","properties":{"host":{"type":"number"},"subject":{"type":"number"},"none":{"type":"number"}},"required":["host","subject","none"]},"people":{"type":"string","enum":["creator","featured","both"]},"peopleMix":{"type":"object","properties":{"creator":{"type":"number"},"featured":{"type":"number"},"both":{"type":"number"}},"required":["creator","featured","both"]},"arrows":{"type":"object","properties":{"count":{"type":"number"},"of":{"type":"number"},"pointsAt":{"type":["string","null"]}},"required":["count","of","pointsAt"]},"picture":{"type":"string","description":"One paragraph an image model can follow to paint a background in this niche's style: subject type, framing, expression, lighting, colour grade, background treatment. Describe the look only — no list of objects or props, no settings as such, no names, no channel branding, no text. What is in a picture is decided by each video; this is how the winners' pictures look, not what is in them."},"avoid":{"maxItems":5,"type":"array","items":{"type":"string"},"description":"Things the winners never do that a newcomer might."}},"required":["summary","textSide","words","palette","lettering","shade","style","role","picture","avoid"]},"facts":{"type":"object","properties":{"words":{"type":"integer","minimum":0,"maximum":60},"side":{"type":"string","enum":["left","right","bottom","center","top","none"]},"uppercase":{"type":"boolean"},"fontKinds":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":40}},"fills":{"maxItems":12,"type":"array","items":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}},"role":{"type":"string","enum":["subject","host","none"]},"textHeight":{"type":"number","minimum":0,"maximum":1},"painted":{"default":false,"type":"boolean"},"arrows":{"type":"integer","minimum":0,"maximum":8},"brand":{"maxItems":6,"type":"array","items":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}}},"required":["words","side","uppercase","fontKinds","fills","textHeight"]}},"required":["brief"]},"ImproveRequest":{"type":"object","properties":{"image":{"type":"string","maxLength":12000000,"pattern":"^data:image\\/(jpeg|png|webp);base64,"},"fixes":{"minItems":1,"maxItems":6,"type":"array","items":{"type":"string","minLength":3,"maxLength":400}},"lettered":{"default":false,"type":"boolean"},"headline":{"type":"string","maxLength":200},"made":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"keep":{"default":true,"type":"boolean"}},"required":["image","fixes"]},"JobRequest":{"type":"object","properties":{"kind":{"type":"string","enum":["thumbnails","generate","study","direct","headlines","review","improve"],"description":"Which route's work to do."},"request":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"The same body that route takes. Validated by that route when the job runs."}},"required":["kind","request"]},"KitRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60},"kit":{"type":"object","properties":{"niche":{"type":"string","maxLength":120},"days":{"type":"integer","exclusiveMinimum":0,"maximum":3650},"colours":{"type":"object","properties":{"hook":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"body":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"accent":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}},"required":["hook","body","accent","stroke"]},"font":{"type":"string","maxLength":60},"finish":{"type":"string","enum":["none","rawGold","gold","chrome","fire","ice","foil","stone"]},"tilt":{"type":"number","minimum":-12,"maximum":12},"tagline":{"type":"string","maxLength":60},"style":{"type":"string","enum":["bold","cinematic","clean","illustrated","neon","gilded","photo"]},"role":{"type":"string","enum":["auto","subject","host","none"]},"personaId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"logo":{"type":"object","properties":{"corner":{"type":"string","enum":["top-left","top-right","bottom-left","bottom-right"]},"size":{"type":"number","minimum":0.05,"maximum":0.4}},"required":["corner","size"]}}},"logo":{"anyOf":[{"type":"string","maxLength":3000000,"pattern":"^data:image\\/(png|jpeg|webp|svg\\+xml);base64,"},{"type":"null"}]}},"required":["name","kit"]},"MoveKitBody":{"type":"object","properties":{"spaceId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The client space to move this kit to."}},"required":["spaceId"]},"SpaceRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60},"memberIds":{"default":[],"maxItems":200,"type":"array","items":{"type":"string","maxLength":80}}},"required":["name"]},"ActiveSpaceBody":{"type":"object","properties":{"id":{"type":"string","maxLength":60,"description":"A space id, or empty for the workspace's default space."}},"required":["id"]},"PersonaRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60},"kitId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"kind":{"default":"creator","type":"string","enum":["creator","featured"]},"photos":{"minItems":2,"maxItems":3,"type":"array","items":{"type":"object","properties":{"angle":{"type":"string","enum":["front","left","right"]},"image":{"type":"string","maxLength":6000000,"pattern":"^data:image\\/(jpeg|png|webp);base64,"}},"required":["angle","image"]}},"consent":{"type":"boolean","const":true}},"required":["name","kitId","photos","consent"]},"MovePersonaBody":{"type":"object","properties":{"kitId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The brand this persona belongs to."}},"required":["kitId"]},"AddPhotoBody":{"type":"object","properties":{"angle":{"type":"string","enum":["front","left","right"]},"image":{"type":"string","maxLength":6000000,"pattern":"^data:image\\/(jpeg|png|webp);base64,"},"consent":{"type":"boolean","const":true}},"required":["angle","image","consent"]},"InvitationSpacesBody":{"type":"object","properties":{"spaceIds":{"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"The client spaces the invited person may work in."}},"required":["spaceIds"]},"CheckoutQuery":{"type":"object","properties":{"plan":{"type":"string","enum":["creator","pro","team"]},"interval":{"default":"month","type":"string","enum":["month","year"]}},"required":["plan"]},"SaveRequest":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"title":{"default":"","type":"string","maxLength":120},"background":{"type":"string","maxLength":12000000,"pattern":"^data:image\\/(jpeg|png|webp);base64,"},"preview":{"type":"string","maxLength":12000000,"pattern":"^data:image\\/(jpeg|png|webp);base64,"},"design":{"type":"object","properties":{"designVersion":{"default":1,"type":"number","const":1},"anchor":{"default":"center","type":"string","enum":["center","bottom"]},"backgroundTransform":{"type":"object","properties":{"x":{"type":"number","minimum":-1280,"maximum":1280},"y":{"type":"number","minimum":-720,"maximum":720},"scale":{"type":"number","minimum":0.25,"maximum":3}},"required":["x","y","scale"]},"shade":{"default":{"side":"none","strength":0},"type":"object","properties":{"side":{"type":"string","enum":["none","left","right","bottom","center","full"]},"strength":{"type":"number","minimum":0,"maximum":1}},"required":["side","strength"]},"layers":{"maxItems":60,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"text":{"type":"string","maxLength":500},"x":{"type":"number","minimum":-8000,"maximum":8000},"y":{"type":"number","minimum":-8000,"maximum":8000},"width":{"type":"number","minimum":1,"maximum":8000},"rotation":{"default":0,"type":"number","minimum":-360,"maximum":360},"fontSize":{"type":"number","minimum":4,"maximum":2000},"fontFamily":{"type":"string","minLength":1,"maxLength":160},"fontWeight":{"default":"400","type":"string","maxLength":12},"fill":{"default":"#ffffff","type":"string","maxLength":60},"stroke":{"default":"#000000","type":"string","maxLength":60},"strokeWidth":{"default":0,"type":"number","minimum":0,"maximum":200},"align":{"default":"left","type":"string","enum":["left","center","right"]},"uppercase":{"default":false,"type":"boolean"},"shadow":{"default":true,"type":"boolean"},"box":{"default":null,"anyOf":[{"type":"string","maxLength":60},{"type":"null"}]},"boxOpacity":{"default":1,"type":"number","minimum":0,"maximum":1},"boxRadius":{"default":0,"type":"number","minimum":0,"maximum":500},"boxOutlineOnly":{"type":"boolean"},"boxLineWidth":{"type":"number","minimum":0,"maximum":100},"gradient":{"default":null,"anyOf":[{"type":"string","enum":["rawGold","gold","chrome","fire","ice","foil","stone"]},{"type":"null"}]},"glow":{"default":null,"anyOf":[{"type":"string","maxLength":60},{"type":"null"}]},"letterSpacing":{"default":0,"type":"number","minimum":-200,"maximum":500},"wordSpacing":{"default":0,"type":"integer","minimum":-3,"maximum":50},"group":{"default":null,"anyOf":[{"type":"string","maxLength":80},{"type":"null"}]},"locked":{"default":false,"type":"boolean"}},"required":["text","x","y","width","fontSize","fontFamily"],"additionalProperties":{}}},"arrows":{"maxItems":8,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"x1":{"type":"number","minimum":-8000,"maximum":8000},"y1":{"type":"number","minimum":-8000,"maximum":8000},"x2":{"type":"number","minimum":-8000,"maximum":8000},"y2":{"type":"number","minimum":-8000,"maximum":8000},"bend":{"default":0,"type":"number","minimum":-5,"maximum":5},"color":{"default":"#ff2b1a","type":"string","maxLength":60},"width":{"default":22,"type":"number","minimum":1,"maximum":200}},"required":["x1","y1","x2","y2"]}},"ornaments":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"kind":{"type":"string","enum":["raw-short","raw-medium","raw-long","raw-rising","raw-falling","underline","cross","divider"]},"x":{"type":"number","minimum":-8000,"maximum":8000},"y":{"type":"number","minimum":-8000,"maximum":8000},"width":{"type":"number","minimum":1,"maximum":8000},"color":{"default":"gold","type":"string","maxLength":60},"rotation":{"type":"number","minimum":-360,"maximum":360}},"required":["kind","x","y","width"]}},"logo":{"anyOf":[{"type":"object","properties":{"src":{"type":"string","maxLength":3000000},"corner":{"type":"string","enum":["top-left","top-right","bottom-left","bottom-right"]},"size":{"type":"number","minimum":0.05,"maximum":0.4}},"required":["src","corner","size"]},{"type":"null"}]}}},"brief":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["preview","design"]},"TrackRequest":{"type":"object","properties":{"url":{"type":"string","minLength":5,"maxLength":300},"libraryItemId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["url"]},"Design":{"type":"object","properties":{"designVersion":{"default":1,"type":"number","const":1},"anchor":{"default":"center","type":"string","enum":["center","bottom"]},"backgroundTransform":{"type":"object","properties":{"x":{"type":"number","minimum":-1280,"maximum":1280},"y":{"type":"number","minimum":-720,"maximum":720},"scale":{"type":"number","minimum":0.25,"maximum":3}},"required":["x","y","scale"]},"shade":{"default":{"side":"none","strength":0},"type":"object","properties":{"side":{"type":"string","enum":["none","left","right","bottom","center","full"]},"strength":{"type":"number","minimum":0,"maximum":1}},"required":["side","strength"]},"layers":{"maxItems":60,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"text":{"type":"string","maxLength":500},"x":{"type":"number","minimum":-8000,"maximum":8000},"y":{"type":"number","minimum":-8000,"maximum":8000},"width":{"type":"number","minimum":1,"maximum":8000},"rotation":{"default":0,"type":"number","minimum":-360,"maximum":360},"fontSize":{"type":"number","minimum":4,"maximum":2000},"fontFamily":{"type":"string","minLength":1,"maxLength":160},"fontWeight":{"default":"400","type":"string","maxLength":12},"fill":{"default":"#ffffff","type":"string","maxLength":60},"stroke":{"default":"#000000","type":"string","maxLength":60},"strokeWidth":{"default":0,"type":"number","minimum":0,"maximum":200},"align":{"default":"left","type":"string","enum":["left","center","right"]},"uppercase":{"default":false,"type":"boolean"},"shadow":{"default":true,"type":"boolean"},"box":{"default":null,"anyOf":[{"type":"string","maxLength":60},{"type":"null"}]},"boxOpacity":{"default":1,"type":"number","minimum":0,"maximum":1},"boxRadius":{"default":0,"type":"number","minimum":0,"maximum":500},"boxOutlineOnly":{"type":"boolean"},"boxLineWidth":{"type":"number","minimum":0,"maximum":100},"gradient":{"default":null,"anyOf":[{"type":"string","enum":["rawGold","gold","chrome","fire","ice","foil","stone"]},{"type":"null"}]},"glow":{"default":null,"anyOf":[{"type":"string","maxLength":60},{"type":"null"}]},"letterSpacing":{"default":0,"type":"number","minimum":-200,"maximum":500},"wordSpacing":{"default":0,"type":"integer","minimum":-3,"maximum":50},"group":{"default":null,"anyOf":[{"type":"string","maxLength":80},{"type":"null"}]},"locked":{"default":false,"type":"boolean"}},"required":["text","x","y","width","fontSize","fontFamily"],"additionalProperties":{}}},"arrows":{"maxItems":8,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"x1":{"type":"number","minimum":-8000,"maximum":8000},"y1":{"type":"number","minimum":-8000,"maximum":8000},"x2":{"type":"number","minimum":-8000,"maximum":8000},"y2":{"type":"number","minimum":-8000,"maximum":8000},"bend":{"default":0,"type":"number","minimum":-5,"maximum":5},"color":{"default":"#ff2b1a","type":"string","maxLength":60},"width":{"default":22,"type":"number","minimum":1,"maximum":200}},"required":["x1","y1","x2","y2"]}},"ornaments":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"kind":{"type":"string","enum":["raw-short","raw-medium","raw-long","raw-rising","raw-falling","underline","cross","divider"]},"x":{"type":"number","minimum":-8000,"maximum":8000},"y":{"type":"number","minimum":-8000,"maximum":8000},"width":{"type":"number","minimum":1,"maximum":8000},"color":{"default":"gold","type":"string","maxLength":60},"rotation":{"type":"number","minimum":-360,"maximum":360}},"required":["kind","x","y","width"]}},"logo":{"anyOf":[{"type":"object","properties":{"src":{"type":"string","maxLength":3000000},"corner":{"type":"string","enum":["top-left","top-right","bottom-left","bottom-right"]},"size":{"type":"number","minimum":0.05,"maximum":0.4}},"required":["src","corner","size"]},{"type":"null"}]}}},"LayeredDesign":{"type":"object","properties":{"designVersion":{"default":1,"type":"number","const":1},"anchor":{"default":"center","type":"string","enum":["center","bottom"]},"backgroundTransform":{"type":"object","properties":{"x":{"type":"number","minimum":-1280,"maximum":1280},"y":{"type":"number","minimum":-720,"maximum":720},"scale":{"type":"number","minimum":0.25,"maximum":3}},"required":["x","y","scale"]},"shade":{"default":{"side":"none","strength":0},"type":"object","properties":{"side":{"type":"string","enum":["none","left","right","bottom","center","full"]},"strength":{"type":"number","minimum":0,"maximum":1}},"required":["side","strength"]},"layers":{"maxItems":60,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"text":{"type":"string","maxLength":500},"x":{"type":"number","minimum":-8000,"maximum":8000},"y":{"type":"number","minimum":-8000,"maximum":8000},"width":{"type":"number","minimum":1,"maximum":8000},"rotation":{"default":0,"type":"number","minimum":-360,"maximum":360},"fontSize":{"type":"number","minimum":4,"maximum":2000},"fontFamily":{"type":"string","minLength":1,"maxLength":160},"fontWeight":{"default":"400","type":"string","maxLength":12},"fill":{"default":"#ffffff","type":"string","maxLength":60},"stroke":{"default":"#000000","type":"string","maxLength":60},"strokeWidth":{"default":0,"type":"number","minimum":0,"maximum":200},"align":{"default":"left","type":"string","enum":["left","center","right"]},"uppercase":{"default":false,"type":"boolean"},"shadow":{"default":true,"type":"boolean"},"box":{"default":null,"anyOf":[{"type":"string","maxLength":60},{"type":"null"}]},"boxOpacity":{"default":1,"type":"number","minimum":0,"maximum":1},"boxRadius":{"default":0,"type":"number","minimum":0,"maximum":500},"boxOutlineOnly":{"type":"boolean"},"boxLineWidth":{"type":"number","minimum":0,"maximum":100},"gradient":{"default":null,"anyOf":[{"type":"string","enum":["rawGold","gold","chrome","fire","ice","foil","stone"]},{"type":"null"}]},"glow":{"default":null,"anyOf":[{"type":"string","maxLength":60},{"type":"null"}]},"letterSpacing":{"default":0,"type":"number","minimum":-200,"maximum":500},"wordSpacing":{"default":0,"type":"integer","minimum":-3,"maximum":50},"group":{"default":null,"anyOf":[{"type":"string","maxLength":80},{"type":"null"}]},"locked":{"default":false,"type":"boolean"}},"required":["text","x","y","width","fontSize","fontFamily"],"additionalProperties":{}}},"arrows":{"maxItems":8,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"x1":{"type":"number","minimum":-8000,"maximum":8000},"y1":{"type":"number","minimum":-8000,"maximum":8000},"x2":{"type":"number","minimum":-8000,"maximum":8000},"y2":{"type":"number","minimum":-8000,"maximum":8000},"bend":{"default":0,"type":"number","minimum":-5,"maximum":5},"color":{"default":"#ff2b1a","type":"string","maxLength":60},"width":{"default":22,"type":"number","minimum":1,"maximum":200}},"required":["x1","y1","x2","y2"]}},"ornaments":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"kind":{"type":"string","enum":["raw-short","raw-medium","raw-long","raw-rising","raw-falling","underline","cross","divider"]},"x":{"type":"number","minimum":-8000,"maximum":8000},"y":{"type":"number","minimum":-8000,"maximum":8000},"width":{"type":"number","minimum":1,"maximum":8000},"color":{"default":"gold","type":"string","maxLength":60},"rotation":{"type":"number","minimum":-360,"maximum":360}},"required":["kind","x","y","width"]}},"logo":{"anyOf":[{"type":"object","properties":{"src":{"type":"string","maxLength":3000000},"corner":{"type":"string","enum":["top-left","top-right","bottom-left","bottom-right"]},"size":{"type":"number","minimum":0.05,"maximum":0.4}},"required":["src","corner","size"]},{"type":"null"}]},"background":{"default":null,"anyOf":[{"type":"string","maxLength":12000000,"pattern":"^data:image\\/(jpeg|png|webp);base64,"},{"type":"null"}]}}},"RenderRequest":{"type":"object","properties":{"design":{"type":"object","properties":{"designVersion":{"default":1,"type":"number","const":1},"anchor":{"default":"center","type":"string","enum":["center","bottom"]},"backgroundTransform":{"type":"object","properties":{"x":{"type":"number","minimum":-1280,"maximum":1280},"y":{"type":"number","minimum":-720,"maximum":720},"scale":{"type":"number","minimum":0.25,"maximum":3}},"required":["x","y","scale"]},"shade":{"default":{"side":"none","strength":0},"type":"object","properties":{"side":{"type":"string","enum":["none","left","right","bottom","center","full"]},"strength":{"type":"number","minimum":0,"maximum":1}},"required":["side","strength"]},"layers":{"maxItems":60,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"text":{"type":"string","maxLength":500},"x":{"type":"number","minimum":-8000,"maximum":8000},"y":{"type":"number","minimum":-8000,"maximum":8000},"width":{"type":"number","minimum":1,"maximum":8000},"rotation":{"default":0,"type":"number","minimum":-360,"maximum":360},"fontSize":{"type":"number","minimum":4,"maximum":2000},"fontFamily":{"type":"string","minLength":1,"maxLength":160},"fontWeight":{"default":"400","type":"string","maxLength":12},"fill":{"default":"#ffffff","type":"string","maxLength":60},"stroke":{"default":"#000000","type":"string","maxLength":60},"strokeWidth":{"default":0,"type":"number","minimum":0,"maximum":200},"align":{"default":"left","type":"string","enum":["left","center","right"]},"uppercase":{"default":false,"type":"boolean"},"shadow":{"default":true,"type":"boolean"},"box":{"default":null,"anyOf":[{"type":"string","maxLength":60},{"type":"null"}]},"boxOpacity":{"default":1,"type":"number","minimum":0,"maximum":1},"boxRadius":{"default":0,"type":"number","minimum":0,"maximum":500},"boxOutlineOnly":{"type":"boolean"},"boxLineWidth":{"type":"number","minimum":0,"maximum":100},"gradient":{"default":null,"anyOf":[{"type":"string","enum":["rawGold","gold","chrome","fire","ice","foil","stone"]},{"type":"null"}]},"glow":{"default":null,"anyOf":[{"type":"string","maxLength":60},{"type":"null"}]},"letterSpacing":{"default":0,"type":"number","minimum":-200,"maximum":500},"wordSpacing":{"default":0,"type":"integer","minimum":-3,"maximum":50},"group":{"default":null,"anyOf":[{"type":"string","maxLength":80},{"type":"null"}]},"locked":{"default":false,"type":"boolean"}},"required":["text","x","y","width","fontSize","fontFamily"],"additionalProperties":{}}},"arrows":{"maxItems":8,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"x1":{"type":"number","minimum":-8000,"maximum":8000},"y1":{"type":"number","minimum":-8000,"maximum":8000},"x2":{"type":"number","minimum":-8000,"maximum":8000},"y2":{"type":"number","minimum":-8000,"maximum":8000},"bend":{"default":0,"type":"number","minimum":-5,"maximum":5},"color":{"default":"#ff2b1a","type":"string","maxLength":60},"width":{"default":22,"type":"number","minimum":1,"maximum":200}},"required":["x1","y1","x2","y2"]}},"ornaments":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":80},"kind":{"type":"string","enum":["raw-short","raw-medium","raw-long","raw-rising","raw-falling","underline","cross","divider"]},"x":{"type":"number","minimum":-8000,"maximum":8000},"y":{"type":"number","minimum":-8000,"maximum":8000},"width":{"type":"number","minimum":1,"maximum":8000},"color":{"default":"gold","type":"string","maxLength":60},"rotation":{"type":"number","minimum":-360,"maximum":360}},"required":["kind","x","y","width"]}},"logo":{"anyOf":[{"type":"object","properties":{"src":{"type":"string","maxLength":3000000},"corner":{"type":"string","enum":["top-left","top-right","bottom-left","bottom-right"]},"size":{"type":"number","minimum":0.05,"maximum":0.4}},"required":["src","corner","size"]},{"type":"null"}]},"background":{"default":null,"anyOf":[{"type":"string","maxLength":12000000,"pattern":"^data:image\\/(jpeg|png|webp);base64,"},{"type":"null"}]}}},"libraryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"format":{"default":"jpg","type":"string","enum":["jpg","png"]},"size":{"default":"4k","type":"string","enum":["hd","4k"]},"quality":{"default":0.92,"type":"number","minimum":0.5,"maximum":1}}},"KeyRequest":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":32},"scopes":{"anyOf":[{"maxItems":9,"type":"array","items":{"type":"string","enum":["generate","library:read","library:write","kits:read","kits:write","personas:read","personas:write","videos:read","videos:write"]}},{"type":"null"}]},"spaces":{"anyOf":[{"maxItems":200,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"null"}]}},"required":["name"]},"KeyPatch":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":32},"scopes":{"anyOf":[{"maxItems":9,"type":"array","items":{"type":"string","enum":["generate","library:read","library:write","kits:read","kits:write","personas:read","personas:write","videos:read","videos:write"]}},{"type":"null"}]},"spaces":{"anyOf":[{"maxItems":200,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"null"}]}}},"ThumbnailRequest":{"type":"object","properties":{"topic":{"type":"string","minLength":3,"maxLength":1500},"headline":{"type":"string","maxLength":80},"tagline":{"type":"string","maxLength":60},"kitId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"style":{"type":"string","enum":["bold","cinematic","clean","illustrated","neon","gilded","photo"]},"lettering":{"type":"object","properties":{"finish":{"type":"string","enum":["none","rawGold","gold","chrome","fire","ice","foil","stone"]},"font":{"type":"string","enum":["condensed","tall","wide","geometric","slab","serif","rounded","comic","brush","marker","script","tech"]},"accent":{"type":"string","enum":["condensed","tall","wide","geometric","slab","serif","rounded","comic","brush","marker","script","tech"]},"tilt":{"type":"number","minimum":-12,"maximum":12}}},"role":{"type":"string","enum":["subject","host","none"]},"subject":{"type":"object","properties":{"personaId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"lookId":{"type":"string","maxLength":80},"photos":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"string","maxLength":6000000,"pattern":"^data:image\\/(jpeg|png|webp);base64,"}},"look":{"type":"string","maxLength":1000},"anyone":{"type":"boolean"}}},"featured":{"type":"object","properties":{"personaId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"lookId":{"type":"string","maxLength":80},"photos":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"string","maxLength":6000000,"pattern":"^data:image\\/(jpeg|png|webp);base64,"}},"look":{"type":"string","maxLength":1000},"anyone":{"type":"boolean"}}},"expression":{"type":"string","maxLength":200},"intensity":{"type":"string","enum":["subtle","clear","extreme"]},"pose":{"type":"string","maxLength":200},"permission":{"type":"boolean"},"concept":{"type":"object","properties":{"title":{"type":"string","maxLength":60,"description":"Three or four words naming the idea."},"emotion":{"type":"string","maxLength":240,"description":"The subject's expression, specific enough to act: which feeling, how strong, what the eyes and mouth are doing."},"pose":{"type":"string","maxLength":320,"description":"One or two sentences: what the subject is doing with their body, hands and gaze, and how they are framed."},"background":{"type":"string","maxLength":420,"description":"Where they are and what is behind them: setting, props, light, colour. Name the two or three specific objects that prove the video's claim and say what state each is in, chosen from what this topic and this place actually contain — never the generic furniture of an office or a desk unless the video is about one. A vague word like messy or busy proves nothing, and a picture of a mood cannot be told apart from any other video's. No text or logos."}},"required":["title","emotion","pose","background"]},"niche":{"type":"object","properties":{"palette":{"type":"object","properties":{"hook":{"type":"object","properties":{"hex":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"name":{"type":"string","description":"A plain colour name, like \"bright yellow\"."}},"required":["hex","name"],"description":"Colour of the loudest word or line."},"body":{"type":"object","properties":{"hex":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"name":{"type":"string","description":"A plain colour name, like \"bright yellow\"."}},"required":["hex","name"],"description":"Colour of the rest of the headline."},"accent":{"type":"object","properties":{"hex":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"name":{"type":"string","description":"A plain colour name, like \"bright yellow\"."}},"required":["hex","name"],"description":"A second highlight colour used for a closing line or key word."},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Outline colour around the lettering."},"strokeWidth":{"type":"integer","minimum":0,"maximum":16,"description":"Outline weight on a 1280x720 canvas: 0 none, 6 medium, 12 heavy."}},"required":["hook","body","accent","stroke","strokeWidth"],"description":"Headline colours that would look at home among these thumbnails."},"lettering":{"type":"object","properties":{"font":{"type":"string","enum":["condensed","tall","wide","geometric","slab","serif","rounded","comic","brush","marker","script","tech"],"description":"The character of the typeface most winners use: condensed (heavy impact-style), tall (thin narrow all-caps), wide (broad heavy grotesque), geometric (round modern black sans), slab (heavy slab serif), serif (high-contrast display serif), rounded (soft chunky friendly), comic (comic-book lettering), brush (heavy painted dry-brush capitals), marker (felt-tip hand lettering), script (flowing cursive), tech (squared sci-fi or gaming)."},"uppercase":{"type":"boolean","description":"Whether the headline is set in all capitals."},"shadow":{"type":"boolean","description":"Whether the lettering carries a drop shadow or glow."},"gradient":{"type":"string","enum":["none","rawGold","gold","chrome","fire","ice","foil","stone"],"description":"If the letters are filled with something other than flat colour: gold (smooth gold gradient), foil (textured gold foil with bands of shine and sparkles), chrome, fire, ice, or stone (white lettering that is weathered, chipped or speckled). Otherwise none."},"glow":{"anyOf":[{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},{"type":"null"}],"description":"If a coloured glow sits behind the lettering, its colour; otherwise null."},"tilt":{"type":"number","minimum":-12,"maximum":12,"description":"How far the headline is tilted, in degrees: negative rises to the right, 0 is level."},"boxColor":{"anyOf":[{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},{"type":"null"}],"description":"If the winners set words on a solid coloured box or banner, that box's colour; otherwise null."}},"required":["font","uppercase","shadow","gradient","glow","tilt","boxColor"],"description":"How the headline lettering is set."},"picture":{"type":"string","maxLength":1500},"taglines":{"type":"object","properties":{"count":{"type":"number"},"of":{"type":"number"},"words":{"type":"number"},"examples":{"type":"array","items":{"type":"string"}},"font":{"type":["string","null"]},"fontKind":{"type":"string","enum":["condensed","tall","wide","geometric","slab","serif","rounded","comic","brush","marker","script","tech"]},"uppercase":{"type":"boolean"},"box":{"type":"boolean"}},"required":["count","of","words","examples"]}},"required":["palette","lettering","picture"]},"model":{"type":"string","enum":["openai/gpt-image-2.5-flare","openai/gpt-image-2.5-sunburst","openai/gpt-image-2","openai/gpt-image-1-mini","bfl/flux-pro-1.1","bfl/flux-2-pro","bytedance/seedream-4.5"]},"keep":{"default":true,"type":"boolean"}},"required":["topic"]},"ApiError":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable, specific, machine-readable: invalid_request, not_found, usage_limit_exceeded, idempotency_key_reused, key_scope_denied (the key lacks the scope the route needs), key_space_denied (the key may not work in that client space)…"},"message":{"type":"string","description":"For a person. May be reworded; never branch on it."},"type":{"type":"string","description":"The class, for branching without knowing every code.","enum":["validation","authentication","authorization","not_found","conflict","rate_limit","provider","unavailable","internal"]},"param":{"type":"string","description":"The request field at fault, when one is."},"requestId":{"type":"string","description":"The same id as the x-request-id response header. Quote it to support."}},"required":["code","message","type","requestId"],"additionalProperties":false}},"required":["error"],"description":"Every 4xx and 5xx response, in one shape.","additionalProperties":false},"Health":{"type":"object","properties":{"status":{"type":"string","enum":["operational"]},"apiVersion":{"type":"string","description":"The path version: v1."},"contractVersion":{"type":"string","description":"Semantic version of this contract."}},"required":["status","apiVersion","contractVersion"],"additionalProperties":false},"Concept":{"type":"object","properties":{"title":{"type":"string","description":"Three or four words naming the idea."},"emotion":{"type":"string"},"pose":{"type":"string"},"background":{"type":"string"}},"required":["title","emotion","pose","background"],"additionalProperties":false},"FocalRegion":{"type":"object","properties":{"kind":{"type":"string","enum":["person","object","action"]},"importance":{"type":"string","description":"primary is the presenter; secondary is the story — people, objects and actions a headline must not cover.","enum":["primary","secondary"]},"bounds":{"type":"object","properties":{"x":{"type":"number","description":"Left edge, as a percentage of the frame from 0 to 100.","minimum":0,"maximum":100},"y":{"type":"number","description":"Top edge, as a percentage of the frame from 0 to 100.","minimum":0,"maximum":100},"width":{"type":"number","description":"Width, as a percentage of the frame from 0 to 100.","minimum":0,"maximum":100},"height":{"type":"number","description":"Height, as a percentage of the frame from 0 to 100.","minimum":0,"maximum":100}},"required":["x","y","width","height"],"additionalProperties":false}},"required":["kind","importance","bounds"],"additionalProperties":false},"FocalClearance":{"type":"object","properties":{"found":{"type":"boolean"},"top":{"type":"number","description":"The highest point of any protected region, as a percentage of the frame from 0 to 100.","minimum":0,"maximum":100},"regions":{"type":"array","items":{"$ref":"#/components/schemas/FocalRegion"}},"text":{"type":"object","properties":{"x":{"type":"number","description":"Value, as a percentage of the frame from 0 to 100.","minimum":0,"maximum":100},"y":{"type":"number","description":"Value, as a percentage of the frame from 0 to 100.","minimum":0,"maximum":100},"width":{"type":"number","description":"Value, as a percentage of the frame from 0 to 100.","minimum":0,"maximum":100},"height":{"type":"number","description":"Value, as a percentage of the frame from 0 to 100.","minimum":0,"maximum":100}},"description":"Lettering already painted into the picture, when there is any (full mode).","additionalProperties":false}},"required":["found","top","regions"],"description":"What the finished picture protects. Bounds are percentages of the frame.","additionalProperties":false},"Thumbnail":{"type":"object","properties":{"id":{"anyOf":[{"type":"string","description":"The library item the thumbnail was kept as; null when keep was false."},{"type":"null"}]},"picture":{"anyOf":[{"type":"string","description":"Where to fetch it again: GET this path with the same credential."},{"type":"null"}]},"image":{"type":"string","description":"The finished thumbnail, 1280 × 720, words painted in, as a data URL (data:image/…;base64,…)."},"headline":{"type":"string","description":"The words on it — yours, or the one HitCanvas wrote when none was sent."},"model":{"type":"string","description":"The image model that painted it."},"requestId":{"type":"string","description":"The same id as the x-request-id header. Quote it to support."},"needsAdjustment":{"type":"boolean","description":"The painted headline still crosses the story after one automatic correction. Generate again, or send a different headline."},"usage":{"type":"object","properties":{"generations":{"type":"object","properties":{"used":{"type":"integer"},"cap":{"type":"integer","description":"The workspace's monthly allowance."}},"required":["used","cap"],"additionalProperties":false},"resetsAt":{"type":"string","format":"date-time"}},"required":["generations","resetsAt"],"description":"Where the workspace stands this month, after this one.","additionalProperties":false}},"required":["id","picture","image","headline","model","requestId","usage"],"description":"A finished thumbnail: the public API's answer.","additionalProperties":false},"Generated":{"type":"object","properties":{"image":{"type":"string","description":"The picture, as a data URL (data:image/…;base64,…)."},"model":{"type":"string","description":"The image model that painted it."},"pose":{"type":"string","description":"The pose the person was given, chosen or drawn."},"prompt":{"type":"string","description":"The exact prompt sent to the model."},"libraryId":{"type":"string","description":"The library item this picture was kept as, unless keep was false."},"made":{"type":"object","properties":{},"description":"Everything that went into the picture, so it can be understood and made again: the request as asked, the pose, the model, the prompt, the measurements, and madeAt.","additionalProperties":true},"clearBelow":{"type":"number","description":"Layout mode, words along the bottom: how far down the main face reaches. Fit type under it, as a fraction of the frame from 0 to 1.","minimum":0,"maximum":1},"clearAbove":{"type":"number","description":"Layout mode, words beside the subject: how far down that side is free before anybody's head, as a fraction of the frame from 0 to 1.","minimum":0,"maximum":1},"focal":{"$ref":"#/components/schemas/FocalClearance"},"needsAdjustment":{"type":"boolean","description":"Full mode only: the painted headline still crosses the story after one correction. The picture needs a composition change."}},"required":["image","model","prompt","made"],"description":"The engine's full answer. In full mode, the same picture POST /v1/thumbnails returns, with the record of how it was made. clearBelow, clearAbove and focal are layout-mode measurements for words the caller sets: Studio-only.","additionalProperties":false},"NicheVideo":{"type":"object","properties":{},"description":"One of the niche's outperforming videos: id, title, channel, views, its channel's typical views, and the multiple.","additionalProperties":true},"NicheBrief":{"type":"object","properties":{"summary":{"type":"string","description":"Two or three sentences on what these thumbnails have in common and why it earns the click."},"textSide":{"type":"string","enum":["left","right","bottom","center"],"description":"Where the headline most often sits."},"words":{"type":"integer","minimum":0,"maximum":20,"description":"Typical number of words on the thumbnail."},"fontName":{"type":["string","null"]},"secondFontName":{"type":["string","null"]},"fontWhy":{"type":"string"},"taglines":{"type":"object","properties":{"count":{"type":"number"},"of":{"type":"number"},"words":{"type":"number"},"examples":{"type":"array","items":{"type":"string"}},"font":{"type":["string","null"]},"fontKind":{"type":"string","enum":["condensed","tall","wide","geometric","slab","serif","rounded","comic","brush","marker","script","tech"]},"uppercase":{"type":"boolean"},"box":{"type":"boolean"}},"required":["count","of","words","examples"]},"wordsMix":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"of":{"type":"number"}},"required":["min","max","of"]},"palette":{"type":"object","properties":{"hook":{"type":"object","properties":{"hex":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"name":{"type":"string","description":"A plain colour name, like \"bright yellow\"."}},"required":["hex","name"],"description":"Colour of the loudest word or line."},"body":{"type":"object","properties":{"hex":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"name":{"type":"string","description":"A plain colour name, like \"bright yellow\"."}},"required":["hex","name"],"description":"Colour of the rest of the headline."},"accent":{"type":"object","properties":{"hex":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"name":{"type":"string","description":"A plain colour name, like \"bright yellow\"."}},"required":["hex","name"],"description":"A second highlight colour used for a closing line or key word."},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Outline colour around the lettering."},"strokeWidth":{"type":"integer","minimum":0,"maximum":16,"description":"Outline weight on a 1280x720 canvas: 0 none, 6 medium, 12 heavy."}},"required":["hook","body","accent","stroke","strokeWidth"],"description":"Headline colours that would look at home among these thumbnails."},"lettering":{"type":"object","properties":{"font":{"type":"string","enum":["condensed","tall","wide","geometric","slab","serif","rounded","comic","brush","marker","script","tech"],"description":"The character of the typeface most winners use: condensed (heavy impact-style), tall (thin narrow all-caps), wide (broad heavy grotesque), geometric (round modern black sans), slab (heavy slab serif), serif (high-contrast display serif), rounded (soft chunky friendly), comic (comic-book lettering), brush (heavy painted dry-brush capitals), marker (felt-tip hand lettering), script (flowing cursive), tech (squared sci-fi or gaming)."},"uppercase":{"type":"boolean","description":"Whether the headline is set in all capitals."},"shadow":{"type":"boolean","description":"Whether the lettering carries a drop shadow or glow."},"gradient":{"type":"string","enum":["none","rawGold","gold","chrome","fire","ice","foil","stone"],"description":"If the letters are filled with something other than flat colour: gold (smooth gold gradient), foil (textured gold foil with bands of shine and sparkles), chrome, fire, ice, or stone (white lettering that is weathered, chipped or speckled). Otherwise none."},"glow":{"anyOf":[{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},{"type":"null"}],"description":"If a coloured glow sits behind the lettering, its colour; otherwise null."},"tilt":{"type":"number","minimum":-12,"maximum":12,"description":"How far the headline is tilted, in degrees: negative rises to the right, 0 is level."},"boxColor":{"anyOf":[{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},{"type":"null"}],"description":"If the winners set words on a solid coloured box or banner, that box's colour; otherwise null."}},"required":["font","uppercase","shadow","gradient","glow","tilt","boxColor"],"description":"How the headline lettering is set."},"shade":{"type":"object","properties":{"side":{"type":"string","enum":["none","left","right","bottom","center","full"],"description":"Where the picture is darkened behind the words so they read: usually the side the words sit on, none if the pictures are left bright."},"strength":{"type":"number","minimum":0,"maximum":1,"description":"How dark: 0.3 subtle, 0.6 clear, 0.9 nearly black."}},"required":["side","strength"],"description":"The darkening behind the headline."},"style":{"type":"string","enum":["bold","cinematic","clean","illustrated","neon","gilded","photo"],"description":"Which picture style fits these thumbnails best: bold (saturated, punchy), cinematic (moody film still), clean (minimal studio), illustrated (vector art), neon (dark with neon glow), photo (natural photoreal)."},"role":{"type":"string","enum":["subject","host","none"],"description":"The part the person plays in most of these thumbnails. host: the person PRESENTS the video, a creator or commentator addressing the viewer, set beside or in front of a separate visual that is what the video is about. subject: the person IS what the video is about. That includes anyone who is not the presenter, an athlete in uniform, a guest, a public figure, whatever logos, scores or graphics sit beside them, and it includes a creator who is simply inside one ordinary scene. none: most of these thumbnails have no person in them at all."},"roleMix":{"type":"object","properties":{"host":{"type":"number"},"subject":{"type":"number"},"none":{"type":"number"}},"required":["host","subject","none"]},"people":{"type":"string","enum":["creator","featured","both"]},"peopleMix":{"type":"object","properties":{"creator":{"type":"number"},"featured":{"type":"number"},"both":{"type":"number"}},"required":["creator","featured","both"]},"arrows":{"type":"object","properties":{"count":{"type":"number"},"of":{"type":"number"},"pointsAt":{"type":["string","null"]}},"required":["count","of","pointsAt"]},"picture":{"type":"string","description":"One paragraph an image model can follow to paint a background in this niche's style: subject type, framing, expression, lighting, colour grade, background treatment. Describe the look only — no list of objects or props, no settings as such, no names, no channel branding, no text. What is in a picture is decided by each video; this is how the winners' pictures look, not what is in them."},"avoid":{"maxItems":5,"type":"array","items":{"type":"string"},"description":"Things the winners never do that a newcomer might."}},"required":["summary","textSide","words","palette","lettering","shade","style","role","picture","avoid"]},"Study":{"type":"object","properties":{"version":{"type":"integer"},"query":{"type":"object","properties":{"niche":{"type":"string"},"days":{"type":"integer"},"region":{"type":"string"}},"required":["niche","days","region"],"additionalProperties":false},"videos":{"type":"array","items":{"$ref":"#/components/schemas/NicheVideo"}},"searched":{"type":"integer","description":"How many videos search returned."},"qualified":{"type":"integer","description":"How many passed the filters; the brief reads the best ten."},"warning":{"type":"string","description":"Set when the sample is too thin to trust fully."},"brief":{"$ref":"#/components/schemas/NicheBrief"},"model":{"type":"string"},"studiedAt":{"type":"string","format":"date-time"},"cached":{"type":"boolean","description":"Served from an earlier study of the same niche, at no cost and not counted."}},"required":["query","videos","searched","qualified","brief","model","studiedAt"],"additionalProperties":false},"Direction":{"type":"object","properties":{"concepts":{"type":"array","items":{"$ref":"#/components/schemas/Concept"}},"model":{"type":"string"}},"required":["concepts","model"],"additionalProperties":false},"Headlines":{"type":"object","properties":{"headlines":{"type":"array","items":{"type":"string"}},"taglines":{"type":"array","items":{"type":"string"},"description":"Only when the niche's winners carry taglines."},"model":{"type":"string"}},"required":["headlines","taglines","model"],"additionalProperties":false},"Finding":{"type":"object","properties":{"area":{"type":"string"},"verdict":{"type":"string","enum":["matches","differs"]},"finding":{"type":"string","description":"What was found, stated so it can be checked."},"fix":{"type":"string","description":"What to do about it; empty when nothing needs doing."},"source":{"type":"string","description":"Counted from the design, or seen by the vision model.","enum":["measured","seen"]}},"required":["area","verdict","finding","fix","source"],"additionalProperties":false},"Review":{"type":"object","properties":{"findings":{"type":"array","items":{"$ref":"#/components/schemas/Finding"}},"matches":{"type":"integer"},"differs":{"type":"integer"},"score":{"type":"object","properties":{"percent":{"type":"number"},"passed":{"type":"integer"},"total":{"type":"integer"},"areas":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"passed":{"type":"integer"},"total":{"type":"integer"}},"required":["name","passed","total"],"additionalProperties":false}}},"required":["percent","passed","total","areas"],"additionalProperties":false},"model":{"type":"string"},"analysisVersion":{"type":"string","description":"Semantic version of the review methodology. A changed score with the same thumbnail means this moved."}},"required":["findings","matches","differs","score","model","analysisVersion"],"additionalProperties":false},"Improved":{"type":"object","properties":{"image":{"type":"string","description":"The changed picture, as a data URL (data:image/…;base64,…)."},"model":{"type":"string"},"prompt":{"type":"string"},"libraryId":{"type":"string"},"made":{"type":"object","properties":{},"description":"The original's record, continued.","additionalProperties":true}},"required":["image","model","prompt","made"],"additionalProperties":false},"Job":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["thumbnails","generate","study","direct","headlines","review","improve"]},"status":{"type":"string","enum":["queued","running","succeeded","failed"]},"requestId":{"type":"string","description":"The id the work ran under; the same one a direct call would have logged."},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"finishedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"result":{"type":"object","properties":{},"description":"When succeeded: the very response the direct route would have sent, parsed.","additionalProperties":true},"error":{"$ref":"#/components/schemas/ApiError","description":"When failed: the same error the direct route would have sent."}},"required":["id","kind","status","requestId","createdAt"],"additionalProperties":false},"LibraryItem":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"hasDesign":{"type":"boolean","description":"Whether a design was saved on it, or it is a picture alone."},"createdBy":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"picture":{"type":"string","description":"Path to the picture, on this API. GET it with the same credential."},"preview":{"anyOf":[{"type":"string","description":"Path to the rendered preview, when a design was saved."},{"type":"null"}]}},"required":["id","title","hasDesign","createdBy","createdAt","updatedAt","picture","preview"],"additionalProperties":false},"LibraryItemFull":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"hasDesign":{"type":"boolean"},"createdBy":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"picture":{"type":"string"},"preview":{"anyOf":[{"type":"string"},{"type":"null"}]},"design":{"anyOf":[{"$ref":"#/components/schemas/Design","description":"The editable design as saved, versioned by designVersion. Round-trip it through POST /v1/library, or send it to POST /v1/renders."},{"type":"null"}]},"brief":{"type":"object","properties":{},"description":"How the picture was made.","additionalProperties":true}},"required":["id","title","hasDesign","createdBy","createdAt","updatedAt","picture","preview","design","brief"],"additionalProperties":false},"Kit":{"type":"object","properties":{"niche":{"type":"string","maxLength":120},"days":{"type":"integer","exclusiveMinimum":0,"maximum":3650},"colours":{"type":"object","properties":{"hook":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"body":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"accent":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}},"required":["hook","body","accent","stroke"]},"font":{"type":"string","maxLength":60},"finish":{"type":"string","enum":["none","rawGold","gold","chrome","fire","ice","foil","stone"]},"tilt":{"type":"number","minimum":-12,"maximum":12},"tagline":{"type":"string","maxLength":60},"style":{"type":"string","enum":["bold","cinematic","clean","illustrated","neon","gilded","photo"]},"role":{"type":"string","enum":["auto","subject","host","none"]},"personaId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"logo":{"type":"object","properties":{"corner":{"type":"string","enum":["top-left","top-right","bottom-left","bottom-right"]},"size":{"type":"number","minimum":0.05,"maximum":0.4}},"required":["corner","size"]}}},"BrandKit":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"kit":{"$ref":"#/components/schemas/Kit"},"logo":{"anyOf":[{"type":"string","description":"Path to the logo image on this API."},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","name","kit","logo","updatedAt"],"additionalProperties":false},"Space":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"isDefault":{"type":"boolean","description":"The one space everyone in the workspace can read; where a call with no x-hitcanvas-space works."}},"required":["id","name"],"additionalProperties":false},"Persona":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"kitId":{"anyOf":[{"type":"string","description":"The brand it belongs to."},{"type":"null"}]},"name":{"type":"string"},"kind":{"type":"string","enum":["creator","featured"]},"photos":{"type":"array","items":{"type":"string","description":"Path to a photo on this API."}},"angles":{"type":"array","items":{"type":"string","enum":["front","left","right"]},"description":"Which way each photo faces, in the same order."},"looks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"photos":{"type":"array","items":{"type":"string"}},"angles":{"type":"array","items":{"type":"string"}}},"required":["id","name","description","photos","angles"],"additionalProperties":false}},"consentBy":{"type":"string","description":"Who recorded the person's consent."},"createdAt":{"type":"string","format":"date-time"}},"required":["id","kitId","name","kind","photos","angles","looks","consentBy","createdAt"],"additionalProperties":false},"Usage":{"type":"object","properties":{"month":{"type":"string","description":"YYYY-MM"},"resetsAt":{"type":"string","format":"date-time"},"generation":{"type":"object","properties":{"used":{"type":"integer"},"cap":{"type":"integer","description":"The monthly allowance."}},"required":["used","cap"],"description":"Pictures: thumbnails, generate and improve.","additionalProperties":false},"study":{"type":"object","properties":{"used":{"type":"integer"},"cap":{"type":"integer"}},"required":["used","cap"],"description":"Niche studies.","additionalProperties":false},"idea":{"type":"object","properties":{"used":{"type":"integer"},"cap":{"type":"integer"}},"required":["used","cap"],"description":"Concepts, headlines and reviews.","additionalProperties":false},"byKey":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true},"description":"Owners and admins only, signed in: this month by API key."},"bySpace":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true},"description":"Owners and admins only, signed in: this month by client space."}},"required":["month","resetsAt","generation","study","idea"],"additionalProperties":false},"Tracked":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"videoId":{"type":"string"},"title":{"type":"string"},"channel":{"type":"string"},"channelId":{"type":"string"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}]},"publishedAt":{"type":"string"},"ageDays":{"type":"integer"},"views":{"type":"integer"},"subscribers":{"type":"integer"},"typical":{"type":"integer","description":"The channel's typical views for a video this age."},"comparedWith":{"type":"integer","description":"How many of its videos that typical figure is drawn from."},"libraryItemId":{"anyOf":[{"type":"string"},{"type":"null"}]},"preview":{"anyOf":[{"type":"string"},{"type":"null"}]},"analytics":{"anyOf":[{"type":"object","properties":{"days":{"type":"array","items":{"type":"object","properties":{"day":{"type":"string"},"views":{"type":"integer"}},"additionalProperties":false}},"sources":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string"},"views":{"type":"integer"}},"additionalProperties":false}}},"description":"Only for a connected channel that owns the video.","additionalProperties":true},{"type":"null"}]}},"required":["id","videoId","title","channel","channelId","publishedAt","ageDays","views","subscribers","typical","comparedWith"],"additionalProperties":false},"Scope":{"type":"string","description":"What a key may do. generate: Make pictures, studies, concepts, headlines, reviews and improvements — the paid work — and run them as jobs. library:read: List the library, open an item, fetch its picture, and render a design. library:write: Save designs and remove items. kits:read: List brand kits and fetch their logos. kits:write: Create and change brand kits. personas:read: List saved people and fetch their photos. personas:write: Save, change and remove people, their photos and looks. videos:read: List the videos being watched. videos:write: Watch and stop watching videos.","enum":["generate","library:read","library:write","kits:read","kits:write","personas:read","personas:write","videos:read","videos:write"]},"Key":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"start":{"type":"string","description":"The first characters of the key, to tell keys apart. The key itself is shown once, when made."},"createdAt":{"type":"string","format":"date-time"},"lastRequest":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"enabled":{"type":"boolean"},"scopes":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/Scope"}},{"type":"null"}],"description":"The scopes it holds. Null is every scope — what every key made before scopes existed has."},"spaces":{"anyOf":[{"type":"array","items":{"type":"string","description":"A client space's id"}},{"type":"null"}],"description":"The client spaces it may work in. Null is every space."}},"required":["id","name","start","createdAt","lastRequest","enabled","scopes","spaces"],"additionalProperties":false},"KeyCreated":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"start":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"lastRequest":{"anyOf":[{"type":"string"},{"type":"null"}]},"enabled":{"type":"boolean"},"scopes":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/Scope"}},{"type":"null"}]},"spaces":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"key":{"type":"string","description":"The key itself. Shown this once; it is stored hashed."}},"required":["id","name","start","createdAt","enabled","scopes","spaces","key"],"additionalProperties":false},"Face":{"type":"object","properties":{"name":{"type":"string","description":"What the picker calls it. Accepted as fontFamily on its own."},"group":{"type":"string"},"kind":{"type":"string","enum":["condensed","tall","wide","geometric","slab","serif","rounded","comic","brush","marker","script","tech"]},"fontFamily":{"type":"string","description":"The value to put in a text layer's fontFamily, exactly."},"fontWeight":{"type":"string","description":"The value to put in its fontWeight."},"source":{"type":"string","description":"Where the file comes from: a hand-picked Google face, the wider catalogue, or a file HitCanvas ships.","enum":["hand-picked","catalogue","own"]}},"required":["name","group","kind","fontFamily","fontWeight","source"],"additionalProperties":false},"Connection":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"channelId":{"anyOf":[{"type":"string"},{"type":"null"}]},"title":{"type":"string"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}]},"connectedBy":{"type":"string"},"connectedAt":{"type":"string","format":"date-time"},"canList":{"type":"boolean","description":"Whether its uploads can be listed."}},"required":["id","title","connectedBy","connectedAt","canList"],"additionalProperties":false},"Upload":{"type":"object","properties":{"videoId":{"type":"string"},"title":{"type":"string"},"publishedAt":{"type":"string"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}]},"privacy":{"type":"string"}},"required":["videoId","title","publishedAt"],"additionalProperties":false},"LookRequest":{"type":"object","properties":{"name":{"type":"string","maxLength":60},"description":{"type":"string","description":"How the person is styled: clothing, hair, grooming, accessories.","maxLength":1000},"photos":{"type":"array","items":{"type":"object","properties":{"angle":{"type":"string","enum":["front","left","right"]},"image":{"type":"string","description":"A photo, as a data URL (data:image/…;base64,…)."}},"required":["angle","image"],"additionalProperties":false}}},"required":["name","description"],"additionalProperties":false}}},"paths":{"/v1/health":{"get":{"operationId":"getHealth","summary":"Whether the API is up, and which contract it speaks.","tags":["Meta"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","security":[],"responses":{"200":{"description":"Health.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}},"/v1/openapi.json":{"get":{"operationId":"getOpenapiJson","summary":"This document.","tags":["Meta"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","security":[],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{},"description":"OpenAPI 3.1.","additionalProperties":true}}}}}}},"/v1/thumbnails":{"post":{"operationId":"postThumbnails","summary":"A finished thumbnail from a creative brief: the words painted in, nothing to set or render. One generation.","description":"The public API in one call. Describe the video, say the words (or leave them to HitCanvas, which counts as an idea), name a style, add the person and their photos if there is one, and get back a 1280 × 720 picture with the headline painted in, kept in the workspace's library. If the painted words land on the story the picture is corrected once (another generation); needsAdjustment says if that did not take. The person in it can be a saved persona — subject.personaId, with one of their looks as lookId — or photos sent along. A brand kit (kitId) fills in wherever the brief is silent — style, lettering, colours, tagline, role — brings its person as the subject when none is named (subject.anyone: true asks for a drawn stranger instead), and sets its logo in its corner of the finished picture. Send x-hitcanvas-space to make it for a client. Takes two minutes at most; POST /v1/jobs with kind \"thumbnails\" runs it after answering.","tags":["Thumbnails"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"generate","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThumbnailRequest"}}}},"responses":{"200":{"description":"Thumbnail.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Thumbnail"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"501":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/improve":{"post":{"operationId":"postImprove","summary":"The same thumbnail back with a review's changes made. One generation.","tags":["Thumbnails"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"generate","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImproveRequest"}}}},"responses":{"200":{"description":"Improved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Improved"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/study":{"post":{"operationId":"postStudy","summary":"The niche's outperforming thumbnails, and a brief on what they share. Cached for a day and not counted when served from cache.","tags":["Ideas"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"generate","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudyRequest"}}}},"responses":{"200":{"description":"Study.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Study"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/direct":{"post":{"operationId":"postDirect","summary":"Three concepts for the picture: emotion, pose and background. Counts as an idea.","tags":["Ideas"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"generate","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DirectRequest"}}}},"responses":{"200":{"description":"Direction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Direction"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/headlines":{"post":{"operationId":"postHeadlines","summary":"Five headlines from what the video is about. Counts as an idea.","tags":["Ideas"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"generate","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeadlinesRequest"}}}},"responses":{"200":{"description":"Headlines.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Headlines"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/review":{"post":{"operationId":"postReview","summary":"A finished thumbnail checked against its niche brief. Counts as an idea.","tags":["Ideas"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"generate","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}}}},"responses":{"200":{"description":"Review.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/generate":{"post":{"operationId":"postGenerate","summary":"The engine directly: layout mode (a background with measurements for words you set) or full mode (what POST /v1/thumbnails wraps).","description":"Layout mode returns a background and measurements — clearBelow, clearAbove, focal — for setting real type over it, which is what the Studio does with its own canvas, fonts and renderer. Full mode paints the headline itself; new integrations should use POST /v1/thumbnails, which takes a plainer brief and answers with the finished picture. Counts as one generation; a correction counts as another.\n\nAdvanced, Studio-facing surface: served for integrations that built on it before the public API settled on POST /v1/thumbnails, and marked deprecated in this document and with a Deprecation: true header on every answer. Not part of new public guidance. Nothing here is restricted or removed without the published compatibility path — notice to existing callers, a contract version, then the change. See /developers#compatibility.","tags":["Advanced"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"studio","deprecated":true,"x-hitcanvas-scope":"generate","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRequest"}}}},"responses":{"200":{"description":"Generated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Generated"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/jobs":{"post":{"operationId":"postJobs","summary":"Any of the picture calls as a job: 202 now, the route's own response later.","description":"The work runs after the answer and is billed exactly as the direct call would be. Poll GET /v1/jobs/{id}.","tags":["Jobs"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"generate","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobRequest"}}}},"responses":{"202":{"description":"Job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"501":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/jobs/{id}":{"get":{"operationId":"getJobsId","summary":"A job's status and, once finished, its result or error.","tags":["Jobs"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"generate","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"Job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/library":{"get":{"operationId":"getLibrary","summary":"Everything this space has made, newest first.","tags":["Library"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"library:read","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/LibraryItem"}}},"required":["items"],"additionalProperties":false}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"501":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"postLibrary","summary":"Save a layered design onto the item it was made from, or as a new one.","description":"Advanced, Studio-facing surface: served for integrations that built on it before the public API settled on POST /v1/thumbnails, and marked deprecated in this document and with a Deprecation: true header on every answer. Not part of new public guidance. Nothing here is restricted or removed without the published compatibility path — notice to existing callers, a contract version, then the change. See /developers#compatibility.","tags":["Advanced"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"studio","deprecated":true,"x-hitcanvas-scope":"library:write","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveRequest"}}}},"responses":{"200":{"description":"LibraryItemFull.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LibraryItemFull"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"501":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deleteLibrary","summary":"Clear the pictures that were never saved as a design (?unsaved=1).","tags":["Library"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"library:write","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"unsaved","in":"query","required":false,"schema":{"type":"string","description":"Must be 1.","enum":["1"]}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"removed":{"type":"integer"}},"required":["removed"],"additionalProperties":false}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"501":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/renders":{"post":{"operationId":"postRenders","summary":"A layered design drawn as a file: 3840 × 2160 (or the 1280 × 720 frame) as JPG or PNG.","description":"The studio's export, over HTTP: text is drawn fresh at the output size in the face the layer names, over the picture, with the shade, arrows, ornaments and logo the design carries. Send a design with its picture in it, or a libraryId to render a saved design on its own picture. Not a model call, so it is not counted against the allowance. ?download=1 adds a content-disposition. A font the API does not know is a 422 naming the layer; GET /v1/fonts lists every face.\n\nAdvanced, Studio-facing surface: served for integrations that built on it before the public API settled on POST /v1/thumbnails, and marked deprecated in this document and with a Deprecation: true header on every answer. Not part of new public guidance. Nothing here is restricted or removed without the published compatibility path — notice to existing callers, a contract version, then the change. See /developers#compatibility.","tags":["Advanced"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"studio","deprecated":true,"x-hitcanvas-scope":"library:read","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderRequest"}}}},"responses":{"200":{"description":"The file.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}}},"headers":{"content-type":{"schema":{"type":"string"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/fonts":{"get":{"operationId":"getFonts","summary":"Every headline face a layered design can name, with the exact fontFamily and fontWeight to put in a text layer.","description":"Advanced, Studio-facing surface: served for integrations that built on it before the public API settled on POST /v1/thumbnails, and marked deprecated in this document and with a Deprecation: true header on every answer. Not part of new public guidance. Nothing here is restricted or removed without the published compatibility path — notice to existing callers, a contract version, then the change. See /developers#compatibility.","tags":["Advanced"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"studio","deprecated":true,"security":[],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"faces":{"type":"array","items":{"$ref":"#/components/schemas/Face"}}},"required":["faces"],"additionalProperties":false}}}}}}},"/v1/library/{id}":{"get":{"operationId":"getLibraryId","summary":"One item with its text layers and the settings behind it.","tags":["Library"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"library:read","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"LibraryItemFull.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LibraryItemFull"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deleteLibraryId","summary":"Remove an item.","tags":["Library"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"library:write","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"204":{"description":"Done. No body."},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/library/{id}/image":{"get":{"operationId":"getLibraryIdImage","summary":"The picture itself. ?which=preview for the rendered preview; ?download=1 to get it as an attachment.","tags":["Library"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"library:read","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"which","in":"query","required":false,"schema":{"type":"string","enum":["picture","preview"]}},{"name":"download","in":"query","required":false,"schema":{"type":"string","enum":["1"]}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"The file.","content":{"image/*":{"schema":{"type":"string","format":"binary"}}},"headers":{"content-type":{"schema":{"type":"string"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/kits":{"get":{"operationId":"getKits","summary":"The space's brand kits.","tags":["Brand kits"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"kits:read","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"kits":{"type":"array","items":{"$ref":"#/components/schemas/BrandKit"}},"space":{"type":"string","description":"The space these belong to."},"elsewhere":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"brands":{"type":"integer"}},"additionalProperties":false},"description":"Other spaces that hold kits, when this one is empty."}},"required":["kits"],"additionalProperties":false}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"postKits","summary":"Create a brand kit.","tags":["Brand kits"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"kits:write","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KitRequest"}}}},"responses":{"200":{"description":"BrandKit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandKit"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/kits/{id}":{"put":{"operationId":"putKitsId","summary":"Replace a kit's name, look and logo.","tags":["Brand kits"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"kits:write","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KitRequest"}}}},"responses":{"200":{"description":"BrandKit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandKit"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"patch":{"operationId":"patchKitsId","summary":"Move a kit to another client space.","tags":["Brand kits"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"public","x-hitcanvas-requires":"owner or admin","security":[{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveKitBody"}}}},"responses":{"200":{"description":"BrandKit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandKit"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deleteKitsId","summary":"Remove a kit. Refused while personas belong to it.","tags":["Brand kits"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"public","x-hitcanvas-requires":"owner or admin","security":[{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"204":{"description":"Done. No body."},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/kits/{id}/logo":{"get":{"operationId":"getKitsIdLogo","summary":"The kit's logo image.","tags":["Brand kits"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"kits:read","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"The file.","content":{"image/*":{"schema":{"type":"string","format":"binary"}}},"headers":{"content-type":{"schema":{"type":"string"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/personas":{"get":{"operationId":"getPersonas","summary":"The space's saved people.","tags":["Personas"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"personas:read","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"personas":{"type":"array","items":{"$ref":"#/components/schemas/Persona"}},"available":{"type":"boolean","description":"Whether this server keeps personas at all."}},"required":["personas"],"additionalProperties":false}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"postPersonas","summary":"Save a person: one to three photos of the same face, with recorded consent, filed under a brand.","tags":["Personas"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"personas:write","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaRequest"}}}},"responses":{"200":{"description":"Persona.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Persona"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"501":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/personas/{id}":{"patch":{"operationId":"patchPersonasId","summary":"Move a persona to another brand.","tags":["Personas"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"personas:write","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MovePersonaBody"}}}},"responses":{"200":{"description":"Persona.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Persona"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deletePersonasId","summary":"Remove a person and their photos.","tags":["Personas"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"personas:write","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"204":{"description":"Done. No body."},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/personas/{id}/photo":{"get":{"operationId":"getPersonasIdPhoto","summary":"One of the person's photos: ?n=0..2, or ?look=<lookId>&n=….","tags":["Personas"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"personas:read","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"n","in":"query","required":false,"schema":{"type":"integer","description":"Which photo, 0 to 2."}},{"name":"look","in":"query","required":false,"schema":{"type":"string","description":"A look's id, for that look's photos."}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"The file.","content":{"image/*":{"schema":{"type":"string","format":"binary"}}},"headers":{"content-type":{"schema":{"type":"string"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"postPersonasIdPhoto","summary":"Add a photo at an angle the person does not have yet. Three at most.","tags":["Personas"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"personas:write","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddPhotoBody"}}}},"responses":{"200":{"description":"Persona.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Persona"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deletePersonasIdPhoto","summary":"Remove photo ?n=…. Two must remain.","tags":["Personas"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"personas:write","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"n","in":"query","required":false,"schema":{"type":"integer","description":"Which photo, 0 to 2."}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"Persona.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Persona"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/personas/{id}/looks":{"post":{"operationId":"postPersonasIdLooks","summary":"Save a look: a named description of how the person is styled, with its own photos.","tags":["Personas"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"personas:write","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LookRequest"}}}},"responses":{"200":{"description":"Persona.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Persona"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deletePersonasIdLooks","summary":"Remove look ?look=<lookId>.","tags":["Personas"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"personas:write","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"look","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"Persona.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Persona"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/spaces":{"get":{"operationId":"getSpaces","summary":"The client spaces you can work in, which is active, and (owners and admins) who is in each.","tags":["Spaces"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"spaces":{"type":"array","items":{"$ref":"#/components/schemas/Space"}},"active":{"type":"string"},"canManage":{"type":"boolean"},"defaultName":{"type":"string"},"people":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true},"description":"Owners and admins only."}},"required":["spaces","active","canManage"],"additionalProperties":false}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"postSpaces","summary":"Create a client space.","tags":["Spaces"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"public","x-hitcanvas-requires":"owner or admin","security":[{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpaceRequest"}}}},"responses":{"200":{"description":"Space.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Space"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"501":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"patch":{"operationId":"patchSpaces","summary":"Change who is in which space.","tags":["Spaces"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"public","x-hitcanvas-requires":"owner or admin","security":[{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpaceRequest"}}}},"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":true}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"501":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/spaces/active":{"post":{"operationId":"postSpacesActive","summary":"Move your session into a space. Sets a cookie; every request checks it again.","tags":["Spaces"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"public","security":[{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActiveSpaceBody"}}}},"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"active":{"type":"string"}},"required":["active"],"additionalProperties":false}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/spaces/{id}":{"put":{"operationId":"putSpacesId","summary":"Rename a space.","tags":["Spaces"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"public","x-hitcanvas-requires":"owner or admin","security":[{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpaceRequest"}}}},"responses":{"200":{"description":"Space.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Space"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deleteSpacesId","summary":"Remove a space, moving its work to ?moveTo=general or another space's id.","tags":["Spaces"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"public","x-hitcanvas-requires":"owner or admin","security":[{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"moveTo","in":"query","required":false,"schema":{"type":"string","description":"general, or a space id."}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"204":{"description":"Done. No body."},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/invitations/{id}/spaces":{"put":{"operationId":"putInvitationsIdSpaces","summary":"Which client spaces an invited person may work in.","tags":["Spaces"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"public","x-hitcanvas-requires":"owner or admin","security":[{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationSpacesBody"}}}},"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"added":{"type":"integer"}},"required":["added"],"additionalProperties":false}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"postInvitationsIdSpaces","summary":"Claim the spaces an invitation granted, on accepting it.","tags":["Spaces"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"public","security":[{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"added":{"type":"integer"}},"required":["added"],"additionalProperties":false}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/videos":{"get":{"operationId":"getVideos","summary":"Published videos being watched, each against its channel's typical video. Public data, read by HitCanvas with its own YouTube credentials.","description":"Nothing here needs a YouTube account from you. The `analytics` field is filled only for a video on a channel somebody connected in the Studio; for every other video it is null and everything else is present.","tags":["Videos"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"videos:read","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"videos":{"type":"array","items":{"$ref":"#/components/schemas/Tracked"}}},"required":["videos"],"additionalProperties":false}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"postVideos","summary":"Watch a video by link.","tags":["Videos"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"videos:write","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackRequest"}}}},"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":false}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"501":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/videos/{id}":{"delete":{"operationId":"deleteVideosId","summary":"Stop watching a video.","tags":["Videos"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","x-hitcanvas-scope":"videos:write","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"204":{"description":"Done. No body."},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/youtube":{"get":{"operationId":"getYoutube","summary":"YouTube channels a signed-in person connected in the Studio. Sessions only; a key is refused.","description":"A Studio feature: a person connects their own channel with Google OAuth, in a signed-in browser session, for things only their account can do — picking one of their existing thumbnails to review, reading their analytics. Not part of the public API: an API customer never connects a YouTube account, and nothing in thumbnail generation or research needs one. An API key is refused with session_required.\n\nAdvanced, Studio-facing surface: served for integrations that built on it before the public API settled on POST /v1/thumbnails, and marked deprecated in this document and with a Deprecation: true header on every answer. Not part of new public guidance. Nothing here is restricted or removed without the published compatibility path — notice to existing callers, a contract version, then the change. See /developers#compatibility.","tags":["Advanced"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"studio","deprecated":true,"security":[{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"connections":{"type":"array","items":{"$ref":"#/components/schemas/Connection"}},"available":{"type":"boolean","description":"Whether this server can connect channels at all."},"canManage":{"type":"boolean"}},"required":["connections","available","canManage"],"additionalProperties":false}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/youtube/{id}/uploads":{"get":{"operationId":"getYoutubeIdUploads","summary":"A Studio-connected channel's latest uploads, unlisted and private included. Sessions only; a key is refused.","description":"Advanced, Studio-facing surface: served for integrations that built on it before the public API settled on POST /v1/thumbnails, and marked deprecated in this document and with a Deprecation: true header on every answer. Not part of new public guidance. Nothing here is restricted or removed without the published compatibility path — notice to existing callers, a contract version, then the change. See /developers#compatibility.","tags":["Advanced"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"studio","deprecated":true,"security":[{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"uploads":{"type":"array","items":{"$ref":"#/components/schemas/Upload"}}},"required":["uploads"],"additionalProperties":false}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/youtube/{id}":{"delete":{"operationId":"deleteYoutubeId","summary":"Disconnect a channel connected in the Studio.","description":"Advanced, Studio-facing surface: served for integrations that built on it before the public API settled on POST /v1/thumbnails, and marked deprecated in this document and with a Deprecation: true header on every answer. Not part of new public guidance. Nothing here is restricted or removed without the published compatibility path — notice to existing callers, a contract version, then the change. See /developers#compatibility.","tags":["Advanced"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"studio","deprecated":true,"x-hitcanvas-requires":"owner or admin","security":[{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"204":{"description":"Done. No body."},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/usage":{"get":{"operationId":"getUsage","summary":"This month against the workspace's allowance, and when it resets. Owners and admins, signed in, also get it by key and by space.","tags":["Workspace"],"x-hitcanvas-auth":"key-or-session","x-hitcanvas-audience":"public","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"Usage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/keys":{"get":{"operationId":"getKeys","summary":"The workspace's API keys, each with the scopes it holds and the client spaces it may work in.","tags":["Workspace"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"public","security":[{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}}},"required":["keys"],"additionalProperties":false}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"501":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"postKeys","summary":"Make a key. The key itself is in the answer once.","description":"Scopes and spaces left out are unrestricted. A key limited to client spaces works in the default space if that is one of them, else in its one space, else only when x-hitcanvas-space names one of them.","tags":["Workspace"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"public","x-hitcanvas-requires":"owner or admin","security":[{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyRequest"}}}},"responses":{"200":{"description":"KeyCreated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyCreated"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"501":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/keys/{id}":{"patch":{"operationId":"patchKeysId","summary":"Narrow or widen a key: its scopes, its client spaces, its name. Takes effect on its next call.","tags":["Workspace"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"public","x-hitcanvas-requires":"owner or admin","security":[{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyPatch"}}}},"responses":{"200":{"description":"Key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Key"}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"501":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deleteKeysId","summary":"Revoke a key. Anything using it stops working at once.","tags":["Workspace"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"public","x-hitcanvas-requires":"owner or admin","security":[{"session":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}}],"responses":{"204":{"description":"Done. No body."},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"501":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/billing/checkout":{"post":{"operationId":"postBillingCheckout","summary":"Start a subscription. The workspace's owner only.","tags":["Workspace"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"public","security":[{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutQuery"}}}},"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"],"additionalProperties":false}}}},"400":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"501":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/billing/portal":{"post":{"operationId":"postBillingPortal","summary":"Open the billing portal. The workspace's owner only.","tags":["Workspace"],"x-hitcanvas-auth":"session","x-hitcanvas-audience":"public","security":[{"session":[]}],"parameters":[{"name":"x-hitcanvas-space","in":"header","required":false,"description":"A client space's id to work in. Left off, empty, or \"general\": the workspace's default space. A malformed or foreign id is a 404 and nothing is written.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters, unique to this attempt. The same key with the same body returns the same answer without doing the work or charging again (Idempotency-Replayed: true); with a different body it is a 422; while the first is still running it is a 409. A 5xx is never kept. Keys live 24 hours.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"],"additionalProperties":false}}}},"401":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"501":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"The standard error shape; see the code and type in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}}}