intro.md
title: Getting started subtitle: Build your first AI-powered video and audio application in 5 minutes.
import { Card, CardGroup, CodeBlocks, Steps, Warning, Tip, Info } from '@site/src/components/CustomComponents';
Vinci is a platform for creating AI agents for video production. Transform your content with powerful APIs for speech processing, voice conversion, video generation, and video manipulation.
Vinci provides a comprehensive suite of AI-powered tools:
Generate videos from text prompts or images using AI. Manage your account settings and preferences. Secure API key management and authentication. Monitor usage and manage billing preferences.Sign up for a Vinci account and create your first API key:
### Create account Visit [https://app.tryvinci.com](https://app.tryvinci.com) and sign up for an account.Navigate to your API dashboard and create a new API key. Your API key will look like sk-....
Add credits to your account to start using the APIs. Video generation costs $0.05 per second.
```python title="hello_world.py" import requestsurl = "https://tryvinci.com/api/v1/generate/text-to-video" headers = { "Authorization": "Bearer sk-your-api-key-here", "Content-Type": "application/json" } data = { "prompt": "A serene sunset over a calm lake", "duration_seconds": 5, "aspect_ratio": "16:9" }
response = requests.post(url, headers=headers, json=data) result = response.json() print(f"Request ID: {result['request_id']}")
```javascript title="hello_world.js"
// Generate a video from text
const response = await fetch('https://tryvinci.com/api/v1/generate/text-to-video', {
method: 'POST',
headers: {
'Authorization': 'Bearer sk-your-api-key-here',
'Content-Type': 'application/json',
},
body: JSON.stringify({
prompt: 'A serene sunset over a calm lake',
duration_seconds: 5,
aspect_ratio: '16:9'
}),
});
const result = await response.json();
console.log(`Request ID: ${result.request_id}`);
Video generation is asynchronous. Poll the status endpoint to check when your video is ready:
```python title="check_status.py" import requests import timerequest_id = "your-request-id" url = f"https://tryvinci.com/api/v1/status/{request_id}" headers = {"Authorization": "Bearer sk-your-api-key-here"}
while True: response = requests.get(url, headers=headers) status = response.json()
if status['status'] == 'completed': print(f"Video ready: {status['video_url']}") break elif status['status'] == 'failed': print("Generation failed") break
print(f"Status: {status['status']}") time.sleep(5)
```javascript title="check_status.js"
const requestId = 'your-request-id';
const url = `https://tryvinci.com/api/v1/status/${requestId}`;
const checkStatus = async () => {
const response = await fetch(url, {
headers: {
'Authorization': 'Bearer sk-your-api-key-here',
},
});
const status = await response.json();
if (status.status === 'completed') {
console.log(`Video ready: ${status.video_url}`);
return status;
} else if (status.status === 'failed') {
console.log('Generation failed');
return status;
}
console.log(`Status: ${status.status}`);
setTimeout(checkStatus, 5000);
};
checkStatus();
All API requests require a Bearer token for authentication:
Authorization: Bearer sk-your-api-key-hereVinci uses a simple usage-based pricing model:
- Video generation: $0.05 per second of generated video
- API management: Free with your account
- Usage monitoring: Free with your account
Check your current balance and usage at any time through the API.
All API endpoints use the following base URL:
https://tryvinci.com/api
api-keys.md
import { Accordion, AccordionGroup, CodeBlocks, Warning, Tip } from '@site/src/components/CustomComponents';
Securely authenticate your requests to the Vinci API using API keys.
Vinci uses API keys for authentication. All API requests must include your API key in the Authorization header using Bearer token authentication.
Keep your API keys secure and never expose them in client-side code. Use environment variables or secure key management systems in production.Include your API key in the Authorization header of every request:
Authorization: Bearer sk-your-api-key-hereheaders = { "Authorization": "Bearer sk-your-api-key-here", "Content-Type": "application/json" }
response = requests.get( "https://tryvinci.com/api/v1/billing/balance", headers=headers )
balance = response.json() print(f"Current balance: ${balance['balance_usd']}")
```javascript title="authenticated_request.js"
const response = await fetch('https://tryvinci.com/api/v1/billing/balance', {
headers: {
'Authorization': 'Bearer sk-your-api-key-here',
},
});
const balance = await response.json();
console.log(`Current balance: $${balance.balance_usd}`);
Generate a new API key for your account.
POST /api/v1/keysAuthorization: Bearer sk-existing-api-key| Parameter | Type | Description | Default |
|---|---|---|---|
name |
string | Descriptive name for the API key | Required |
rate_limit |
integer | Requests per minute limit | 10 |
{
"key_id": "vinci_abc123...",
"name": "Production API Key",
"api_key": "sk-your-new-api-key-here",
"rate_limit": 10,
"created_at": "2024-01-01T00:00:00Z"
}url = "https://tryvinci.com/api/v1/keys" headers = { "Authorization": "Bearer sk-existing-api-key", "Content-Type": "application/json" } data = { "name": "Production API Key", "rate_limit": 20 }
response = requests.post(url, headers=headers, json=data) result = response.json()
print(f"New API key created: {result['api_key']}") print(f"Key ID: {result['key_id']}")
```javascript title="create_key.js"
const response = await fetch('http://34.67.47.2:8000/api/v1/keys', {
method: 'POST',
headers: {
'Authorization': 'Bearer sk-existing-api-key',
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Production API Key',
rate_limit: 20
}),
});
const result = await response.json();
console.log(`New API key created: ${result.api_key}`);
console.log(`Key ID: ${result.key_id}`);
View all API keys associated with your account.
GET /api/v1/keysAuthorization: Bearer sk-your-api-key-here{
"api_keys": [
{
"key_id": "vinci_abc123...",
"name": "Production API Key",
"is_active": true,
"created_at": "2024-01-01T00:00:00Z",
"last_used": "2024-01-01T12:00:00Z",
"key_preview": "sk-...abc123...",
"rate_limit": 10
},
{
"key_id": "vinci_def456...",
"name": "Development API Key",
"is_active": false,
"created_at": "2024-01-02T00:00:00Z",
"last_used": null,
"key_preview": "sk-...def456...",
"rate_limit": 5
}
],
"count": 2
}url = "http://34.67.47.2:8000/api/v1/keys" headers = {"Authorization": "Bearer sk-your-api-key-here"}
response = requests.get(url, headers=headers) result = response.json()
print(f"Total API keys: {result['count']}") for key in result['api_keys']: status = "Active" if key['is_active'] else "Disabled" print(f"- {key['name']}: {key['key_preview']} ({status})")
```javascript title="list_keys.js"
const response = await fetch('http://34.67.47.2:8000/api/v1/keys', {
headers: {
'Authorization': 'Bearer sk-your-api-key-here',
},
});
const result = await response.json();
console.log(`Total API keys: ${result.count}`);
result.api_keys.forEach(key => {
const status = key.is_active ? 'Active' : 'Disabled';
console.log(`- ${key.name}: ${key.key_preview} (${status})`);
});
Permanently delete an API key. This action cannot be undone.
DELETE /api/v1/keys/{key_id}Authorization: Bearer sk-your-api-key-here{
"message": "API key revoked successfully",
"key_id": "vinci_abc123..."
}key_id = "vinci_abc123..." url = f"http://34.67.47.2:8000/api/v1/keys/{key_id}" headers = {"Authorization": "Bearer sk-your-api-key-here"}
response = requests.delete(url, headers=headers) result = response.json()
print(f"API key revoked: {result['message']}")
```javascript title="revoke_key.js"
const keyId = 'vinci_abc123...';
const response = await fetch(`http://34.67.47.2:8000/api/v1/keys/${keyId}`, {
method: 'DELETE',
headers: {
'Authorization': 'Bearer sk-your-api-key-here',
},
});
const result = await response.json();
console.log(`API key revoked: ${result.message}`);
Each API key has configurable rate limits to prevent abuse and ensure fair usage.
- New keys: 10 requests per minute
- Maximum: 100 requests per minute
API responses include rate limit information in the headers:
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1640995200When you exceed your rate limit, the API returns a 429 status code:
{
"detail": "Rate limit exceeded. Try again in 60 seconds."
}def make_request_with_retry(url, headers, max_retries=3): for attempt in range(max_retries): response = requests.get(url, headers=headers)
if response.status_code == 429:
# Rate limited, wait and retry
wait_time = 60 # seconds
print(f"Rate limited. Waiting {wait_time} seconds...")
time.sleep(wait_time)
continue
return response
raise Exception("Max retries exceeded")
```javascript title="rate_limit_handling.js"
async function makeRequestWithRetry(url, options, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const response = await fetch(url, options);
if (response.status === 429) {
// Rate limited, wait and retry
const waitTime = 60000; // milliseconds
console.log(`Rate limited. Waiting ${waitTime/1000} seconds...`);
await new Promise(resolve => setTimeout(resolve, waitTime));
continue;
}
return response;
}
throw new Error('Max retries exceeded');
}
billing.md
import { Card, CardGroup, Accordion, AccordionGroup, CodeBlocks, Info, Tip } from '@site/src/components/CustomComponents';
Track your account balance, usage statistics, and manage your billing preferences.
Vinci uses a simple usage-based pricing model. Monitor your spending and usage patterns to optimize your costs and ensure uninterrupted service.
Check your current account balance in real-time. Monitor API usage and costs over time.- Video generation: $0.05 per second of generated video
- API management: Free with your account
- Usage monitoring: Free with your account
Get your current account balance and total spending.
GET /api/v1/billing/balanceAuthorization: Bearer sk-your-api-key-here{
"balance_usd": 25.5000,
"total_spent_usd": 134.7500
}url = "https://tryvinci.com/api/v1/billing/balance" headers = {"Authorization": "Bearer sk-your-api-key-here"}
response = requests.get(url, headers=headers) balance = response.json()
print(f"Current balance:
if balance['balance_usd'] < 5.0:
print("
```javascript title="check_balance.js"
const response = await fetch('https://tryvinci.com/api/v1/billing/balance', {
headers: {
'Authorization': 'Bearer sk-your-api-key-here',
},
});
const balance = await response.json();
console.log(`Current balance: $${balance.balance_usd.toFixed(2)}`);
console.log(`Total spent: $${balance.total_spent_usd.toFixed(2)}`);
// Check if balance is low
if (balance.balance_usd < 5.0) {
console.log('⚠️ Low balance! Consider adding more credits.');
}
Monitor your API usage and costs over a specified time period.
GET /api/v1/billing/usage?days={days}Authorization: Bearer sk-your-api-key-here| Parameter | Type | Description | Default |
|---|---|---|---|
days |
integer | Number of days to look back (1-90) | 30 |
{
"period_days": 30,
"total_requests": 156,
"total_seconds": 420.5,
"total_cost_usd": 21.0250,
"current_balance_usd": 25.5000,
"total_spent_usd": 134.7500
}url = "https://tryvinci.com/api/v1/billing/usage?days=7" headers = {"Authorization": "Bearer sk-your-api-key-here"}
response = requests.get(url, headers=headers) usage = response.json()
print(f"Usage for last {usage['period_days']} days:")
print(f"- Total requests: {usage['total_requests']}")
print(f"- Total video seconds: {usage['total_seconds']}")
print(f"- Total cost:
if usage['total_requests'] > 0: avg_cost = usage['total_cost_usd'] / usage['total_requests'] print(f"- Average cost per request: ${avg_cost:.3f}")
```javascript title="usage_stats.js"
// Get usage for the last 7 days
const response = await fetch('https://tryvinci.com/api/v1/billing/usage?days=7', {
headers: {
'Authorization': 'Bearer sk-your-api-key-here',
},
});
const usage = await response.json();
console.log(`Usage for last ${usage.period_days} days:`);
console.log(`- Total requests: ${usage.total_requests}`);
console.log(`- Total video seconds: ${usage.total_seconds}`);
console.log(`- Total cost: $${usage.total_cost_usd.toFixed(2)}`);
console.log(`- Current balance: $${usage.current_balance_usd.toFixed(2)}`);
// Calculate average cost per request
if (usage.total_requests > 0) {
const avgCost = usage.total_cost_usd / usage.total_requests;
console.log(`- Average cost per request: $${avgCost.toFixed(3)}`);
}
Always check your balance before making expensive API calls to avoid failed requests.
```python title="balance_check.py" import requestsdef check_balance_for_video(duration_seconds, api_key): """Check if balance is sufficient for video generation"""
balance_url = "http://34.67.47.2:8000/api/v1/billing/balance" headers = {"Authorization": f"Bearer {api_key}"}
response = requests.get(balance_url, headers=headers) balance = response.json()
estimated_cost = duration_seconds * 0.05 current_balance = balance['balance_usd']
print(f"Current balance:
if current_balance < estimated_cost: print("❌ Insufficient balance for this request") return False
print("✅ Sufficient balance available") return True
api_key = "sk-your-api-key-here" video_duration = 8 # seconds
if check_balance_for_video(video_duration, api_key): print("Proceeding with video generation...")
else: print("Please add more credits to your account")
```javascript title="balance_check.js"
async function checkBalanceForVideo(durationSeconds, apiKey) {
// Check current balance
const balanceResponse = await fetch('http://34.67.47.2:8000/api/v1/billing/balance', {
headers: { 'Authorization': `Bearer ${apiKey}` },
});
const balance = await balanceResponse.json();
// Calculate estimated cost
const estimatedCost = durationSeconds * 0.05;
const currentBalance = balance.balance_usd;
console.log(`Current balance: $${currentBalance.toFixed(2)}`);
console.log(`Estimated cost: $${estimatedCost.toFixed(2)}`);
if (currentBalance < estimatedCost) {
console.log('❌ Insufficient balance for this request');
return false;
}
console.log('✅ Sufficient balance available');
return true;
}
// Example usage
const apiKey = 'sk-your-api-key-here';
const videoDuration = 8; // seconds
if (await checkBalanceForVideo(videoDuration, apiKey)) {
console.log('Proceeding with video generation...');
// Make video generation request
} else {
console.log('Please add more credits to your account');
}
To add credits to your account, visit your dashboard at https://tryvinci.com and navigate to the billing section. You can add credits using:
- Credit/debit cards
- PayPal
- Bank transfers (for larger amounts)
When your balance is too low for a request, the API returns a 402 status code:
{
"detail": "Insufficient balance. Current balance: $1.25, required: $2.50"
}Handle this error gracefully in your applications:
```python title="error_handling.py" import requestsdef make_video_request(prompt, duration, api_key): url = "http://34.67.47.2:8000/api/v1/generate/text-to-video" headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } data = { "prompt": prompt, "duration_seconds": duration }
try: response = requests.post(url, headers=headers, json=data)
if response.status_code == 402:
error_data = response.json()
print(f"Insufficient balance: {error_data['detail']}")
return None
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e: print(f"Request failed: {e}") return None
```javascript title="error_handling.js"
async function makeVideoRequest(prompt, duration, apiKey) {
const url = 'http://34.67.47.2:8000/api/v1/generate/text-to-video';
try {
const response = await fetch(url, {
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
prompt: prompt,
duration_seconds: duration
}),
});
if (response.status === 402) {
const errorData = await response.json();
console.log(`Insufficient balance: ${errorData.detail}`);
return null;
}
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error) {
console.log(`Request failed: ${error.message}`);
return null;
}
}
video-generation.md
import { Card, CardGroup, Accordion, AccordionGroup, CodeBlocks, Tip, Warning, Tabs, Tab } from '@site/src/components/CustomComponents';
Create high-quality videos from text descriptions or transform static images into dynamic video content.
Vinci's video generation API uses advanced AI models to create videos from text prompts or images. The service supports multiple aspect ratios and durations, making it perfect for content creation, marketing, and creative projects.
Generate videos from descriptive text prompts. Animate static images with motion and effects.Video generation costs $0.05 per second of generated video. A 5-second video costs $0.25.
Check your account balance before generating videos to ensure you have sufficient credits.Generate videos from text descriptions using AI.
POST /api/v1/generate/text-to-videoAuthorization: Bearer sk-your-api-key-here| Parameter | Type | Description | Default |
|---|---|---|---|
prompt |
string | Text description of the video to generate | Required |
duration_seconds |
integer | Video duration in seconds (1-10) | 5 |
aspect_ratio |
string | Video aspect ratio: "16:9", "9:16", "1:1" | "16:9" |
seed |
integer | Random seed for reproducible results | -1 (random) |
{
"request_id": "req_abc123...",
"status": "pending",
"estimated_cost_usd": 0.25,
"estimated_duration_seconds": 5
}url = "https://tryvinci.com/api/v1/generate/text-to-video" headers = { "Authorization": "Bearer sk-your-api-key-here", "Content-Type": "application/json" } data = { "prompt": "A majestic eagle soaring through mountain peaks at sunset", "duration_seconds": 8, "aspect_ratio": "16:9" }
response = requests.post(url, headers=headers, json=data) result = response.json() request_id = result["request_id"]
print(f"Generation started. Request ID: {request_id}") print(f"Estimated cost: ${result['estimated_cost_usd']}")
status_url = f"https://tryvinci.com/api/v1/status/{request_id}"
while True: status_response = requests.get(status_url, headers=headers) status = status_response.json()
print(f"Status: {status['status']}")
if status['status'] == 'completed': print(f"Video ready: {status['video_url']}") print(f"Duration: {status['duration_seconds']} seconds") print(f"Final cost: ${status['cost_usd']}") break elif status['status'] == 'failed': print("Generation failed") break
time.sleep(5)
```javascript title="text_to_video.js"
// Generate video from text
const generateVideo = async () => {
const response = await fetch('https://tryvinci.com/api/v1/generate/text-to-video', {
method: 'POST',
headers: {
'Authorization': 'Bearer sk-your-api-key-here',
'Content-Type': 'application/json',
},
body: JSON.stringify({
prompt: 'A majestic eagle soaring through mountain peaks at sunset',
duration_seconds: 8,
aspect_ratio: '16:9'
}),
});
const result = await response.json();
console.log(`Generation started. Request ID: ${result.request_id}`);
console.log(`Estimated cost: $${result.estimated_cost_usd}`);
return result.request_id;
};
// Check status
const checkStatus = async (requestId) => {
const response = await fetch(`https://tryvinci.com/api/v1/status/${requestId}`, {
headers: {
'Authorization': 'Bearer sk-your-api-key-here',
},
});
const status = await response.json();
console.log(`Status: ${status.status}`);
if (status.status === 'completed') {
console.log(`Video ready: ${status.video_url}`);
console.log(`Duration: ${status.duration_seconds} seconds`);
console.log(`Final cost: $${status.cost_usd}`);
return status;
} else if (status.status === 'failed') {
console.log('Generation failed');
return status;
}
// Continue polling
setTimeout(() => checkStatus(requestId), 5000);
};
// Usage
const requestId = await generateVideo();
await checkStatus(requestId);
Transform static images into dynamic videos with motion and effects.
POST /api/v1/generate/image-to-videoAuthorization: Bearer sk-your-api-key-hereForm data with the following fields:
| Parameter | Type | Description | Default |
|---|---|---|---|
image |
file | Input image file (JPEG/PNG) | Required |
prompt |
string | Text description for video motion | Required |
duration_seconds |
integer | Video duration in seconds (1-10) | 5 |
{
"request_id": "req_abc123...",
"status": "pending",
"estimated_cost_usd": 0.25,
"estimated_duration_seconds": 5
}url = "https://tryvinci.com/api/v1/generate/image-to-video" headers = {"Authorization": "Bearer sk-your-api-key-here"}
files = {"image": open("portrait.jpg", "rb")} data = { "prompt": "The person starts smiling and waves at the camera", "duration_seconds": 6 }
response = requests.post(url, headers=headers, files=files, data=data) result = response.json()
print(f"Generation started. Request ID: {result['request_id']}") print(f"Estimated cost: ${result['estimated_cost_usd']}")
```javascript title="image_to_video.js"
// Generate video from image
const fileInput = document.getElementById('imageInput');
const imageFile = fileInput.files[0];
const formData = new FormData();
formData.append('image', imageFile);
formData.append('prompt', 'The person starts smiling and waves at the camera');
formData.append('duration_seconds', '6');
const response = await fetch('https://tryvinci.com/api/v1/generate/image-to-video', {
method: 'POST',
headers: {
'Authorization': 'Bearer sk-your-api-key-here',
},
body: formData,
});
const result = await response.json();
console.log(`Generation started. Request ID: ${result.request_id}`);
console.log(`Estimated cost: $${result.estimated_cost_usd}`);
Check the progress and results of your video generation requests.
GET /api/v1/status/{request_id}Authorization: Bearer sk-your-api-key-herepending: Request queued for processingprocessing: Video generation in progresscompleted: Video ready with download URLfailed: Generation failed with error message
Common error responses and how to handle them:
| Status Code | Error | Solution |
|---|---|---|
| 401 | Invalid API key | Check your authorization header |
| 402 | Insufficient balance | Add credits to your account |
| 413 | File too large | Reduce image file size |
| 429 | Rate limit exceeded | Wait before making more requests |
| 500 | Server error | Retry the request after a delay |