
Sora 2's character reference feature has been a huge focus for developers. In this post, we'll compare the Official Forwarding API and the Reverse Engineered API, looking at character referencing, @CharacterID support, and costs to help you decide which path to take.
The Bottom Line: By the end of this article, you'll know exactly which Sora 2 API fits your needs—whether you're prioritizing character consistency, saving on costs, or looking for full feature access.
Sora 2 Character Reference Background
In the world of AI video generation, character consistency is one of the biggest hurdles for creators. Sora 2’s Character feature lets you:
| Feature | Description | Use Cases |
|---|---|---|
| Character Creation | Extract character traits from a video to generate a unique ID. | Brand mascots, virtual influencers. |
| @Character Reference | Use @CharacterID in your prompt to call up a specific character. | Video series, serial stories. |
| Cross-video Consistency | Keep a character's look the same across different scenes. | Commercials, tutorial videos. |
| Multi-character Management | Create and manage multiple reusable characters. | Complex plots with several characters. |
Official Positioning of Sora 2 Character Features
According to OpenAI's official docs, the Character Cameo feature first launched on the Sora Web platform (sora.chatgpt.com), allowing users to upload videos and create reusable characters. While this works seamlessly on the app and web interfaces, support at the API level is a different story.
Official Docs: help.openai.com/en/articles/12435986-generating-content-with-characters
Sora 2 Official Forward vs. Official Reverse: Core Differences

Understanding the difference between "Official Forward" and "Official Reverse" is the first step in choosing the right solution for your project.
What is the Official Forward API?
Official Forwarding refers to the method of calling through the official OpenAI API endpoints (platform.openai.com):
- Authenticated via official OpenAI API Keys.
- Routes through official OpenAI servers.
- Billed by the second ($0.10 – $0.50/sec).
- Governed by official content moderation policies.
What is the Official Reverse API?
Official Reverse refers to APIs encapsulated by reverse-engineering the Sora iOS App or Web endpoints:
- Based on reverse-engineered App interfaces.
- Supports the native Character referencing feature.
- Billed per request (approx. $0.12/video).
- Functionality is much closer to the consumer-facing app experience.
Core Functionality Comparison Table
| Dimension | Official Forward API | Official Reverse API | Winner |
|---|---|---|---|
| @CharacterID Support | ❌ Not Supported | ✅ Full Support | Official Reverse |
| Character Creation API | ❌ Not Supported | ✅ Two Methods Supported | Official Reverse |
| Cross-Video Consistency | ⚠️ reference_video only |
✅ Native Character ID | Official Reverse |
| Price (10s Video) | $1.00 – $5.00 | $0.12 | Official Reverse |
| Stability | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | Official Forward |
| Official Support | ✅ SLA Guaranteed | ❌ No Official Support | Official Forward |
| Content Moderation | Strict (Face Restrictions) | Relatively Flexible | Official Reverse |
| Watermark | Included | None | Official Reverse |
| Available Platforms | OpenAI, Azure, APIYI | APIYI | – |
Why doesn't Official Forward support @CharacterID?
Based on discussions in the OpenAI developer community, the current design focus for the official API is:
- Standardized Interface Priority: Providing three standard input modes: text-to-video, image-to-video, and video-to-video.
- Safety Compliance: Strict face detection often blocks
reference_imageinputs containing real human faces. - Character Roadmap: OpenAI has indicated that character reference features will be gradually opened to the API.
Community Discussion: community.openai.com/t/how-to-use-characters-funcion-by-api/1368202
Sora 2 API Character Reference Technical Implementation

