Generor API Documentation

Build with 93+ AI generators — text, image, video, audio, and more.

Base URL v1
https://generor.com/api/v1

A unified REST API for generating, browsing, and managing AI content. All requests use JSON. Authenticate with a Bearer token.

Authentication

Authenticate with a Bearer token in the Authorization header:

curl https://generor.com/api/v1/users/me \
  -H "Authorization: Bearer gnr_live_your_api_key_here"

API keys start with gnr_live_ followed by 40 hex characters. Create keys via the API Keys endpoint or your account settings.

Some endpoints (browsing generators, public creations, models) work without authentication. Endpoints marked with AUTH require a valid API key.

Scopes

API keys can be scoped to limit access:

ScopeAllows
readGET requests to all endpoints
writePOST, PATCH, DELETE operations (comments, ratings, profile updates, etc.)
generateContent generation (costs credits)

Keys with no scopes specified have full access.

Rate Limits

Limits are per API key. Every response includes rate limit headers:

X-RateLimit-Limit: 30
X-RateLimit-Remaining: 28
X-RateLimit-Reset: 1708444860
X-RateLimit-Tier: free
TierPer MinutePer HourPer Day
free305005,000
basic602,00020,000
pro1205,00050,000
enterprise30020,000200,000

Unauthenticated requests are limited to 15/minute per IP. When rate limited, you'll receive a 429 response with a Retry-After header.

Response Format

All responses use a consistent JSON envelope:

Success

{
  "success": true,
  "data": { ... },
  "meta": {
    "page": 1,
    "per_page": 20,
    "total": 142,
    "total_pages": 8,
    "has_next": true,
    "has_prev": false
  }
}

Error

{
  "success": false,
  "error": {
    "code": "NOT_FOUND",
    "message": "Creation not found",
    "status": 404
  }
}

Pagination

List endpoints support pagination via query parameters:

ParameterDefaultDescription
page1Page number (1-based)
per_page20Items per page (max 100)
sortnewestSort order: newest, oldest

Generators

GET /generators

List all available generators.

curl https://generor.com/api/v1/generators

Query params: status (active, development, all)

Response: Array of generators with slug, title, description, icon, and similar generators.

GET /generators/{slug}

Get detailed info about a specific generator.

curl https://generor.com/api/v1/generators/image

GET /generators/{slug}/creations

Browse public creations for a generator. Supports pagination.

curl "https://generor.com/api/v1/generators/joke/creations?page=1&per_page=10"

POST /generators/{slug}/estimate

Preview the credit cost and expected generation time before calling /generate. Same body shape as /generate — but read-only: no credits charged, no creation written. This is the exact same number the UI shows next to the Generate button.

curl -X POST https://generor.com/api/v1/generators/horoscope/estimate \
  -H "Content-Type: application/json" \
  -d '{
    "model_id": 37,
    "count": 5,
    "parameters": {
      "zodiac-sign": "aries",
      "horoscope-length": "long"
    }
  }'

Response:

{
  "success": true,
  "data": {
    "generator": "horoscope",
    "model_id": 37,
    "model_type": "text",
    "model_name": "Gemini 3.5 Flash",
    "credit_cost": {
      "total": 15,             // after bulk discount
      "per_item": 3,           // model base × length/quality multipliers
      "count": 5,
      "discount": 0,           // credits saved
      "discount_percent": 5    // % off applied (count% off, capped at 10%)
    },
    "time_estimate": {
      "seconds": 50,           // total wall-clock estimate
      "per_item": 10,
      "min_seconds": 8,
      "max_seconds": 14,
      "sample_count": 10,      // recent generations averaged
      "has_historical": true,
      "source": "historical"   // or "fallback" when sample_count < 3
    },
    "applied_parameters": {    // what the API actually used (schema-filtered)
      "zodiac-sign": "aries",
      "horoscope-length": "long",
      "model-text": "3",
      "horoscope-count": "5"
    }
  }
}

Open to unauthenticated callers — pricing/timing is public information and matches what the public generator page displays.

Snapped video durations

If you pass a seconds value that isn't in the model's supported_durations, the API snaps to the nearest supported value (ties break to the lower) and surfaces the change in an adjustments block. The credit cost and time estimate in the same response reflect the snapped value — what /generate will actually do — not the original request.

