Skip to content

Developers

Vellria API reference

Every model through one HTTPS endpoint, authenticated with your API key.

Base URL
https://vellria.com/v1
Authentication
Authorization: Bearer vll_...

Quickstart

#

Four calls take you from an API key to a finished file. Every generation spends credits from your balance at the price the catalog lists; send expectedCost and a request whose price has changed is refused instead of charged (Prices & expected cost).

  1. Create an API key

    Sign in and create a key on the API keys page. Keys start with vll_; send yours as a Bearer token on every call.

  2. Pick a model

    GET /v1/models lists every model id with its sizes, parameters and credit price. Read it instead of hard-coding a model list.

  3. Start a generation

    POST /v1/generate/image with a model id and a prompt. It answers 202 with the generation id and the credits charged; a failed generation is refunded.

  4. Poll, then download

    Call GET /v1/generations/{id} every few seconds until status is completed, or failed with an error_code. Then download output_url with the same key.

2. Pick a model
curl
curl https://vellria.com/v1/models \
  -H "Authorization: Bearer vll_..."
Response · 200
{
  "image": [
    {
      "id": "vellria-seedream-5-pro",
      "label": "Seedream 5 Pro",
      "kind": "image"
    }
  ],
  "video": [
    {
      "id": "vellria-seedance-2-5",
      "label": "Seedance 2.5",
      "kind": "video"
    }
  ]
}
3. Start a generation
curl
curl https://vellria.com/v1/generate/image \
  -H "Authorization: Bearer vll_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "vellria-seedream-5-pro",
    "prompt": "A lighthouse at dawn, soft light",
    "size": "1536*1536"
  }'
Response · 202
{
  "id": "gen_3f9a1c7e5b2d4086",
  "status": "processing",
  "model": "vellria-seedream-5-pro",
  "size": "1536*1536",
  "cost_cents": 10
}
4. Poll, then download
curl
curl https://vellria.com/v1/generations/{id} \
  -H "Authorization: Bearer vll_..."
Response · 200
{
  "id": "gen_3f9a1c7e5b2d4086",
  "status": "completed",
  "output_url": "https://vellria.com/v1/generations/gen_3f9a1c7e5b2d4086/file",
  "error_code": null,
  "expires_at": 1791936000000
}
curl
curl -o result.png https://vellria.com/v1/generations/{id}/file \
  -H "Authorization: Bearer vll_..."

Authentication

#

Send your API key as a Bearer token in the Authorization header on every request. Keys start with the vll_ prefix and are created on the API Keys page.

http
Authorization: Bearer vll_...

Errors

#

Every error comes back with the same JSON body. Branch on error.code: it is stable, while error.message is written for people and may change. error.param names the field at fault when there is one, and a few codes add error.reason (image_unreadable: animated, transparent, too_small or too_large). Credits are never kept for a request that returns an error: request errors are raised before anything is charged, and a generation that cannot be started is refunded.

HTTP status codes

HTTPMeaning
400The request is invalid; error.code says which field or rule.
401The API key is missing or invalid.
402Not enough credits.
403This account or key cannot use the endpoint.
404The resource does not exist or belongs to another account.
409The request conflicts with the current state, such as a changed price or a generation still running.
410The file has passed its retention period and was deleted.
413The file or body is too large.
415The Content-Type is not an accepted image type.
416The requested byte range cannot be served.
429Too many requests; wait for the Retry-After header and try again.
500Unexpected error on our side.
502The model or payment provider refused or failed the request.
503The service is temporarily unavailable; nothing is charged.

Error codes