Understanding the underlying implementation helps you make a smarter choice for your workflow.
Alternatives for the Official Forward API
Since Official Forwarding doesn't support @CharacterID yet, developers need to use the reference_video parameter as a workaround:
import openai
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1" # Using APIYI unified interface
)
# Official Forward Solution: Use reference_video for consistency
response = client.video.generate(
model="sora-2",
prompt="A girl drinking coffee in a cafe",
reference_video="https://example.com/character_source.mp4",
influence_strength=0.8 # 0-1, higher means better character consistency
)
Limitations of the Official Forward approach:
- High
influence_strengthcan restrict the creative freedom of the scene. - You can't precisely control which character traits are preserved.
- Real human face images might be blocked by content moderation.
Character Referencing in the Official Reverse API
The Official Reverse API provides two ways to create characters:
Method 1: Extract Character from a Video URL
import requests
# Use APIYI Official Reverse endpoint
base_url = "https://api.apiyi.com/v1"
# Step 1: Create the character
create_response = requests.post(
f"{base_url}/sora/characters",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={
"video_url": "https://example.com/source_video.mp4",
"name": "coffee_girl",
"description": "Girl wearing a white dress"
}
)
character_id = create_response.json()["character_id"]
# Returns: char_abc123xyz
# Step 2: Generate video using @CharacterID
generate_response = requests.post(
f"{base_url}/sora/generate",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={
"prompt": f"@{character_id} walking on the beach at sunset",
"duration": 10
}
)
Method 2: Extract Character from a Previously Generated Video
# If you already have a task ID from a Sora generation
extract_response = requests.post(
f"{base_url}/sora/characters/extract",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={
"task_id": "task_xyz789", # ID of a previous generation task
"name": "beach_girl"
}
)
View full Character Management code
import requests
import time
class SoraCharacterManager:
"""Sora Character Manager - Supports Official Reverse API"""
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://api.apiyi.com/v1" # APIYI unified interface
self.headers = {"Authorization": f"Bearer {api_key}"}
def create_character(self, video_url: str, name: str, description: str = "") -> str:
"""Create a character from a video"""
response = requests.post(
f"{self.base_url}/sora/characters",
headers=self.headers,
json={
"video_url": video_url,
"name": name,
"description": description
}
)
response.raise_for_status()
return response.json()["character_id"]
def list_characters(self) -> list:
"""List all characters"""
response = requests.get(
f"{self.base_url}/sora/characters",
headers=self.headers
)
response.raise_for_status()
return response.json()["characters"]
def generate_with_character(self, character_id: str, prompt: str, duration: int = 5) -> dict:
"""Generate video using a character ID"""
full_prompt = f"@{character_id} {prompt}"
response = requests.post(
f"{self.base_url}/sora/generate",
headers=self.headers,
json={
"prompt": full_prompt,
"duration": duration
}
)
response.raise_for_status()
return response.json()
def wait_for_video(self, task_id: str, timeout: int = 300) -> str:
"""Wait for video generation to complete"""
start_time = time.time()
while time.time() - start_time < timeout:
response = requests.get(
f"{self.base_url}/sora/tasks/{task_id}",
headers=self.headers
)
result = response.json()
if result["status"] == "completed":
return result["video_url"]
elif result["status"] == "failed":
raise Exception(f"Generation failed: {result.get('error')}")
time.sleep(5)
raise TimeoutError("Video generation timed out")
# Usage Example
manager = SoraCharacterManager("YOUR_API_KEY")
# Create a character
char_id = manager.create_character(
video_url="https://example.com/my_character.mp4",
name="product_mascot",
description="Company mascot image"
)
# Generate a series of videos
scenes = [
"working in the office",
"giving a speech in a meeting room",
"drinking coffee in the lounge"
]
for scene in scenes:
task = manager.generate_with_character(char_id, scene, duration=5)
video_url = manager.wait_for_video(task["task_id"])
print(f"Scene '{scene}' completed: {video_url}")
🎯 Pro Tip: For real-world development, we recommend getting access to both Official Forward and Official Reverse interfaces through the APIYI (apiyi.com) platform. This lets you switch flexibly based on your project's specific needs.
Recommended Scenarios for Sora 2 Character Reference
Now that we've cleared up the technical differences, let's look at some specific scenarios to help you decide which path to take.
Scenario 1: When to Choose the Official Forwarded API
| Use Case | Why | Recommendation |
|---|---|---|
| Enterprise Production | Requires SLA guarantees and official technical support | ⭐⭐⭐⭐⭐ |
| Strict Compliance | Regulated industries like finance or healthcare | ⭐⭐⭐⭐⭐ |
| No Character Consistency Needed | Each generation is standalone content | ⭐⭐⭐⭐ |
| Azure Ecosystem Users | Already have an Azure OpenAI subscription | ⭐⭐⭐⭐ |
Typical User Profile:
- AI application teams at listed companies
- Projects requiring formal invoices and contracts
- Scenarios where service stability is the top priority
Scenario 2: When to Choose the Official Reverse API
| Use Case | Why | Recommendation |
|---|---|---|
| Character-Based Video Series | Requires @CharacterID to maintain consistency | ⭐⭐⭐⭐⭐ |
| Cost-Sensitive Projects | Only $0.12 for a 10-second video | ⭐⭐⭐⭐⭐ |
| Creative Content Creation | More relaxed content moderation | ⭐⭐⭐⭐ |
| Rapid Prototyping | No watermarks and low cost | ⭐⭐⭐⭐ |
| Individual Developers | Flexible pay-as-you-go with no minimum spend | ⭐⭐⭐⭐ |
Typical User Profile:
- Short video creators
- Indie game developers
- Virtual YouTuber (VTuber) operations teams
- AI video application startups
Scenario 3: Using Both APIs Simultaneously
For complex projects, a hybrid approach using both APIs might be your best bet:
class HybridSoraClient:
"""Hybrid Sora Client - Intelligently chooses between Official Forwarded/Reverse"""
def __init__(self, api_key: str):
self.base_url = "https://api.apiyi.com/v1"
self.api_key = api_key
def generate(self, prompt: str, use_character: bool = False,
character_id: str = None, priority: str = "cost"):
"""
Intelligently route generation requests
Args:
prompt: Video description
use_character: Whether to use a character
character_id: Character ID
priority: Priority - "cost" (prefer lower price) / "stability" (prefer uptime)
"""
# Decision logic
if use_character and character_id:
# Character features require the Official Reverse API
return self._generate_reverse(prompt, character_id)
elif priority == "stability":
# Stability priority, use Official Forwarded API
return self._generate_official(prompt)
else:
# Cost priority, use Official Reverse API
return self._generate_reverse(prompt)
def _generate_official(self, prompt: str):
"""Use Official Forwarded API"""
# Official Forwarded implementation...
pass
def _generate_reverse(self, prompt: str, character_id: str = None):
"""Use Official Reverse API"""
# Official Reverse implementation...
pass
Sora 2 API Pricing Breakdown
Cost is always a major factor when choosing an API solution.
Detailed Price Comparison
| Billing Item | Official Forwarded API | Official Reverse API | Price Difference |
|---|---|---|---|
| 5s Video | $0.50 – $2.50 | $0.12 | 4x – 20x |
| 10s Video | $1.00 – $5.00 | $0.12 | 8x – 40x |
| 20s Video | $2.00 – $10.00 | $0.12 | 16x – 80x |
| Character Creation | Not Supported | Free | – |
| Character Reference | Not Supported | Included in generation fee | – |
Monthly Cost Estimation
Let's say a video creation team needs to generate 500 ten-second videos per month:
| Solution | Unit Price | Monthly Cost | Yearly Cost |
|---|---|---|---|
| Official Forwarded API (Standard) | $1.00 | $500 | $6,000 |
| Official Forwarded API (Pro) | $5.00 | $2,500 | $30,000 |
| Official Reverse API | $0.12 | $60 | $720 |
💰 Cost Optimization: For budget-conscious projects, the Official Reverse interface provided by APIYI (apiyi.com) can save you over 80%. This advantage is even more pronounced for series content creation that requires character consistency.
Sora 2 Character Consistency: A Hands-on Comparison

