SEELE API Docs
Overview

Seele Public API

Intro

The Seele Public API provides a stable, API-key based interface for generating and iterating on any type of content programmatically via jobs.

Typical integration flow:

  1. Create an API key in the Seele developer console.
  2. Upload reference files when needed with POST /v2/api/files.
  3. Start a generation job with POST /v2/api/jobs.
  4. Optionally add a follow-up step to an existing job with POST /v2/api/jobs/{job_id}/steps.
  5. Poll GET /v2/api/jobs/{job_id} until status is finished.

Base URL

https://openapi.seeles.ai

Authentication

All public API endpoints require Bearer authentication. Include your API key in the Authorization header:

Header
Authorization: Bearer YOUR_API_KEY

Create and manage API keys in the Seele developer console.

Endpoints

POST/v2/api/filesCreate a temporary upload session and receive a reusable file_id.
PUT{upload_url}Upload raw bytes to the temporary URL returned by POST /v2/api/files.
POST/v2/api/jobsStart a new generation job request.
POST/v2/api/jobs/{job_id}/stepsSend a follow-up prompt step for an existing job.
GET/v2/api/jobs/{job_id}Check progress and retrieve available job outputs.
GET/v2/api/generation_modelsDiscover generation models, their required plan tier, and which API surfaces support them.
POST/v2/api/generationsDirectly generate an image or video from a supported generation model.
GET/v2/api/generations/{generation_id}Poll a direct generation until it completes and retrieve result URLs.

Contract notes

  • All documented endpoints are versioned under /v2/api.
  • job_id and file_id are opaque public identifiers.
  • Successful responses return ok: true.
  • Failed responses return ok: false with an error object.
  • Only rely on fields explicitly documented on this page.
  • Additional non-contract fields may appear in some responses for product integration or display convenience and may change without notice.

Response envelope

okboolean
Success responses return ok: true. Error responses return ok: false.
dataobject
Successful response payload. Fields depend on the endpoint.
error.codestring
Machine-readable error code on failed requests.
error.messagestring
Human-readable error message on failed requests.
Representative success payload
JSON
{
  "ok": true,
  "data": {
    "job_id": "job_123",
    "meta": {
      "platform_url": "https://www.seeles.ai/workspace/job_123"
    }
  }
}
Error example
JSON
{
  "ok": false,
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Invalid or missing API key"
  }
}
Bearer auth

Authentication

Pass the API key from the Seele developer console in the Authorization header as a Bearer token.

Request example

cURL
curl https://openapi.seeles.ai/v2/api/jobs \
  -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Build a cozy cat farming game",
    "model": "Seele02-flash",
    "engine": "threejs"
  }'
POST /v2/api/files

Upload File

POST /v2/api/files creates a temporary upload session. Upload the raw file bytes to the returned upload_url before upload_url_expires_at, then pass the returned file_id to /v2/api/jobs or /v2/api/jobs/{job_id}/steps.

Request fields

filenamestringRequired
Original file name returned for confirmation in the response.
content_typestringRequired
MIME type used when uploading the raw file bytes.
sizeintegerRequired
File size in bytes. Must not exceed 25 MiB.
Step 1: request upload URL
cURL
curl https://openapi.seeles.ai/v2/api/files \
  -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "filename": "reference.png",
    "content_type": "image/png",
    "size": 428731
  }'
Step 2: PUT raw bytes
cURL
curl "$UPLOAD_URL" \
  -X PUT \
  -H "Content-Type: image/png" \
  --data-binary "@reference.png"

Response example

JSON
{
  "ok": true,
  "data": {
    "file_id": "0123456789abcdef0123456789abcdef",
    "upload_url": "https://...presigned-put-url...",
    "upload_url_expires_at": "2026-04-17T00:45:00.000Z",
    "upload_headers": {
      "Content-Type": "image/png"
    },
    "filename": "reference.png",
    "content_type": "image/png",
    "size": 428731
  }
}
POST /v2/api/jobs

Create Job

Start a new generation job request from an initial prompt. Store the returned job_id and reuse it for later status checks or step requests. The accepted response can also include meta.platform_url, a hosted Seele workspace link that product users can open as a sandbox for review or further iteration. engine accepts threejs, unity, or unreal as the runtime environment, and unreal is available to subscription users only. Seele02-pro is available to subscription users; otherwise the request returns 403.

