# Novu > Voice audio for phone menus (IVR) and video voiceovers, bought per package with no account. An AI agent can take a whole order through Novu's MCP server: choose a voice with the customer, create the package, get it paid and hand over the audio. ## Connect - MCP endpoint: https://novu.isbry.com/mcp - Transport: Streamable HTTP, stateless, JSON responses. - Authentication: none. No account, no API key, no OAuth. To add it to Claude Code, run: ``` claude mcp add --transport http novu https://novu.isbry.com/mcp ``` To set up another client, see https://novu.isbry.com/agentes#conectar. ## How to buy novu turns text into professional voice audio and sells it per package, with no account: phone-menu (IVR) audio for a business's phone system, and voiceovers for videos. You write the text with the customer, in their language (Spanish is most common), and novu produces the audio. Human docs: https://novu.isbry.com/agentes. Every order has the same five steps: 1) Call list_voices and share preview_url links so the customer picks a voice by ear. 2) Agree the exact text with the customer. novu reads it verbatim, so write numbers, emails and web addresses the way they should be spoken. 3) Create the package and tell the customer its price_cop, in Colombian pesos. Keep package_id: it is the only key to the package, and anyone holding it can download the audio, so share it only with the customer. 4) Call the pay tool with the customer's email. If they have a promo code, pass it and the package unlocks at once. Otherwise give them checkout_url, an ePayco payment page that lasts 24 hours; call the pay tool again if they lose it. 5) Call the get tool until status is ready (each call waits up to 20 seconds while generating), then give them download_url. It works for 7 days, and the get tool returns a fresh one on every call. novu produces the audio once paid even if this conversation ends, and emails the customer the download link. IVR packages use create_ivr_package, pay_for_ivr_package and get_ivr_package. Write a greeting first, then a menu, one option per menu choice, plus after-hours and on-hold messages if they want them. Each message is one audio file of at most 700 characters. Price by message count: 1 message: individual, 54,000 COP; 2-3 messages: emprendedor, 132,000 COP; 4-5 messages: recepcion, 190,000 COP; 6-10 messages: pyme, 260,000 COP; 11-25 messages: empresa, 550,000 COP; 26-50 messages: call-center, 900,000 COP. Ask which phone system will play the audio and set audio_format: MP3 by default, pcm_16000 (WAV 16 kHz), or ulaw_8000 (common on Asterisk). Audio is usually ready 1 to 5 minutes after payment. Video voiceovers use create_video_package, pay_for_video_package and get_video_package. One voice reads the whole script, delivered as MP3 and 48 kHz WAV. The script is at most 4,500 characters; put how it should sound in intent (at most 600 characters), never in the script. Price by script length: up to 1,000 characters: video-corto, 60,000 COP; 1,001-2,500 characters: video-medio, 120,000 COP; 2,501-4,500 characters: video-largo, 200,000 COP. There is no sample of the script before payment. Recording can take several minutes when other orders are ahead. A failed call returns an error whose text starts with a code, such as rate_limited, and says what to do next. If a paid package fails, ask the customer to write to hola@novu.io with the package_id. ## Tools - `create_ivr_package`: Create an IVR (phone menu) audio package from messages you wrote with the customer. - `create_video_package`: Create a video voiceover package: one novu voice reads the customer's whole script, for a video, ad, course or presentation, delivered as an MP3 and a 48 kHz WAV. - `get_ivr_package`: Check a package's status and get its download link. - `get_video_package`: Check a video package's status and get its downloads. - `list_voices`: List the voices novu sells, for IVR packages and video voiceovers alike. - `pay_for_ivr_package`: Unlock a draft package for audio generation. - `pay_for_video_package`: Unlock a draft video package for recording. ## Docs - [Novu for AI agents](https://novu.isbry.com/agentes): human docs, in Spanish. ## Optional - [Full tool reference](https://novu.isbry.com/llms-full.txt): this file plus each tool's full description, annotations, and input and output JSON Schema. - [MCP server card](https://novu.isbry.com/mcp/server-card): the server's name, version and endpoint. It follows the draft MCP Server Cards extension (SEP-2127) and may change. - [AI catalog](https://novu.isbry.com/.well-known/ai-catalog.json): points to the server card. It follows the same draft and may change. ## Tool reference ### create_ivr_package Title: Create IVR package Create an IVR (phone menu) audio package from messages you wrote with the customer. Nothing is charged yet. novu sets the tier from the message count: 1 message: individual, 54,000 COP; 2-3 messages: emprendedor, 132,000 COP; 4-5 messages: recepcion, 190,000 COP; 6-10 messages: pyme, 260,000 COP; 11-25 messages: empresa, 550,000 COP; 26-50 messages: call-center, 900,000 COP. Each message becomes one audio file, read exactly as written. Returns package_id: keep it, every later call needs it. Messages cannot be edited afterwards; to change them, create a new package (unpaid packages cost nothing). Annotations: ```json { "destructiveHint": false, "idempotentHint": false, "openWorldHint": false, "readOnlyHint": false } ``` Input schema: ```json { "additionalProperties": false, "properties": { "audio_format": { "default": "mp3_44100_128", "description": "File format the phone system needs. mp3_44100_128 (MP3, default), pcm_16000 (WAV 16 kHz) or ulaw_8000 (mu-law 8 kHz, common on Asterisk and other PBXs).", "enum": [ "mp3_44100_128", "pcm_16000", "ulaw_8000" ], "type": "string" }, "business_name": { "description": "The customer's business name. Names the ZIP and transcript; it is only spoken if a message says it.", "maxLength": 100, "minLength": 1, "type": "string" }, "messages": { "description": "The phone-menu messages in playback order. Start with a greeting. The count sets the price.", "items": { "additionalProperties": false, "properties": { "text": { "description": "Exactly what the voice says. Write numbers, emails and web addresses the way they should be spoken.", "maxLength": 700, "minLength": 1, "type": "string" }, "type": { "description": "greeting (welcome), menu (lists the options), option (plays after the caller picks one), after-hours (outside opening hours) or on-hold (while the caller waits).", "enum": [ "greeting", "menu", "option", "after-hours", "on-hold" ], "type": "string" } }, "required": [ "type", "text" ], "type": "object" }, "maxItems": 50, "minItems": 1, "type": "array" }, "voice_id": { "description": "A voice_id from list_voices.", "type": "string" } }, "required": [ "business_name", "voice_id", "messages" ], "type": "object" } ``` Output schema: ```json { "additionalProperties": false, "properties": { "checkout_url": { "description": "ePayco payment link for the customer to open and pay. Only returned by pay_for_ivr_package.", "type": "string" }, "download_expires_at": { "description": "RFC 3339 time after which download_url stops working. Call get_ivr_package again for a new one.", "type": "string" }, "download_url": { "description": "ZIP with every audio file, a transcript and a README. Present only when status is ready; freshly signed on every call.", "type": "string" }, "message_count": { "description": "Number of audio messages in this package.", "type": "integer" }, "next_step": { "description": "What to do now, in plain English.", "type": "string" }, "package_id": { "description": "The key to this package. Store it and pass it to every later call. Anyone holding it can see the package and download its audio.", "type": "string" }, "plan": { "description": "Package tier, chosen by novu from the message count.", "type": "string" }, "price_cop": { "description": "Price of this package in Colombian pesos (COP), a whole number.", "type": "integer" }, "status": { "description": "draft, awaiting_payment, generating, ready or failed.", "type": "string" } }, "required": [ "package_id", "status", "plan", "message_count", "price_cop", "next_step" ], "type": "object" } ``` ### create_video_package Title: Create video voiceover package Create a video voiceover package: one novu voice reads the customer's whole script, for a video, ad, course or presentation, delivered as an MP3 and a 48 kHz WAV. Nothing is charged yet. novu sets the package from the script's length: up to 1,000 characters: video-corto, 60,000 COP; 1,001-2,500 characters: video-medio, 120,000 COP; 2,501-4,500 characters: video-largo, 200,000 COP. The script is read exactly as written; intent says how it should sound. Returns package_id: keep it, every later call needs it. The script cannot be edited afterwards; to change it, create a new package (unpaid packages cost nothing). There is no sample of the script before payment: the customer picks a voice from the list_voices preview_url samples. Annotations: ```json { "destructiveHint": false, "idempotentHint": false, "openWorldHint": false, "readOnlyHint": false } ``` Input schema: ```json { "additionalProperties": false, "properties": { "intent": { "description": "Optional, at most 600 characters: how the read should sound, in plain words, for example calm at the start and excited at the end, or warm and close. It guides the performance and is never read aloud.", "type": "string" }, "script": { "description": "Exactly what the voice reads, in the customer's language, at most 4,500 characters counted after line breaks are normalized and surrounding whitespace is trimmed. The length sets the package and the price. Write numbers, emails and web addresses the way they should be spoken.", "minLength": 1, "type": "string" }, "voice_id": { "description": "A voice_id from list_voices.", "type": "string" } }, "required": [ "voice_id", "script" ], "type": "object" } ``` Output schema: ```json { "additionalProperties": false, "properties": { "audio_url": { "description": "The MP3 alone, to listen to right away. Present only when status is ready; freshly signed on every call.", "type": "string" }, "characters": { "description": "The script's length as novu counts it for the price.", "type": "integer" }, "checkout_url": { "description": "ePayco payment link for the customer to open and pay. Only returned by pay_for_video_package.", "type": "string" }, "download_expires_at": { "description": "RFC 3339 time after which download_url and audio_url stop working. Call get_video_package again for new ones.", "type": "string" }, "download_url": { "description": "ZIP with the voiceover as MP3 and as 48 kHz WAV, the script and a README. Present only when status is ready; freshly signed on every call.", "type": "string" }, "duration_seconds": { "description": "Length of the voiceover in seconds. Present only when status is ready.", "type": "number" }, "max_characters": { "description": "The longest script this package covers.", "type": "integer" }, "next_step": { "description": "What to do now, in plain English.", "type": "string" }, "package": { "description": "video-corto, video-medio or video-largo, chosen by novu from the script's length.", "type": "string" }, "package_id": { "description": "The key to this package. Store it and pass it to every later call. Anyone holding it can see the package and download its audio.", "type": "string" }, "price_cop": { "description": "Price of this package in Colombian pesos (COP), a whole number.", "type": "integer" }, "status": { "description": "draft, awaiting_payment, generating, ready or failed.", "type": "string" }, "title": { "description": "The script's first words. They name the delivered files.", "type": "string" } }, "required": [ "package_id", "status", "package", "title", "characters", "max_characters", "price_cop", "next_step" ], "type": "object" } ``` ### get_ivr_package Title: Get IVR package Check a package's status and get its download link. While status is generating it waits up to 20 seconds for a change, so call it in a loop without sleeping. While awaiting_payment, call it when the customer says they paid. When ready, download_url is a fresh link valid for 7 days; call again any time for a new one. Annotations: ```json { "destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true } ``` Input schema: ```json { "additionalProperties": false, "properties": { "package_id": { "description": "The package_id from create_ivr_package.", "type": "string" } }, "required": [ "package_id" ], "type": "object" } ``` Output schema: ```json { "additionalProperties": false, "properties": { "checkout_url": { "description": "ePayco payment link for the customer to open and pay. Only returned by pay_for_ivr_package.", "type": "string" }, "download_expires_at": { "description": "RFC 3339 time after which download_url stops working. Call get_ivr_package again for a new one.", "type": "string" }, "download_url": { "description": "ZIP with every audio file, a transcript and a README. Present only when status is ready; freshly signed on every call.", "type": "string" }, "message_count": { "description": "Number of audio messages in this package.", "type": "integer" }, "next_step": { "description": "What to do now, in plain English.", "type": "string" }, "package_id": { "description": "The key to this package. Store it and pass it to every later call. Anyone holding it can see the package and download its audio.", "type": "string" }, "plan": { "description": "Package tier, chosen by novu from the message count.", "type": "string" }, "price_cop": { "description": "Price of this package in Colombian pesos (COP), a whole number.", "type": "integer" }, "status": { "description": "draft, awaiting_payment, generating, ready or failed.", "type": "string" } }, "required": [ "package_id", "status", "plan", "message_count", "price_cop", "next_step" ], "type": "object" } ``` ### get_video_package Title: Get video voiceover package Check a video package's status and get its downloads. While status is generating it waits up to 20 seconds for a change, so call it in a loop without sleeping; recording can take several minutes when other orders are ahead. While awaiting_payment, call it when the customer says they paid. When ready, download_url (a ZIP with the MP3 and the 48 kHz WAV) and audio_url (the MP3 alone) are fresh links valid for 7 days; call again any time for new ones. Annotations: ```json { "destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true } ``` Input schema: ```json { "additionalProperties": false, "properties": { "package_id": { "description": "The package_id from create_video_package.", "type": "string" } }, "required": [ "package_id" ], "type": "object" } ``` Output schema: ```json { "additionalProperties": false, "properties": { "audio_url": { "description": "The MP3 alone, to listen to right away. Present only when status is ready; freshly signed on every call.", "type": "string" }, "characters": { "description": "The script's length as novu counts it for the price.", "type": "integer" }, "checkout_url": { "description": "ePayco payment link for the customer to open and pay. Only returned by pay_for_video_package.", "type": "string" }, "download_expires_at": { "description": "RFC 3339 time after which download_url and audio_url stop working. Call get_video_package again for new ones.", "type": "string" }, "download_url": { "description": "ZIP with the voiceover as MP3 and as 48 kHz WAV, the script and a README. Present only when status is ready; freshly signed on every call.", "type": "string" }, "duration_seconds": { "description": "Length of the voiceover in seconds. Present only when status is ready.", "type": "number" }, "max_characters": { "description": "The longest script this package covers.", "type": "integer" }, "next_step": { "description": "What to do now, in plain English.", "type": "string" }, "package": { "description": "video-corto, video-medio or video-largo, chosen by novu from the script's length.", "type": "string" }, "package_id": { "description": "The key to this package. Store it and pass it to every later call. Anyone holding it can see the package and download its audio.", "type": "string" }, "price_cop": { "description": "Price of this package in Colombian pesos (COP), a whole number.", "type": "integer" }, "status": { "description": "draft, awaiting_payment, generating, ready or failed.", "type": "string" }, "title": { "description": "The script's first words. They name the delivered files.", "type": "string" } }, "required": [ "package_id", "status", "package", "title", "characters", "max_characters", "price_cop", "next_step" ], "type": "object" } ``` ### list_voices Title: List voices List the voices novu sells, for IVR packages and video voiceovers alike. Each has a voice_id for create_ivr_package or create_video_package and a preview_url, an MP3 sample the customer can open before choosing. Free, no side effects. Annotations: ```json { "destructiveHint": false, "idempotentHint": true, "openWorldHint": false, "readOnlyHint": true } ``` Input schema: ```json { "additionalProperties": false, "type": "object" } ``` Output schema: ```json { "additionalProperties": false, "properties": { "voices": { "description": "Every voice on sale.", "items": { "additionalProperties": false, "properties": { "description": { "description": "Tone and style.", "type": "string" }, "gender": { "description": "F or M.", "type": "string" }, "name": { "description": "Display name.", "type": "string" }, "preview_url": { "description": "An MP3 sample of this voice. Share it so the customer can listen.", "type": "string" }, "voice_id": { "description": "Pass this to create_ivr_package or create_video_package.", "type": "string" } }, "required": [ "voice_id", "name", "preview_url" ], "type": "object" }, "type": "array" } }, "required": [ "voices" ], "type": "object" } ``` ### pay_for_ivr_package Title: Pay for IVR package Unlock a draft package for audio generation. Always pass the customer's email: novu emails them the download link when the audio is ready. With promo_code, the package unlocks at once and generation starts. Without it, you get checkout_url, an ePayco payment page: give it to the customer. Generation starts by itself once they pay, even if this conversation has ended. If the customer loses the link, call this again without promo_code: you get the same link while it is open, or a new one once it has expired (payment links last 24 hours). The email from the first call is kept. Annotations: ```json { "destructiveHint": false, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false } ``` Input schema: ```json { "additionalProperties": false, "properties": { "email": { "description": "The customer's email. novu sends the download link there when the audio is ready.", "type": "string" }, "package_id": { "description": "The package_id from create_ivr_package.", "type": "string" }, "promo_code": { "description": "A novu promo code the customer gave you. Omit it to get a card payment link instead.", "maxLength": 32, "type": "string" } }, "required": [ "package_id", "email" ], "type": "object" } ``` Output schema: ```json { "additionalProperties": false, "properties": { "checkout_url": { "description": "ePayco payment link for the customer to open and pay. Only returned by pay_for_ivr_package.", "type": "string" }, "download_expires_at": { "description": "RFC 3339 time after which download_url stops working. Call get_ivr_package again for a new one.", "type": "string" }, "download_url": { "description": "ZIP with every audio file, a transcript and a README. Present only when status is ready; freshly signed on every call.", "type": "string" }, "message_count": { "description": "Number of audio messages in this package.", "type": "integer" }, "next_step": { "description": "What to do now, in plain English.", "type": "string" }, "package_id": { "description": "The key to this package. Store it and pass it to every later call. Anyone holding it can see the package and download its audio.", "type": "string" }, "plan": { "description": "Package tier, chosen by novu from the message count.", "type": "string" }, "price_cop": { "description": "Price of this package in Colombian pesos (COP), a whole number.", "type": "integer" }, "status": { "description": "draft, awaiting_payment, generating, ready or failed.", "type": "string" } }, "required": [ "package_id", "status", "plan", "message_count", "price_cop", "next_step" ], "type": "object" } ``` ### pay_for_video_package Title: Pay for video voiceover package Unlock a draft video package for recording. Always pass the customer's email: novu emails them the download link when the voiceover is ready. With promo_code, the package unlocks at once and recording starts. A promo code for this package or a larger one pays for it, but a larger package's code is used up whole on this one, so tell the customer before you use one. Without promo_code, you get checkout_url, an ePayco payment page: give it to the customer. Recording starts by itself once they pay, even if this conversation has ended. If the customer loses the link, call this again without promo_code: you get the same link while it is open, or a new one once it has expired (payment links last 24 hours). The email from the first call is kept. Annotations: ```json { "destructiveHint": false, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false } ``` Input schema: ```json { "additionalProperties": false, "properties": { "email": { "description": "The customer's email. novu sends the download link there when the audio is ready.", "type": "string" }, "package_id": { "description": "The package_id from create_video_package.", "type": "string" }, "promo_code": { "description": "A novu promo code the customer gave you. Omit it to get a card payment link instead.", "maxLength": 32, "type": "string" } }, "required": [ "package_id", "email" ], "type": "object" } ``` Output schema: ```json { "additionalProperties": false, "properties": { "audio_url": { "description": "The MP3 alone, to listen to right away. Present only when status is ready; freshly signed on every call.", "type": "string" }, "characters": { "description": "The script's length as novu counts it for the price.", "type": "integer" }, "checkout_url": { "description": "ePayco payment link for the customer to open and pay. Only returned by pay_for_video_package.", "type": "string" }, "download_expires_at": { "description": "RFC 3339 time after which download_url and audio_url stop working. Call get_video_package again for new ones.", "type": "string" }, "download_url": { "description": "ZIP with the voiceover as MP3 and as 48 kHz WAV, the script and a README. Present only when status is ready; freshly signed on every call.", "type": "string" }, "duration_seconds": { "description": "Length of the voiceover in seconds. Present only when status is ready.", "type": "number" }, "max_characters": { "description": "The longest script this package covers.", "type": "integer" }, "next_step": { "description": "What to do now, in plain English.", "type": "string" }, "package": { "description": "video-corto, video-medio or video-largo, chosen by novu from the script's length.", "type": "string" }, "package_id": { "description": "The key to this package. Store it and pass it to every later call. Anyone holding it can see the package and download its audio.", "type": "string" }, "price_cop": { "description": "Price of this package in Colombian pesos (COP), a whole number.", "type": "integer" }, "status": { "description": "draft, awaiting_payment, generating, ready or failed.", "type": "string" }, "title": { "description": "The script's first words. They name the delivered files.", "type": "string" } }, "required": [ "package_id", "status", "package", "title", "characters", "max_characters", "price_cop", "next_step" ], "type": "object" } ```