Authentication and account8authentication_requiredaccount_deletedaccount_suspendedaccount_mergedforbiddenpending_paymentmerge_in_progressaccount_delete_failed
CodeHTTPMeaning
authentication_required401No API key was sent, or it is invalid or revoked.
account_deleted403The account has been closed.
account_suspended403The account is suspended.
account_merged403The account was merged into another one; use that account's key.
forbidden403The endpoint works with a console session only, not an API key.
pending_payment409A payment has not settled yet; try again once it has.
merge_in_progress409The account is being linked to another one; try again in a moment.
account_delete_failed500The account could not be closed; try again in a moment.
Request validation22invalid_bodyinvalid_promptprompt_too_longinvalid_expected_costinvalid_modelinvalid_sizeinvalid_durationinvalid_resolutioninvalid_ratioinvalid_reference_modeinvalid_reference_tokentext_to_video_not_supportedinvalid_<parameter>invalid_typeinvalid_statusinvalid_queryinvalid_idsinvalid_untilinvalid_generation_typethumbnail_unsupportedthumbnail_size_unsupportedinvalid_range
CodeHTTPMeaning
invalid_body400The body is not valid JSON or misses a required field.
invalid_prompt400prompt is missing or empty.
prompt_too_long400prompt is longer than the model's max_prompt_length.
invalid_expected_cost400expectedCost is not a non-negative whole number.
invalid_model400The model id is not in GET /v1/models.
invalid_size400size is not one of the model's sizes.
invalid_duration400duration is outside the mode's range.
invalid_resolution400resolution is not one of the mode's resolutions.
invalid_ratio400ratio is not one of the mode's ratios.
invalid_reference_mode400reference_mode is neither frame nor subject, or the model has no subject mode.
invalid_reference_token400The prompt cites an @image with no matching reference, such as @image3 with two images.
text_to_video_not_supported400The model needs a reference image and cannot run from a prompt alone.
invalid_<parameter>400A per-model parameter has a value the model does not declare.
invalid_type400type is neither image nor video.
invalid_status400status is not queued, processing or completed.
invalid_query400The search text is too long.
invalid_ids400ids is not a list of 1-50 generation ids.
invalid_until400until is not a valid timestamp.
invalid_generation_type400Only image generations can become a reference.
thumbnail_unsupported400Thumbnails exist for images only.
thumbnail_size_unsupported400thumb is not a supported thumbnail size.
invalid_range416The Range header cannot be satisfied.
Prompts, references and uploads11content_blockedinvalid_image_urlsreference_not_publicimage_unreadablereference_not_allowedempty_uploadinvalid_imagefile_too_largepayload_too_largeunsupported_media_typeupload_in_use
CodeHTTPMeaning
content_blocked400The prompt was refused by the safety filter before any credit was spent.
invalid_image_urls400image_urls is malformed, has too few or too many images for the model, or is missing where the mode needs it.
reference_not_public400A reference points at an authenticated file URL; upload it with POST /v1/uploads instead.
image_unreadable400A reference image cannot be used; error.reason says why (animated, transparent, too_small or too_large).
reference_not_allowed403Reference images are not available on this service.
empty_upload400The upload body is empty.
invalid_image400The upload is not a readable image of the declared type.
file_too_large413The file is larger than the allowed size.
payload_too_large413The request body is larger than the allowed size.
unsupported_media_type415The Content-Type is not one of the accepted image types.
upload_in_use409The upload was used in a generation; it is kept until it expires.
Generations and files8not_foundcontent_expiredgeneration_in_progressgeneration_not_completedupstream_errorreference_rejectedgeneration_unavailablereference_unavailable
CodeHTTPMeaning
not_found404No such resource on this account.
content_expired410The file has passed its retention period and was deleted.
generation_in_progress409The generation is still queued or processing.
generation_not_completed409The generation has not completed yet.
upstream_error502The generation could not be started; the credits are refunded.
reference_rejected502The model refused a reference image; the credits are refunded.
generation_unavailable503Generation is temporarily unavailable; nothing is charged.
reference_unavailable503A reference image could not be prepared; nothing is charged.
Credits and payments18insufficient_balanceprice_changedinvalid_packageinvalid_amountinvalid_providerpackage_unavailable_for_providerinvalid_plancheckout_lockedpayment_create_failednot_configuredalready_paidalready_subscribeddowngrade_requires_cancelcheckout_in_progresssubscription_changedsubscription_under_reviewsubscription_not_foundsubscription_cancel_failed
CodeHTTPMeaning
insufficient_balance402The account does not have enough credits.
price_changed409The price differs from expectedCost; the current price is in price.cost and nothing is charged.
invalid_package400package_id is not in GET /v1/billing/packages.
invalid_amount400price_amount is outside min_usd to max_usd.
invalid_provider400The provider is unknown, closed, or not accepted for this payment.
package_unavailable_for_provider400The chosen provider cannot sell this package (it is in the package's excluded_providers, e.g. telegram_stars for large packages); no payment is opened.
invalid_plan400plan_id is not one of the plans.
checkout_locked429Card checkout (provider whop) is locked for a while after too many failed card attempts; crypto and Telegram Stars stay open. See Retry-After.
payment_create_failed502The payment provider could not open the checkout; try again.
not_configured503Payments are not available right now.
already_paid409The payment has already completed.
already_subscribed409You already have this plan.
downgrade_requires_cancel409Moving to a smaller plan needs a cancellation first.
checkout_in_progress409A subscription checkout is still being opened.
subscription_changed409The subscription changed while the checkout was opening; reload and try again.
subscription_under_review409The first payment of a subscription is under review; no new checkout opens until it is decided.
subscription_not_found404There is no active subscription.
subscription_cancel_failed502The cancellation could not be confirmed; try again.
Rate limits2rate_limit_exceededreference_rate_limited
CodeHTTPMeaning
rate_limit_exceeded429Too many requests in the window; wait for Retry-After.
reference_rate_limited429More than the hourly limit of requests with reference images.
Chat9insufficient_creditsinvalid_jsoninvalid_requestcontext_too_longunsupported_contentdata_url_not_supportedinvalid_image_urltoo_many_imagesempty_response
CodeHTTPMeaning
insufficient_credits402The balance cannot cover the longest possible reply (max_tokens); nothing is charged.
invalid_json400The body is not valid JSON.
invalid_request400A field is missing or malformed (messages, role, stream, max_tokens, temperature or top_p); error.param names it.
context_too_long400Too many messages or characters for the model's limits.
unsupported_content400A content part is neither text nor image_url, or an image is outside a user message.
data_url_not_supported400An image was sent as a data URL; upload it with POST /v1/uploads and pass the returned URL.
invalid_image_url400image_url.url is not an http(s) URL.
too_many_images400More images than the model accepts per message or per request.
empty_response502The model returned an empty reply; nothing is charged.
Server1internal_error
CodeHTTPMeaning
internal_error500Unexpected error on our side.

Failed generations

A generation that fails after it has started is not an HTTP error: GET /v1/generations/{id} returns it with status failed and one of these error_code values, and its credits are refunded automatically.

Show 10 codes10content_blockedprovider_errorprovider_timeoutprovider_cancelledprovider_unavailableabandonedunknown_providerimage_blockedmoderation_failedreference_rejected
CodeMeaning
content_blockedThe prompt was refused by a safety check after the generation was queued.
provider_errorThe model failed to produce a result.
provider_timeoutThe model did not finish in time.
provider_cancelledThe model cancelled the job.
provider_unavailableThe model was unavailable.
abandonedThe job got no answer for too long and was given up.
unknown_providerThe job could not be traced to a model run.
image_blockedOlder rows only: a reference image was refused by a screening that is no longer used.
moderation_failedOlder rows only: the screening itself failed.
reference_rejectedThe model refused a reference image.
Response · 400
{
  "error": {
    "message": "vellria-seedance-2-5 does not support reference_mode \"subject\"",
    "type": "invalid_request_error",
    "param": "reference_mode",
    "code": "invalid_reference_mode"
  }
}
Response · 400
{
  "error": {
    "message": "image_urls[0] is animated: use a still, opaque JPEG, PNG, GIF or WebP image of at most 20 MB, 36 megapixels",
    "type": "invalid_request_error",
    "param": "image_urls",
    "code": "image_unreadable",
    "reason": "animated"
  }
}
Response · 409
{
  "error": {
    "message": "Price changed: this request now costs 10 credits",
    "type": "invalid_request_error",
    "param": "expectedCost",
    "code": "price_changed"
  },
  "price": {
    "cost": 10
  }
}

Rate limits

#

20 images and 10 videos per minute. Generations with reference images also share a limit of 120 attempts per hour, refused ones included; beyond it the generate endpoints return the reference_rate_limited code. Exceeding a limit returns HTTP 429; wait for the period in the Retry-After header and try again.

Model catalog

#

The valid models, with their credit costs, returned as { image: [...], video: [...] }. Read this endpoint instead of hardcoding a price list on your side.

More details

Every entry carries id (the value you send as model), label, kind (image or video), family, and developer, the company that built it (null for a model offered under the Vellria name), plus two modes, text and reference: send only a prompt and the model runs in text mode — a text-to-image or text-to-video call; attach one or more reference images to that same id and it runs in reference mode instead — image-to-image or image-to-video — there is no separate id to pick between the two. Each mode carries its own sizes (image) or resolutions (video), a default, max_prompt_length (the character limit that mode enforces on prompt, and on any free-text parameter that does not declare its own), and parameters. Every size or resolution carries ratio and tier alongside its label, so you never have to parse the label to know the aspect ratio or the resolution step (a ratio of adaptive means the output takes its proportions from the input image). reference_images is null in text mode; in reference mode it carries the min and max reference images that mode accepts, extra_credits charged for each reference beyond the first, and the file limits a reference image must meet. A model whose reference slots carry fixed roles lists them in order under reference_images.roles (null for every model today): the first URL in image_urls would take the first role, each later URL the next one, and the last role would repeat for the rest.

Image models

#
  • Model
    Seedream 5 Pro Uncensoredvellria-seedream-5-pro
    Modes
    Text to imageImage to image
    Sizes
    2K · 5 sizes
    Price
    10 credits
    Parameters

    Text to image · 10 credits for every size + 1 credit for each reference image after the first

    ParameterAllowed valuesDefault
    image_urlsType: string[]0–10 https URLs (required)—
    sizeType: string1536*15361776*13281328*17762048*11521152*20481536*1536
    reasoningType: stringenableddisabledenabled

    Image to image · 10 credits for every size + 1 credit for each reference image after the first

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–10 https URLs (required)—
    Model page — Seedream 5 Pro Uncensored
  • Model
    Qwen 3 Uncensoredvellria-qwen-3
    Modes
    Text to imageImage to image
    Sizes
    1K, 1.5K, 2K · 8 sizes
    Price
    8 credits
    Parameters

    Text to image · 8 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string1024*10241536*10241024*15362048*15361536*20482048*11521152*20482048*20481024*1024
    seedType: integer0–2147483647random when omitted, echoed back
    negative_promptType: stringtext, at most 8000 characters—

    Image to image · 8 credits for every size + 1 credit for each reference image after the first

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–3 https URLs (required)—
    sizeType: string1024*10241280*960960*12801280*720720*12801440*14401024*1024
    Model page — Qwen 3 Uncensored
  • Model
    Qwen 3 Pro Uncensoredvellria-qwen-3-pro
    Modes
    Text to imageImage to image
    Sizes
    1K, 1.5K · 3 sizes
    Price
    10 credits
    Parameters

    Text to image · 10 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string1024*10241536*10241024*15361024*1024
    seedType: integer0–2147483647random when omitted, echoed back
    negative_promptType: stringtext, at most 8000 characters—

    Image to image · 10 credits for every size + 1 credit for each reference image after the first

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–3 https URLs (required)—
    sizeType: string1024*10241280*960960*12801280*720720*12801440*14401024*1024
    Model page — Qwen 3 Pro Uncensored
  • Model
    Qwen Image Edit 2511 Uncensoredvellria-qwen-image-edit-2511
    Modes
    Text to imageImage to image
    Sizes
    1K, 1.3K · 5 sizes
    Price
    6 credits
    Parameters

    Text to image · 6 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string1024*10241280*960960*12801280*720720*12801024*1024
    seedType: integer0–2147483647random when omitted, echoed back

    Image to image · 6 credits for every size

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–3 https URLs (required)—
    sizeType: string1K1K
    Model page — Qwen Image Edit 2511 Uncensored
  • Model
    Qwen Image 2.1 Uncensoredvellria-qwen-image-2-1
    Modes
    Text to imageImage to image
    Sizes
    1K, 1.2K, 1.3K · 7 sizes
    Price
    from 7 credits
    Parameters

    Text to image · 7 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string1024*10241248*832832*12481184*896896*11841376*768768*13761024*1024
    seedType: integer0–2147483647random when omitted, echoed back

    Image to image · 8 credits for every size + 1 credit for each reference image after the first

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–10 https URLs (required)—
    sizeType: string1K1024*10241248*832832*12481184*896896*11841376*768768*13761K
    Model page — Qwen Image 2.1 Uncensored
  • Model
    Seedream 5 Lite Uncensoredvellria-seedream-5-lite
    Modes
    Text to imageImage to image
    Sizes
    3K, 4K · 8 sizes
    Price
    8 credits
    Parameters

    Text to image · 8 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string3072*30723456*25922592*34563744*24962496*37444096*23042304*40964704*20163072*3072

    Image to image · 8 credits for every size

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–10 https URLs (required)—
    Model page — Seedream 5 Lite Uncensored
  • Model
    Seedream 4.5 Uncensoredvellria-seedream-4-5
    Modes
    Text to imageImage to image
    Sizes
    2K · 8 sizes
    Price
    9 credits
    Parameters

    Text to image · 9 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string2048*20482304*17281728*23042496*16641664*24962848*16001600*28483136*13442048*2048

    Image to image · 9 credits for every size

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–10 https URLs (required)—
    Model page — Seedream 4.5 Uncensored
  • Model
    Seedream 4 Uncensoredvellria-seedream-4
    Modes
    Text to imageImage to image
    Sizes
    2K · 5 sizes
    Price
    7 credits
    Parameters

    Text to image · 7 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string2048*20482368*17761776*23682816*15841584*28162048*2048

    Image to image · 7 credits for every size

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–10 https URLs (required)—
    sizeType: string2K2048*20482368*17761776*23682816*15841584*28162K
    Model page — Seedream 4 Uncensored
  • Model
    Wan 2.7 Uncensoredvellria-wan-2-7
    Modes
    Text to imageImage to image
    Sizes
    2K · 1 size
    Price
    8 credits
    Parameters

    Text to image · 8 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string2K2K
    seedType: integer0–2147483647random when omitted, echoed back

    Image to image · 8 credits for every size

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–9 https URLs (required)—
    Model page — Wan 2.7 Uncensored
  • Model
    Bria FIBO 2.0 Uncensoredvellria-bria-fibo-2-0
    Modes
    Text to imageImage to image
    Sizes
    2K, 1K · 30 sizes
    Price
    10 credits
    Parameters

    Text to image · 10 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string2048*20482304*15361536*23042048*15361536*20481920*15361536*19202048*11521152*20481024*10241248*832832*12481152*864864*11521120*896896*11201408*792792*14081280*800800*12801440*720720*14401568*672672*15681776*592592*17762048*512512*20482320*464464*23202048*2048
    seedType: integer0–2147483647random when omitted, echoed back

    Image to image · 10 credits for every size

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–4 https URLs (required)—
    sizeType: string1K1K
    Model page — Bria FIBO 2.0 Uncensored
  • Model
    Bria FIBO 1.5 Uncensoredvellria-bria-fibo-1-5
    Modes
    Text to imageImage to image
    Sizes
    2K, 2.3K · 7 sizes
    Price
    10 credits
    Parameters

    Text to image · 10 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string2048*20482304*15361536*23042048*15361536*20482048*11521152*20482048*2048
    seedType: integer0–2147483647random when omitted, echoed back

    Image to image · 10 credits for every size

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–4 https URLs (required)—
    sizeType: string1K1K
    Model page — Bria FIBO 1.5 Uncensored
  • Model
    MiniMax H3 Image Uncensoredvellria-minimax-h3-image
    Modes
    Text to imageImage to image
    Sizes
    1K, 1.2K, 1.3K · 7 sizes
    Price
    8 credits
    Parameters

    Text to image · 8 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string1024*10241248*832832*12481184*896896*11841376*768768*13761024*1024
    seedType: integer0–2147483647random when omitted, echoed back

    Image to image · 8 credits for every size + 1 credit for each reference image after the first

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–9 https URLs (required)—
    sizeType: string1K1024*10241248*832832*12481184*896896*11841376*768768*13761K
    Model page — MiniMax H3 Image Uncensored
  • Model
    Seedream 5 Flash Uncensoredvellria-seedream-5-flash
    Modes
    Text to imageImage to image
    Sizes
    2K · 5 sizes
    Price
    8 credits
    Parameters

    Text to image · 8 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string2048*20482368*17761776*23682816*15841584*28162048*2048

    Image to image · 8 credits for every size

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–10 https URLs (required)—
    sizeType: string2K2048*20482368*17761776*23682816*15841584*28162K
    Model page — Seedream 5 Flash Uncensored
  • Model
    Z-Image Turbo Uncensoredvellria-z-image-turbo
    Modes
    Text to image
    Sizes
    1K, 1.5K, 2K · 6 sizes
    Price
    2 credits
    Parameters

    Text to image · 2 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string1024*10241536*10241024*15362048*11521152*20482048*20481024*1024
    seedType: integer0–2147483647random when omitted, echoed back
    Model page — Z-Image Turbo Uncensored
  • Model
    Anima Uncensoredvellria-anima
    Modes
    Text to imageImage to image
    Sizes
    1K, 1.2K, 1.1K, 1.3K · 7 sizes
    Price
    5 credits
    Parameters

    Text to image · 5 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string1024*10241248*832832*12481168*880880*11681360*768768*13601024*1024
    seedType: integer0–2147483647random when omitted, echoed back

    Image to image · 5 credits for every size

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–1 https URLs (required)—
    sizeType: string1K1K
    Model page — Anima Uncensored
  • Model
    Vellria Anime Pro Spicy Uncensoredvellria-anime-pro-spicy
    Modes
    Text to imageImage to image
    Sizes
    2K · 5 sizes
    Price
    10 credits
    Parameters

    Text to image · 10 credits for every size + 1 credit for each reference image after the first

    ParameterAllowed valuesDefault
    image_urlsType: string[]0–10 https URLs (required)—
    sizeType: string1536*15361776*13281328*17762048*11521152*20481536*1536

    Image to image · 10 credits for every size + 1 credit for each reference image after the first

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–10 https URLs (required)—
    Model page — Vellria Anime Pro Spicy Uncensored
  • Model
    Pruna P-Image Uncensoredvellria-p-image
    Modes
    Text to imageImage to image
    Sizes
    1K, 1.2K, 1.1K, 1.3K · 7 sizes
    Price
    4 credits
    Parameters

    Text to image · 4 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string1024*10241216*832832*12161152*896896*11521344*768768*13441024*1024
    seedType: integer0–2147483647random when omitted, echoed back

    Image to image · 4 credits for every size

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–5 https URLs (required)—
    sizeType: string1K1024*10241216*832832*12161152*896896*11521344*768768*13441K
    Model page — Pruna P-Image Uncensored
  • Model
    Flux 2 Klein 9B Uncensoredvellria-flux-2-klein-9b
    Modes
    Text to imageImage to image
    Sizes
    1K, 1.2K, 1.1K, 1.3K · 7 sizes
    Price
    5 credits
    Parameters

    Text to image · 5 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string1024*10241248*832832*12481152*864864*11521360*768768*13601024*1024
    seedType: integer0–2147483647random when omitted, echoed back

    Image to image · 5 credits for every size

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–3 https URLs (required)—
    sizeType: string1K1024*10241248*832832*12481152*864864*11521360*768768*13601K
    Model page — Flux 2 Klein 9B Uncensored
  • Model
    Moss Image Uncensoredvellria-moss-image
    Modes
    Text to image
    Sizes
    1K, 1.2K, 1.1K, 1.3K, 1.4K, 1.5K, 1.7K · 15 sizes
    Price
    5 credits
    Parameters

    Text to image · 5 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string1024*10241248*832832*12481168*880880*11681136*912912*11361360*768768*13601440*720720*14401552*656656*15521760*576576*17601024*1024
    seedType: integer0–2147483647random when omitted, echoed back
    Model page — Moss Image Uncensored
  • Model
    Jib Mix Qwen Image Uncensoredvellria-jib-mix-qwen-image
    Modes
    Text to image
    Sizes
    1K, 1.2K, 1.1K, 1.3K · 7 sizes
    Price
    5 credits
    Parameters

    Text to image · 5 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string1024*10241248*832832*12481152*864864*11521360*768768*13601024*1024
    seedType: integer0–2147483647random when omitted, echoed back
    Model page — Jib Mix Qwen Image Uncensored
  • Model
    Z-Image Spicy Uncensoredvellria-z-image-spicy
    Modes
    Text to image
    Sizes
    1K, 1.5K · 7 sizes
    Price
    4 credits
    Parameters

    Text to image · 4 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string1024*10241024*15361536*10241152*15361536*1152864*15361536*8641024*1536
    seedType: integer0–2147483647random when omitted, echoed back
    Model page — Z-Image Spicy Uncensored
  • Model
    Z-Image Spicy Pro Uncensoredvellria-z-image-spicy-pro
    Modes
    Text to image
    Sizes
    1K, 2K, 2.5K · 8 sizes
    Price
    5 credits
    Parameters

    Text to image · 5 credits for every size

    ParameterAllowed valuesDefault
    sizeType: string1024*10242048*20481536*20482048*15361680*25202520*16801440*25602560*14401024*1024
    seedType: integer0–2147483647random when omitted, echoed back
    Model page — Z-Image Spicy Pro Uncensored
  • Model
    Qwen Image Edit Spicy Uncensoredvellria-qwen-image-edit-spicy
    Modes
    Text to imageImage to image
    Sizes
    1K · 1 size
    Price
    10 credits
    Parameters

    Text to image · 10 credits for every size

    ParameterAllowed valuesDefault
    image_urlsType: string[]1–3 https URLs (required)—
    sizeType: string1K1K
    seedType: integer0–2147483647random when omitted, echoed back

    Image to image · 10 credits for every size

    Model page — Qwen Image Edit Spicy Uncensored

GET/v1/models

List every model with its modes, sizes or resolutions, parameters and credit prices. Public: no key needed.
curl
curl https://vellria.com/v1/models \
  -H "Authorization: Bearer vll_..."
#

Image generation

#

Create an image from a text prompt, or attach reference images in image_urls to edit or restyle them with the same model id. The call answers at once with HTTP 202 and the generation id; the image is made in the background, so poll GET /v1/generations/{id} until the status is completed and download it from output_url.

More details

The credits for the chosen size are taken when the generation starts and refunded automatically if it fails. Sizes, reference limits, parameters and prices for every model come from GET /v1/models.

POST/v1/generate/image

Start an image generation. Returns 202 with the generation id; poll it for the result.

Parameters

ParameterDescription
modelstring · bodyOptionalModel id from GET /v1/models.
promptstring · bodyRequiredWhat to generate. At most the model's max_prompt_length characters.
sizestring · bodyOptionalA size id from the model's sizes; the model's default size when left out.
image_urlsstring[] · bodyOptionalReference image URLs: an upload URL from POST /v1/uploads or any public https URL. How many a model accepts and the file limits are under reference_images.
image_urlstring · bodyOptionalShorthand for a single reference image.
expectedCostinteger · bodyOptionalOptional price check: the credits you expect this request to cost. A different price returns 409 price_changed and nothing is charged.

Each model also accepts the parameters listed under parameters in its GET /v1/models entry, such as seed; a value outside what the model declares returns invalid_<parameter>.

curl
curl https://vellria.com/v1/generate/image \
  -H "Authorization: Bearer vll_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "vellria-qwen-3",
    "prompt": "A cat asleep in space, cinematic light",
    "size": "1024*1024",
    "seed": 42
  }'