Request fields

promptstringRequired
Initial creation prompt. Max length 100000 characters.
modelSeele02-flash | Seele02-pro | Seele01-flash | Seele01-pro
Optional model tier. Defaults to Seele02-flash. Seele02-pro is available to subscription users.
enginethreejs | unity | unreal
Runtime or rendering environment for the generated job. Accepted values are threejs, unity, or unreal. unreal is available to subscription users only.
generation_modelstring
Optional generation model identifier, e.g. seedream5lite. Discover available models from GET /v2/api/generation_models.
file_idsstring[]
Optional reference file IDs returned by POST /v2/api/files.

Request example

cURL
curl https://openapi.seeles.ai/v2/api/jobs \
  -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Build a cozy cat farming game with planting and fishing",
    "model": "Seele02-flash",
    "engine": "threejs",
    "generation_model": "seedream5lite",
    "file_ids": ["0123456789abcdef0123456789abcdef"]
  }'

Response example

JSON
{
  "ok": true,
  "data": {
    "job_id": "job_123",
    "meta": {
      "platform_url": "https://www.seeles.ai/workspace/job_123"
    }
  }
}

Response fields

job_idstringRequired
Opaque public job identifier for later polling or step requests.
step_idstring
Opaque step identifier for the accepted generation turn when available (only present for step requests).
meta.platform_urlstring
Hosted Seele workspace link for the same job. Useful as a product sandbox for review or further iteration, but not required for API workflows.

Build workflow around job_id and later status. Treat meta.platform_url as a convenience field for product review flows, not as required contract for automation.

Status codes

201
Job request accepted successfully.
400
Invalid request payload.
401
Missing or invalid API key.
403
The requested model, engine, or generation_model option is not available for this API key. Seele02-pro and unreal require a subscription user.
502
Service temporarily unavailable.
POST /v2/api/jobs/{job_id}/steps

Create Job Step

Submit a follow-up prompt step for an existing job using its public job_id. Successful responses follow the same shape as create and may also include meta.platform_url pointing to the updated workspace, plus a step_id for the new step. Seele02-pro is available to subscription users; otherwise the request returns 403.

Request fields

promptstringRequired
Follow-up instruction for the existing job.
modelSeele02-flash | Seele02-pro | Seele01-flash | Seele01-pro
Optional model tier override. Defaults to Seele02-flash. Seele02-pro is available to subscription users.
enginethreejs | unity | unreal
Optional runtime or rendering environment override for this step.
generation_modelstring
Optional generation model identifier for this step.
file_idsstring[]
Optional extra references uploaded through POST /v2/api/files.

Request example

cURL
curl https://openapi.seeles.ai/v2/api/jobs/$JOB_ID/steps \
  -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Add a day-night cycle and a boss battle",
    "model": "Seele02-flash",
    "file_ids": ["fedcba9876543210fedcba9876543210"]
  }'

Response example

JSON
{
  "ok": true,
  "data": {
    "job_id": "job_123",
    "step_id": "step_456",
    "meta": {
      "platform_url": "https://www.seeles.ai/workspace/job_123"
    }
  }
}

Response fields

job_idstringRequired
Opaque public job identifier for later polling or step requests.
step_idstring
Opaque step identifier for the accepted generation turn when available (only present for step requests).
meta.platform_urlstring
Hosted Seele workspace link for the same job. Useful as a product sandbox for review or further iteration, but not required for API workflows.

If the job is still processing, the API returns 409 instead of accepting the step request.

As with create, build automation around documented identifiers and status fields. Treat meta.platform_url as convenience product metadata.

Status codes

200
Job step request accepted successfully.
400
Invalid request payload.
401
Missing or invalid API key.
403
The requested model, engine, or generation_model option is not available for this API key. Seele02-pro requires a subscription user.
409
The job is still processing and cannot accept a new step request yet.
502
Service temporarily unavailable.

Error example

409 job still processing
JSON
{
  "ok": false,
  "error": {
    "code": "JOB_ALREADY_PROCESSING",
    "message": "job is still generating, new steps are not allowed yet"
  }
}
GET /v2/api/jobs/{job_id}

