# Account
Source: https://docs.eversince.ai/api/account
Credits, skills, memories, learned preferences, API keys, and share links.
## Get credit balance
```
GET /account/credits
```
### Response `200`
```json theme={"dark"}
{
"credits_balance": 1450
}
```
## Get credit packages
```
GET /account/credit-packages
```
Returns available top-up packages with purchase links.
### Response `200`
```json theme={"dark"}
{
"credits_balance": 1450,
"has_subscription": true,
"subscription_required": false,
"packages": [
{
"id": "1k",
"credits": 1000,
"price": "$15",
"price_cents": 1500,
"purchase_url": "https://eversince.ai/app/subscription?buy=1k"
},
{
"id": "4k",
"credits": 4000,
"price": "$50",
"price_cents": 5000,
"purchase_url": "https://eversince.ai/app/subscription?buy=4k"
}
]
}
```
## Skills
Skills are persistent instructions that shape agent behavior across all projects. Use them for brand guidelines, style rules, or domain-specific knowledge.
### List skills
```
GET /account/skills
```
Returns available skills, both Eversince skills (built by Eversince) and custom skills.
#### Response `200`
```json theme={"dark"}
{
"skills": [
{
"id": "skill-cinema",
"name": "Cinema",
"is_active": false,
"source": "eversince",
"description": "Story-driven filmmaking with shot design, camera movement, and emotional pacing.",
"tokens": 26000
},
{
"id": "skill_001",
"name": "Brand Guidelines",
"is_active": true,
"source": "user",
"tokens": 113,
"sort_order": 0
}
],
"budget": {
"used": 113,
"limit": 40000
}
}
```
### Create a skill
```
POST /account/skills
```
| Parameter | Type | Required | Description |
| -------------- | ------- | -------- | --------------------------------------------------------------------------------------------------------------------------- |
| `name` | string | Yes | Skill name. Max 100 characters. |
| `instructions` | string | Yes | What the agent should know or do. No per-skill cap. Active skills share a 40,000-token budget (roughly 160,000 characters). |
| `is_active` | boolean | No | Enable immediately. Default `true`. |
#### Response `201`
```json theme={"dark"}
{
"skill": {
"id": "skill_002",
"name": "Brand Guidelines",
"instructions": "Always use warm color palettes. Brand voice is confident but approachable...",
"is_active": true,
"source": "user",
"characters": 450,
"sort_order": 1,
"created_at": "2025-03-15T10:30:00Z",
"updated_at": "2025-03-15T10:30:00Z"
},
"budget": {
"used": 113,
"limit": 40000
}
}
```
#### Example
```bash curl theme={"dark"}
curl -X POST https://eversince.ai/api/v1/account/skills \
-H "Authorization: Bearer $EVERSINCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Brand Guidelines",
"instructions": "Brand: Acme Corp. Colors: deep navy (#1a237e) and warm gold (#ffd54f). Voice: confident, modern, never corporate. Always end with the tagline. Product shots should emphasize materials and craftsmanship.",
"is_active": true
}'
```
```python Python theme={"dark"}
skill = requests.post(f"{BASE}/account/skills", headers=headers, json={
"name": "Brand Guidelines",
"instructions": "Brand: Acme Corp. Colors: deep navy (#1a237e) and warm gold (#ffd54f). Voice: confident, modern, never corporate. Always end with the tagline. Product shots should emphasize materials and craftsmanship.",
"is_active": True
}).json()
```
```javascript JavaScript theme={"dark"}
const skill = await fetch(`${BASE}/account/skills`, {
method: "POST",
headers,
body: JSON.stringify({
name: "Brand Guidelines",
instructions:
"Brand: Acme Corp. Colors: deep navy (#1a237e) and warm gold (#ffd54f). Voice: confident, modern, never corporate. Always end with the tagline. Product shots should emphasize materials and craftsmanship.",
is_active: true,
}),
}).then((r) => r.json());
```
### Get a skill
```
GET /account/skills/:id
```
Returns full skill details including instructions.
#### Response `200`
Custom skill:
```json theme={"dark"}
{
"skill": {
"id": "skill_001",
"name": "Brand Guidelines",
"instructions": "Always use warm color palettes...",
"is_active": true,
"source": "user",
"characters": 450,
"sort_order": 0,
"created_at": "2025-03-15T10:30:00Z",
"updated_at": "2025-03-15T10:30:00Z"
}
}
```
Eversince skill:
```json theme={"dark"}
{
"skill": {
"id": "skill-cinema",
"name": "Cinema",
"is_active": false,
"source": "eversince",
"description": "Story-driven filmmaking with shot design, camera movement, and emotional pacing."
}
}
```
### Update a skill
```
PATCH /account/skills/:id
```
Update a custom skill's name, instructions, or active state. For Eversince skills, only `is_active` can be toggled.
| Parameter | Type | Description |
| -------------- | ------- | ------------------------------------------------------------------------------ |
| `name` | string | New name. Max 100 characters. |
| `instructions` | string | New instructions. No per-skill cap. Active skills share a 40,000-token budget. |
| `is_active` | boolean | Enable or disable. |
#### Response `200`
Custom skill update returns the skill with updated budget:
```json theme={"dark"}
{
"skill": {
"id": "skill_002",
"name": "Updated Name",
"instructions": "Updated instructions...",
"is_active": true,
"source": "user",
"characters": 230,
"sort_order": 1,
"created_at": "2025-03-15T10:30:00Z",
"updated_at": "2025-03-16T08:00:00Z"
},
"budget": {
"used": 58,
"limit": 40000
}
}
```
Eversince skill toggle returns the skill without budget:
```json theme={"dark"}
{
"skill": {
"id": "skill-cinema",
"name": "Cinema",
"is_active": true,
"source": "eversince"
}
}
```
### Delete a skill
```
DELETE /account/skills/:id
```
Only custom skills can be deleted.
#### Response `200`
```json theme={"dark"}
{
"deleted": true
}
```
Skills stack freely. Multiple skills can be active at once. Active skills (Eversince + custom) share a combined budget of 40,000 tokens. The agent receives all active skill instructions as part of its context.
## Learned preferences
The agent learns your patterns across projects. Style tendencies, brand preferences, production habits. These persist across all projects.
### Get preferences
```
GET /account/learned-preferences
```
#### Response `200`
```json theme={"dark"}
{
"content": "Prefers warm color grading. Favors cinematic aspect ratios...",
"enabled": true,
"characters": 340
}
```
### Update preferences
```
PUT /account/learned-preferences
```
| Parameter | Type | Description |
| --------- | ------- | -------------------------------------- |
| `content` | string | Updated preferences text. |
| `enabled` | boolean | Enable or disable preference learning. |
#### Response `200`
```json theme={"dark"}
{
"content": "Prefers warm color grading. Favors cinematic aspect ratios.",
"enabled": true,
"characters": 340
}
```
## Memories
Short user-authored facts the agent reads at runtime — preferred voice, recurring brand details, audience, anything you want carried across all projects. Lighter-weight than skills: use memories for one-line facts, skills for full instructions. Active memories share a 10,000-character budget.
### List memories
```
GET /account/memories
```
#### Response `200`
```json theme={"dark"}
{
"memories": [
{
"id": "mem_001",
"title": "Preferred voiceover",
"body": "Use Adam (warm, mid-tempo) for all narration unless asked otherwise.",
"is_active": true,
"sort_order": 0,
"characters": 67,
"created_at": "2026-03-15T10:30:00Z",
"updated_at": "2026-03-15T10:30:00Z"
}
],
"budget": {
"used": 67,
"limit": 10000
}
}
```
### Create a memory
```
POST /account/memories
```
| Parameter | Type | Required | Description |
| ----------- | ------- | -------- | ------------------------------------------------------------------------------------------ |
| `title` | string | Yes | Short label. Max 100 characters. |
| `body` | string | Yes | Memory content. Up to 10,000 characters. Active memories share a 10,000-char total budget. |
| `is_active` | boolean | No | Enable immediately. Default `true`. |
If `is_active` is true and the new body would push active memories past 10,000 chars, the request returns `400`.
#### Response `201`
```json theme={"dark"}
{
"memory": {
"id": "mem_002",
"title": "Audience",
"body": "Indie film festivals and creative directors at boutique agencies.",
"is_active": true,
"sort_order": 1,
"characters": 64,
"created_at": "2026-03-15T10:35:00Z",
"updated_at": "2026-03-15T10:35:00Z"
},
"budget": {
"used": 131,
"limit": 10000
}
}
```
#### Example
```bash curl theme={"dark"}
curl -X POST https://eversince.ai/api/v1/account/memories \
-H "Authorization: Bearer $EVERSINCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Preferred voiceover",
"body": "Use Adam (warm, mid-tempo) for all narration unless asked otherwise."
}'
```
```python Python theme={"dark"}
memory = requests.post(f"{BASE}/account/memories", headers=headers, json={
"title": "Preferred voiceover",
"body": "Use Adam (warm, mid-tempo) for all narration unless asked otherwise."
}).json()
```
```javascript JavaScript theme={"dark"}
const memory = await fetch(`${BASE}/account/memories`, {
method: "POST",
headers,
body: JSON.stringify({
title: "Preferred voiceover",
body: "Use Adam (warm, mid-tempo) for all narration unless asked otherwise.",
}),
}).then((r) => r.json());
```
### Get a memory
```
GET /account/memories/:id
```
#### Response `200`
```json theme={"dark"}
{
"memory": {
"id": "mem_001",
"title": "Preferred voiceover",
"body": "Use Adam (warm, mid-tempo) for all narration unless asked otherwise.",
"is_active": true,
"sort_order": 0,
"characters": 67,
"created_at": "2026-03-15T10:30:00Z",
"updated_at": "2026-03-15T10:30:00Z"
}
}
```
### Update a memory
```
PATCH /account/memories/:id
```
Provide at least one of `title`, `body`, `is_active`. Activating a memory that would push active memories past the 10,000-char budget returns `400`.
| Parameter | Type | Description |
| ----------- | ------- | -------------------------------- |
| `title` | string | New title. Max 100 characters. |
| `body` | string | New body. Max 10,000 characters. |
| `is_active` | boolean | Toggle on or off. |
#### Response `200`
```json theme={"dark"}
{
"memory": {
"id": "mem_001",
"title": "Preferred voiceover",
"body": "Use Adam (warm, mid-tempo). Slow pacing for product shots.",
"is_active": true,
"sort_order": 0,
"characters": 58,
"created_at": "2026-03-15T10:30:00Z",
"updated_at": "2026-03-15T11:00:00Z"
},
"budget": {
"used": 122,
"limit": 10000
}
}
```
### Delete a memory
```
DELETE /account/memories/:id
```
#### Response `200`
```json theme={"dark"}
{
"deleted": true
}
```
## API keys
### Create a key
```
POST /keys
```
| Parameter | Type | Required | Description |
| --------- | ------ | -------- | ------------------------------------- |
| `name` | string | Yes | Descriptive name. Max 100 characters. |
#### Response `201`
```json theme={"dark"}
{
"id": "key_001",
"name": "Production",
"key": "es_live_a1b2c3d4e5f6...",
"key_prefix": "es_live_a1b2",
"created_at": "2025-03-15T10:30:00Z",
"message": "Store this key securely. It will not be shown again."
}
```
The full key is only returned once at creation. Store it securely.
### List keys
```
GET /keys
```
Returns keys with prefix only (for identification).
#### Response `200`
```json theme={"dark"}
{
"keys": [
{
"id": "key_001",
"name": "Production",
"key_prefix": "es_live_a1b2",
"last_used_at": "2025-03-20T14:00:00Z",
"created_at": "2025-03-15T10:30:00Z"
}
]
}
```
### Revoke a key
```
DELETE /keys/:id
```
Immediately invalidates the key. Max 10 keys per account.
#### Response `200`
```json theme={"dark"}
{
"id": "key_001",
"revoked": true
}
```
## Share links
### List shares
```
GET /account/shares
```
| Parameter | Type | Default | Description |
| --------- | ------- | ------- | ----------------------- |
| `limit` | integer | 10 | Results per page. 1–50. |
| `offset` | integer | 0 | Pagination offset. |
#### Response `200`
```json theme={"dark"}
{
"shares": [
{
"share_url": "https://eversince.ai/share/abc123",
"video_url": "https://...",
"title": "My Project",
"aspect_ratio": "16:9",
"view_count": 42,
"created_at": "2025-03-15T10:30:00Z"
}
],
"total": 3,
"total_views": 156,
"has_more": false
}
```
## Submit feedback
```
POST /feedback
```
Report bugs or suggest improvements.
| Parameter | Type | Required | Description |
| ------------ | ------ | -------- | ------------------------------------ |
| `type` | string | Yes | `bug`, `suggestion`, or `question`. |
| `message` | string | Yes | Your feedback. Max 5,000 characters. |
| `project_id` | string | No | Related project ID. |
#### Response `201`
```json theme={"dark"}
{
"received": true
}
```
# Discovery
Source: https://docs.eversince.ai/api/discovery
Browse available models and voices, estimate costs, and discover existing projects.
## List models
```
GET /models
```
Returns all available generation models with their capabilities and supported features.
| Parameter | Type | Description |
| --------- | ------ | ----------------------------- |
| `type` | string | Filter by `video` or `image`. |
### Response `200`
```json theme={"dark"}
{
"models": [
{
"id": "kling-3.0",
"name": "Kling 3.0",
"type": "video",
"generation_types": ["text-to-video", "image-to-video"],
"aspect_ratios": ["16:9", "9:16", "1:1"],
"durations": ["4s", "6s", "8s"],
"resolutions": ["1080p"],
"has_sound": true,
"supports_audio_toggle": true,
"supports_audio_input": false,
"supports_image_input": true,
"supports_end_frame": false,
"supports_multi_shot": false,
"supports_reference_images": false,
"max_reference_images": null,
"supports_reference_videos": false,
"max_reference_videos": null,
"supports_video_input": false,
"max_input_video_duration": null,
"supports_negative_prompt": true,
"supports_camera_fixed": false,
"supports_camera_motion": true,
"camera_motion_options": ["static", "dolly_in", "dolly_out", "tracking_left", "tracking_right"],
"max_prompt_length": 2500
}
]
}
```
Use model IDs when setting project defaults (`video_model`, `image_model`) or when directing the agent to use a specific model.
## List voices
```
GET /voices
```
Returns available voiceover voices with descriptions.
| Parameter | Type | Description |
| --------- | ------ | ----------------------------------------- |
| `gender` | string | Filter by `male`, `female`, or `neutral`. |
### Response `200`
```json theme={"dark"}
{
"voices": [
{
"name": "Isabella",
"gender": "female",
"age": "young adult",
"accent": "American",
"style": "warm, conversational",
"description": "Warm and engaging, ideal for lifestyle brands and conversational narration."
},
{
"name": "James",
"gender": "male",
"age": "middle-aged",
"accent": "British",
"style": "authoritative, cinematic",
"description": "Deep and commanding, suited for luxury brands and cinematic narration."
}
]
}
```
Voice names can be used when directing the agent: `"Use the voice Isabella for the voiceover"`.
## Estimate costs
```
POST /estimate-cost
```
Estimate credit costs for planned operations before committing.
### Request body
| Parameter | Type | Required | Description |
| ------------ | ----- | -------- | ----------------------------------- |
| `operations` | array | Yes | List of planned operations. Max 50. |
Each operation:
| Field | Type | Required | Description |
| ------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `tool` | string | Yes | `generate_image`, `generate_video`, `generate_audio`, `upscale_media`, `analyze_media`, `remove_background`, `motion_overlay`. |
| `model` | string | Varies | Required for `generate_image` and `generate_video`. |
| `type` | string | Varies | Required for `generate_audio` (`voiceover`, `music`, `sound_effect`) and `upscale_media` (`image`, `video`). |
| `duration` | number | Varies | Required for `generate_video` (seconds). |
| `count` | integer | No | Number of generations. Default 1, max 100. |
| `sound` | boolean | No | Include audio in video generation. |
| `resolution` | string | No | Output resolution. |
| `music_model` | string | No | Music engine for audio generation. |
### Response `200`
```json theme={"dark"}
{
"items": [
{
"operation": "generate_video",
"credits_per_unit": 55,
"count": 4,
"subtotal": 220
},
{
"operation": "generate_image",
"credits_per_unit": 12,
"count": 4,
"subtotal": 48
}
],
"total_credits": 268,
"is_partial": false,
"note": "Covers generation costs only. Agent reasoning costs are additional."
}
```
### Example
```bash curl theme={"dark"}
curl -X POST https://eversince.ai/api/v1/estimate-cost \
-H "Authorization: Bearer $EVERSINCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{ "tool": "generate_video", "model": "seedance-2.0", "duration": 5, "count": 4 },
{ "tool": "generate_image", "model": "nano-banana-pro", "count": 4 },
{ "tool": "generate_audio", "type": "voiceover", "duration": 15 },
{ "tool": "generate_audio", "type": "music", "duration": 15 }
]
}'
```
```python Python theme={"dark"}
estimate = requests.post(f"{BASE}/estimate-cost", headers=headers, json={
"operations": [
{"tool": "generate_video", "model": "seedance-2.0", "duration": 5, "count": 4},
{"tool": "generate_image", "model": "nano-banana-pro", "count": 4},
{"tool": "generate_audio", "type": "voiceover", "duration": 15},
{"tool": "generate_audio", "type": "music", "duration": 15}
]
}).json()
print(f"Estimated cost: {estimate['total_credits']} credits")
```
```javascript JavaScript theme={"dark"}
const estimate = await fetch(`${BASE}/estimate-cost`, {
method: "POST",
headers,
body: JSON.stringify({
operations: [
{ tool: "generate_video", model: "seedance-2.0", duration: 5, count: 4 },
{ tool: "generate_image", model: "nano-banana-pro", count: 4 },
{ tool: "generate_audio", type: "voiceover", duration: 15 },
{ tool: "generate_audio", type: "music", duration: 15 },
],
}),
}).then((r) => r.json());
console.log(`Estimated cost: ${estimate.total_credits} credits`);
```
## Discover existing projects
```
GET /projects/discover
```
List projects created in the studio that are available for API management.
| Parameter | Type | Default | Description |
| --------- | ------- | ------- | ------------------------ |
| `limit` | integer | 20 | Results per page. 1–100. |
| `offset` | integer | 0 | Pagination offset. |
| `title` | string | | Search by title. |
### Response `200`
The `title` field can be `null` if the project has no title set.
```json theme={"dark"}
{
"projects": [
{
"project_id": "proj_abc123",
"title": "My Project",
"aspect_ratio": "16:9",
"project_url": "https://eversince.ai/app/projects/...",
"created_at": "2025-03-15T10:30:00Z",
"updated_at": "2025-03-15T10:35:00Z"
}
],
"total": 5,
"limit": 20,
"offset": 0
}
```
## Adopt a project
```
POST /projects/adopt
```
Take control of an existing studio project via the API.
### Request body
| Parameter | Type | Required | Description |
| ------------ | ------ | -------- | ------------------------------------------ |
| `project_id` | string | Yes | The project ID from discovery. |
| `mode` | string | No | `autonomous` or `collaborative` (default). |
### Response `201` (newly adopted)
```json theme={"dark"}
{
"id": "proj_abc123",
"status": "idle",
"mode": "collaborative",
"project_url": "https://eversince.ai/app/projects/..."
}
```
### Response `200` (already adopted)
If the project was already adopted, returns the existing record with a `message` field.
```json theme={"dark"}
{
"id": "proj_abc123",
"status": "idle",
"mode": "collaborative",
"project_url": "https://eversince.ai/app/projects/...",
"message": "Project already adopted"
}
```
After adoption, all project endpoints work normally. The project remains accessible in the studio.
# Output
Source: https://docs.eversince.ai/api/output
Access project timeline, assets, variations, memory, and render or share the final result.
## Get timeline
```
GET /projects/:id/timeline
```
Returns the full timeline structure: scenes, audio tracks, overlays, and captions.
| Parameter | Type | Description |
| -------------- | ------ | ---------------------------------------------------------------- |
| `variation_id` | string | Fetch a specific variation's timeline instead of the active one. |
### Response `200`
```json theme={"dark"}
{
"timeline": {
"duration_seconds": 15.2,
"aspect_ratio": "16:9",
"skills": [],
"scenes": [
{
"id": "scene_001",
"ref": "a1b2c3d4",
"type": "video",
"position": 0,
"duration": 4.0,
"description": "Opening shot of the product",
"image_url": "https://...",
"video_url": "https://...",
"video_model": "seedance-2.0",
"image_model": "nano-banana-pro",
"prompt": "Opening shot of the product on a clean background...",
"volume": 1,
"fade_in": 0.5,
"fade_out": null
}
],
"audio": {
"voiceover": {
"url": "https://...",
"duration": 12.5,
"voice": "Isabella",
"voice_id": "voice_001",
"language": "en",
"script": "Your voiceover script here..."
},
"music": {
"url": "https://...",
"duration": 15.2,
"genre": "ambient",
"mood": "warm",
"bpm": 72,
"role": "background",
"instrumental": true
},
"tracks": [
{
"id": "track_001",
"type": "voiceover",
"url": "https://...",
"duration": 12.5,
"volume": 100,
"start_time": 0.5,
"name": "Main narration",
"voice": "Isabella",
"voice_id": "voice_001",
"language": "en",
"script": "Your voiceover script here..."
}
]
},
"overlays": [
{
"id": "text-0",
"type": "text",
"content": "Your Brand",
"start_time": 12.0,
"duration": 3.0,
"position": "bottom-center",
"font_size": 48,
"color": "#FFFFFF",
"background_color": "rgba(0,0,0,0.5)"
}
],
"captions": {
"enabled": true,
"preset": "clean"
}
}
}
```
## Get assets
```
GET /projects/:id/assets
```
Returns all generated assets (images, videos, audio) for the project. Each asset has a `ref`, an 8-character short identifier that links assets to scenes on the timeline.
| Parameter | Type | Default | Description |
| --------- | ------- | ------- | ------------------------ |
| `limit` | integer | 20 | Results per page. 1–200. |
| `offset` | integer | 0 | Pagination offset. |
### Response `200`
```json theme={"dark"}
{
"assets": [
{
"ref": "x7y8z9a0",
"type": "video",
"url": "https://...",
"model": "seedance-2.0",
"prompt": "Opening shot of the product on a clean background...",
"duration": 5.0,
"aspect_ratio": "16:9",
"source_image_url": "https://...",
"source_video_url": null,
"reference_image_url": null,
"created_at": "2025-03-15T10:32:00Z"
}
],
"total": 24,
"limit": 20,
"offset": 0
}
```
## List variations
```
GET /projects/:id/variations
```
Returns all variations for a project. Variations are read-only via the API. Create, switch, and delete them by sending messages to the agent.
### Response `200`
```json theme={"dark"}
{
"variations": [
{
"id": "var_001",
"title": "Original",
"description": null,
"aspect_ratio": "16:9",
"language": "en",
"scene_count": 4,
"is_active": true,
"created_at": "2025-03-15T10:30:00Z"
},
{
"id": "var_002",
"title": "TikTok Version",
"description": "Portrait format for social",
"aspect_ratio": "9:16",
"language": "en",
"scene_count": 4,
"is_active": false,
"created_at": "2025-03-15T10:40:00Z"
}
]
}
```
To create or switch variations, send a message to the agent:
```json theme={"dark"}
{ "message": "Create a 9:16 version for TikTok" }
{ "message": "Switch to variation var_002" }
{ "message": "Duplicate the current variation" }
```
Use `GET /projects/:id/timeline?variation_id=var_002` to inspect a non-active variation's timeline without switching.
## Get agent memory
```
GET /projects/:id/memory
```
Read the agent's working memory for this project.
### Response `200`
```json theme={"dark"}
{
"sections": {
"creative": {
"content": "Markdown summary of the locked creative direction and production settings...",
"tokens": 142
},
"todos": {
"content": "Checklist tracking what's done and what's next...",
"tokens": 98
},
"assets": {
"content": "Structured ledger of characters, products, environments, and references...",
"tokens": 67
}
},
"total_tokens": 307
}
```
The agent maintains three memory sections per project:
* **Creative** — Markdown of the locked creative direction and chosen production settings
* **Todos** — Checklist of what's done and what's next
* **Assets** — Structured ledger of characters, products, environments, and references the agent is using
Memory is per-project (shared across all variations). The agent condenses automatically as sections grow.
Separately, **learned preferences** persist across all projects. These are patterns the agent picks up from your feedback about style and production choices. Manage these via the [account endpoints](/api/account#learned-preferences).
## Render video
```
POST /projects/:id/render
```
Trigger a final video render. Composites all timeline content (scenes, audio, overlays, captions) into a single video file. Only valid when status is `idle`.
### Request body
| Parameter | Type | Default | Description |
| --------- | ------ | ------- | -------------------------------------------------------------------------- |
| `quality` | string | `1080p` | `1080p` or `4k`. 1080p is free (rate-limited per day). 4K charges credits. |
### Response `202`
```json theme={"dark"}
{
"id": "proj_abc123",
"status": "rendering",
"quality": "1080p"
}
```
Poll the project status. When rendering completes, the status returns to `idle` and `assembled_url` contains the video URL.
Rendered video URLs expire after 24 hours. Create a share link for a permanent URL, or render again.
## Create share link
```
POST /projects/:id/share
```
Create a permanent, public URL for a rendered video. Requires a completed render.
### Request body
| Parameter | Type | Description |
| ------------- | ------ | ----------------------------------- |
| `title` | string | Optional title for the shared page. |
| `description` | string | Optional description. |
### Response `201`
```json theme={"dark"}
{
"share_url": "https://eversince.ai/share/abc123",
"video_url": "https://..."
}
```
The `video_url` from a share link does not expire.
## Upload files
Upload reference media (images, videos, audio) for use in project creation or messages.
### Step 1: Get a presigned upload URL
```
POST /uploads
```
| Parameter | Type | Required | Description |
| -------------- | ------- | -------- | -------------------------------------------- |
| `file_name` | string | Yes | Original file name. |
| `content_type` | string | Yes | MIME type (e.g., `image/jpeg`, `video/mp4`). |
| `file_size` | integer | Yes | File size in bytes. |
**Size limits:** Images 10 MB, Videos 500 MB, Audio 50 MB.
**Accepted types:** `image/jpeg`, `image/jpg`, `image/png`, `image/webp`, `video/mp4`, `video/webm`, `video/quicktime`, `video/x-msvideo`, `audio/mpeg`, `audio/mp3`, `audio/wav`, `audio/mp4`, `audio/m4a`.
#### Response `200`
```json theme={"dark"}
{
"upload_url": "https://...",
"r2_key": "uploads/abc123/image.jpg",
"expires_in": 3600
}
```
### Step 2: Upload the file
```
PUT {upload_url}
```
Upload the file directly to the presigned URL with the matching `Content-Type` header.
### Step 3: Confirm the upload
```
POST /uploads/confirm
```
| Parameter | Type | Required | Description |
| -------------- | ------- | -------- | ------------------------- |
| `r2_key` | string | Yes | The `r2_key` from step 1. |
| `file_name` | string | Yes | Original file name. |
| `file_size` | integer | Yes | File size in bytes. |
| `content_type` | string | Yes | MIME type. |
#### Response `201`
```json theme={"dark"}
{
"upload_id": "upl_abc123",
"type": "image"
}
```
Use the `upload_id` as a reference when creating projects or sending messages:
```json theme={"dark"}
{
"brief": "Create an ad featuring this product",
"references": [{ "upload_id": "upl_abc123" }]
}
```
### Full upload example
```bash curl theme={"dark"}
# 1. Get presigned URL
PRESIGN=$(curl -s -X POST https://eversince.ai/api/v1/uploads \
-H "Authorization: Bearer $EVERSINCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"file_name": "product.jpg",
"content_type": "image/jpeg",
"file_size": 245000
}')
UPLOAD_URL=$(echo $PRESIGN | jq -r '.upload_url')
R2_KEY=$(echo $PRESIGN | jq -r '.r2_key')
# 2. Upload the file
curl -X PUT "$UPLOAD_URL" \
-H "Content-Type: image/jpeg" \
--data-binary @product.jpg
# 3. Confirm
curl -X POST https://eversince.ai/api/v1/uploads/confirm \
-H "Authorization: Bearer $EVERSINCE_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"r2_key\": \"$R2_KEY\",
\"file_name\": \"product.jpg\",
\"file_size\": 245000,
\"content_type\": \"image/jpeg\"
}"
# Response: { "upload_id": "upl_abc123", "type": "image" }
```
```python Python theme={"dark"}
import os
file_path = "product.jpg"
file_size = os.path.getsize(file_path)
# 1. Get presigned URL
presign = requests.post(f"{BASE}/uploads", headers=headers, json={
"file_name": "product.jpg",
"content_type": "image/jpeg",
"file_size": file_size
}).json()
# 2. Upload the file
with open(file_path, "rb") as f:
requests.put(presign["upload_url"],
data=f,
headers={"Content-Type": "image/jpeg"})
# 3. Confirm
upload = requests.post(f"{BASE}/uploads/confirm", headers=headers, json={
"r2_key": presign["r2_key"],
"file_name": "product.jpg",
"file_size": file_size,
"content_type": "image/jpeg"
}).json()
# Use in project creation
requests.post(f"{BASE}/projects", headers=headers, json={
"brief": "Create an ad featuring this product",
"references": [{"upload_id": upload["upload_id"]}]
})
```
```javascript JavaScript theme={"dark"}
const fs = require("fs");
const filePath = "product.jpg";
const fileSize = fs.statSync(filePath).size;
// 1. Get presigned URL
const presign = await fetch(`${BASE}/uploads`, {
method: "POST",
headers,
body: JSON.stringify({
file_name: "product.jpg",
content_type: "image/jpeg",
file_size: fileSize,
}),
}).then((r) => r.json());
// 2. Upload the file
await fetch(presign.upload_url, {
method: "PUT",
headers: { "Content-Type": "image/jpeg" },
body: fs.readFileSync(filePath),
});
// 3. Confirm
const upload = await fetch(`${BASE}/uploads/confirm`, {
method: "POST",
headers,
body: JSON.stringify({
r2_key: presign.r2_key,
file_name: "product.jpg",
file_size: fileSize,
content_type: "image/jpeg",
}),
}).then((r) => r.json());
// Use in project creation
await fetch(`${BASE}/projects`, {
method: "POST",
headers,
body: JSON.stringify({
brief: "Create an ad featuring this product",
references: [{ upload_id: upload.upload_id }],
}),
});
```
# Overview
Source: https://docs.eversince.ai/api/overview
Eversince is a creative agent that plans and executes across image, video, and audio. It orchestrates the latest AI models and operates in a purpose-built environment with tools, skills, and memory. Works for one-off tasks or as a creative employee in any agent-to-agent workflow.
## Base URL
```
https://eversince.ai/api/v1
```
## Authentication
All requests require an API key in the `Authorization` header.
```
Authorization: Bearer YOUR_API_KEY
```
API keys start with `es_live_` and can be created in your [account settings](https://eversince.ai/app/settings) or via the [API](/api/account#api-keys). Each account can have up to 10 active keys.
## Quick start
Create a project, poll until it's done, then get the result.
```bash curl theme={"dark"}
# 1. Create a project
curl -X POST https://eversince.ai/api/v1/projects \
-H "Authorization: Bearer $EVERSINCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"brief": "Your brief here",
"mode": "autonomous"
}'
# Response: { "id": "proj_abc123", "status": "queued", ... }
# 2. Poll for status
curl https://eversince.ai/api/v1/projects/proj_abc123 \
-H "Authorization: Bearer $EVERSINCE_API_KEY"
# 3. When status is "idle", trigger a render
curl -X POST https://eversince.ai/api/v1/projects/proj_abc123/render \
-H "Authorization: Bearer $EVERSINCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "quality": "1080p" }'
# 4. Poll again until status is "idle", then get the assembled_url
```
```python Python theme={"dark"}
import requests
import time
API_KEY = "YOUR_API_KEY"
BASE = "https://eversince.ai/api/v1"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# 1. Create a project
resp = requests.post(f"{BASE}/projects", headers=headers, json={
"brief": "Your brief here",
"mode": "autonomous"
})
project = resp.json()
project_id = project["id"]
# 2. Poll for completion
while True:
resp = requests.get(f"{BASE}/projects/{project_id}", headers=headers)
status = resp.json()["status"]
if status in ("idle", "failed", "cancelled"):
break
interval = {"queued": 5, "running": 30, "generating": 45, "rendering": 30}
time.sleep(interval.get(status, 10))
# 3. Render the final video
if status == "idle":
requests.post(f"{BASE}/projects/{project_id}/render",
headers=headers, json={"quality": "1080p"})
# Poll until rendering completes
while True:
resp = requests.get(f"{BASE}/projects/{project_id}", headers=headers)
data = resp.json()
if data["status"] != "rendering":
break
time.sleep(30)
print(data["assembled_url"])
```
```javascript JavaScript theme={"dark"}
const API_KEY = "YOUR_API_KEY";
const BASE = "https://eversince.ai/api/v1";
const headers = {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
};
// 1. Create a project
const project = await fetch(`${BASE}/projects`, {
method: "POST",
headers,
body: JSON.stringify({
brief:
"Your brief here",
mode: "autonomous",
}),
}).then((r) => r.json());
// 2. Poll for completion
const intervals = { queued: 5000, running: 30000, generating: 45000, rendering: 30000 };
let status;
do {
const data = await fetch(`${BASE}/projects/${project.id}`, { headers }).then(
(r) => r.json()
);
status = data.status;
if (!["idle", "failed", "cancelled"].includes(status)) {
await new Promise((r) => setTimeout(r, intervals[status] || 10000));
}
} while (!["idle", "failed", "cancelled"].includes(status));
// 3. Render
if (status === "idle") {
await fetch(`${BASE}/projects/${project.id}/render`, {
method: "POST",
headers,
body: JSON.stringify({ quality: "1080p" }),
});
// Poll until rendering completes
let result;
do {
result = await fetch(`${BASE}/projects/${project.id}`, { headers }).then(
(r) => r.json()
);
if (result.status === "rendering") {
await new Promise((r) => setTimeout(r, 30000));
}
} while (result.status === "rendering");
console.log(result.assembled_url);
}
```
## Project lifecycle
Every project follows this status flow:
```
queued → running → generating → idle
→ failed
idle → (call /render) → rendering → idle
→ failed
cancelled (from queued, running, generating, or idle)
```
| Status | Meaning | Poll interval |
| ------------ | -------------------------------------------------------------------- | ------------- |
| `queued` | Waiting to start | 5s |
| `running` | Agent is planning and executing | 30s |
| `generating` | Waiting for model outputs | 30-60s |
| `rendering` | Compositing final video | 30s |
| `idle` | Ready for next action (see below) | Stop |
| `failed` | Something went wrong. Check `error_message`. Send a message to retry | Stop |
| `cancelled` | Stopped by user | Stop |
The `idle` status appears twice in a typical flow. **First idle**: the agent finished its work. `assembled_url` is `null`, the project is ready for feedback or rendering. **Second idle** (after you call `/render`): rendering is complete and `assembled_url` contains the video URL. Always check `assembled_url` to distinguish between the two.
## Two modes
**Autonomous** (API default). The agent handles everything start to finish. Create the project, poll until `idle`, get the result.
**Collaborative**. The agent stops at decision points and returns `idle` with a message in `agent_message`. Review the message, send feedback via `POST /projects/:id/messages`, and the agent continues. Good for guiding creative direction.
The API defaults to autonomous mode. In the studio, the default is collaborative.
Switch modes anytime via `PATCH /projects/:id/settings`.
## Rate limits
| Limit | Value |
| ------------------- | ----------------------- |
| Requests | 120 per minute per user |
| Concurrent projects | 5 active simultaneously |
| Renders | 50 per day |
| Request payload | 1 MB max |
For higher limits, contact us at [support@eversince.ai](mailto:support@eversince.ai)
Rate limit headers are included on every response:
```
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 118
X-RateLimit-Reset: 1711929600
```
When rate limited, you'll receive a `429` response with a `Retry-After` header.
## Errors
All errors follow the same format:
```json theme={"dark"}
{
"error": {
"code": "validation_error",
"message": "brief: brief is required",
"status": 400
}
}
```
| Code | Status | Meaning |
| ---------------------- | ------ | -------------------------------------------------- |
| `validation_error` | 400 | Invalid request parameters |
| `unauthorized` | 401 | Missing or invalid API key |
| `insufficient_credits` | 402 | Not enough credits |
| `forbidden` | 403 | Permission denied |
| `not_found` | 404 | Resource doesn't exist |
| `conflict` | 409 | Status conflict (e.g., project is already running) |
| `payload_too_large` | 413 | Request body exceeds 1 MB |
| `project_limit` | 429 | Concurrent project or daily project limit exceeded |
| `rate_limited` | 429 | Too many requests |
| `internal_error` | 500 | Server error |
| `service_unavailable` | 503 | Temporarily unavailable |
Validation errors join multiple field errors with semicolons: `"brief: brief is required; mode: mode must be autonomous or collaborative"`.
## Response headers
Every response includes:
| Header | Description |
| ----------------------- | --------------------------------------- |
| `X-Request-Id` | Unique request identifier for debugging |
| `X-RateLimit-Limit` | Requests allowed per window |
| `X-RateLimit-Remaining` | Requests remaining |
| `X-RateLimit-Reset` | Unix timestamp when the window resets |
## Minimum credit requirements
| Action | Minimum credits |
| -------------- | ----------------------------------------------- |
| Create project | 50 |
| Send message | 10 |
| Render (1080p) | Free (rate-limited per day: 10 non-sub, 50 sub) |
| Render (4K) | Charges credits |
## Best practices
Network retries can duplicate projects. Include an `idempotency_key` to prevent this. Existing projects return `200`, new projects return `202`. Handle both as success.
Webhooks are delivered once. Use them as a trigger, then confirm state with `GET /projects/:id`.
`assembled_url` expires after 24 hours. Create a share link for a permanent URL, or download the video. Check `assembled_url_expires_at` for the exact expiry.
When balance drops below 100 credits, responses include `credits_warning`. Use this to trigger top-up flows before the agent runs out mid-project.
Store the last message ID and pass it as `?after=msg_id` to get only new messages.
Every response includes an `X-Request-Id` header. Log these alongside your requests for debugging with support.
# Projects
Source: https://docs.eversince.ai/api/projects
## Create a project
```
POST /projects
```
Start a new project. The agent begins working immediately.
### Request body
| Parameter | Type | Required | Description |
| ----------------- | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `brief` | string | Yes | Creative direction for the agent. Max 8,000 characters. |
| `title` | string | No | Project title. Max 30 characters. |
| `mode` | string | No | `autonomous` (default) or `collaborative`. |
| `aspect_ratio` | string | No | `16:9` (default), `9:16`, `1:1`, or `21:9`. |
| `skills` | string\[] | No | Skills to activate on this project. Each entry is an Eversince skill (`cinema`, `animation`, `ugc`, `music`, `photography`, `motion-graphics`) or a custom-skill UUID from `GET /account/skills`. Stack freely up to the 40,000-token combined budget. Omit or pass `[]` for no skills. |
| `video_model` | string | No | Default video model ID. Agent selects if not set. |
| `image_model` | string | No | Default image model ID. Agent selects if not set. |
| `agent_model` | string | No | One of `opus-4.7`, `opus-4.6`, `sonnet-4.6`. |
| `reasoning_mode` | string | No | `thinking` (default) — deeper reasoning. `fast` — quicker turns. |
| `webhook_url` | string | No | HTTPS URL for status change notifications. |
| `idempotency_key` | string | No | Prevent duplicate projects on retries. Max 256 characters. |
| `references` | array | No | Reference media. See below. |
| `extract_content` | boolean | No | Extract content from reference URLs. Default `true`. |
### References
Each reference is either an uploaded file or a URL:
```json theme={"dark"}
[
{ "upload_id": "upl_abc123" },
{ "url": "https://example.com/image.jpg", "type": "image" },
{ "url": "https://youtube.com/watch?v=...", "type": "url" }
]
```
Reference types: `image`, `video`, `audio`, `url`. Max 10 references per request, max 3 URL references.
### Response `202`
```json theme={"dark"}
{
"id": "proj_abc123",
"status": "queued",
"mode": "autonomous",
"project_url": null,
"credits_balance": 1450,
"created_at": "2025-03-15T10:30:00Z"
}
```
### Example
```bash curl theme={"dark"}
curl -X POST https://eversince.ai/api/v1/projects \
-H "Authorization: Bearer $EVERSINCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"brief": "Your brief here",
"mode": "autonomous"
}'
```
```python Python theme={"dark"}
resp = requests.post(f"{BASE}/projects", headers=headers, json={
"brief": "Your brief here",
"mode": "autonomous"
})
project = resp.json()
```
```javascript JavaScript theme={"dark"}
const project = await fetch(`${BASE}/projects`, {
method: "POST",
headers,
body: JSON.stringify({
brief: "Your brief here",
mode: "autonomous",
}),
}).then((r) => r.json());
```
If you include an `idempotency_key` and a non-failed project already exists for that key, the endpoint returns `200` with a different response shape:
```json theme={"dark"}
{
"id": "proj_abc123",
"status": "running",
"message": "Project already exists for this idempotency key"
}
```
## Adopt a project
```
POST /projects/adopt
```
Adopt an existing studio project for API management.
### Request body
| Parameter | Type | Required | Description |
| ------------ | ------ | -------- | ------------------------------------------ |
| `project_id` | string | Yes | ID of the studio project to adopt. |
| `mode` | string | No | `autonomous` or `collaborative` (default). |
### Response `201`
Returned when the project is newly adopted.
```json theme={"dark"}
{
"id": "proj_abc123",
"status": "idle",
"mode": "collaborative",
"project_url": "https://eversince.ai/app/projects/..."
}
```
### Response `200`
Returned when the project has already been adopted.
```json theme={"dark"}
{
"id": "proj_abc123",
"status": "idle",
"mode": "collaborative",
"project_url": "https://eversince.ai/app/projects/...",
"message": "Project already adopted"
}
```
## List projects
```
GET /projects
```
| Parameter | Type | Default | Description |
| --------- | ------- | ------- | ----------------------------------- |
| `limit` | integer | 20 | Results per page. 1–100. |
| `offset` | integer | 0 | Pagination offset. |
| `status` | string | | Filter by status. |
| `title` | string | | Search by title (case-insensitive). |
### Response `200`
```json theme={"dark"}
{
"projects": [
{
"id": "proj_abc123",
"source_project_id": null,
"status": "idle",
"mode": "autonomous",
"title": "My Project",
"brief": "Your brief here...",
"assembled_url": "https://...",
"project_url": "https://eversince.ai/app/projects/...",
"created_at": "2025-03-15T10:30:00Z",
"updated_at": "2025-03-15T10:35:00Z"
}
],
"total": 42,
"limit": 20,
"offset": 0
}
```
The `brief` field is truncated to 200 characters in list responses. The `source_project_id` field indicates the original studio project when a project was adopted via the API.
## Get project status
```
GET /projects/:id
```
Returns the current status, agent message, and output URLs.
### Response `200`
```json theme={"dark"}
{
"id": "proj_abc123",
"status": "idle",
"mode": "autonomous",
"output_type": "assembled",
"assembled_url": "https://...",
"assembled_url_expires_at": "2025-03-16T10:30:00Z",
"project_url": "https://eversince.ai/app/projects/...",
"agent_message": "Your project is complete. 4 scenes ready for review...",
"variation_id": "var_xyz",
"created_at": "2025-03-15T10:30:00Z",
"updated_at": "2025-03-15T10:35:00Z"
}
```
| Field | Description |
| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `output_type` | `assembled` (rendered video available), `assets` (standalone assets, no render needed), or `pending` (still in progress). |
| `assembled_url` | URL of the rendered video. Expires after 24 hours. Render again or create a [share link](/api/output#create-share-link) for a permanent URL. |
| `agent_message` | The agent's last message. In collaborative mode, this contains what the agent wants feedback on. |
| `credits_warning` | Present when balance is below 100 credits. |
| `variation_id` | The currently active variation. |
| `error_message` | Present when status is `failed`. |
## Update project settings
```
PATCH /projects/:id/settings
```
Update project configuration. Blocked while the agent is actively running (`running`, `generating`, `rendering`).
### Request body
All fields are optional. Only include fields you want to change.
| Parameter | Type | Description |
| ---------------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `title` | string\|null | Project title. Max 30 characters. Set to `null` to clear. |
| `mode` | string | `autonomous`, `collaborative`, or `none` (hand project to studio). |
| `video_model` | string | Default video model ID. |
| `image_model` | string | Default image model ID. |
| `agent_model` | string | One of `opus-4.7`, `opus-4.6`, `sonnet-4.6`. |
| `reasoning_mode` | string | `thinking` (default) — deeper reasoning. `fast` — quicker turns. |
| `skills` | string\[] | Replace the active skill set. Each entry is an Eversince skill slug (`cinema`, `animation`, `ugc`, `music`, `photography`, `motion-graphics`) or a custom-skill UUID. Pass `[]` to clear. Combined token budget across active skills is 40,000. |
| `webhook_url` | string\|null | Webhook URL. Set to `null` to remove. |
### Response `200`
```json theme={"dark"}
{
"title": "My Project",
"mode": "collaborative",
"aspect_ratio": "16:9",
"video_model": "seedance-2.0",
"image_model": "nano-banana-pro",
"agent_model": "sonnet-4.6",
"reasoning_mode": "thinking",
"skills": ["skill-cinema"],
"webhook_url": "https://your-server.com/webhooks/eversince"
}
```
## Cancel a project
```
POST /projects/:id/cancel
```
Stop the agent. Valid when status is `queued`, `running`, `generating`, or `idle`. Generations already in progress at the provider level will still complete, but the agent won't continue to the next step.
### Response `200`
```json theme={"dark"}
{
"id": "proj_abc123",
"status": "cancelled"
}
```
## Send a message
```
POST /projects/:id/messages
```
Send feedback or direction to the agent. Valid when the project is `idle`, `completed`, `cancelled`, or `failed`. Returns 400 if the agent is still actively working (`running`, `generating`, `rendering`). Requires at least 10 credits.
### Request body
| Parameter | Type | Required | Description |
| ----------------- | ------- | -------- | ---------------------------------------------------- |
| `message` | string | Yes | Your feedback or direction. Max 8,000 characters. |
| `references` | array | No | Reference media (same format as project creation). |
| `extract_content` | boolean | No | Extract content from reference URLs. Default `true`. |
### Response `202`
```json theme={"dark"}
{
"id": "proj_abc123",
"status": "running"
}
```
The agent resumes work with your feedback.
### Example
```bash curl theme={"dark"}
curl -X POST https://eversince.ai/api/v1/projects/proj_abc123/messages \
-H "Authorization: Bearer $EVERSINCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"message": "The music is too intense. Make it more subtle and add a female voiceover."
}'
```
```python Python theme={"dark"}
resp = requests.post(f"{BASE}/projects/{project_id}/messages",
headers=headers,
json={"message": "The music is too intense. Make it more subtle and add a female voiceover."})
```
```javascript JavaScript theme={"dark"}
await fetch(`${BASE}/projects/${project.id}/messages`, {
method: "POST",
headers,
body: JSON.stringify({
message: "The music is too intense. Make it more subtle and add a female voiceover.",
}),
});
```
## Get messages
```
GET /projects/:id/messages
```
Retrieve conversation history.
| Parameter | Type | Default | Description |
| --------- | ------- | ------- | ------------------------------------------------------- |
| `limit` | integer | 20 | Messages per page. 1–50. |
| `after` | string | | Message ID cursor. Returns messages newer than this ID. |
| `before` | string | | Message ID cursor. Returns messages older than this ID. |
### Response `200`
```json theme={"dark"}
{
"messages": [
{
"id": "msg_001",
"role": "user",
"content": "Your brief here.",
"source": "chat",
"created_at": "2025-03-15T10:30:00Z"
},
{
"id": "msg_002",
"role": "assistant",
"content": "I've created a 4-scene project ready for review...",
"source": "chat",
"created_at": "2025-03-15T10:32:00Z"
}
],
"has_more": false
}
```
Use the `after` cursor for efficient polling. Store the last message ID you've seen and pass it as `?after=msg_002` to get only new messages.
# Webhooks
Source: https://docs.eversince.ai/api/webhooks
Receive real-time status updates instead of polling.
Webhooks notify your server when a project's status changes, eliminating the need to poll.
## Setup
Set a webhook URL when creating a project or via settings:
```json theme={"dark"}
{
"brief": "Your brief here",
"webhook_url": "https://your-server.com/webhooks/eversince"
}
```
Or add one to an existing project:
```bash theme={"dark"}
curl -X PATCH https://eversince.ai/api/v1/projects/proj_abc123/settings \
-H "Authorization: Bearer $EVERSINCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "webhook_url": "https://your-server.com/webhooks/eversince" }'
```
The URL must use HTTPS.
## Events
Webhooks fire on these status transitions:
| Event | When |
| ------------ | ------------------------------------------------ |
| `running` | Agent started working |
| `generating` | Waiting for model outputs |
| `idle` | Work complete. Result ready or awaiting feedback |
| `failed` | Something went wrong |
| `rendering` | Final video render in progress |
Cancelled projects do not fire webhook events.
## Payload
Each webhook delivers the full project state (the same data returned by `GET /projects/:id`) plus an `event` field indicating the status transition that triggered the webhook.
```json theme={"dark"}
{
"id": "proj_abc123",
"status": "idle",
"mode": "autonomous",
"output_type": "assembled",
"event": "idle",
"assembled_url": "https://...",
"assembled_url_expires_at": "2025-03-16T10:30:00Z",
"project_url": "https://eversince.ai/app/projects/...",
"agent_message": "Your project is complete...",
"assets": [
{
"ref": "a1b2c3d4",
"type": "image-to-video",
"url": "https://...",
"model": "wan-2.6",
"prompt": "Opening shot of the product on a clean background",
"duration": 5.0,
"aspect_ratio": "16:9",
"source_image_url": "https://...",
"source_video_url": null,
"reference_image_url": null,
"created_at": "2025-03-15T10:32:00Z"
}
],
"timeline": {
"duration_seconds": 15.0,
"aspect_ratio": "16:9",
"skills": ["skill-cinema"],
"scenes": [
{
"id": "scene_uuid",
"ref": "a1b2c3d4",
"type": "video",
"position": 1,
"duration": 5,
"description": "Opening shot",
"image_url": "https://...",
"video_url": "https://...",
"video_model": "wan-2.6",
"image_model": "flux-2-max",
"prompt": "Opening shot of the product on a clean background",
"volume": 1.0,
"fade_in": null,
"fade_out": null
}
],
"audio": {
"voiceover": null,
"music": null,
"tracks": []
},
"overlays": [],
"captions": null
},
"created_at": "2025-03-15T10:30:00Z",
"updated_at": "2025-03-15T10:35:00Z"
}
```
## Signature verification
Webhook signing is optional. When a signing secret is configured for your account, every webhook includes signature headers for verification:
| Header | Description |
| ----------------------- | -------------------------- |
| `X-Eversince-Signature` | `sha256=` |
| `X-Eversince-Timestamp` | Unix timestamp (seconds) |
### Verification
The signature is an HMAC-SHA256 of `{timestamp}.{raw body}` using your signing secret.
```python Python theme={"dark"}
import hmac
import hashlib
def verify_webhook(request, signing_secret):
timestamp = request.headers["X-Eversince-Timestamp"]
signature = request.headers["X-Eversince-Signature"]
body = request.body.decode("utf-8")
signed_content = f"{timestamp}.{body}"
expected = "sha256=" + hmac.new(
signing_secret.encode(),
signed_content.encode(),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)
```
```javascript JavaScript theme={"dark"}
const crypto = require("crypto");
function verifyWebhook(req, signingSecret) {
const timestamp = req.headers["x-eversince-timestamp"];
const signature = req.headers["x-eversince-signature"];
const body = req.body; // raw string
const signedContent = `${timestamp}.${body}`;
const expected =
"sha256=" +
crypto.createHmac("sha256", signingSecret).update(signedContent).digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
```
## Delivery
* **Timeout:** 10 seconds. Your endpoint must respond within this window.
* **Method:** POST with `Content-Type: application/json`
* Webhooks are delivered once. For reliability, confirm state with a `GET /projects/:id` call after receiving a webhook
# Changelog
Source: https://docs.eversince.ai/changelog
| Date | Change |
| ---------- | --------------------------------------------------------------------------------------------------------------------------- |
| 2026-04-16 | MCP server launched at mcp.eversince.ai. Connect Claude Desktop, claude.ai, Cursor, Zed, Windsurf, or any MCP-aware client. |
| 2026-04-11 | Seedance 2.0 and Seedance 2.0 Fast added. Seedance 2.0 is now the default video model. |
| 2026-03-31 | Public API launched |
# FAQ
Source: https://docs.eversince.ai/faq
## Getting started
No. Describe what you want and the agent handles the rest. If you have editing expertise, you can direct every detail.
Yes. Upload images, videos, or audio. The agent can use them as creative references, generate from them, or build a project around them. You can also paste links for context.
Yes. Tell the agent what you need.
Yes, 8,000 characters. Same for the API `brief` and `message` fields.
## How the agent works
The agent runs on Claude (Opus 4.7, Opus 4.6, or Sonnet 4.6) for reasoning, and orchestrates the latest AI image, video, and audio models for creative output. See [Models](/features/models) for the full list.
Opus 4.7 is the most capable, with efficient workflows and precise instruction following. Opus 4.6 offers deep reasoning well-suited to complex multi-scene projects and nuanced direction. Sonnet 4.6 responds faster at a lower cost per run and works well for straightforward tasks. The agent picks automatically by default; you can override per project.
Yes. The agent has memory within each project, and long-term memory that carries across projects.
Eversince can deliver projects in 60+ languages, including voiceover, captions, and text overlay localization. See [Supported languages](/features/timeline#supported-languages) for the full list.
Yes. The agent can generate character variations for you to choose from. Once selected, the character is saved and used consistently across scenes.
The agent works autonomously while the tab is open. You can switch to other tabs. If you close the Eversince tab, any generation in progress will finish, but the agent will stop after that. Your work is saved and you can reopen anytime.
## Credits and usage
Credits are how Eversince measures creation. Video and image generations, voiceover, music, and sound effects each use a few credits. Video credits depend on the model and duration, while agent tasks vary by complexity.
Monthly credits reset each billing cycle. Purchased credit packs never expire.
Credits are refunded automatically for failed generations. If you don't see a refund, contact us and we'll verify.
Free gives you access to the studio, the agent, and the API. Pro gives the agent the ability to generate for you, with all models, variations, 60+ languages, 4K export, and voice mode. See [eversince.ai/pricing](https://eversince.ai/pricing).
Yes, 100%. Everything you make with Eversince is yours, with full commercial usage rights.
## Support
Email [support@eversince.ai](mailto:support@eversince.ai) or use the feedback endpoint (`POST /feedback`) from the API.
## API
Go to your [account settings](https://eversince.ai/app/settings) to create an API key.
Yes. API projects appear in the studio and studio projects can be adopted for API management via `POST /projects/adopt`.
Yes. Eversince supports webhooks for status change notifications and polling with status-aware intervals.
See [API Overview](/api/overview) for current rate limits.
# Agent
Source: https://docs.eversince.ai/features/agent
| Capability | Description |
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Research & planning** | Web search, social listening, brand analysis, content ideation, model selection |
| **Eversince skills** | Built-in domain expertise (cinema, animation, photography, ugc, music, motion graphics, and more). Shapes every decision from shot composition to audio mixing. Maintained and improved by Eversince |
| **Custom skills** | Brand guidelines, style rules, and domain knowledge that persist across projects |
| **Memory & learning** | Per-project memory. Cross-project learned preferences |
| **Image** | Generates from text, edits existing images. Reference images for visual consistency |
| **Video** | Generates from text, images, or existing video. Multi-shot, lip-sync, start + end frames |
| **Audio** | Voices across 60+ languages. Multiple music models. Sound effects. Voice transformation. Custom audio uploads. Multi-track mixing |
| **Motion graphics** | Kinetic typography, data visualizations, logo reveals, custom effects |
| **Agentic editing** | Builds and reorders scenes, adjusts durations, syncs audio to visuals, places text/logo/motion overlays, generates captions with word-level timing. Works with generated and uploaded content |
| **Cost tracking** | Estimates cost per operation before execution. Tracks spending and enforces budgets |
| **Parallel execution** | Up to 10 generations running simultaneously per project |
| **Media analysis** | Analyzes uploaded and generated media for quality, content, and alignment |
| **Post-processing** | 4x image upscale, 2x video upscale, background removal, image cropping |
| **Rendering** | Composites all layers into a single MP4 at 30 fps. 1080p and 4K |
| **Failure recovery** | Automatic retries and recovery. Keeps working through model or provider issues |
| **Variations** | Branches the timeline into independent versions for different formats, languages, or creative directions |
## Models
| Model | Best for |
| --------------------- | ----------------------------------------------------------------- |
| **Claude Opus 4.7** | Most capable. Efficient workflows, precise instruction following. |
| **Claude Opus 4.6** | Deep reasoning. Complex multi-scene projects, nuanced direction. |
| **Claude Sonnet 4.6** | Faster responses, lower cost per run. Straightforward tasks. |
## Modes
| Mode | How it works | Default in |
| ----------------- | ------------------------------------------------------------------------------------- | ---------- |
| **Collaborative** | Pauses at each stage for review and approval. Plan, cost estimate, generated outputs. | Studio |
| **Autonomous** | Handles everything end to end without checkpoints. | API |
In the studio, to make the agent work autonomously, simply tell it. In the API, to switch to collaborative mode, set `"mode": "collaborative"` via `POST /projects`.
## Memory
Per-project context that builds as you work with the agent. Shared across all variations of the timeline. The agent updates memory automatically and you can see each update in the chat.
| Section | What it stores |
| ------------ | ----------------------------------------------- |
| **Creative** | The idea, storyline, visual direction |
| **Todos** | A to-do list of what's done and what's next |
| **Assets** | URLs, voice IDs, style and character references |
## Continuous learning
The agent picks up your preferences over time and applies them across projects.
| What it learns | |
| -------------- | -------------------------------------------- |
| **Visual** | Styles, color palettes, shot compositions |
| **Brand** | Recurring elements, tone, messaging |
| **Production** | Model preferences, workflows, output formats |
## Voice mode
A specialized voice agent that extracts actionable items for execution. Available from the prompt box on the home page and in the studio. Male or female voice, persisted across sessions.
| Model | Description |
| --------------------- | ----------------------------------------------------- |
| **GPT Realtime 1.5** | Better for natural conversation with low latency |
| **Claude Sonnet 4.6** | Better for creative reasoning with multimodal context |
Both models have the production knowledge and are environment-aware. Claude Sonnet 4.6 also sees images throughout the voice session.
# Models
Source: https://docs.eversince.ai/features/models
By default, the agent picks the best model for each task. You can override for a single generation or an entire project from the prompt box settings, or by telling the agent directly. When using the API, `GET /models` returns the current list.
## Image
| Mode | Description |
| ------------------------ | -------------------------------------------------- |
| **Text to image** | Generate from a text prompt |
| **Image to image** | Edit or transform an existing image |
| **Ingredients to image** | Combine multiple reference images into a new image |
### Available image models
| Model | ID | Modes | Aspect ratios | Max refs | Max variants |
| --------------------- | ------------------------ | ----------------------- | --------------------- | -------- | ------------ |
| **Nano Banana Pro** | `google-nano-banana-pro` | text, image, references | 16:9, 9:16, 21:9, 1:1 | 5 | 1 |
| **Nano Banana 2** | `google-nano-banana-2` | text, image, references | 16:9, 9:16, 21:9, 1:1 | 14 | 1 |
| **Nano Banana** | `google-nano-banana` | text, image, references | 16:9, 9:16, 21:9, 1:1 | 3 | 1 |
| **GPT Image 2** | `gpt-image-2` | text, image, references | 1:1, 16:9, 9:16 | 10 | 5 |
| **GPT Image 1.5** | `gpt-image-1.5` | text, image, references | 16:9, 9:16 | 10 | 5 |
| **Seedream 5.0 Lite** | `seedream-5` | text, image, references | 16:9, 9:16, 21:9, 1:1 | 14 | 5 |
| **Seedream 4.5** | `seedream-4.5` | text, image, references | 16:9, 9:16, 21:9, 1:1 | 10 | 5 |
| **Flux 2 Max** | `flux-2-max` | text, image, references | 16:9, 9:16 | 8 | 1 |
| **Grok Imagine Pro** | `grok-imagine-image-pro` | text, image | 16:9, 9:16, 1:1 | — | 1 |
| **Riverflow 2.0 Pro** | `riverflow-2-pro` | text, image, references | 16:9, 9:16, 21:9, 1:1 | 10 | 1 |
## Video
| Mode | Description |
| ------------------------ | ------------------------------------------------------------------ |
| **Text to video** | Generate from a text prompt |
| **Image to video** | Generate video from a starting image |
| **Ingredients to video** | Combine multiple reference images into a video |
| **Video to video** | Edit or transform an existing video |
| **Audio to video** | Generate video synced to speech or music |
| **Multi-shot** | Multiple shots in a single generation, each with its own direction |
| **Lip-sync** | Generate video synced to a voiceover |
| **Start + end frame** | Set the first and last frame, video is generated between them |
### Available video models
| Model | ID | Modes | Durations | Audio | Key features |
| ---------------------- | --------------------- | ---------------------------------------------------------------------- | ---------- | --------- | --------------------------------------------------------------------------------- |
| **Seedance 2.0** | `seedance-2.0` | text, image, references, video, audio, end frame, multi-shot, lip-sync | 1–15s | Yes | 9 ref images, 3 ref videos, 3 ref audios, prose multi-shot, native lip-sync, 720p |
| **Seedance 2.0 Fast** | `seedance-2.0-fast` | text, image, references, video, audio, end frame, multi-shot, lip-sync | 1–15s | Yes | Same capabilities as Seedance 2.0, lower cost, 720p |
| **Kling 3.0 Omni** | `kling-3.0-omni` | image, video, references, multi-shot, end frame | 3–15s | Yes | 7 ref images, 1 ref video, V2V |
| **Kling 3.0** | `kling-3.0` | image, multi-shot, end frame | 3–15s | Yes | 1080p |
| **Kling O1 Edit** | `kling-o1` | image, video, references, end frame | 3–10s | No | V2V editing, 7 ref images, preserves original sound |
| **Kling 2.6** | `kling-2.6` | text, image | 5, 10s | Yes | Negative prompt, 1080p |
| **Veo 3.1** | `google-veo-3.1` | text, image, end frame | 4, 6, 8s | Yes | Up to 1080p |
| **Veo 3.1 Fast** | `google-veo-3.1-fast` | text, image, end frame | 4, 6, 8s | Yes | Up to 1080p |
| **Seedance 1.5 Pro** | `seedance-1.5-pro` | text, image, end frame | 4–12s | Yes | All aspect ratios, 1080p |
| **Wan 2.6** | `wan-2.6` | text, image, audio, end frame, lip-sync | 5, 10, 15s | Always on | Audio input sync |
| **LTX 2.3 Pro** | `ltx-2.3-pro` | text, image, end frame | 6, 8, 10s | Yes | Camera motion (dolly, jib, tracking, static, focus shift), up to 4K |
| **LTX 2.3 Fast** | `ltx-2.3-fast` | text, image, end frame | 6–20s | Yes | Camera motion, up to 4K, longest durations |
| **Sora 2 Pro** | `openai-sora-2-pro` | text, image | 4, 8, 12s | Always on | Up to 1024p |
| **Sora 2** | `openai-sora-2` | text, image | 4, 8, 12s | Always on | 720p |
| **Grok Imagine Video** | `grok-imagine-video` | text, image, video | 1–15s | Always on | V2V, flexible durations, 720p |
## Audio
| Type | Description |
| ----------------- | ---------------------------------------- |
| **Voiceover** | Generate speech across 60+ languages |
| **Music** | Generate music from text prompts |
| **Sound effects** | Generate sound effects and ambient audio |
### Voiceover
| Model | ID | Key features |
| ----------------- | ------------ | -------------------------------------------------------------- |
| **ElevenLabs v3** | `elevenlabs` | 60+ languages, tone control, voice transform, adjustable speed |
### Music
| Model | ID | Duration | Duration control |
| ---------------------- | ------------ | ----------------------- | ---------------- |
| **ElevenLabs Music** | `elevenlabs` | 3s–10 min | Yes |
| **MiniMax Music 2.5** | `minimax` | Varies by lyrics length | No |
| **Google Lyria 3 Pro** | `google` | Up to 3 min | No |
### Sound effects
| Model | ID | Duration | Key features |
| ------------------ | ------------ | -------- | --------------------------------- |
| **ElevenLabs SFX** | `elevenlabs` | 0.5–22s | Looping, prompt influence control |
# Skills
Source: https://docs.eversince.ai/features/skills
Skills are domain-specific expertise that shape what and how the agent creates. Two kinds: **Eversince skills** (pre-built disciplines maintained by Eversince) and **custom skills** (your own). Multiple can be active at once, sharing a 40,000-token combined budget.
## Eversince skills
Pre-built layers of domain expertise. By default a new project starts with no skill active. When a skill is active, every decision the agent makes is informed by that domain. Available in the prompt box or from the API. Activate, deactivate, or stack at any time. The agent can also toggle them itself when the task changes. Maintained and continuously improved by Eversince.
| Skill | Description | Version |
| ------------------- | ----------------------------------------------------------- | ------- |
| **Cinema** | Story-driven filmmaking, shot design, emotional pacing | `v1` |
| **Animation** | Illustrated worlds with character-driven storytelling | `v1` |
| **UGC** | Creator-style content for TikTok, Reels, and Shorts | `v1` |
| **Music** | Song generation, music videos, beat-synced visuals | `v1` |
| **Photography** | Hero shots, detail work, and lifestyle compositions | `v1` |
| **Motion Graphics** | Animated text, data visualization, and graphic storytelling | `v1` |
### Using skills via the API
Activate skills when creating a project. `skills` accepts an array of Eversince skills and/or custom-skill UUIDs:
```json theme={"dark"}
{
"brief": "Your brief here",
"skills": ["cinema"]
}
```
Stack multiple:
```json theme={"dark"}
{
"brief": "Your brief here",
"skills": ["cinema", "photography", "a1b2c3d4-..."]
}
```
Omit `skills` (or pass `[]`) to start with no skills active:
```json theme={"dark"}
{
"brief": "Your brief here"
}
```
Available Eversince values: `cinema`, `animation`, `ugc`, `music`, `photography`, `motion-graphics`. Custom-skill UUIDs come from `GET /account/skills`. All active skills share a 40,000-token combined budget. Replace the active set at any time via `PATCH /projects/:id/settings` with a new `skills` array.
## Custom skills
Persistent instructions you can add, like brand guidelines, style rules, tone of voice, domain knowledge, or preferred workflows. Applied on every agent run across every project when active.
| Detail | Value |
| ---------------- | ------------------------------------------------------------------ |
| **Create** | Studio or `POST /account/skills` via the API |
| **Token budget** | 40,000 tokens shared across all active skills (Eversince + custom) |
| **Toggle** | Activate or deactivate on the fly without deleting |
| **Scope** | Applied across all projects where active |
## Common questions
Yes. Skills stack freely. Multiple skills can be active at once, sharing a 40,000-token combined budget.
No direct charge. Active skills add tokens to the agent's context on every turn, which slightly increases per-turn LLM credit consumption.
Yes. Both types stack and share the 40,000-token budget.
# Timeline
Source: https://docs.eversince.ai/features/timeline
| Layer | Description |
| ---------------- | ----------------------------------------------------------------------------- |
| **Scenes** | Video or image per scene with duration, volume, and fade controls |
| **Audio tracks** | Voiceover, music, and sound effects with per-track volume, position, and fade |
| **Overlays** | Text, logos, and motion graphics with start time, duration, and fade |
## Captions
Generated from voiceover, scene audio, or music with word-level timing.
| Preset | Behavior | Default position |
| ----------- | ----------------------------------------- | ---------------- |
| **Impact** | One word at a time, scale animation | Center |
| **Clean** | Phrase groups (4–6 words), fade animation | Bottom center |
| **Kinetic** | Words build up on screen | Center |
You can edit caption text and adjust phrase grouping after generation, or ask the agent to do it.
## Variations
Branch a project into independent versions, each with its own scenes, audio, overlays, and settings, while sharing the same conversation, memory, and asset pool. Examples:
| Use case | Description |
| -------------------- | ------------------------------------------------------------------ |
| **Multi-format** | Same project in 16:9, 9:16, 1:1, and 21:9 |
| **Multi-language** | Translated voiceover, captions, and text overlays in 60+ languages |
| **Creative testing** | Different hooks, CTAs, music, voiceover |
| **Save points** | Duplicate before major changes, switch back anytime |
Changing aspect ratio or language automatically creates a new variation. The original is preserved.
## Supported languages
The agent can deliver projects in 60+ languages, including voiceover, captions, and text overlay localization.
| | | | |
| --------------- | --------------- | -------------------- | ---------------- |
| 🇿🇦 Afrikaans | 🇸🇦 Arabic | 🇦🇲 Armenian | 🇦🇿 Azerbaijani |
| 🇧🇩 Bengali | 🇧🇦 Bosnian | 🇧🇬 Bulgarian | 🇪🇸 Catalan |
| 🇨🇳 Chinese | 🇭🇷 Croatian | 🇨🇿 Czech | 🇩🇰 Danish |
| 🇳🇱 Dutch | 🇺🇸 English | 🇪🇪 Estonian | 🇵🇭 Filipino |
| 🇫🇮 Finnish | 🇫🇷 French | 🇪🇸 Galician | 🇬🇪 Georgian |
| 🇩🇪 German | 🇬🇷 Greek | 🇮🇳 Gujarati | 🇳🇬 Hausa |
| 🇮🇱 Hebrew | 🇮🇳 Hindi | 🇭🇺 Hungarian | 🇮🇸 Icelandic |
| 🇮🇩 Indonesian | 🇮🇪 Irish | 🇮🇹 Italian | 🇯🇵 Japanese |
| 🇮🇳 Kannada | 🇰🇿 Kazakh | 🇰🇷 Korean | 🇱🇻 Latvian |
| 🇱🇹 Lithuanian | 🇲🇰 Macedonian | 🇲🇾 Malay | 🇮🇳 Malayalam |
| 🇮🇳 Marathi | 🇳🇵 Nepali | 🇳🇴 Norwegian | 🇮🇷 Persian |
| 🇵🇱 Polish | 🇧🇷 Portuguese | 🇮🇳 Punjabi | 🇷🇴 Romanian |
| 🇷🇺 Russian | 🇷🇸 Serbian | 🇸🇰 Slovak | 🇸🇮 Slovenian |
| 🇪🇸 Spanish | 🇰🇪 Swahili | 🇸🇪 Swedish | 🇮🇳 Tamil |
| 🇮🇳 Telugu | 🇹🇭 Thai | 🇹🇷 Turkish | 🇺🇦 Ukrainian |
| 🇵🇰 Urdu | 🇻🇳 Vietnamese | 🏴 Welsh | |
## Formats
Available formats:
| Format | Ratio |
| ------------- | ----- |
| **Landscape** | 16:9 |
| **Portrait** | 9:16 |
| **Square** | 1:1 |
| **Ultrawide** | 21:9 |
Aspect ratio can be changed mid-project. You can also ask the agent to generate standalone assets in a different ratio than the timeline and download them directly.
## Export
Exports the current state of the timeline as MP4 at 30 fps. To export different variations, switch to it first. Export typically takes around 30 seconds per 15 seconds of timeline. At peak times your request is queued. You can close the app and find it in your project exports once finished.
| Quality | Description |
| --------- | ---------------- |
| **1080p** | Standard quality |
| **4K** | Maximum quality |
# Glossary
Source: https://docs.eversince.ai/glossary
| Term | Definition |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Aspect ratio** | The width-to-height ratio of the output. Supported: 16:9 (landscape), 9:16 (portrait), 1:1 (square), 21:9 (ultrawide). |
| **Brief** | Your creative direction to the agent. Can be a single sentence or a detailed production document. |
| **Skill** | A layer of deeper domain expertise active during agent runs. **Eversince skills** are built and maintained by Eversince (cinema, animation, photography, ugc, music, motion graphics, and more); **custom skills** are yours (brand guidelines, style rules, workflows). Multiple can be active at once, sharing a 40,000-token budget. |
| **Credit** | How Eversince measures creation. Costs vary based on model used. |
| **Custom skill** | Persistent instructions you can add, like brand guidelines, style rules, tone of voice, domain knowledge, or preferred workflows. Applied across projects when active. |
| **Generation** | A single output from an AI model. One image, video clip, or audio track. |
| **Long-term memory** | Patterns the agent learns from your feedback over time. Carries across projects. |
| **Motion graphic** | A visual effect on the timeline such as kinetic text, data counters, and logo reveals. Built and customized by the agent. |
| **Multi-shot** | Video generation mode: direct multiple shots within a single generation, each with its own camera direction. |
| **Overlay** | A visual layer on top of video such as text, logos, or motion graphics. Each has timing and position controls. |
| **Reference image** | An existing image passed to the model for visual consistency. Character sheets, style references, product photos. |
| **Render** | Compositing all timeline elements into a single exported MP4 file. |
| **Scene** | A segment of the timeline. Video or image with duration, volume, and fade controls. |
| **Timeline** | The browser-based editor where scenes, audio tracks, overlays, and captions are composed and previewed. |
| **Variation** | An independent branch of a project with its own timeline state. Shares conversation and memory with other variations in the project. |
# Introduction
Source: https://docs.eversince.ai/introduction
Eversince is a creative agent that plans and executes across image, video, and audio. It orchestrates the latest AI models and operates in a purpose-built environment with tools, skills, and memory.
## Key concepts
* **Model-agnostic:** Orchestrates the latest image, video, and audio models.
* **Source assets:** Generates from scratch or builds on your own assets.
* **Agentic editing:** Works directly on the timeline, building scenes, adjusting durations, syncing audio to visuals, mixing voiceover, music, and sound effects, placing overlays, and aligning it all. It can work autonomously or follow your direction.
* **Skills:** Domain-specific expertise that shapes what and how the agent creates. Eversince maintains a set of pre-built skills, and supports custom ones.
* **Memory:** Per-project memory and cross-project learned preferences.
* **Studio + API + MCP:** Available in the studio, via REST API, or as an MCP server for agent-to-agent workflows.
## How it works
1. Send a brief in natural language and attach any references you need
2. The agent plans the creative, selects models, generates in parallel
3. The agent delivers standalone assets or builds on the timeline
4. Give feedback and the agent iterates
5. Download assets or export the timeline in 1080p or 4K
## Under the hood
Parallel execution, failure recovery, media analysis, cost tracking, and rendering. [Full breakdown](/features/agent).
## Explore
First project setup
How the agent works
All available models
Domain expertise
Editor and export
Integrate with the API
Common questions
Term definitions
# Quickstart
Source: https://docs.eversince.ai/quickstart
Create an account at [eversince.ai](https://eversince.ai)
From the home page, type what you want to create. This is your brief, the creative direction the agent works from.
| Level | Example |
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
| **Open** | A product launch video for a new espresso machine. |
| **Standard** | A 15-second Instagram ad for a new perfume. Dramatic lighting, close-ups on the bottle, cinematic feel. |
| **Detailed** | Open on the bottle on dark marble. Slow dolly in. Cut to a hand reaching for it in soft window light. End on logo. Male voiceover, deep tone. |
| **Scripted** | Full script |
You can also add image, video, and audio attachments, paste links to websites, product pages, or YouTube videos, choose your aspect ratio, and optionally select a [skill](/features/skills).
The agent thinks through the creative approach, often presents a plan with cost estimation, selected models, and execution steps, then starts generating. You'll see it working in real time, generating images, creating video from those images, composing audio, writing motion graphics, and assembling everything on the timeline.
Keep the tab open so the agent can continue working autonomously. If you close it, your work is saved but the agent won't continue until you send another message.
Review the output. Give feedback in the chat:
* "Try a different shot for scene 2"
* "The music should be more subtle"
* "Add the tagline as animated text on the last scene"
* "Create a 9:16 version for TikTok"
The agent picks up where it left off and applies your direction.
Describe your intent naturally, not as a prompt. The agent is built with deep knowledge of how to prompt each AI model and you will get better results letting it handle that for you.
Download your assets or export the timeline in 1080p or 4K.
## Tips
| | |
| ------------------------- | ------------------------------------------------------------------------------- |
| **Use voice mode** | Speak to a specialized voice agent that extracts actionable items for execution |
| **Run multiple projects** | Open another tab, each project runs independently with its own instance |
Create an API key in your [account settings](https://eversince.ai/app/settings). Keys start with `es_live_`.
Describe what you want to create. The agent starts working immediately.
```bash theme={"dark"}
curl -X POST https://eversince.ai/api/v1/projects \
-H "Authorization: Bearer $EVERSINCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"brief": "Your brief here",
"mode": "autonomous"
}'
```
Returns `{ "id": "proj_abc123", "status": "queued" }`.
Check the project status until it reaches `idle`.
```bash theme={"dark"}
curl https://eversince.ai/api/v1/projects/proj_abc123 \
-H "Authorization: Bearer $EVERSINCE_API_KEY"
```
Poll intervals: `queued` (5s), `running` (30s), `generating` (30–60s). Or use [webhooks](/api/webhooks) instead of polling.
When status is `idle`, check `output_type` in the response.
* **`assets`** — standalone media ready to download. Fetch with `GET /projects/:id/assets`.
* **`assembled`** — timeline ready to render:
```bash theme={"dark"}
curl -X POST https://eversince.ai/api/v1/projects/proj_abc123/render \
-H "Authorization: Bearer $EVERSINCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "quality": "1080p" }'
```
Poll until status returns to `idle`, then read `assembled_url` for the video.
See the full [API reference](/api/overview) for all endpoints, error handling, and best practices.