{
  "success": true,
  "data": {
    "credit_cost": { "total": 30, ... },
    "time_estimate": { "seconds": 60, ... },
    "adjustments": {
      "seconds": {
        "requested": 3,
        "used": 5,
        "supported": [5, 6, 7, 8, 10, 12, 15],
        "reason": "snapped to nearest provider-supported duration"
      }
    }
  }
}

When to use it

  • Pre-flight cost check — confirm a user can afford the generation before charging.
  • Progress UI — feed time_estimate.seconds into your loading bar so users know how long to wait.
  • Parameter tuning — call it whenever a user changes a dropdown; cost updates without committing to generate.

Relationship to /generate/estimate is a separate, optional call. /generate already returns the actual credit_cost it charged + credits_remaining after the fact, so if you're happy paying whatever the live price is, you can skip /estimate entirely.

Integration prompt (paste into your AI assistant when wiring up Generor):
Use the Generor API at https://generor.com/api/v1.

Before calling POST /generators/{slug}/generate, call
POST /generators/{slug}/estimate with the same body to get back:
  - credit_cost.total (credits the next generate call will charge)
  - time_estimate.seconds (expected wall-clock duration)

Show both to the user, then call /generate when they confirm.
The /generate response includes the real credit_cost charged and
credits_remaining — use those to update the user's balance.

Discover each generator's tweakable fields with GET /generators/{slug}
and pass them under the `parameters` object on both /estimate and
/generate (keys match the dropdown IDs you see on the public page).

POST /generators/{slug}/generate AUTH

Generate content using AI. This is a synchronous call — the response returns when generation is complete. Costs credits based on the model selected. Text generation typically takes 5-30 seconds, image generation 10-60 seconds, and video generation can take several minutes.

# Text generation (joke with GPT 5 Nano)
curl -X POST https://generor.com/api/v1/generators/joke/generate \
  -H "Authorization: Bearer gnr_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Tell me a joke about programming",
    "model_id": 37
  }'

# Image generation (Flux Schnell, square)
curl -X POST https://generor.com/api/v1/generators/image/generate \
  -H "Authorization: Bearer gnr_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A sunset over mountains",
    "model_id": 10003,
    "aspect_ratio": 1
  }'

# Image description (vision — Qwen VL Max, image-only input, prompt is optional)
curl -X POST https://generor.com/api/v1/generators/vision/generate \
  -H "Authorization: Bearer gnr_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model_id": 34,
    "image_url": "https://example.com/photo.jpg",
    "preference": "detailed"
  }'

# Video generation (Happy Horse 1.0 R2V — multi-reference, 6s, wide)
curl -X POST https://generor.com/api/v1/generators/video/generate \
  -H "Authorization: Bearer gnr_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "The character from [Image1] walks through the forest from [Image2]",
    "model_id": 20050,
    "aspect_ratio": "16:9",
    "seconds": 6,
    "reference_images": [
      "https://example.com/character.jpg",
      "https://example.com/forest.jpg"
    ]
  }'

# Video generation (Happy Horse Video Edit — natural-language edit of an existing clip)
curl -X POST https://generor.com/api/v1/generators/video/generate \
  -H "Authorization: Bearer gnr_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Replace the sky with a stormy sunset",
    "model_id": 20051,
    "video_url": "https://example.com/source.mp4",
    "seconds": 5
  }'

Request body:

