NexzLabs Developer API

Documentation is public. API requests require a Bearer API key. Eligible plans: Monthly Creator and Pro; Lifetime Lite and Starter.

Download full OpenAPI specification

GET /voices

List current voices (100 per page)

{
  "summary": "List current voices (100 per page)",
  "responses": {
    "200": {
      "description": "Success"
    },
    "400": {
      "description": "Invalid request"
    },
    "401": {
      "description": "Invalid API key"
    },
    "403": {
      "description": "Plan, credits or account restricted"
    },
    "429": {
      "description": "Rate or capacity limit; respect Retry-After"
    },
    "503": {
      "description": "Temporarily unavailable"
    }
  },
  "parameters": [
    {
      "name": "page",
      "in": "query",
      "schema": {
        "type": "integer",
        "minimum": 1,
        "default": 1
      }
    },
    {
      "name": "search",
      "in": "query",
      "schema": {
        "type": "string"
      }
    }
  ]
}

GET /usage

Read shared plan credits limit and usage

{
  "summary": "Read shared plan credits limit and usage",
  "responses": {
    "200": {
      "description": "Success"
    },
    "400": {
      "description": "Invalid request"
    },
    "401": {
      "description": "Invalid API key"
    },
    "403": {
      "description": "Plan, credits or account restricted"
    },
    "429": {
      "description": "Rate or capacity limit; respect Retry-After"
    },
    "503": {
      "description": "Temporarily unavailable"
    }
  }
}

POST /generations

Create an asynchronous generation

{
  "summary": "Create an asynchronous generation",
  "responses": {
    "200": {
      "description": "Existing idempotent job: id, status"
    },
    "202": {
      "description": "Accepted: id, status pending, progress 0"
    },
    "400": {
      "description": "Invalid request"
    },
    "401": {
      "description": "Invalid API key"
    },
    "403": {
      "description": "Plan, credits or account restricted"
    },
    "409": {
      "description": "Idempotency key conflict"
    },
    "429": {
      "description": "Rate or capacity limit; respect Retry-After"
    },
    "503": {
      "description": "Temporarily unavailable"
    }
  },
  "parameters": [
    {
      "name": "Idempotency-Key",
      "in": "header",
      "required": true,
      "schema": {
        "type": "string",
        "format": "uuid"
      },
      "description": "New UUID per new job; same UUID and body on transport retries."
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "required": [
            "text",
            "voice_id"
          ],
          "properties": {
            "text": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100000
            },
            "voice_id": {
              "type": "string",
              "description": "Opaque id returned by /voices"
            },
            "speed": {
              "type": "number",
              "minimum": 0.25,
              "maximum": 4,
              "default": 1
            },
            "mode": {
              "type": "string",
              "enum": [
                "single",
                "podcast"
              ],
              "default": "single"
            },
            "speakers": {
              "type": "array",
              "minItems": 2,
              "maxItems": 20,
              "items": {
                "type": "object",
                "required": [
                  "id",
                  "name",
                  "voice_id"
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "pattern": "^speaker_[1-9][0-9]{0,3}
quot; }, "name": { "type": "string", "maxLength": 80 }, "voice_id": { "type": "string" } } } } } } } } } }

GET /generations/{id}

Poll your job; completed response includes audio_url, expires_at, audio_duration_seconds and credits_used

{
  "summary": "Poll your job; completed response includes audio_url, expires_at, audio_duration_seconds and credits_used",
  "responses": {
    "200": {
      "description": "id, status (pending/completed/failed), progress, audio_url (nullable), audio_duration_seconds, expires_at, credits_used, optional sanitized error"
    },
    "400": {
      "description": "Invalid request"
    },
    "401": {
      "description": "Invalid API key"
    },
    "403": {
      "description": "Plan, credits or account restricted"
    },
    "404": {
      "description": "Job not found"
    },
    "429": {
      "description": "Rate or capacity limit; respect Retry-After"
    },
    "503": {
      "description": "Temporarily unavailable"
    }
  },
  "parameters": [
    {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string",
        "format": "uuid"
      }
    }
  ]
}

POST /generations/{id}/cancel

Cancel your pending job and release reserved credits

{
  "summary": "Cancel your pending job and release reserved credits",
  "responses": {
    "200": {
      "description": "cancelled: true"
    },
    "400": {
      "description": "Invalid request"
    },
    "401": {
      "description": "Invalid API key"
    },
    "403": {
      "description": "Plan, credits or account restricted"
    },
    "404": {
      "description": "Job not found"
    },
    "409": {
      "description": "Already finalizing or terminal"
    },
    "429": {
      "description": "Rate or capacity limit; respect Retry-After"
    },
    "503": {
      "description": "Temporarily unavailable"
    }
  },
  "parameters": [
    {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string",
        "format": "uuid"
      }
    }
  ]
}