Get Job Status

Query the current job state with a job_id. Poll this endpoint every 10–30 seconds until status becomes finished. Finished responses include summary, total_koin, an artifacts array with latest-turn generated output metadata, and meta.platform_url for opening the result in the Seele workspace interface.

Artifact metadata is returned for finished jobs, but direct artifact download URLs are gated by plan. API keys on Standard or above receive populated artifacts[].urls. Lower-tier keys receive urls: [] plus meta.artifact_urls_access_message, and can still preview the result through meta.platform_url.

Generation states

processing
Generation is still running. Poll again later; the response may include a current_operation hint.
finished
Generation is complete. The response contains the final summary, total Koin consumed, and any currently available output artifacts.

Request example

cURL
curl https://openapi.seeles.ai/v2/api/jobs/$JOB_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

Representative finished response for a lower-tier key

JSON
{
  "ok": true,
  "data": {
    "job_id": "job_123",
    "status": "finished",
    "summary": "A time detective puzzle with a boss room.",
    "total_koin": 125,
    "artifacts": [
      {
        "id": "artifact_789",
        "name": "Game Project",
        "description": "Generated Unity project package",
        "status": "ready",
        "urls": []
      }
    ],
    "meta": {
      "platform_url": "https://www.seeles.ai/workspace/job_123",
      "artifact_urls_access_message": "Upgrade to Standard or above to access artifact download URLs. You can preview the output from platform_url."
    }
  }
}

Response fields

job_idstringRequired
Opaque public job identifier for subsequent API requests.
statusprocessing | finishedRequired
Primary workflow state. Poll until this field becomes finished.
current_operationstring
Optional progress hint while status is processing (display only).
summarystring
High-level summary of the finished result.
total_koininteger
Cumulative Koin consumed by this job across all completed steps (only present when status is finished).
artifactsarray
Latest-turn output artifact metadata generated by the job, each including id, name, description, urls, status, version, lineage_root, and create_at when available (only present when status is finished).
artifacts[].urlsstring[]
Download URLs for the artifact. Returned for Standard or above API keys. For lower-tier keys, the field is returned as an empty array while artifact metadata remains visible.
meta.artifact_urls_access_messagestring
Optional upgrade hint returned when artifact download URLs are hidden because the API key is below Standard tier.
meta.platform_urlstring
Hosted Seele workspace link for the same job.

For automation, rely on status and the documented output fields. Treat artifact URLs as plan-gated outputs: check whether artifacts[].urls is populated before starting a download, and fall back to meta.platform_url when only preview access is available.

Status codes

200
Job status returned successfully.
401
Missing or invalid API key.
502
Service temporarily unavailable.
GET /v2/api/generation_models

List Generation Models

Discover the available generation models before creating jobs or direct generations. Each entry declares its modality (tags), the minimum plan tier needed to use it (required_plan_tier), and which API surfaces accept it (supported_interfaces). Image and video models work with both /v2/api/generations and /v2/api/jobs; world and 3d models are currently jobs-only.

Request example

cURL
curl https://openapi.seeles.ai/v2/api/generation_models \
  -H "Authorization: Bearer YOUR_API_KEY"

Response example

JSON
{
  "ok": true,
  "data": {
    "generation_models": [
      {
        "id": "nanobanana",
        "label": "NanoBanana",
        "description": "Free image generation and single-reference editing; ...",
        "required_plan_tier": "free",
        "tags": ["image"],
        "supported_interfaces": ["generations", "jobs"]
      },
      {
        "id": "seedance1_5_720p",
        "label": "Seedance 1.5 720p",
        "description": "Standard text/image/video/audio generation, editing, and extension; ...",
        "required_plan_tier": "standard",
        "tags": ["video"],
        "supported_interfaces": ["generations", "jobs"],
        "capabilities": {
          "aspect_ratios": ["16:9", "9:16", "1:1", "4:3", "3:4", "21:9", "adaptive"],
          "duration_seconds": { "min": 4, "max": 12, "allow_auto": true },
          "generate_types": ["text_to_video", "image_to_video_first_frame", "image_to_video_first_last_frame"]
        }
      },
      {
        "id": "marble_0.1-mini",
        "label": "Marble 0.1 Mini",
        "description": "Free world model; ...",
        "required_plan_tier": "free",
        "tags": ["world"],
        "supported_interfaces": ["jobs"]
      }
    ]
  }
}

Response fields

generation_models[].idstringRequired
Stable generation model identifier. Pass this value as generation_model.
generation_models[].labelstringRequired
Human-readable model label for display.
generation_models[].descriptionstringRequired
Short capability description: modality, resolutions, durations, and ratios.
generation_models[].required_plan_tierfree | standardRequired
Minimum plan tier required to use this model. Models marked standard require an active subscription; requests from free API keys return 403 SUBSCRIPTION_REQUIRED.
generation_models[].tagsstring[]Required
Modality tags: image, video, world, or 3d.
generation_models[].supported_interfacesarray of generations | jobsRequired
API surfaces that accept this model. Image and video models support both POST /v2/api/generations and /v2/api/jobs. World and 3d models currently support only /v2/api/jobs.
generation_models[].capabilitiesobject
Structured parameter constraints: aspect_ratios, image_sizes, duration_seconds {min,max,allow_auto}, resolutions, and generate_types. Absent fields mean the constraint is not published; treat them as provider-defined rather than unrestricted.

Status codes

200
Generation model catalog returned successfully.
401
Missing or invalid API key.
POST /v2/api/generations

Create Generation

Generate an image or video directly from a supported generation model, without creating a job. Image models usually finish synchronously and return status: completed with result.urls. Video models are asynchronous: the response returns queued or processing, and you poll GET /v2/api/generations/{generation_id} until the status becomes completed or failed. Billing is atomic: the estimated cost is frozen on acceptance, settled on success, and automatically released on failure.

Access is gated by plan. Models marked required_plan_tier: standard require an active subscription; free API keys receive 403 SUBSCRIPTION_REQUIRED before any billing happens. Models whose supported_interfaces do not include generations (world and 3d) are rejected with 400 UNSUPPORTED_GENERATION_MODEL and must be used through /v2/api/jobs.

Request fields

Idempotency-KeyheaderRequired
Unique key per logical request. Retries with the same key safely replay the original generation instead of creating (and billing) a duplicate.
generation_modelstringRequired
Model identifier from GET /v2/api/generation_models. Only models whose supported_interfaces include generations are accepted; image and video models only.
promptstringRequired
Generation prompt. Max length 100000 characters.
aspect_ratiostring
Optional output aspect ratio, e.g. 16:9 or 9:16. Valid values depend on the model.
image_sizestring
Optional image size hint for image models, e.g. 1K, 2K, 4K.
image_idsstring[]
Optional reference image file IDs returned by POST /v2/api/files (max 16), for image editing or multimodal reference.
generate_typeenum
Optional video generation mode: text_to_video, image_to_video_first_frame, image_to_video_first_last_frame, video_edit, video_extend, or multimodal_reference.
durationinteger
Optional video duration in seconds (2-15). Valid values depend on the model.
resolutionstring
Optional video resolution, e.g. 720p or 1080p.
first_frame_url / last_frame_url / video_url / video_urlsstring | string[]
Optional frame or video references for image-to-video, video edit, or video extend modes.
Image (synchronous)
cURL
curl https://openapi.seeles.ai/v2/api/generations \
  -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 9f1c2a84-unique-per-logical-request" \
  -d '{
    "generation_model": "nanobanana",
    "prompt": "A cozy reading nook with warm light, soft illustration style"
  }'
Video (asynchronous)
cURL
curl https://openapi.seeles.ai/v2/api/generations \
  -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 7bd31f02-unique-per-logical-request" \
  -d '{
    "generation_model": "seedance2_720p",
    "prompt": "A calm ocean wave rolling onto a sandy beach at sunrise",
    "duration": 4,
    "aspect_ratio": "16:9"
  }'

Response example

JSON
{
  "ok": true,
  "data": {
    "generation_id": "495d160a-48f8-4942-86c7-193736f5b477",
    "status": "completed",
    "result": {
      "urls": ["https://...signed-download-url..."]
    },
    "billing": {
      "status": "settled",
      "estimatedCost": 0,
      "actualCost": 0
    }
  }
}

