Pro API: limits, error codes and good practice

Caps

Every key carries three: renders at once (2 by default), submissions per minute (60 by default) and, if you set one, a daily credit cap.

Past a cap the answer is 429 with a Retry-After header in seconds. A refused call costs nothing. The day used for the caps is the UTC day.

Long videos add two caps of their own: 30 shots per sequence and 5 sequences in progress per licence (see Videos).

Characters have one: 50 per Pro licence, those made in the app included, and a character left unused for one year is erased (see Characters). Locations, objects and animals have their own, counted separately: 50 per Pro licence (10 with a personal licence, in the app), erased after the same year unused (see Locations, objects, animals, styles and outfits).

Face swap has two of its own: a passage of 20 s at most per render, and our server prepares two videos at a time. Past that, the answer is 429 server_busy: retry after Retry-After (see Face swap). Through the MCP, a Face swap with a transition takes a whole video of 60 s at most, and the server handles two at a time: past that, the tool asks you to try again in a few minutes.

Our own card is shared with the app's users. When it is busy your renders go to rented GPUs, at the same price and through the same API, with a few tens of seconds more at startup.

Error codes

CodeerrorWhat it means, and what to do
400prompt_requiredAdd a prompt.
400forbidden_contentThe content filter refused the prompt.
400invalid_seedseed must be a whole number from 0 to 4294967295.
400image_required, inpaint_images_requiredThe mode needs image_b64, and mask_b64 for inpaint.
401key_required, invalid_keyHeader missing, or unknown key.
402insufficient_creditsNot enough balance for this render (cost is given). The answer carries buy_url, the credit purchase page of your licence. A render or a training in progress reserves its price until it ends: engaged says how many credits are held aside that way.
402confirmation_required, payment_declinedA purchase on your saved card (POST /credits/purchase): your bank asks for your confirmation, or declined the payment. Use buy_url, the ordinary purchase link.
409agent_not_allowed, no_saved_card, monthly_cap_reachedA purchase on your saved card: your agent is not allowed to buy (automatic top-up of your account page), no card is saved, or the purchase would go past your monthly limit. Use buy_url.
409topup_in_progress, purchase_in_progressAnother payment on your saved card is in progress: wait for it to end.
400unknown_packA purchase with an unknown pack, or a custom amount out of bounds or not a whole step.
503payment_unavailableThe payment could not be confirmed: we do not know whether the charge went through. Do not retry right away; a charge that went through is credited.
403key_disabled, key_revoked, key_expiredKey switched off, revoked or expired: create a new one in the app.
403license_revoked, license_not_proLicence revoked, or an account that is not Pro.
403missing_scopeThe key lacks the permission asked for, named in scope.
403unknown_loraA character that does not belong to the account.
404media_unavailableThe file is gone: submit again.
404unknown_loraOn DELETE /loras/{name}, no file by that name on the account. Note the code: the same name answers 403 when a render asks for a character that is not yours.
411size_requiredA LoRA upload without Content-Length. The body is raw, so the size has to be announced.
413file_too_largeA LoRA past 800 MB, or past 90 MB in a single upload. Send it in parts. A bare 413 with no JSON body is a different thing: the request never reached the API, see the upload section.
413part_too_largeOne part is bigger than the max_part_size the session announced.
404unknown_upload_sessionThe uploadId does not exist, or the session was abandoned (six hours) or cancelled by a rejected part.
503upload_refused, part_refusedThe storage could not be reached during the upload: retry.
507storage_fullNo room left on the server storage (LoRAs, or sequences in progress). The team is alerted: retry later.
415invalid_safetensorsThe uploaded file is not a safetensors.
415incompatible_loraThe LoRA is for another architecture, named in architecture. Images take Krea 2 only, videos LTX 2.5 or 2.3. Nothing is stored and no quota is spent.
413lora_quotaThe account's LoRA storage is full (20 files or 10 GB). The answer says what is left; delete a file to make room.
413image_too_largeSource image or mask past 12 MB decoded.
429too_many_concurrent_renders, rate_limited, daily_capA cap is reached, see Retry-After.
429daily_credit_capThe key's daily credit cap is reached (cap, spent, cost).
502submission_failed, status_failedAn incident on the render side: retry in a few seconds.
503license_check_failedThe account cannot be checked right now: retry in a minute.
400invalid_extend_framesAn extension whose extend_frames is not 9, 17, 25, 33, 41 or 49, or an extend_video that does not have exactly that many frames.
400extension_with_transitionAn extension cannot also be a transition, except with consistency enhanced: drop end_image, or ask for enhanced consistency.
400extension_too_shortThe length of an extension counts the new frames only, and must be 9 at least.
404clip_unavailableThe clip to extend is no longer available: extend it sooner, or send its end in extend_video. As a 502, reading it failed: retry.
404unknown_clipThe clip to extend belongs to another licence.
404unknown_sequenceThe sequence does not exist, belongs to another licence, or has expired.
400job_id_required, empty_sequencePOST /sequences/{id}/clips without a job_id, or the export of a sequence that has no shot.
409not_exported_yetGET /sequences/{id}/file before the export: call POST /sequences/{id}/export first.
404unknown_exportProject folder export: unknown render, from another licence or submitted more than 24 h ago; ZIP erased (45 min after its first download, 2 h at most).
409export_in_progressOne project folder export at a time per licence.
413export_too_largeProject folder over 2 GB: export the shots one by one.
400unknown_referenceProject folder export: an entry of exclude_references names no reference of the export (no id, name or @mention).
400invalid_export_optionsProject folder export: an option that is not a boolean, an exclude_references that is not a list of texts, or include_film without include_media.
500export_failedThe export failed (reason in detail): nothing is charged, try again.
422resolution_mismatch, unreadable_clipA render filed by hand (POST /sequences/{id}/clips) at another resolution than the sequence, or unreadable.
409missing_shotA shot is not finished yet, or no longer available (job_id names it): wait for it to finish, then export again.
409sequence_exportedThe sequence is already assembled.
409audio_mismatchA shot with sound in a silent sequence, or the other way round.
413extend_video_too_largeThe clip end you sent is past 8 MB.
413too_many_shots30 shots at most per sequence.
422unreadable_tailThe clip end, sent or read back, is not a readable video.
422assembly_failedThe shots have different resolutions, or sound on some of them only.
503ultra_unavailableUltra mode is closed for the moment: retry later, or render without quality.
503ultra_4k_unavailableA 4K size asked in Ultra: 4K is no longer offered, video goes up to 1080p (1920 x 1088).
400ultra_incompatibleA transition (end_image) asked in Ultra.
400extension_4kThe continuation of an older 4K clip: 4K is no longer offered, a 4K clip cannot be continued (ultra_4k_unavailable with quality: "max"). Extend a clip of 1080p at most.
400resolution_above_qualityA size above 1080p (1920 x 1088) without quality: "max": 1080p is the ceiling in every mode.
400invalid_keyframes, invalid_keyframe_time, keyframes_modeKeyframes out of bounds: more than 4, an invalid image or strength; a moment outside the clip, or two keyframes less than 0.5 s apart; a mode other than Quality (Ultra, Multi-Ref), or an extension without consistency enhanced.
400invalid_consistency, consistency_modeconsistency other than standard or enhanced; enhanced consistency asked in Ultra or in Multi-Ref.
400consistency_explicitA prompt that enhanced consistency does not render yet, beyond 20 s (15 s with an end_image), in an extension or in a sequence (a single shorter shot renders in standard consistency): shorten it, or use standard.
403consistency_licensed_onlyEnhanced consistency is reserved for licences.
503consistency_unavailableEnhanced consistency is closed for the moment: retry later, or render in standard.
409consistency_mismatchA shot whose consistency differs from the sequence's.
422encoding_mismatchA render filed by hand (POST /sequences/{id}/clips) whose consistency differs from the shots already filed.
400invalid_fps, fps_requires_fixed_duration, extend_fps_mismatchA frame rate (fps) the mode does not have (detail lists the ones it has); enhanced consistency above 30 fps with automatic duration (set duration_auto to false and give length); an extension at a frame rate other than the previous clip's.
409sequence_fps_mismatchA shot whose frame rate (fps) differs from the sequence's.
503keyframes_unavailableKeyframes are closed for the moment: render without keyframes.
429too_many_sequences5 sequences in progress at most per licence: export one, or wait for one to expire.
400invalid_name, invalid_kind, invalid_photo_role, outfit_too_long, invalid_roleA character field out of bounds (see Characters).
400image_too_smallA photo under 1024 px on its long side.
415unsupported_image_format, unreadable_imageA photo or a location image that is not a readable JPEG, PNG or WebP.
404unknown_characterThe character_id is not on your licence, or was erased (one year unused, or deleted in the app).
409character_limitThe character cap (max) is reached: delete one.
409character_busyIts views are being made: wait until status is no longer pending. On POST /characters: the same creation is being saved, send it again a few seconds later.
409photo_view, empty_character, single_image_sheetThe view that came from the original photo cannot be redone; or the character has no readable view (if the storage refused the read: 503 storage_unavailable, retry); or a sheet imported as a single image (a whole sheet, kept as is): its views are not redone, and it does not dress a new sheet (send view 4 or 1).
409app_characterAn instruction or an uploaded view on a character or a sheet made in the app: reserved for characters and sheets created through the API.
400instruction_too_longAn instruction longer than 200 characters.
400outfit_or_views_requiredA sheet added with neither outfit nor views: give an outfit to generate, or views.
400views_requiredA sheet added with generate: false: give at least one view.
409source_sheet_emptyA sheet added without a full-body view or a bust, to a character with neither to start from: send one of them in views.
404unknown_sheetOnly a sheet added through the API (sheet_origin api) can be deleted with DELETE /characters/{id}/sheets/{sheet_id}.
404unknown_subjectThe subject_id is not on your licence, or was erased after one year unused.
409subject_limitThe subject cap (max) is reached: locations, objects, animals, styles and outfits count together; delete one.
409empty_subjectA subject with no readable image.
400invalid_type, description_too_long, invalid_imagesA subject field out of bounds (see Locations, objects, animals, styles and outfits).
400invalid_imageA subject image that is not a readable JPEG, PNG or WebP of at least 512 px on the long side (index says which one).
400description_required, invalid_views, invalid_view, invalid_count, too_many_images, prompt_too_long, invalid_instructionsGenerate a subject: no description, prompt or start image; a view key the type does not have (detail lists them); count outside 1 to 6, or more than 6 images, start included; a prompt over 2,000 characters; instructions empty, too long or for several views.
409subject_busy, subject_not_generated, view_exists, views_exist, start_image_missing, start_image_importedA series is already running on this subject; a subject made from images (add images through /images); a view already done (redo it); a start to redo while views start from it; a failed start to redo first; an imported start, which cannot be redone.
404 / 503unknown_view, generation_unavailableA view never asked for (add it); subject generation is not available on the server for the moment: retry later.
400multiref_characters_required, multiref_incompatible, multiref_mode, multiref_format, invalid_lengthMulti-Ref out of bounds: 1 to 4 characters (12 in Ultra), no extension or transition, the formats and lengths of Multi-Ref Video.
400duplicate_name, invalid_strength, unknown_mentionTwo characters with the same name; strength outside 0 to 2; an @Name in the prompt with no character (mentions lists them).
400voice_requires_audio, voice_slotA character voice (voice_b64) without sound ("audio": true); or on a character other than characters[0] and characters[1] (the engine supports 2 voices). index says which one.
400invalid_voice_choicevoice other than character or original in a Face swap, or characters[].voice other than character or generated in Multi-Ref Video.
413audio_too_largeA character voice past 4 MB, or past 2 MB in a Face swap. Only the first 5 seconds are used (20 in a Face swap): send a short excerpt.
415unsupported_audio_formatA character voice that is not a readable audio file (WAV, MP3, OGG, FLAC).
400multiref_too_many_references, invalid_subject_typeMore than 4 characters, objects and animals in all, outside Ultra; a subject in the wrong field (a location in subjects, an object as location, a style outside styles, an outfit outside outfits).
400invalid_count, invalid_view, invalid_lora_pass, invalid_subject_image, invalid_sizeCreate an image: count 1 or 2, view 1 to 5 and present in the sheet, lora_pass 0.3 to 0.9, the image of a subject among its images, width and height from 256 to 2048.
400character_not_readyCreate an image: the chosen view of a character has no image yet.
503multiref_image_disabledCreating an image is not open on this server yet.
400multiref_ultra_only, multiref_too_many_images, unknown_wearerStyles, outfits or motion outside Multi-Ref in Ultra; more than 30 images in Ultra; a worn_by that names no character.
400invalid_motion, invalid_motion_mode, unreadable_motion, motion_missingmotion with neither motion_id nor video_b64; a mode other than camera or choreography; an unreadable video, or one outside 4 to 30 s (input_video_out_of_limits); a motion_id never uploaded (no PUT).
404 / 409unknown_motion, motion_already_usedA motion_id that is unknown, already used or older than 2 hours: upload the video again.
413 / 503motion_too_large, motion_not_open, motion_mode_unavailableA motion video over 20 MB (20 MB once brought down to 480p); the motion is not open yet (ultra.motion_per_second is null); a mode that is not open yet.
409extension_link_expiredAn extend_job_id your licence does not know, or an Ultra shot older than 24 hours: upload its original (POST /extensions) and pass extend_upload_id.
400extension_real_faceThe video to extend in Ultra was not rendered by the Ultra mode (a render from another mode, for example) and shows a realistic face: nothing is charged. Extend it in Quality mode, or redo the shot in Ultra.
400extension_ultra_only, extension_ultra_options, invalid_extension_direction, extension_backward_sequence, extension_tail_quality_onlyAn Ultra extension out of bounds: extend_upload_id or backward without quality: "max" (or from a clip that is not Ultra); a start image, references, motion or enhanced consistency with it; a direction other than forward or backward; backward in a sequence; extend_video in Ultra.
400extension_too_large, unreadable_extension, extension_upload_missingAn uploaded video above 1080p; an unreadable MP4, or one outside 4 to 30 s (input_video_out_of_limits); a file never uploaded (no PUT).
400input_video_out_of_limitsA video sent to the Ultra mode (motion, video to extend) outside its limits, checked before the render, nothing charged: limit says which one (duration: 4 to 30 s; total_duration: 30 s with the reference sounds; count: 10; size: 200 MB; format: MP4 or MOV; fps: 24 to 60; pixels: width × height from 409,600 to 8,295,044; aspect_ratio: 0.4 to 2.5), with value, min and max.
404 / 409unknown_extension_upload, extension_upload_usedAn extend_upload_id that is unknown, older than 2 hours or already used: upload the file again.
413 / 503extension_too_heavy, extension_not_open, extension_backward_unavailableA file over 60 MB; the Ultra extension is not open yet (ultra.extend_per_second is null); backward is not open yet.
413references_too_largeThe prepared views go past the render's budget: fewer characters, or a smaller format.
400video_required, character_requiredA Face swap without video_b64, or without character_id.
413video_too_largeA Face swap video past 20 MB: trim or compress it first, or use the MCP tool tendre_face_swap, which takes up to 95 MB.
415unreadable_videoThe Face swap video is not a readable MP4, MOV, WebM or MKV.
400invalid_start, invalid_duration, passage_too_shortA Face swap passage out of bounds: start below 0 or past the end of the video; duration outside 0.5 to 20 s; a passage shorter than half a second.
400invalid_zone, invalid_likeness, invalid_scene, invalid_description, invalid_character_name, invalid_partA Face swap field out of bounds: zone other than tight, normal or wide; part other than full or head; likeness outside 0.5 to 2; scene over 400 characters; description over 360; name over 60.
413face_swap_too_largeThe passage is still too heavy once prepared: give a shorter duration.
429server_busyOur server is already preparing two Face swap videos: retry after Retry-After (20 s). The MCP upload link answers the same code as a 503 when too many files are waiting: retry in a few minutes.
503face_swap_unavailable, face_swap_price_missingFace swap is closed, or has no price, for the moment: retry later.
503creation_unavailable, multiref_unavailable, storage_unavailableThe service is unavailable for the moment: retry later.
500internal_errorAn unexpected incident on the server side: retry, and tell us if it happens again.