FieldTypeRequiredDescription
promptstringYesThe generation prompt (max 10,000 chars)
model_idintegerYesAI model ID. Text: 1-9999, Image: 10001-19999, Video: 20001-29999. See Models.
privacy_modeintegerNo0 = public (default), 1 = private
team_idintegerNoCreate under a team
countintegerNoNumber of items (1-10, default 1)
languagestringNoLanguage code for text generation (e.g. "en-US", "nb-NO"). Default: "auto"
temperaturefloatNoLLM creativity (text models only, 0.0-2.0)
preferencestring/intNoGenerator-specific preference (e.g. joke type, poem style)
preference_twostring/intNoGenerator-specific secondary preference
aspect_ratioint or stringNoAccepts numeric IDs or ratio/name strings. Image: 1 / "1:1" / "square", 2 / "3:4" / "vertical", 3 / "4:3" / "horizontal", 4 / "16:9" / "wide", 5 / "9:16" / "tall". Video: 1 / "16:9" / "wide", 2 / "9:16" / "tall". Tip: use ratio strings like "16:9" and the API maps to the correct ID for the model type.
image_urlstringNoReference image URL for image-to-image, style transfer, or image-to-video (I2V).
secondsintegerNoVideo duration in seconds (video models only). Each provider accepts only a discrete set — query GET /models/video/{id} for supported_durations. If you pass an unsupported value, the API snaps it to the nearest supported one and reports the adjustment in adjustments.seconds on the response.
generate_audiobooleanNoNative-audio toggle for Veo 3.1 and Seedance 1.5 Pro (video). Other video models bake audio behavior in and ignore this flag.
ending_frame_urlstringNoEnd-frame anchor for models that support start+end frame control (Veo 3.1, Wan 2.6 I2V, Seedance Pro Lite, Kling v3). Pair with image_url for seamless transitions or loops.
reference_imagesarray<string>NoUp to 9 reference image URLs. Supported by: Veo 3.1 (max 3), Seedance 2.0 (max 9), Happy Horse R2V (max 9), Happy Horse Video Edit (max 5). Order is preserved and surfaced to the model as [Image1] … [ImageN] when prompts reference them.
reference_videosarray<string>NoUp to 3 reference video URLs. Used by Seedance 2.0 (Replicate) and Dreamina Seedance 2.0 (BytePlus direct) for motion/style coherence.
reference_audiostringNoReference audio URL for music/voice continuity. Currently used by Dreamina Seedance 2.0 (model 20060-20062, BytePlus direct).
video_urlstringNoSource video URL — required by Happy Horse Video Edit (model 20051), and used by Dreamina Seedance 2.0 (20060-20062) for video-edit / video-extend modes.
parametersobjectNoGenerator-specific fields — the same dropdowns the frontend exposes, keyed by their DOM IDs. See Generator Parameters below. Unknown / invalid keys are silently dropped.

Generator Parameters

Every generator's full set of tweakable fields lives in a per-generator schema (the same source the on-site dropdowns and URL-prefill use). Pass any of those fields in the parameters object on a generate request to drive them programmatically.

Get the schema for any generator at GET /generators/{slug} — the parameters array on the response lists each field with its id, type (enum, number, or model), options (or min/max), default, and cost_multipliers.

# 1) Discover the parameters for the horoscope generator
curl https://generor.com/api/v1/generators/horoscope

# 2) Pass them on the generate call
curl -X POST https://generor.com/api/v1/generators/horoscope/generate \
  -H "Authorization: Bearer gnr_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Aries weekly reading",
    "model_id": 37,
    "parameters": {
      "zodiac-sign": "aries",
      "horoscope-timeframe": "weekly",
      "horoscope-tone": "mystical",
      "horoscope-length": "long",
      "horoscope-focus": "career"
    }
  }'

# Image example — every dropdown in the UI is a key here
curl -X POST https://generor.com/api/v1/generators/wallart/generate \
  -H "Authorization: Bearer gnr_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Calm mountain lake at dawn",
    "model_id": 10003,
    "parameters": {
      "wallart-type": "framed-print",
      "wallart-orientation": "landscape",
      "image-aspect-ratio": "4"
    }
  }'
Why a discovery endpoint? The platform has 100+ generators, each with its own settings. Rather than freezing them into the API spec, you fetch the live schema for the generator you're building against and the API mirrors the dropdowns you see on the public page exactly.

Additional text-generation fields

For text generators (model_id 1-9999), these top-level body fields are forwarded to the LLM endpoint when relevant:

FieldTypeDescription
user_textstringFree-form supplemental text (e.g. source content to summarize / transform)
user_text_twostringSecondary supplemental text (used by generators with two text inputs)
avoid_duplicatesbooleanBias the model toward novel outputs across a batch
thinking_modestringFor reasoning-capable models: off, on, or high
story_contextstringSource story passed to story, story-part, and storyboard for on-brand scene writing
character_context / character_name / character_idstring / intCharacter continuity for storyboards, story parts, and follow-up creations
support_forintegerParent creation ID — links this generation as a child / companion creation
modestringGenerator-specific mode toggle (e.g. game phase)
model_speechintegerSpeech model to pair with the text output (used for narrated horoscopes, podcasts, etc.)
item_index / total_countintegerSequential generation hints (used when generating items in order, e.g. solution steps)
translation_of / source_languageinteger / stringTranslate an existing creation rather than generate from scratch