#

Sizes, parameters and prices for each model: Image models.

Prices & expected cost

#

Both generate endpoints accept an optional expectedCost: the number of credits you expect this exact request to cost, priced from GET /v1/models (model, size or resolution, duration and extra reference images). If it differs from what the request would actually be charged, the call returns HTTP 409 with the price_changed code and the current price in price.cost; nothing is charged and no generation starts. Leave the field out to skip the check.

Video generation

#

Attach reference images in image_urls and choose how the model uses them with reference_mode. The default, frame (also what you get when the field is left out), starts the video from that image. subject treats every image as a reference for a person, object or setting that should appear in the video, and the prompt cites them as @image1, @image2 and so on, in image_urls order (case does not matter). subject mode exists only on models whose GET /v1/models entry carries a subject block (null on the others); that block lists its own resolutions, durations, ratios and parameters, the reference limit under subject.reference_images.max and the token pattern under subject.reference_token.

More details

It is priced like image to video on the same model, with no charge per reference. Errors, all HTTP 400 and before any credit is spent: invalid_reference_mode when the value is neither frame nor subject or the model has no subject mode, invalid_image_urls when subject mode gets no reference or more than the model accepts, and invalid_reference_token when the prompt cites an @image with no matching reference (@image3 with two images, for example). In frame mode @image1 is plain text.

