Projects
Create, list, fetch, and delete projects.
/api/v1/projectsCreate Project
Create a project and start ingest. Returns 202 Accepted immediately; the project processes asynchronously via the Inngest pipeline.
Cloud import (source_type cloud) is Pro only. Requires Google Drive, Dropbox, or OneDrive connected under Settings → Integrations. SparkVox downloads or exports the file server-side and starts ingest in one request. Supported via API: MP3 (up to 500 MB) and SRT on google-drive, dropbox, and onedrive; native Google Docs on google-drive only (mime_type application/vnd.google-apps.document, exported to plain text). Plain text transcripts use source_type transcript. The web app Import from cloud tab also supports TXT on all providers.
Notetaker import (source_type notetaker) is Pro, Accelerate, or Scale only. Requires Fireflies, Fathom, Granola, Google Meet, or Zoom connected under Settings → Integrations. SparkVox fetches the transcript server-side and starts ingest in one request. List meetings with GET/api/v1/notetaker-meetings.
Request body
URL source
{
"title": "My Podcast Episode",
"source_type": "url",
"source_url": "https://youtube.com/watch?v=...",
"transcript": null,
"source_material": "Podcast / Interview",
"perspective": "host",
"platforms": ["linkedin"],
"duration_seconds": 3600
}Cloud source (Google Drive, Dropbox, or OneDrive)
{
"title": "Drive episode",
"source_type": "cloud",
"source_material": "Podcast / Interview",
"perspective": "host",
"platforms": ["linkedin"],
"duration_seconds": 3600,
"provider": "google-drive",
"file_id": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
"file_name": "episode.mp3",
"mime_type": "audio/mpeg",
"size": 8000000
}file_id is the provider file identifier (from Google Drive, Dropbox, or OneDrive). size is optional but recommended for MP3 billing checks.
Google Doc on Google Drive
{
"title": "Workshop notes doc",
"source_type": "cloud",
"source_material": "Knowledge & Advisory",
"perspective": "trainer",
"platforms": ["linkedin"],
"duration_seconds": 1800,
"provider": "google-drive",
"file_id": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
"file_name": "Q3 workshop notes",
"mime_type": "application/vnd.google-apps.document"
}Google Docs are google-drive only. SparkVox exports the Doc to text and skips audio transcription. duration_seconds is required for billing - estimate from document length (for example word count at a typical speaking pace) the same way you would for a pasted transcript project.
Notetaker source (Fireflies, Fathom, Granola, Google Meet, Zoom)
{
"title": "Client discovery call",
"source_type": "notetaker",
"source_material": "Knowledge & Advisory",
"perspective": "advisor",
"platforms": ["linkedin"],
"duration_seconds": 2700,
"provider": "granola",
"meeting_id": "not_1d3tmYTlCICgjy"
}meeting_id comes from GET/api/v1/notetaker-meetings. Connect the notetaker in the app before using the API.
Fields
| Field | Required | Notes |
|---|---|---|
| title | Yes | Display name for the project |
| source_type | Yes | url, transcript, cloud, or notetaker (device upload not supported in v1) |
| source_url | For url | Public audio/video URL (YouTube supported) |
| transcript | For transcript | Full transcript text; skips transcription |
| provider | For cloud or notetaker | Cloud: google-drive, dropbox, or onedrive. Notetaker: fireflies, fathom, granola, google-meet, or zoom |
| file_id | For cloud | Provider file ID |
| meeting_id | For notetaker | Meeting or note id from GET/api/v1/notetaker-meetings |
| file_name | For cloud | Original filename (used for type detection) |
| mime_type | For cloud | audio/mpeg (MP3), application/x-subrip or text/srt (SRT), application/vnd.google-apps.document (Google Docs on google-drive only) |
| size | For cloud | File size in bytes (optional; recommended for MP3) |
| source_material | No | Podcast / Interview or Knowledge & Advisory. Omitted → API key owner's onboarding default, then Podcast / Interview |
| perspective | No | Perspective slug (see below). Omitted → owner's Settings → Project Presets defaults from profiles.onboarding |
| platforms | No | Array - only linkedin is live today; others are stripped |
| duration_seconds | Yes | Content length in seconds - used for billing |
Source material and perspective (slugs)
Projects store a source lens on each row: source_material (Podcast / Interview or Knowledge & Advisory) and professional_perspective (a slug). POST/api/v1/projects accepts slugs only in perspective. Legacy pipeline ids thought_leader, expert_guest, and show_brand return 400.
| Source material | Valid perspective slugs | Ingest behavior |
|---|---|---|
| Podcast / Interview | host, guest, full_conversation | host / guest → diarized + speaker pick; full_conversation → full transcript |
| Knowledge & Advisory | expert, advisor, trainer | expert / advisor → diarized + speaker pick; trainer → full transcript |
Slug must match source_material (e.g. trainer with Podcast / Interview returns 400). Multi-speaker recordings with host, guest, or advisor may pause at awaiting_speaker until the user selects their speaker in the app (API clients should poll GET/projects/:id).
Response 202
{ "project_id": "uuid", "status": "pending" }Error responses
- 400 - missing/invalid fields, invalid perspective, unsupported source_type
- 401 - invalid or missing API key
- 402 - insufficient processing time (error body may say Insufficient credits.)
- 429 - rate limit exceeded
/api/v1/projectsList Projects
List projects for the authenticated API key owner.
Query parameters
- limit - max results (default 50, max 100)
- offset - pagination offset (default 0)
Response 200
{
"projects": [
{
"id": "uuid",
"title": "My Episode",
"status": "ready",
"source_type": "url",
"platforms": ["linkedin"],
"created_at": "2026-05-01T10:00:00Z",
"processing_cost_cents": 5400,
"error_message": null
}
]
}Project statuses: pending → transcribing → (awaiting_speaker?) → extracting → generating → ready | failed. awaiting_speaker appears when diarization completes and the user must pick their speaker in the app before generation continues.
/api/v1/projects/:idGet Project
Fetch a single project by ID. Returns 404 if not found or not owned by the API key user.
Response 200
{
"project": {
"id": "uuid",
"title": "...",
"status": "ready",
"source_type": "url",
"platforms": ["linkedin"],
"duration_seconds": 3600,
"created_at": "...",
"processing_cost_cents": 5400,
"error_message": null
}
}/api/v1/projects/:idDelete Project
Permanently delete a project and all associated moments and posts. Raw audio in R2 is removed when present.
Response 200
{ "deleted": true }