Response (201 Created) — Text generator example:

{
  "success": true,
  "data": {
    "generator": "joke",
    "model_id": 37,
    "model_type": "text",
    "model_name": "Gemini 3.5 Flash",
    "creations": [
      {
        "creation_id": 6144,
        "text": "Why do programmers prefer dark mode? Because light attracts bugs!",
        "illustration_desc": "a minimalist bug icon on a dark background"
      }
    ],
    "credit_cost": 1,
    "credit_cost_estimated": 1,
    "credits_remaining": 36024,
    "time_taken_seconds": 4.18
  }
}

Response (201 Created) — Image generator example:

{
  "success": true,
  "data": {
    "generator": "image",
    "model_id": 10003,
    "model_type": "image",
    "model_name": "black-forest-labs/flux-schnell",
    "creations": [
      {
        "creation_id": 6147,
        "image_url": "https://generor.com/users/2/img/image-6147.webp"
      }
    ],
    "credit_cost": 24,
    "credit_cost_estimated": 6,
    "credits_remaining": 35998,
    "time_taken_seconds": 23.7
  }
}

Snapped video durations — if the caller's seconds isn't in the model's supported_durations, the API snaps to the nearest supported value before invoking the provider and adds an adjustments.seconds block to the response identical in shape to the one on /estimate. This prevents providers from silently defaulting unsupported values.

How the cost fields work

  • credit_cost — the actual amount deducted, computed as balance_before − balance_after. This is the source of truth: use it for logging, billing, and updating user balances.
  • credit_cost_estimated — the upfront catalog estimate (the same number /estimate would have predicted). Included for transparency and drift monitoring. Often differs from credit_cost for video / per-second / per-character pricing where the real charge is computed inside the provider call.
  • time_taken_seconds — actual wall-clock duration. Compare against time_estimate.seconds from /estimate to validate the historical-time prediction.
Note: Text creations return generator-specific fields (e.g. text, illustration_desc for jokes; dish_name, ingredients for recipes). Use GET /creations/{id} to fetch the full creation data later.

Creations

GET /creations AUTH

List your own creations.

curl https://generor.com/api/v1/creations \
  -H "Authorization: Bearer gnr_live_..."

Query params: generator (filter by slug), page, per_page, sort

GET /creations/public

Browse all public creations across all generators.

curl "https://generor.com/api/v1/creations/public?generator=image&page=1"

GET /creations/search

Search public creations by prompt text.

curl "https://generor.com/api/v1/creations/search?q=sunset+mountain"

GET /creations/{id}

Get a single creation with full details, images, and generator-specific data.

curl https://generor.com/api/v1/creations/12345

Public creations are accessible to anyone. Private creations require authentication as the owner.

Response includes:

{
  "success": true,
  "data": {
    "creation_id": 12345,
    "generator": "image",
    "user_id": 42,
    "username": "johndoe",
    "prompt": "A sunset over mountains",
    "created_at": "2026-02-20 12:00:00",
    "privacy_mode": 0,
    "type": "img",
    "license": 1,
    "images": [
      {
        "url": "/users/42/img/image-12345.png",
        "width": 1024,
        "height": 1024
      }
    ],
    "generator_data": { ... }
  }
}

GET /creations/{id}/status AUTH