Response fields

generation_idstringRequired
Opaque generation identifier. Use it with GET /v2/api/generations/{generation_id} to poll status.
statusqueued | processing | completed | failed | billing_failedRequired
Image generations usually complete synchronously (completed or failed). Video generations return queued or processing and must be polled until a terminal state.
result.urlsstring[]
Download URLs for the generated media. Only present once status is completed and billing is settled.
errorobject
Present when status is failed: a stable code and a human-readable message. GENERATION_PARAMS_REJECTED means the request parameters cannot work for that model; IMAGE_GENERATION_FAILED / VIDEO_GENERATION_FAILED means the upstream generation failed and retrying may help; RESULT_PERSISTENCE_FAILED means the worker could not persist a result. Billing holds are automatically released on failure.
billing.statusstringRequired
Billing lifecycle: pre_frozen, settlement_pending, reconciliation_pending, settled, or released.
billing.estimatedCostnumberRequired
Estimated Koin cost frozen when the generation was accepted.
billing.actualCostnumber
Final settled Koin cost. Present after settlement succeeds.

Plan gating and unsupported model errors

403 subscription required
JSON
{
  "ok": false,
  "error": {
    "code": "SUBSCRIPTION_REQUIRED",
    "message": "generation_model seedance1_5_720p requires an active subscription"
  }
}
400 jobs-only model
JSON
{
  "ok": false,
  "error": {
    "code": "UNSUPPORTED_GENERATION_MODEL",
    "message": "generation_model marble_0.1-mini is not supported by POST /v2/api/generations (image/video models only); use /v2/api/jobs instead"
  }
}

Status codes

200
Generation completed synchronously or was durably recorded.
400
Invalid request, missing Idempotency-Key, or the model is not supported by this endpoint (UNSUPPORTED_GENERATION_MODEL). World and 3d models must be used through /v2/api/jobs.
401
Missing or invalid API key.
402
Billing unavailable.
403
The requested generation_model requires an active subscription (SUBSCRIPTION_REQUIRED). Check required_plan_tier in GET /v2/api/generation_models.
502
Service temporarily unavailable.
GET /v2/api/generations/{generation_id}

Get Generation

Poll a direct generation with its generation_id. For asynchronous video generations, poll every 10-30 seconds until status becomes completed or failed. Completed responses include result.urls once billing has settled. Failed generations include an error object, and any frozen billing hold is released automatically.

Request example

cURL
curl https://openapi.seeles.ai/v2/api/generations/$GENERATION_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

Response example

JSON
{
  "ok": true,
  "data": {
    "generation_id": "1a8c9132-27ad-4221-8ab6-8c77bdb3ed5f",
    "status": "completed",
    "result": {
      "urls": ["https://...video-download-url..."]
    },
    "billing": {
      "status": "settled",
      "estimatedCost": 15,
      "actualCost": 15
    }
  }
}

Response fields

generation_idstringRequired
Opaque generation identifier. Use it with GET /v2/api/generations/{generation_id} to poll status.
statusqueued | processing | completed | failed | billing_failedRequired
Image generations usually complete synchronously (completed or failed). Video generations return queued or processing and must be polled until a terminal state.
result.urlsstring[]
Download URLs for the generated media. Only present once status is completed and billing is settled.
errorobject
Present when status is failed: a stable code and a human-readable message. GENERATION_PARAMS_REJECTED means the request parameters cannot work for that model; IMAGE_GENERATION_FAILED / VIDEO_GENERATION_FAILED means the upstream generation failed and retrying may help; RESULT_PERSISTENCE_FAILED means the worker could not persist a result. Billing holds are automatically released on failure.
billing.statusstringRequired
Billing lifecycle: pre_frozen, settlement_pending, reconciliation_pending, settled, or released.
billing.estimatedCostnumberRequired
Estimated Koin cost frozen when the generation was accepted.
billing.actualCostnumber
Final settled Koin cost. Present after settlement succeeds.

Status codes

200
Generation status returned successfully.
401
Missing or invalid API key.
404
Unknown generation_id.
502
Service temporarily unavailable.