Huebsch Docs
API Reference

Intake Production API

Full control over audio structure. This is the canonical format that all other schemas transform into.

Endpoint

POST /api/intake/production/{accessToken}

Quick Test

curl -X POST https://huebsch.schoenreden.com/api/intake/production/YOUR_TOKEN \
  -H "Content-Type: application/json" \
  -d '{"type":"doc","content":[{"type":"article","attrs":{"title":"Test","slug":"/test","voiceName":"Hannah","proofreadPromptName":"Default"},"content":[{"type":"paragraph","attrs":{"voiceName":"Hannah","proofreadPromptName":"Default"},"content":[{"type":"text","text":"Hello world."}]}]}]}'

Request Body

{
  "type": "doc",
  "content": [
    {
      "type": "article",
      "attrs": {
        "title": "Article Title",
        "slug": "/unique-slug",
        "voiceName": "Voice Name",
        "proofreadPromptName": "Prompt Name",
        "locale": "de-CH",
        "cover": "https://example.com/image.jpg",
        "description": "Short description",
        "webhook": "https://callback.url",
        "source": "https://original.article.url"
      },
      "content": [
        // Content nodes...
      ]
    }
  ]
}

Article Attributes

Article-level attributes apply to the article as a whole (e.g., title, slug, cover). Voice and proofreading settings must be specified on each content node individually.

FieldTypeRequiredDescription
titlestringYesArticle title
slugstringYesIdentifier (2-256 chars), must start with /, alphanumeric + hyphens + slashes. Reusing a slug creates a new production that replaces the existing track.
voiceNamestringNoVoice name (max 128 chars). Not used by the production pipeline directly — set voice on each paragraph instead. Get available voices from Voices API.
proofreadPromptNamestringNoProofreading prompt name (max 128 chars). Not used by the production pipeline directly — set on each paragraph instead. Configured by Huebsch during onboarding.
localestringNoLanguage locale (e.g., de-CH, en-UK)
coverurlNoCover image URL
descriptionstringNoShort description (max 256 chars)
webhookurlNoCallback URL for completion notification
sourceurlNoOriginal article URL
shownotesstringNoPodcast show notes / extended description

Shownotes support basic HTML (<p>, <a>, <br>). Apple Podcasts truncates descriptions beyond 4000 characters.

Content Node Types

Paragraph

Text content to be synthesized as speech.

{
  "type": "paragraph",
  "attrs": {
    "voiceName": "Voice Name",
    "proofreadPromptName": "Prompt Name",
    "locale": "de-CH"
  },
  "content": [
    { "type": "text", "text": "The text to speak..." }
  ]
}
FieldTypeRequiredDescription
voiceNamestringYesVoice for this paragraph
proofreadPromptNamestringYesProofreading prompt
localestringNoOverride article locale

Pause

Insert a pause in the audio.

{
  "type": "pause",
  "attrs": {
    "pause": 1.5
  }
}
FieldTypeRequiredDescription
pausenumberYesDuration in seconds (0-10, up to 3 decimal places)

Sound

Insert a pre-configured sound by name. Contact your Huebsch contact for available sounds.

{
  "type": "sound",
  "attrs": {
    "soundName": "Jingle Intro"
  }
}
FieldTypeRequiredDescription
soundNamestringYesSound identifier (max 128 chars)

Sound External

Insert audio from an external URL.

{
  "type": "soundExternal",
  "attrs": {
    "asset": "https://example.com/audio.mp3",
    "name": "Optional name",
    "crossfade.leadin": 0.5,
    "crossfade.leadout": 0.5
  }
}
FieldTypeRequiredDescription
asseturlYesAudio file URL
namestringNoDisplay name (max 128 chars)
crossfade.leadinnumberNoCrossfade in seconds
crossfade.leadoutnumberNoCrossfade in seconds

Marker

Insert a chapter marker. Markers become chapters in the finished track — visible in the Track API response and the web player.

{
  "type": "marker",
  "attrs": {
    "label": "Chapter Title"
  }
}
FieldTypeRequiredDescription
labelstringYesChapter title (1-256 chars)

Supported Locales

de-DE, de-CH

Reach out to your Huebsch contact for other locales.

Minimal Example

{
  "type": "doc",
  "content": [{
    "type": "article",
    "attrs": {
      "title": "Hello World",
      "slug": "/hello",
      "voiceName": "Hannah",
      "proofreadPromptName": "Default"
    },
    "content": [{
      "type": "paragraph",
      "attrs": {
        "voiceName": "Hannah",
        "proofreadPromptName": "Default"
      },
      "content": [{ "type": "text", "text": "Hello, world." }]
    }]
  }]
}

Full Example

{
  "type": "doc",
  "content": [
    {
      "type": "article",
      "attrs": {
        "title": "My First Production",
        "slug": "/2024/01/my-first-production",
        "voiceName": "Hannah",
        "proofreadPromptName": "Default",
        "locale": "de-CH"
      },
      "content": [
        {
          "type": "sound",
          "attrs": { "soundName": "Intro Jingle" }
        },
        {
          "type": "marker",
          "attrs": { "label": "Introduction" }
        },
        {
          "type": "paragraph",
          "attrs": {
            "voiceName": "Hannah",
            "proofreadPromptName": "Default",
            "locale": "de-CH"
          },
          "content": [
            { "type": "text", "text": "Welcome to my first audio production." }
          ]
        },
        {
          "type": "pause",
          "attrs": { "pause": 1.0 }
        },
        {
          "type": "paragraph",
          "attrs": {
            "voiceName": "Hannah",
            "proofreadPromptName": "Default",
            "locale": "de-CH"
          },
          "content": [
            { "type": "text", "text": "This demonstrates the production schema." }
          ]
        },
        {
          "type": "sound",
          "attrs": { "soundName": "Outro Jingle" }
        }
      ]
    }
  ]
}

Validation

  • Article content must contain at least one paragraph, sound, or soundExternal node
  • Maximum 512 content nodes per article
  • Text content maximum 5,000 characters per paragraph
  • Slug must match pattern: /[a-zA-Z0-9-/]+

Response

The endpoint validates the request and returns immediately. Audio production happens asynchronously.

Success

{ "ok": true, "val": "accepted" }

To receive notification when production completes, include a webhook URL in the article attributes. See Webhooks for payload format.

Error

{
  "ok": false,
  "val": {
    "error": "Schema validation failed",
    "code": "422.2",
    "issues": [{ "code": "invalid_type", "expected": "string", "path": ["title"], "message": "Invalid input: expected string, received undefined" }]
  }
}

For error codes, see Error Codes.

Processing

After validation, processing occurs in two phases:

  1. Content transformation - Your request is transformed into the internal production format
  2. Audio generation - Text is synthesized, sounds are fetched, and the final audio is assembled

For the production schema, both phases happen immediately after your request. Errors in your content that only show during audio generation (like an unknown voice) arrive via webhook. See Webhook Callback.

On this page