Openai Sora 2 Characters
Playground
Try it on WavespeedAI!OpenAI Sora 2 Characters creates reusable character IDs from video references for consistent character appearance across Sora 2 generations. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
Notice — Service Stability
The Sora 2 family is currently unstable. Generations may fall back to alternative models without notice and the service can be temporarily unavailable. OpenAI is also expected to discontinue this model in the future.
If you need an equally capable, stable alternative, we recommend Seedance 2: bytedance/seedance-2.0/text-to-video.
OpenAI Sora 2 Characters
Sora 2 Characters creates reusable character identities from short video clips. Upload a 2–4 second video of a character and assign a name — the model extracts identity features that can be referenced in Sora 2 Text-to-Video to maintain consistent character appearance across generated videos.
Why Choose This?
-
Character consistency Maintain the same character identity across multiple video generations.
-
Simple workflow Just upload a short video clip and provide a name — character ID is created instantly.
-
Reusable assets Once created, character IDs can be referenced in any Sora 2 Text-to-Video generation.
-
Ultra-low cost Only $0.001 per character creation.
Parameters
| Parameter | Required | Description |
|---|---|---|
| video | Yes | Source video of the character (2–4 seconds) |
| name | Yes | Name identifier for the character |
How to Use
- Upload a video — provide a 2–4 second video clip featuring the character.
- Enter a name — assign a memorable name for easy reference.
- Run — the model extracts character identity and creates the ID.
- Use in Sora 2 — reference the character by name in Sora 2 Text-to-Video.
Pricing
| Output | Cost |
|---|---|
| Per character ID | $0.001 |
Best Use Cases
- Consistent Storytelling — Maintain character identity across multiple video scenes.
- Series Production — Create recurring characters for episodic content.
- Brand Mascots — Generate consistent brand character appearances.
- Animation Projects — Ensure character consistency throughout a project.
Pro Tips
- Use clear, well-lit video clips with the character prominently visible.
- 2–4 seconds is optimal — shorter clips may lack sufficient identity information.
- Choose descriptive names for easy reference in prompts (e.g., “Joe” rather than “Character1”).
- Front-facing shots with visible facial features produce the best identity extraction.
Notes
- Both video and name are required fields.
- Video length: 2–4 seconds recommended.
- Created character IDs are used in Sora 2 Text-to-Video.
- Ensure your content complies with OpenAI’s usage policies.
Related Models
- OpenAI Sora 2 Text-to-Video — Generate videos using character IDs.
- OpenAI Sora 2 Pro Text-to-Video — Premium video generation.
- OpenAI Sora 2 Pro Image-to-Video — Animate images with Sora quality.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
# Submit the task
curl --location --request POST "https://api.wavespeed.ai/api/v3/openai/sora-2/characters" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ${WAVESPEED_API_KEY}" \
--data-raw '{}'
# Get the result
curl --location --request GET "https://api.wavespeed.ai/api/v3/predictions/${requestId}/result" \
--header "Authorization: Bearer ${WAVESPEED_API_KEY}"
Parameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| video | string | Yes | - | URL of an MP4 video (minimum 720p, max ~2.67:1 aspect ratio) to define the character. Videos exceeding 1080p are automatically scaled down. Non-standard aspect ratios are automatically padded to 16:9 (landscape) or 9:16 (portrait). Videos longer than 4 seconds are trimmed to the first 4 seconds. | |
| name | string | Yes | - | - | Name for the character (1–80 characters). Refer to this name in prompts when using the character. |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Array of URLs to the generated content (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.has_nsfw_contents | array | Array of boolean values indicating NSFW detection for each output |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction, the ID of the prediction to get |
| data.model | string | Model ID used for the prediction |
| data.outputs | string | Array of URLs to the generated content (empty when status is not completed). |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |