AIVeed Developers Get your API key

Quickstart

From nothing to a hosted AI video in four steps. New accounts get up to 200 free credits. Until you buy credits, an account can make one video, of any model and options that fit within those credits, counted across the web app and the API. That is enough to verify your integration end-to-end once before buying anything. nano-banana is the cheapest model to test with at 10 credits.

1. Create an API key

Get your API key

Sign up (or log in), verify your email, and create a key on the dashboard's API Keys page. The secret (aiv_sk_...) is shown once — store it as AIVEED_API_KEY. New accounts start with up to 200 free credits (one video).

2–4. Image → first video → result

bash
# 1) First call — nano-banana is the cheapest model, 10 credits
curl -X POST "https://api.aiveed.io/v1/generate/image" \
  -H "X-API-Key: $AIVEED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "nano-banana", "prompt": "A cinematic product shot of a smartwatch on a marble table"}'

# → { "id": "job_...", "status": "submitted", "credits_charged": 10, ... }

# 2) First video — seedance-v1-pro, 480p / 5s (30 credits)
curl -X POST "https://api.aiveed.io/v1/generate/video" \
  -H "X-API-Key: $AIVEED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-v1-pro",
    "prompt": "A golden retriever puppy chasing soap bubbles in a sunlit garden, slow motion",
    "resolution": "480p",
    "duration": "5",
    "aspect_ratio": "9:16"
  }'

# 3) Poll until status is "completed"
curl "https://api.aiveed.io/v1/jobs/JOB_ID" -H "X-API-Key: $AIVEED_API_KEY"

# → { "id": "job_...", "status": "completed", "result_url": "https://...", ... }
The video call charges 30 credits (seedance-v1-pro at 480p/5s — the cheapest video). Prices for every model and option are on the pricing page and at GET /v1/credits/pricing. Failed jobs are refunded automatically.

Node.js

javascript
const BASE = 'https://api.aiveed.io/v1';
const headers = {
  'X-API-Key': process.env.AIVEED_API_KEY,
  'Content-Type': 'application/json',
};

async function submit(path, body) {
  const res = await fetch(`${BASE}${path}`, { method: 'POST', headers, body: JSON.stringify(body) });
  const data = await res.json();
  if (!res.ok) throw new Error(`${data.code}: ${data.message}`);
  return data;
}

async function waitFor(jobId) {
  while (true) {
    const res = await fetch(`${BASE}/jobs/${jobId}`, { headers });
    const job = await res.json();
    if (job.status === 'completed') return job;
    if (job.status === 'failed' || job.status === 'cancelled') throw new Error(job.error_message || job.status);
    await new Promise((r) => setTimeout(r, 5000));
  }
}

// 1) Image — the cheapest way to prove the integration
const image = await submit('/generate/image', {
  model: 'nano-banana',
  prompt: 'A cinematic product shot of a smartwatch on a marble table',
});
console.log('image:', (await waitFor(image.id)).result_url);

// 2) First video (30 credits)
const video = await submit('/generate/video', {
  model: 'seedance-v1-pro',
  prompt: 'A golden retriever puppy chasing soap bubbles in a sunlit garden, slow motion',
  resolution: '480p',
  duration: '5',
  aspect_ratio: '9:16',
});
const done = await waitFor(video.id);
console.log('video:', done.result_url, '· credits:', done.credits_charged);

Python

python
import os, time, requests

BASE = 'https://api.aiveed.io/v1'
HEADERS = {'X-API-Key': os.environ['AIVEED_API_KEY']}

def submit(path, body):
    r = requests.post(f'{BASE}{path}', headers=HEADERS, json=body)
    data = r.json()
    if not r.ok:
        raise RuntimeError(f"{data['code']}: {data['message']}")
    return data

def wait_for(job_id):
    while True:
        job = requests.get(f'{BASE}/jobs/{job_id}', headers=HEADERS).json()
        if job['status'] == 'completed':
            return job
        if job['status'] in ('failed', 'cancelled'):
            raise RuntimeError(job.get('error_message') or job['status'])
        time.sleep(5)

# 1) Image — the cheapest way to prove the integration
image = submit('/generate/image', {
    'model': 'nano-banana',
    'prompt': 'A cinematic product shot of a smartwatch on a marble table',
})
print('image:', wait_for(image['id'])['result_url'])

# 2) First video (30 credits)
video = submit('/generate/video', {
    'model': 'seedance-v1-pro',
    'prompt': 'A golden retriever puppy chasing soap bubbles in a sunlit garden, slow motion',
    'resolution': '480p',
    'duration': '5',
    'aspect_ratio': '9:16',
})
done = wait_for(video['id'])
print('video:', done['result_url'], '· credits:', done['credits_charged'])

Next steps