Documentacion de la API de Podhoc
Integra la generacion de podcasts en tus aplicaciones
La API de Podhoc te permite crear podcasts generados por IA de forma programatica a partir de URLs de acceso publico. Integra la generacion de podcasts en tus flujos de trabajo, aplicaciones y plataformas.
Fuentes de contenido: La API acepta solo URLs de acceso publico. La carga de archivos y el texto sin formato no estan soportados actualmente. Si su organizacion tiene requisitos de cumplimiento o seguridad que impiden el alojamiento publico, cree un ticket de soporte para discutir opciones de integracion empresarial.
Inicio rapido
- Consigue una suscripcion PRO en app.podhoc.com
- Crea un token de API en app.podhoc.com/account/api-access
- Haz tu primera peticion usando los ejemplos de abajo
Autenticacion
Todas las peticiones a la API requieren una cabecera X-Api-Key con tu token:
X-Api-Key: phk_test_a1b2c3d4e5f6...
URL base: https://api-ext.podhoc.com/v1
Tipos de token:
- Tokens de prueba (
phk_test_...) – Mas economico, funciones limitadas. Para desarrollo y pruebas. - Tokens de produccion (
phk_prod_...) – Mas costoso, acceso completo. Para uso en produccion.
Endpoints
POST /v1/podcasts – Crear un podcast
Inicia la generacion de un nuevo podcast a partir de una o mas fuentes.
Parametros de la peticion:
| Parametro | Tipo | Obligatorio | Por defecto | Descripcion |
|---|---|---|---|---|
urls | string[] | Si | – | URLs de origen de acceso publico |
language | string | No | "en" | Codigo de idioma (ej. en-US, es, fr) |
target_duration_minutes | number | No | 10 | Duracion objetivo (1–120) |
style | string | No | "deep_dive" | Estilo del podcast |
voice_config | object | No | 2 voces | Configuracion de voces |
tts_model | string | No | "gemini-2.5-flash-tts" | Modelo de texto a voz |
auto_publish | boolean | No | false | Publicar automaticamente (solo prod) |
custom_focus | string | No | null | Tema de enfoque personalizado (solo prod) |
source_weights | object | No | null | Ponderacion de fuentes (solo prod) |
Nota: Solo se admiten URLs de acceso publico. La carga de archivos (
file_ids) y el contenido de texto (text_content) no estan disponibles a traves de la API.
Ejemplo de peticion:
curl -X POST https://api-ext.podhoc.com/v1/podcasts \
-H "X-Api-Key: phk_test_..." \
-H "Content-Type: application/json" \
-d '{
"urls": ["https://example.com/article"],
"language": "es",
"target_duration_minutes": 10,
"style": "conversational"
}'
Ejemplo de respuesta (202 Accepted):
{
"success": true,
"data": {
"podcast_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "processing",
"estimated_duration_minutes": 10,
"credits_charged": 38
},
"meta": {
"request_id": "f1e2d3c4-b5a6-7890-abcd-ef1234567890",
"credits_charged": 38,
"credit_balance": 462
}
}
GET /v1/podcasts/{id}/status – Consultar estado de generacion
Comprueba el progreso de un podcast en generacion.
curl https://api-ext.podhoc.com/v1/podcasts/a1b2c3d4-e5f6-7890-abcd-ef1234567890/status \
-H "X-Api-Key: phk_test_..."
Valores de estado: requested, processing, completed, failed.
GET /v1/podcasts/{id}/download – Descargar podcast
Obtiene una URL de descarga prefirmada para un podcast completado. La URL caduca en 1 hora.
curl https://api-ext.podhoc.com/v1/podcasts/a1b2c3d4-e5f6-7890-abcd-ef1234567890/download \
-H "X-Api-Key: phk_test_..."
GET /v1/estimate-cost – Estimar coste en creditos
Previsualiza el coste en creditos antes de crear un podcast.
| Parametro | Tipo | Obligatorio | Por defecto | Descripcion |
|---|---|---|---|---|
duration_minutes | integer | No | 10 | Duracion objetivo del podcast |
source_count | integer | No | 1 | Numero de fuentes |
voice_count | integer | No | 2 | Numero de voces |
has_custom_weights | boolean | No | false | Si se usan pesos personalizados |
curl "https://api-ext.podhoc.com/v1/estimate-cost?duration_minutes=30&source_count=2&voice_count=2" \
-H "X-Api-Key: phk_test_..."
GET /v1/account/credits – Consultar saldo de creditos
curl https://api-ext.podhoc.com/v1/account/credits \
-H "X-Api-Key: phk_test_..."
Precios
La generacion de podcasts usa precios dinamicos basados en creditos. La API aplica un multiplicador adicional segun el tipo de token.
Formula:
Coste base: max(30, ceil(duracion_minutos x 2.5))
Bonificaciones: + 20 si mas de 1 fuente
+ 10 si se habilitan pesos personalizados
Escalado de voces: x 1.2 si mas de 1 voz
Limite: min(500, coste_maximo_del_tier)
Coste API: creditos_base x multiplicador_creditos
Ejemplos de coste por duracion (1 fuente, 1 voz, sin pesos personalizados):
| Duracion | Coste base | Token test (Mas economico) | Token prod (Mas costoso) |
|---|---|---|---|
| 5 min | 30 | 45 | 75 |
| 10 min | 30 | 45 | 75 |
| 30 min | 75 | 113 | 188 |
| 45 min | 113 | 170 | 283 |
| 60 min | 150 | 225 | 375 |
| 90 min | 225 | 338 | 500 |
| 120 min | 300 | 450 | 500 |
Impacto de configuraciones avanzadas:
| Configuracion | Efecto | Ejemplo |
|---|---|---|
| Multiples fuentes (>1) | +20 creditos | 2 URLs anaden 20 al base |
| Pesos personalizados | +10 creditos | Habilitar ponderacion de fuentes anade 10 |
| Multiples voces (>1) | multiplicador x1.2 | 2 voces multiplican el subtotal por 1.2 |
Multiplicadores de creditos:
| Tipo de token | Multiplicador | Uso tipico |
|---|---|---|
Test (phk_test_...) | Mas economico | Desarrollo, pruebas, integracion |
Produccion (phk_prod_...) | Mas costoso | Aplicaciones en produccion |
Los multiplicadores de creditos (Mas economico para test, Mas costoso para produccion) son los niveles por defecto. Pueden ajustarse – el multiplicador real aplicado a tu solicitud se muestra en los metadatos de la respuesta.
Ejemplos de codigo
Python – flujo completo
import requests
import time
API_KEY = "phk_prod_your_token_here"
BASE = "https://api-ext.podhoc.com/v1"
HEADERS = {"X-Api-Key": API_KEY, "Content-Type": "application/json"}
# Paso 1: Crear un podcast
resp = requests.post(f"{BASE}/podcasts", headers=HEADERS, json={
"urls": ["https://example.com/article"],
"language": "es",
"target_duration_minutes": 10,
"style": "conversational",
})
podcast_id = resp.json()["data"]["podcast_id"]
# Paso 2: Consultar hasta completar
while True:
status_resp = requests.get(
f"{BASE}/podcasts/{podcast_id}/status",
headers={"X-Api-Key": API_KEY},
)
data = status_resp.json()["data"]
if data["status"] == "completed":
break
if data["status"] == "failed":
raise Exception("Fallo en la generacion")
time.sleep(10)
# Paso 3: Descargar
dl_resp = requests.get(
f"{BASE}/podcasts/{podcast_id}/download",
headers={"X-Api-Key": API_KEY},
)
download_url = dl_resp.json()["data"]["download_url"]
audio = requests.get(download_url)
with open("podcast.mp3", "wb") as f:
f.write(audio.content)
Limites de velocidad
| Tipo de token | Peticiones/minuto | Peticiones/hora | Generaciones simultaneas |
|---|---|---|---|
| Test | 10 | 60 | 1 |
| Produccion | 30 | 300 | 5 |
Cuando se supera el limite, la respuesta incluye una cabecera Retry-After indicando cuando reintentar.
Codigos de error
| Estado HTTP | Codigo | Descripcion |
|---|---|---|
| 400 | INVALID_REQUEST | Campos obligatorios ausentes o parametros invalidos |
| 400 | INVALID_DURATION | Duracion fuera del rango 1–120 minutos |
| 400 | TEST_TOKEN_RESTRICTED | Funcion no disponible con tokens de prueba |
| 401 | UNAUTHORIZED | Token invalido, caducado o revocado |
| 402 | INSUFFICIENT_CREDITS | Creditos insuficientes para la peticion |
| 404 | PODCAST_NOT_FOUND | Podcast no encontrado o no es tuyo |
| 429 | RATE_LIMITED | Limite de velocidad superado (consulta cabecera Retry-After) |
| 500 | INTERNAL_ERROR | Error inesperado del servidor |
Tokens de prueba vs produccion
| Caracteristica | Token de prueba | Token de produccion |
|---|---|---|
| Limite de duracion | 5 minutos max | 120 minutos max |
| Limite de URLs | 1 por peticion | Sin limite |
| Idiomas | Solo ingles | Los 73 idiomas |
| Voces | Max 2 | Todas las opciones |
| Enfoque personalizado | No disponible | Disponible |
| Pesos de fuentes | No disponible | Disponible |
| Subida de archivos | No soportado | No soportado |
| Auto-publicar | No disponible | Disponible |
| Multiplicador | Mas economico | Mas costoso |
| Limite de velocidad | 2/min, 20/hr | 30/min, 300/hr |
| Trabajos simultaneos | 1 | 5 |