POST/v1/generate/video

Start a video generation from a prompt, optionally with reference images. Returns 202 with the generation id.

Parameters

ParameterDescription
modelstring · bodyOptionalModel id from GET /v1/models.
promptstring · bodyRequiredWhat to generate. At most the model's max_prompt_length characters.
durationinteger · bodyOptionalLength in seconds, within the mode's duration range; a value outside it returns 400.
resolutionstring · bodyOptionalA resolution id from the mode's resolutions.
ratiostring · bodyOptionalAn aspect ratio id from the mode's ratios.
reference_modeframe | subject · bodyOptionalframe (the default) starts the video from the first image; subject uses every image as a reference the prompt cites as @image1, @image2 and so on.
image_urlsstring[] · bodyOptionalReference image URLs: an upload URL from POST /v1/uploads or any public https URL. How many a model accepts and the file limits are under reference_images.
image_urlstring · bodyOptionalShorthand for a single reference image.
expectedCostinteger · bodyOptionalOptional price check: the credits you expect this request to cost. A different price returns 409 price_changed and nothing is charged.

Each model also accepts the parameters listed under parameters in its GET /v1/models entry, such as seed; a value outside what the model declares returns invalid_<parameter>.

curl
curl https://vellria.com/v1/generate/video \
  -H "Authorization: Bearer vll_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "vellria-wan-3",
    "prompt": "Ocean waves at sunset, slow dolly forward",
    "duration": 5,
    "resolution": "1080p"
  }'