Ultra billed per second (Ultra):

CodeerrorWhat it means, and what to do
400resolution_outside_ultraAbove 1080p: 480p, 720p or 1080p.
400engine_refusedThe engine refuses the text or an image: the reason is in detail and the code in code. Nothing is charged: rephrase.
502engine_unavailableThe engine does not answer: retry in a few minutes. Nothing is charged.
409render_in_progressCancel of a render already computing: it no longer stops, it is delivered and billed.
400invalid_references, references_too_large, multiref_ultra_options, multiref_ultra_explicitMulti-Ref in Ultra: a reference image is unreadable or too heavy (20 MB at most in all), or an option is not supported.
403multiref_ultra_unavailableMulti-Ref in Ultra billed per second is not open to this account yet.

The error names are the exact strings the API returns. Match on them rather than on the message, which may be reworded.

One answer is not an error: a Multi-Ref render or a Face swap with a character that has only one view goes through, with a limited_likeness warning in warnings ({ "code": "limited_likeness", "character_id": "...", "detail": "..." }). The likeness is limited: create the character's seven views for a faithful one.

A Multi-Ref render in Ultra with 9 to 12 characters goes through too, with a many_characters warning: some may be missing or mixed up (8 are recommended).

Good practice

  • Poll every 3 seconds, not faster. The queue is shared, and hammering it helps nobody.
  • Download as soon as the status is completed. The file is not archived.
  • Write prompts in English, and for videos describe the movement rather than the still.
  • One key per use, and a daily credit cap on every key that lives on a server. A leaked key with a cap costs you a day, not a balance.
  • Treat a 429 as normal, not as a failure: wait for Retry-After and carry on.
  • A connection cut before the answer costs nothing. If an image or video submission gets no answer (a proxy timed out, a 524 error, the program stopped), the render is not started, or it is cancelled at once, and nothing is charged: just send the request again. For a batch of images (count), the renders already created are cancelled too. A character's creation goes on: sending the same request again returns the same character, with nothing charged twice (see Characters).

Prompts are logged on our side, as they are for the app, for safety purposes.

Windows · Mac · Cloud or local

Generate privately. Tonight.

Download tendre.AI for free and generate without limits, privately, on your own GPU.

OS Windows 10/11GPU NVIDIA 8GB+VRAM 12GB recommendedDisk 20GB

Mac: Apple silicon (M1 or later), macOS 13 or later. Intel Macs are not supported.

Local image generation on Mac needs an M4 with 24 GB of memory, or an M2 or M3 Pro, Max or Ultra with 24 GB. Below that, everything runs online with credits. Retouching and video run online on Mac for now.

Everything about tendre.AI for Mac

No NVIDIA GPU? Start 100% in the cloud: 5 free images and 1 free video every day. An NVIDIA card (8GB+) unlocks unlimited local generation.