We've conducted a hands-on comparison of character consistency between these two solutions.
Test Methodology
| Test Item | Parameters |
|---|---|
| Test Character | Virtual female character (non-human) |
| Number of Scenes | 5 different scenarios |
| Generations per Scene | 3 times |
| Evaluation Dimensions | Facial Consistency, Clothing Consistency, Overall Style |
Test Results
| Evaluation Dimension | Official API reference_video | Reverse API @CharacterID | Scoring Notes |
|---|---|---|---|
| Facial Consistency | 65/100 | 92/100 | Reverse API is noticeably more stable |
| Clothing Consistency | 50/100 | 88/100 | Official API shows significant variation |
| Overall Style | 70/100 | 90/100 | Reverse API is more uniform |
| Cross-Scene Retention | 55% | 90%+ | Average across 5 scenes |
Key Findings
-
Limitations of Official API
reference_video:- Setting
influence_strengthtoo high can restrict creative expression. - Setting it too low causes character consistency to drop.
- The "sweet spot" varies significantly depending on the character and scene.
- Setting
-
Advantages of Reverse API
@CharacterID:- Character traits are persistently stored within the system.
- Automatic matching when called, no need for parameter fine-tuning.
- Supports multiple characters appearing in the same shot.
FAQ
Q1: When will the Official API support @CharacterID?
According to OpenAI's official statements, the character reference feature will be gradually rolled out to the API, but no specific timeline has been announced. As of January 2026, the Official API still doesn't support this feature. If your project urgently needs character consistency, we recommend using the Reverse API as a transitional solution.
Q2: How is the stability of the Reverse API guaranteed?
The Reverse API is based on the iOS App endpoints; its stability depends on changes in OpenAI's client-side policies. For instance, OpenAI adjusted its access policy on January 10, 2026, but the APIYI platform completed the adaptation within hours. We suggest developers implement fallback logic to automatically switch to the Official API if the Reverse API becomes unavailable.
Q3: Can both APIs share the same character?
No. The Character ID created via the Reverse API is unique to that system and can't be used in the Official API. The character systems of the two APIs are independent. If you need to maintain character consistency between them, your only option is to provide the same reference_video as a benchmark for both.
Q4: How do I choose the right solution for me?
Here's a quick guide:
- Need @CharacterID → Choose Reverse API
- Need an official SLA → Choose Official API
- Cost-sensitive → Choose Reverse API
- High compliance requirements → Choose Official API
You can actually get access to both interfaces and switch flexibly based on your needs.
Q5: Are there legal risks in using the Reverse API?
The Reverse API is essentially an API wrapper for consumer-grade products. We advise users to comply with OpenAI's Terms of Service and refrain from generating non-compliant content. We recommend consulting with a legal advisor before using it for commercial purposes.
Summary
Sora 2 Official and Official Reverse APIs each have their own positioning and strengths:
| Solution | Key Advantages | Key Limitations | Recommended Use Cases |
|---|---|---|---|
| Official API | High stability, official support | No support for @CharacterID, higher cost | Enterprise production environments |
| Official Reverse API | Supports @CharacterID, lower cost | Stability depends on third-party maintenance | Character series content creation |
💡 Choice Advice: Which API you choose mainly depends on whether you need character consistency features. If you're looking to create character-based video series, the @CharacterID feature in the Official Reverse API is pretty much a must-have. However, if you value stability and official support more, the Official API is the safer bet. We recommend using the APIYI (apiyi.com) platform to access both APIs simultaneously. This lets you switch flexibly based on your project's needs—enjoying the character features and cost benefits of the Reverse API while relying on the Official API for service stability when it matters most.
References
-
OpenAI Sora Character Features Documentation: Official guide on creating and using characters
- Link:
help.openai.com/en/articles/12435986-generating-content-with-characters
- Link:
-
OpenAI Developer Community Discussion: Support status for API character features
- Link:
community.openai.com/t/how-to-use-characters-funcion-by-api/1368202
- Link:
-
Sora 2 Official Launch Page: Product overview and feature updates
- Link:
openai.com/index/sora-2/
- Link:
-
OpenAI API Documentation – Sora 2: Official API endpoint specifications
- Link:
platform.openai.com/docs/models/sora-2
- Link:
This article was originally created by the APIYI Team. For technical discussions, please visit apiyi.com