subject mode: image_urls are the people and objects the prompt cites
curl
curl https://vellria.com/v1/generate/video \
  -H "Authorization: Bearer vll_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "vellria-wan-3",
    "reference_mode": "subject",
    "image_urls": [
      "https://vellria.com/v1/uploads/{id1}",
      "https://vellria.com/v1/uploads/{id2}"
    ],
    "prompt": "@image1 walks along the beach at sunset holding @image2",
    "duration": 5,
    "resolution": "1080p"
  }'
#

Sizes, parameters and prices for each model: Video models.

Chat

#

Uncensored chat and roleplay: play characters, write stories together or just talk, and share images for it to understand. Per 1M tokens: 50 credits ($0.50) input, 200 credits ($2.00) output.

More details

It is OpenAI-compatible: point an OpenAI SDK at the Vellria base URL with your vll_ key. Each reply is charged per token from your credits.

Per 1M tokens: input 50 credits ($0.50) · cached input 5 credits ($0.05) · output 200 credits ($2.00).

  • Replies are unfiltered: Vellria adds no content moderation to this endpoint, so you are responsible for moderating your own end users. A one-line identity instruction is placed before your messages; its tokens are not billed and are left out of usage.
  • Images: add image_url parts to a user message, at most 4 per message and 8 per request. Upload the image with POST /v1/uploads first and pass the returned URL; data URLs are refused with data_url_not_supported.
  • max_tokens defaults to 1024 and can be at most 4096. Reasoning or thinking fields are ignored and replies never contain reasoning.
  • With stream: true the reply arrives as server-sent events (data: lines) in the OpenAI chunk format, ending with data: [DONE]. The chunk before it has empty choices and carries usage and the charge. An error after the stream has started arrives as a data: {"error": …} event; if text was already sent, that text is charged (the usage chunk comes just before the error), otherwise nothing is charged.
  • Every reply carries OpenAI usage plus credits_charged (fractional credits), cost_usd and credits_debited (whole credits taken from the balance now; fractions add up on your account). Refused, failed or empty replies are not charged; a stream you cancel is charged for the tokens already produced.
  • The balance must cover the longest possible reply before the request starts (402 insufficient_credits otherwise). Requests per minute and requests running at the same time are limited per account (429 rate_limit_exceeded).
