Developer Reference

API Documentation

Integrate voice identity protection into your platform with our REST API. Base URL: https://api.voiceseal.io/api/v1

Authentication

All API requests require a JWT Bearer token obtained via login.

POST /auth/login
Content-Type: application/json

{
  "email": "[email protected]",
  "password": "your_password"
}

// Response
{
  "access_token": "eyJ...",
  "token_type": "bearer",
  "user_id": "uuid"
}

Include the token in all subsequent requests: Authorization: Bearer <token>

Voices

Enroll and manage voice prints.

POST /voices/enroll

Enroll a new voice. Requires multipart/form-data with audio file. Biometric consent must be granted first.

GET /voices

List all enrolled voices for the authenticated user.

DELETE /voices/{voice_id}

Remove an enrolled voice and all associated data.

Detection

Scan audio for unauthorized voice clones.

POST /detection/scan

Submit audio for detection. Returns match confidence, voice_id if matched, and watermark data.

// Response
{
  "match": true,
  "voice_id": "uuid",
  "confidence": 0.97,
  "watermark_detected": true,
  "latency_ms": 243
}

Pre-Synthesis Check

The VoiceSeal pre-synthesis consent gate. Called by TTS platforms before generating audio to verify biometric identity, consent status, and license scope. This is VoiceSeal's patent-pending flagship capability. VoiceSeal provides an independent, synthesis-agnostic permission and provenance layer that operates across voice platforms rather than remaining limited to a single generator's ecosystem.

POST /api/v1/protect/pre-synthesis-check

Verify consent and license scope before synthesizing audio from a registered voice identity. Returns a cryptographic approval token on success, or authorization_denied on failure.

🔓 Public endpoint — no auth required for evaluation. Authenticated requests (Bearer or X-API-Key) receive higher rate limits and full audit logging.

This endpoint is intentionally public to allow TTS platforms to evaluate VoiceSeal's consent gate before committing to an API integration. Authenticated Developer-tier requests receive full audit logging and higher rate limits.

Request Body

{
  "voice_id": "string (UUID) — the enrolled voice identity to check",
  "platform_name": "string — identifying name of the calling platform",
  "intended_use": "string — commercial | audiobook | podcast | music | gaming",
  "license_token": "string (optional) — existing license token if already held"
}

Response — Approved (200)

{
  "status": "approved",
  "approval_token": "string — time-bound cryptographic token; embed in your C2PA manifest",
  "voice_id": "string",
  "consented": true,
  "licensed": true,
  "expires_at": "ISO 8601 timestamp",
  "check_id": "string — audit trail reference"
}

Response — Blocked (200)

{
  "status": "blocked",
  "reason": "no_consent | no_license | voice_not_found | scope_mismatch",
  "voice_id": "string",
  "license_url": "https://voiceseal.io/licensing?voice_id={voice_id}",
  "check_id": "string",
  "authorization_denied": true
}

Error Codes

403Platform not authorized
404Voice ID not found in registry
422Invalid request body
429Rate limit exceeded — 100 req/hour unauthenticated, 1,000 req/minute authenticated

Related Webhook Event

pre_synthesis.blocked — fired on every hard block; includes voice_id, platform_name, check_id, and the authorization_denied flag.

EU AI Act Article 50: When synthesis is approved, embed the returned approval_token in your C2PA provenance manifest. This links the generated audio to a verified consent record and supports Article 50 transparency implementation beyond simple AI-generation disclosure.
GET /api/v1/protect/demo/pre-synthesis-check

🔓 Public, no auth. A self-describing demo of the pre-synthesis gate for platform evaluators — returns a live example request, the full response schema, and every possible action outcome, so you can see exactly what an integration looks like without enrolling a voice or authenticating first.

Example Response (abridged)

{
  "demo": true,
  "endpoint": "POST /api/v1/protect/pre-synthesis-check",
  "response_schema": {
    "protected": "bool",
    "action": "authorized | authorization_denied | no_registry_record | allow_licensed",
    "authorization_denied": "bool",
    "platform_decision_required": "bool — true when no registry record exists",
    "license_url": "string | null",
    "check_id": "uuid — hash-chained audit-trail id"
  },
  "possible_responses": {
    "no_registry_record":   { "action": "no_registry_record", "platform_decision_required": true, "...": "..." },
    "protected_no_license": { "action": "blocked", "authorization_denied": true, "license_url": "...", "...": "..." },
    "protected_licensed":   { "action": "allow_licensed", "...": "..." }
  }
}

Try it live: GET https://api.voiceseal.io/api/v1/protect/demo/pre-synthesis-check

Webhooks

Receive real-time detection events to your endpoint.

// Detection event payload
{
  "event": "voice.detected",
  "voice_id": "uuid",
  "owner_id": "uuid",
  "platform": "elevenlabs",
  "confidence": 0.94,
  "timestamp": "2026-03-10T14:32:00Z",
  "audio_url": "https://...",
  "action_required": true
}

Register webhooks via POST /webhooks/register with your endpoint URL and secret.

View Interactive Docs (Swagger)