Check the generation status of a creation (useful if you're tracking generation records).

curl https://generor.com/api/v1/creations/12345/status \
  -H "Authorization: Bearer gnr_live_..."

Status values: pending, generating, completed, failed, cancelled

PATCH /creations/{id} AUTH

Update a creation you own.

curl -X PATCH https://generor.com/api/v1/creations/12345 \
  -H "Authorization: Bearer gnr_live_..." \
  -H "Content-Type: application/json" \
  -d '{"privacy_mode": 1, "license": 2}'
FieldValues
privacy_mode0 (public), 1 (private)
license1 (Open GO-1.0), 2 (Exclusive GE-1.0)

DELETE /creations/{id} AUTH

Delete a creation you own (soft delete).

curl -X DELETE https://generor.com/api/v1/creations/12345 \
  -H "Authorization: Bearer gnr_live_..."

Models

GET /models

List all available AI models grouped by type.

curl https://generor.com/api/v1/models

GET /models/{type}

List models for a specific type.

curl https://generor.com/api/v1/models/image

Valid types: text, image, video, speech, music, soundeffect, upscale, vector, backgroundremoval

Response per model:

{
  "id": 10001,
  "name": "Flux 1.1 Pro",
  "type": "image",
  "provider": "replicate",
  "description": "High-quality image generation...",
  "credit_cost": 80,
  "supports_img2img": true,
  "supports_aspect_ratio": true
}

Video models additionally include the full provider-capability struct:

{
  "id": 20061,
  "name": "Dreamina Seedance 2.0 (720p)",
  "type": "video",
  "provider": "byteplus",
  "credit_cost": 6,

  // Duration constraints
  "supported_durations": [5, 6, 7, 8, 10, 12, 15],
  "default_duration": 8,

  // Audio toggle
  "supports_audio": true,
  "audio_cost_multiplier": 1,

  // End-frame anchoring (pass `ending_frame_url` on /generate)
  "supports_end_frame": true,

  // Resolution variants — same model at different qualities lives at
  // different model_ids. Switch quality by picking the matching id.
  "quality": "720p",
  "default_quality": "720p",
  "qualities": { "480p": 20060, "720p": 20061, "1080p": 20062 },
  "group_slug": "dreamina-seedance-2-direct",
  "group_name": "Dreamina Seedance 2.0",

  // Aspect ratios accepted on /generate
  "supports_aspect_ratio": true,
  "aspect_ratios": [
    { "id": 1, "ratio": "16:9", "label": "Wide" },
    { "id": 2, "ratio": "9:16", "label": "Tall" }
  ]
}

Image models that vary aspect ratio include an equivalent aspect_ratios array (image-side has 6 entries: square, vertical, horizontal, wide, tall, plus match_input_image for img2img modes).

How to use these fields

  • supported_durations — pass any value here via seconds. Unsupported values snap server-side and are reported under adjustments.seconds.
  • qualities — to switch resolution, look up the model_id for the resolution you want and pass that as your model_id. (Resolutions are sibling models, not a runtime parameter.)
  • supports_audio — when true, you can pass "generate_audio": true on /generate. When false, the flag is ignored.
  • supports_end_frame — when true, you can pair image_url (start frame) with ending_frame_url for seamless transitions or loops.
  • aspect_ratios — pass the id (integer) or ratio (string) under the aspect_ratio field on /generate. Both forms work.
Model ID ranges: text (1-9999), image (10001-19999), video (20001-29999), speech (30001-39999), music (40001-49999), sound effects (50001-59999).

GET /models/{type}/{id}

Get a specific model's details and pricing.

curl https://generor.com/api/v1/models/image/10001

Users

GET /users/me AUTH

Get your profile, credit balance, and stats.

curl https://generor.com/api/v1/users/me \
  -H "Authorization: Bearer gnr_live_..."

Response:

{
  "success": true,
  "data": {
    "user_id": 42,
    "username": "johndoe",
    "email": "john@example.com",
    "avatar": null,
    "bio": "I make things with AI",
    "website": "https://example.com",
    "joined": "2025-01-15 10:30:00",
    "credits": {
      "total": 1250,
      "paid": 1000,
      "free": 200,
      "earned": 50,
      "max": 250
    },
    "creation_count": 347,
    "follower_count": 12,
    "following_count": 5,
    "teams": [...]
  }
}

PATCH /users/me AUTH

Update your profile.

curl -X PATCH https://generor.com/api/v1/users/me \
  -H "Authorization: Bearer gnr_live_..." \
  -H "Content-Type: application/json" \
  -d '{"bio": "Updated bio", "website": "https://example.com"}'

GET /users/{username}

Get a user's public profile.

curl https://generor.com/api/v1/users/johndoe

GET /users/{username}/creations

List a user's public creations. Supports pagination.

GET /users/{username}/followers

List a user's followers. Supports pagination.

GET /users/{username}/following

List who a user follows. Supports pagination.

POST /users/{username}/follow AUTH

Follow a user.

curl -X POST https://generor.com/api/v1/users/johndoe/follow \
  -H "Authorization: Bearer gnr_live_..."

DELETE /users/{username}/follow AUTH

Unfollow a user.

GET /users/{username}/follow AUTH

Check if you follow a user. Returns {"following": true/false}.

Teams

All team endpoints require authentication.

GET /teams AUTH

List your teams.

POST /teams AUTH

Create a new team.

curl -X POST https://generor.com/api/v1/teams \
  -H "Authorization: Bearer gnr_live_..." \
  -H "Content-Type: application/json" \
  -d '{"name": "My Creative Team"}'

GET /teams/{id} AUTH

Get team details with member list.

DELETE /teams/{id} AUTH

Leave a team.

POST /teams/{id}/members AUTH

Add a member by username: {"username": "janedoe"}

DELETE /teams/{id}/members/{user_id} AUTH

Remove a team member (owner only).

POST /teams/join/{invite_code} AUTH

Join a team via invite code.

POST /teams/{id}/invite AUTH

Regenerate invite code (owner only).

GET /teams/{id}/creations AUTH

List team creations. Supports pagination.

Comments

GET /creations/{id}/comments

List comments on a creation. Supports pagination.

curl https://generor.com/api/v1/creations/12345/comments

POST /creations/{id}/comments AUTH

Add a comment.

curl -X POST https://generor.com/api/v1/creations/12345/comments \
  -H "Authorization: Bearer gnr_live_..." \
  -H "Content-Type: application/json" \
  -d '{"text": "Great creation!", "parent_id": null}'

DELETE /comments/{id} AUTH

Delete your own comment.

POST /comments/{id}/vote AUTH

Vote on a comment: {"vote": "up"} or {"vote": "down"}

Ratings

GET /creations/{id}/rating

Get average rating for a creation.

// Response:
{"success": true, "data": {"creation_id": 12345, "average": 4.2, "count": 15}}

POST /creations/{id}/rating AUTH

Rate a creation (1-5). Updates existing rating if already rated.

curl -X POST https://generor.com/api/v1/creations/12345/rating \
  -H "Authorization: Bearer gnr_live_..." \
  -H "Content-Type: application/json" \
  -d '{"score": 5}'

Credits

Credits are the payment system used for AI generations, denominated in USD.

GET /credits/balance AUTH

Get your current credit balance.

curl https://generor.com/api/v1/credits/balance \
  -H "Authorization: Bearer gnr_live_..."
// Response:
{
  "success": true,
  "data": {
    "total": 1250,
    "paid": 1000,
    "free": 200,
    "earned": 50,
    "max": 250
  }
}

GET /credits/transactions AUTH

Get credit transaction history.

curl "https://generor.com/api/v1/credits/transactions?type=spend&page=1" \
  -H "Authorization: Bearer gnr_live_..."

Query params: type (spend, purchase, daily_bonus, weekly_bonus, signup_bonus, refund, gift_sent, gift_received), page, per_page

Feed

GET /feed AUTH

Get public creations from users you follow.

curl "https://generor.com/api/v1/feed?generator=image&page=1" \
  -H "Authorization: Bearer gnr_live_..."

Query params: generator (filter by slug), page, per_page

API Keys

Manage your own API keys programmatically. All endpoints require authentication.

GET /api-keys AUTH

List your API keys (shows prefix, not full key).

POST /api-keys AUTH

Create a new API key. The full key is shown only once in the response.

curl -X POST https://generor.com/api/v1/api-keys \
  -H "Authorization: Bearer gnr_live_..." \
  -H "Content-Type: application/json" \
  -d '{"name": "My App", "scopes": ["read", "generate"]}'
// Response (201):
{
  "success": true,
  "data": {
    "key_id": 1,
    "api_key": "gnr_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0",
    "prefix": "gnr_live_a1b2c3d4",
    "name": "My App",
    "scopes": ["read", "generate"],
    "message": "Save this API key now. It will not be shown again."
  }
}

Maximum 10 active keys per account.

DELETE /api-keys/{id} AUTH

Revoke an API key (deactivates it immediately).

Error Codes

CodeHTTP StatusDescription
UNAUTHORIZED401Missing or invalid API key
FORBIDDEN403Valid key but insufficient permissions or scope
NOT_FOUND404Resource does not exist
METHOD_NOT_ALLOWED405HTTP method not supported for this endpoint
VALIDATION_ERROR400Invalid input parameters
INSUFFICIENT_CREDITS402Not enough credits for generation
RATE_LIMIT_EXCEEDED429Too many requests, check Retry-After header
SERVER_ERROR500Internal server error