javascript
import OpenAI from "openai"

const client = new OpenAI({
  apiKey: "vll_...",
  baseURL: "https://vellria.com/v1",
})

const stream = await client.chat.completions.create({
  model: "vellria-uncensored-chat",
  messages: [{ role: "user", content: "Let's start a story." }],
  stream: true,
})
for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "")
}

POST/v1/chat/completions

Send a conversation and get the model's reply, whole or streamed. OpenAI-compatible; charged per token.

Parameters

ParameterDescription
modelstring · bodyRequiredChat model id from the text group of GET /v1/models.
messagesobject[] · bodyRequiredThe conversation: objects with role (system, user or assistant) and content. content is a string, or in a user message a list of text and image_url parts; image URLs come from POST /v1/uploads.
streamboolean · bodyOptionaltrue streams the reply as server-sent events; false (the default) returns it whole.
max_tokensinteger · bodyOptionalMost tokens in the reply: the model's default_max_tokens when left out, at most its max_output_tokens.
temperaturenumber · bodyOptionalSampling temperature, from 0 to 2.
top_pnumber · bodyOptionalNucleus sampling, above 0 and at most 1.
curl
curl https://vellria.com/v1/chat/completions \
  -H "Authorization: Bearer vll_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "vellria-uncensored-chat",
    "messages": [
      {"role": "system", "content": "You are Mira, a sarcastic space pirate. Stay in character."},
      {"role": "user", "content": "Mira, where are we headed tonight?"}
    ],
    "max_tokens": 512
  }'
curl
curl -N https://vellria.com/v1/chat/completions \
  -H "Authorization: Bearer vll_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "vellria-uncensored-chat",
    "stream": true,
    "messages": [
      {"role": "user", "content": [
        {"type": "text", "text": "Describe this character and write her opening line."},
        {"type": "image_url", "image_url": {"url": "<upload_url>"}}
      ]}
    ]
  }'
#

Image upload

#

You do not have to host reference images yourself: send the file to this endpoint as a raw body, get a public URL back and use that URL in image_urls. The Content-Type header is required and must match the body; accepted types are image/jpeg, image/png, image/webp, image/bmp and image/gif, with a 20 MB limit per file.

More details

An image used as a reference must be a still JPEG, PNG, GIF or WebP of at most 20 MB, without transparent areas, and within the file caps the selected model publishes: `GET /v1/models` returns them per model under `reference_images.limits` (bytes, side length in pixels, megapixels). A reference outside those caps is refused with HTTP 400 and `image_unreadable`, reason `too_small` or `too_large`, before any credit is spent. Metadata such as EXIF is removed when the file is stored. The URL carries an unguessable id and is deleted 24 hours after upload if no generation uses it (the expires_at field of the response); once used as a reference in a generation it is kept until 48 hours after upload, much shorter than generated files; once it expires the endpoint returns HTTP 410 and content_expired. A generation's own file URL (/v1/generations/{id}/file) requires authentication and cannot be used as a reference: the generate endpoints reject it with HTTP 400 and the reference_not_public code before any credits are spent. Upload the file here instead, or turn an image generation into a public reference URL with POST /v1/generations/{id}/reference. Reference images are not screened for content: no picture is refused for who or what it shows, and there is no image_blocked refusal on this path. We refuse a reference only when the file itself cannot be read: an image that cannot be read returns HTTP 400 and image_unreadable, with reason animated, transparent too_small or too_large where that is the cause. The model itself may still decline a reference image it cannot process; that generation then fails with error_code reference_rejected and its credits are refunded automatically. If a reference cannot be prepared, the request returns HTTP 503 and reference_unavailable and no credits are spent. Prompts sent with an API key are passed to the model as sent; only requests involving the sexual abuse of minors are refused, with HTTP 400 and the content_blocked code. Every reference is first stored as an upload (an image given by an external URL is copied, without its metadata) and the provider fetches that same pinned URL, so the provider receives exactly the stored file.

POST/v1/uploads

Upload a reference image as a raw body and get back a public URL to use in image_urls.

Parameters

ParameterDescription
Content-Typeimage/* · headerRequiredThe image type of the body: image/jpeg, image/png, image/webp, image/bmp or image/gif.
bodybinary · bodyRequiredThe raw image file, at most 20 MB.
curl
curl https://vellria.com/v1/uploads \
  -H "Authorization: Bearer vll_..." \
  -H "Content-Type: image/png" \
  --data-binary @reference.png
#

GET/v1/uploads/{id}

Fetch an uploaded image. Public: no key needed, the unguessable id is the access.

Parameters

ParameterDescription
idstring · pathRequiredThe upload id.
curl
curl -o reference.png https://vellria.com/v1/uploads/{id}
#

DELETE/v1/uploads/{id}

Delete an upload that no generation has used. Owner only; answers 204. A used upload answers 409 upload_in_use and expires on its own.

Parameters

ParameterDescription
idstring · pathRequiredThe upload id.
curl
curl -X DELETE https://vellria.com/v1/uploads/{id} \
  -H "Authorization: Bearer vll_..."
#

POST/v1/generations/{id}/reference

Turn a completed image generation into a public reference upload you can pass in image_urls.

Parameters

ParameterDescription
idstring · pathRequiredThe generation id.
curl
curl -X POST https://vellria.com/v1/generations/{id}/reference \
  -H "Authorization: Bearer vll_..."
#

Check generation status

#

Generations run asynchronously; the status moves queued → processing → completed. Credits are refunded automatically when a generation fails.

More details

The list at GET /v1/generations shows only completed and running generations: a failed generation is left out of the list and its total, while GET /v1/generations/{id} still returns it with its error_code for 30 days; after that the failed record is removed and GET /v1/generations/{id} and its file endpoint return HTTP 404 with the not_found code. Filtering the list with ?status=failed returns 400, and failed generations are also left out of the generations half of GET /v1/billing/history (generations_total included). Failures you have not been told about yet are listed by GET /v1/generations/failures: count, refunded_cents (credits actually refunded, 0 when no refund was made), until and up to 5 of the most recent in data. Mark them as seen with POST /v1/generations/failures/seen, sending either ids (1-50 generation ids) or until (every failure up to that timestamp); other accounts' ids are ignored and a failure is reported only once, on any device.

GET/v1/generations/{id}

Read one generation: its status, output_url once it is completed, or error_code when it failed.

Parameters

ParameterDescription
idstring · pathRequiredThe generation id.
curl
curl https://vellria.com/v1/generations/{id} \
  -H "Authorization: Bearer vll_..."
#

GET/v1/generations

List your generations, paged and filterable. Failed generations are left out.

Parameters

ParameterDescription
limitinteger · queryOptionalPage size, 1-50 (default 20).
offsetinteger · queryOptionalNumber of rows to skip.
typeimage | video · queryOptionalimage or video.
statusstring · queryOptionalqueued, processing or completed; failed returns 400.
modelstring · queryOptionalOnly generations made with this model id.
favoritesstring · queryOptional1 or true: favorites only.
availablestring · queryOptional1 or true: only generations whose file is still kept; expired or deleted files are left out of data and total.
qstring · queryOptionalSearch in the prompt and the model.
curl
curl "https://vellria.com/v1/generations?type=image" \
  -H "Authorization: Bearer vll_..."
#

GET/v1/generations/{id}/file

Download the generated file. Needs your key, so it cannot be used as a reference URL.

Parameters

ParameterDescription
idstring · pathRequiredThe generation id.
downloadstring · queryOptionalAny value: the file is served as an attachment.
thumbstring · queryOptionalThumbnail size, images only.
curl
curl -o result.png https://vellria.com/v1/generations/{id}/file \
  -H "Authorization: Bearer vll_..."
#

GET/v1/generations/failures

Failed generations you have not been told about yet, with the credits refunded for them.
curl
curl https://vellria.com/v1/generations/failures \
  -H "Authorization: Bearer vll_..."
#

POST/v1/generations/failures/seen

Mark failures as seen, by id or everything up to a timestamp.

Parameters

ParameterDescription
idsstring[] · bodyOptional1-50 generation ids to mark as seen.
untilinteger · bodyOptionalA Unix millisecond timestamp, the until value of GET /v1/generations/failures: every failure up to it is marked.
curl
curl -X POST https://vellria.com/v1/generations/failures/seen \
  -H "Authorization: Bearer vll_..." \
  -H "Content-Type: application/json" \
  -d '{"ids": ["gen_..."]}'
#

Adding credits

#

Credits are bought through a hosted checkout. GET /v1/billing/packages returns a single package list, each package with an id, a usd price and its credits, together with min_usd and max_usd for a free amount; read these from the endpoint rather than hardcoding them.

More details

POST /v1/billing/create-checkout takes either a package_id from that list or a free price_amount in USD between 30 and 10000, rounded to cents; a free amount converts at the same flat rate as the packages. When both are sent, package_id wins and the price and credits come from the catalog. An unknown package_id returns HTTP 400 with the invalid_package code and an amount outside the range returns invalid_amount. At most five checkouts can be open at a time; another one returns HTTP 429 until one of them is paid, cancelled or expires. The response is the payment record with a checkout_url: send the payer there to pay in USD by card (Visa or Mastercard) on our payment partner's secure page. Credits are added automatically once the payment confirms; poll the status with GET /v1/billing/payments/{id}. POST /v1/billing/payments/{id}/cancel marks an open payment as cancelled; if it completes anyway, the credits are still added. The optional provider field picks the provider that takes the payment; the accepted values are whop (card), nowpayments (crypto) and telegram_stars (Telegram Stars). GET /v1/billing/packages lists the providers open for checkout in providers, and the first one is the default when the field is left out. An unknown or closed provider returns HTTP 400 with the invalid_provider code, and an empty providers list means payments are unavailable right now. Each package also lists in excluded_providers the providers that cannot take it, for example telegram_stars when the package is above the Telegram Stars invoice limit; a checkout for that package with an excluded provider returns HTTP 400 with the package_unavailable_for_provider code and opens no payment. GET /v1/billing/balance returns credits, the total you can spend, split into permanent_credits, which never expire, subscription_credits, which expire at subscription_expires_at (a millisecond timestamp, or null when no subscription credits are active), and gift_credits, the one-time signup gift, which expire at gift_expires_at (null when no gift is active); spending uses gift credits first, then subscription credits, then permanent credits. Monthly subscription plans are listed separately in plans on GET /v1/billing/packages, each with an id, a display name, a monthly usd price and the credits it grants every period. POST /v1/billing/subscribe takes a plan_id from that list and returns the pending subscription with a checkout_url to send the payer to. Subscriptions are paid by card only: a provider other than whop returns HTTP 400 with the invalid_provider code, and an unknown plan_id returns invalid_plan. Every paid period replaces the remaining subscription credits with the plan's full amount; unused subscription credits do not roll over, while permanent credits are never touched. Subscribing to the plan you already have returns HTTP 409 with already_subscribed. Moving up to a larger plan starts it at once and adds the remaining credits of the current plan to the new period; moving down returns HTTP 409 with downgrade_requires_cancel. GET /v1/billing/subscription returns the active subscription in subscription (plan_id, status, current_period_end and cancel_at_period_end) and an open checkout in pending; each is null when there is none. Only one checkout can be open at a time: subscribing again to the same plan returns the open checkout, choosing another plan closes the open one first, and a checkout still being opened returns HTTP 409 with checkout_in_progress. POST /v1/billing/subscription/cancel stops the renewal at the end of the current period: the subscription credits stay usable until current_period_end and nothing is refunded. It returns the subscription with cancel_at_period_end set to true (calling it again returns the same), HTTP 404 with subscription_not_found when there is no active subscription, and HTTP 502 with subscription_cancel_failed when the cancellation could not be confirmed; try again in that case. Each plan in plans also carries a rank: a plan with a higher rank is an upgrade over one with a lower rank, so read the direction from rank, not from the price. GET /v1/billing/history lists subscription payments separately in subscription_payments (type subscription, payment_id, subscription_id, plan_id, amount_usd, status paid, refunded or mismatch, period_end and created_at), paged on its own with subscription_payments_offset and counted in subscription_payments_total.

GET/v1/billing/balance

Your spendable credits, split into permanent, subscription and gift credits.
curl
curl https://vellria.com/v1/billing/balance \
  -H "Authorization: Bearer vll_..."
#

GET/v1/billing/packages

Credit packages, the free-amount range, the checkout providers open now and the subscription plans. Public.
curl
curl https://vellria.com/v1/billing/packages
#

POST/v1/billing/create-checkout

Open a hosted checkout for a package or a free amount, then send the payer to checkout_url.

Parameters

ParameterDescription
package_idstring · bodyOptionalA package id from GET /v1/billing/packages; it wins when price_amount is also sent.
price_amountnumber · bodyOptionalA free amount in USD between min_usd and max_usd, rounded to cents.
providerstring · bodyOptionalOne of providers in GET /v1/billing/packages; the first one when left out.
curl
curl https://vellria.com/v1/billing/create-checkout \
  -H "Authorization: Bearer vll_..." \
  -H "Content-Type: application/json" \
  -d '{ "package_id": "pack_30", "provider": "whop" }'
curl
curl https://vellria.com/v1/billing/create-checkout \
  -H "Authorization: Bearer vll_..." \
  -H "Content-Type: application/json" \
  -d '{ "price_amount": 25 }'
#

GET/v1/billing/payments/{id}

Read a payment and its status; credits are added once it confirms.

Parameters

ParameterDescription
idstring · pathRequiredThe payment id.
curl
curl https://vellria.com/v1/billing/payments/{id} \
  -H "Authorization: Bearer vll_..."
#

POST/v1/billing/payments/{id}/cancel

Mark an open payment as cancelled. If it is paid anyway, the credits are still added.

Parameters

ParameterDescription
idstring · pathRequiredThe payment id.
curl
curl -X POST https://vellria.com/v1/billing/payments/{id}/cancel \
  -H "Authorization: Bearer vll_..."
#

GET/v1/billing/history

Your payments, charged generations and subscription payments, each list paged on its own.

Parameters

ParameterDescription
limitinteger · queryOptionalPage size, 1-50 (default 20).
payments_offsetinteger · queryOptionalOffset for the payments list only.
generations_offsetinteger · queryOptionalOffset for the generations list only.
subscription_payments_offsetinteger · queryOptionalOffset for the subscription payments list only.
curl
curl "https://vellria.com/v1/billing/history?limit=20" \
  -H "Authorization: Bearer vll_..."
#

GET/v1/chat/usage

Your chat requests, newest first: source, tokens, fractional credit cost and its USD equivalent, plus the accrued cost not yet deducted from your balance.

Parameters

ParameterDescription
limitinteger · queryOptionalPage size, 1-50 (default 20).
offsetinteger · queryOptionalNumber of rows to skip.
curl
curl "https://vellria.com/v1/chat/usage?limit=20" \
  -H "Authorization: Bearer vll_..."
#

POST/v1/billing/subscribe

Open a checkout for a monthly plan. Card only.

Parameters

ParameterDescription
plan_idstring · bodyRequiredA plan id from plans in GET /v1/billing/packages.
providerstring · bodyOptionalCard only (whop); any other value returns invalid_provider.
curl
curl https://vellria.com/v1/billing/subscribe \
  -H "Authorization: Bearer vll_..." \
  -H "Content-Type: application/json" \
  -d '{ "plan_id": "starter" }'
#

GET/v1/billing/subscription

The active subscription and any open subscription checkout.
curl
curl https://vellria.com/v1/billing/subscription \
  -H "Authorization: Bearer vll_..."
#

POST/v1/billing/subscription/cancel

Stop the renewal at the end of the current period; nothing is refunded.
curl
curl -X POST https://vellria.com/v1/billing/subscription/cancel \
  -H "Authorization: Bearer vll_..."
#

Retention

#

Generated files are kept for 7 days and then deleted from the server. The record stays in your billing history but the file becomes unreachable.

More details

The GET /v1/generations response carries a retention_days field and every generation carries expires_at; requesting an expired file returns HTTP 410 with the content_expired code. Download anything you need to keep for longer. You can also delete a generation yourself: DELETE /v1/generations/{id} removes the stored file straight away and returns purged_at. A deleted generation is gone from the API: it no longer appears in GET /v1/generations, and GET /v1/generations/{id}, its file endpoint and a second DELETE return HTTP 404 with the not_found code, the same as an id that never existed. The credits it cost are not refunded and stay in GET /v1/billing/history. The record of a failed generation is removed after 30 days; from then on GET /v1/generations/{id} and its file endpoint return HTTP 404. A generation that is still queued or processing cannot be deleted yet and returns HTTP 409 with the generation_in_progress code.

DELETE/v1/generations/{id}

Delete a generation now: its file is removed and the record disappears from the API (404); the credits it cost stay in billing history.

Parameters

ParameterDescription
idstring · pathRequiredThe generation id.
curl
curl -X DELETE https://vellria.com/v1/generations/{id} \
  -H "Authorization: Bearer vll_..."
#

Closing your account

#

Closing your account deletes your generations and their stored files, your uploads, your API keys and your support messages, and signs you out. Any credits left on the account are lost and are not refunded.

More details

Payment records are kept as billing records, so a closed account still appears in the payment history we are required to retain. The endpoint is authenticated by session only: it is called from the Account page in the console, and a request carrying an API key is refused with HTTP 403. An account whose payment has not settled yet cannot be closed and returns HTTP 409 with the pending_payment code, because that payment can still be credited; the same 409 with merge_in_progress is returned while the account is being linked to another one. Wait a moment and try again in both cases.

DELETE/v1/account

Close your account. Session only: called from the console, refused with an API key.
#

Content policy

#

Requests made with an API key are passed to the model as sent: the prompt and negative_prompt reach the provider byte for byte, and a prompt rewriter a model ships as a setting is sent switched off (a few video models keep their built-in thinking step). You are responsible for moderation in your application.

More details
  • One check remains on the API: requests involving the sexual abuse of minors are refused with HTTP 400 and content_blocked before any credit is taken (HTTP 503 with Retry-After if the check is briefly unavailable). Nothing else is screened, reference images included. The terms still prohibit bestiality, incest between blood relatives, non-consensual sex, extreme violence and gore, hidden-camera content, and depicting a real person without consent; the minor rule and the non-consensual rule are zero-tolerance and a breach closes the account without notice. Prompts sent from the Vellria console are also screened automatically.
  • The provider running a model applies its own safety filter and can refuse a request after it has started; the generation is marked failed and the credits taken at the start are returned automatically.