Back to Podcast Automation API

API documentation

Podcast Automation API

Submit one podcast job, store its podcast_id, then poll the returned status_url. Only accepted creation requests use the plan quota; authenticated status polling is unmetered. Completed jobs include the permanent MP3, cover, speaker portraits, public page, chapters, and both Smart JavaScript and iframe embed code.

Current planFree1 requests per month

Quota

Free usage

Used0
Remaining1
Limit1
Resets at 2026-09-30 23:59:59.

Authentication

Bearer token

Authorization: Bearer {serviceTokenHere}

For compatibility with simple image tags and legacy clients, ?token=... and the X-API-Token header are also accepted.

Quota: Quota counts podcast creation jobs, not status checks. Free includes 1 creation per month, Plus 10, and Pro 500.

POST

Create podcast

https://ai.mihajlo.mk/api/podcast-automation-api/v1/create-podcast

Queue a complete AI Podcast Maker episode. Returns immediately with HTTP 202, podcast_id, status_url, and the recommended polling interval.

ParameterTypeRequiredDescription
source_typestringYesChoose whether source_input is a topic, pasted text, or public webpage URL.
source_inputstringYesTopic up to 600 characters, source text up to 80,000 characters, or a public HTTP/HTTPS URL up to 1,000 characters.
languagestringNoPodcast language and local voice catalog.
duration_minutesintegerNoApproximate episode duration in minutes.
formatstringNoSolo host or conversational Host + Guest episode.
conversation_stylestringNoConversation structure used for Host + Guest episodes.
general_stylestringNoOverall editorial tone.
additional_instructionsstringNoOptional editorial direction, audience, focus, examples, or points to avoid.
host_voicestringNoOptional Podcast Maker local voice profile ID. The language default is used when omitted.
guest_voicestringNoOptional different local voice profile ID for Host + Guest episodes.
host_character_modestringNoGenerate a new fictional host or reuse a character ID from the user's Podcast Maker library.
host_character_idstringNoRequired only when host_character_mode is reuse.
host_namestringNoOptional fictional host name; leave blank for automatic creation.
host_descriptionstringNoOptional personality and speaking-style direction for a new host.
host_visual_descriptionstringNoOptional photographic appearance and studio direction for the host portrait.
guest_character_modestringNoGenerate a new fictional guest or reuse a character ID from the user's Podcast Maker library.
guest_character_idstringNoRequired only when guest_character_mode is reuse.
guest_namestringNoOptional fictional guest name; leave blank for automatic creation.
guest_descriptionstringNoOptional expertise, personality, and speaking-style direction for a new guest.
guest_visual_descriptionstringNoOptional photographic appearance and studio direction for the guest portrait.

cURL example

curl --request POST \
  --header "Authorization: Bearer {serviceTokenHere}" \
  --header "Content-Type: application/json" \
  --data '{"source_type":"url","source_input":"https://example.com/blog/local-ai-for-publishers","language":"English","duration_minutes":5,"format":"host_guest","conversation_style":"interview","general_style":"professional","additional_instructions":"Explain the article naturally instead of reading it word-for-word. End with practical next steps.","host_name":"Maya Stone","host_description":"Curious publishing technology host who asks concise questions.","guest_name":"Noah Reed","guest_description":"Practical automation consultant with a calm explanatory style."}' \
  "https://ai.mihajlo.mk/api/podcast-automation-api/v1/create-podcast"

Example response

{
    "ok": true,
    "accepted": true,
    "podcast_id": "c3a1e9b2-4d77-4fd1-9d3a-77be128fb842",
    "status": "queued",
    "stage": "queued",
    "stage_detail": "Request saved. Waiting for the podcast producer.",
    "progress": 3,
    "status_url": "https://ai.mihajlo.mk/api/podcast-automation-api/v1/status?podcast_id=c3a1e9b2-4d77-4fd1-9d3a-77be128fb842",
    "poll_after_seconds": 4,
    "message": "Podcast production queued."
}

Live tester

Login to run live requests. All endpoint documentation remains public.

Login to test
GET

Get production status Unmetered

https://ai.mihajlo.mk/api/podcast-automation-api/v1/status

Read ownership-protected persisted progress. Polling is authenticated but does not consume creation quota. When ready is true, result contains every permanent publishing and embed asset.

ParameterTypeRequiredDescription
podcast_idstringYesPodcast UUID returned by the create endpoint.

cURL example

curl --request GET \
  --header "Authorization: Bearer {serviceTokenHere}" \
  "https://ai.mihajlo.mk/api/podcast-automation-api/v1/status?podcast_id=c3a1e9b2-4d77-4fd1-9d3a-77be128fb842"

Example response

{
    "ok": true,
    "podcast_id": "c3a1e9b2-4d77-4fd1-9d3a-77be128fb842",
    "status": "completed",
    "stage": "published",
    "stage_detail": "Podcast published.",
    "progress": 100,
    "ready": true,
    "poll_after_seconds": null,
    "result": {
        "public_id": "Wj8mFb2VpRv4zkZ7qgS2vYwA",
        "title": "Local AI for Independent Publishers",
        "duration_ms": 307420,
        "duration_label": "5:07",
        "public_page_url": "https://ai.mihajlo.mk/podcast/Wj8mFb2VpRv4zkZ7qgS2vYwA",
        "audio_url": "https://ai.mihajlo.mk/podcast/assets/Wj8mFb2VpRv4zkZ7qgS2vYwA/audio",
        "cover_url": "https://ai.mihajlo.mk/podcast/assets/Wj8mFb2VpRv4zkZ7qgS2vYwA/cover",
        "embed": {
            "recommended": "smart_javascript",
            "url": "https://ai.mihajlo.mk/podcast/embed/Wj8mFb2VpRv4zkZ7qgS2vYwA?style=standard&theme=auto",
            "code": "<div data-ai-podcast=\"Wj8mFb2VpRv4zkZ7qgS2vYwA\" data-style=\"standard\" data-theme=\"auto\"></div>\n<script async src=\"https://ai.mihajlo.mk/podcast/embed.js\"></script>"
        }
    }
}

Errors

Standard error envelope

{
  "ok": false,
  "error": "invalid_request",
  "message": "Human-readable explanation"
}

Common statuses: 401 invalid token, 422 invalid parameters, 429 quota used, and 502 upstream or capture failure.