Antes, abrir una cuenta de Hushscript necesitaba una persona, al menos una
vez. Eso ya no es toda la historia. Un flujo que empieza por el pago le
permite a un agente abrir su propia cuenta, financiarla y usarla, sin ningún
titular humano en ningún punto del proceso. /developers y /mcp documentan
las dos interfaces que esa cuenta usa después; esta página es la guía para
conseguir una.
Regístrate
POST /v1/agent/accounts abre un registro sin interfaz. Todavía no hay
cuenta, ni cookie, ni token: solo una compra pendiente.
curl -X POST https://api.hushscript.com/v1/agent/accounts \
-H "Content-Type: application/json" \
-d '{
"contact_email": "ops@example-agent.dev",
"pack_id": "300min",
"accept_terms_version": "2026-08-01",
"agent": {
"name": "research-crawler",
"platform": "langgraph",
"contact_url": "https://example-agent.dev/bots/research-crawler"
}
}'
{
"signup_id": "hsr1:eu:4c3a1f9e7b2d4e6f8a0c1b2d3e4f5061",
"claim_secret": "cs_9f3d2a1b7e6c4f5a8b9d0e1f2a3b4c5d",
"checkout_url": "https://checkout.stripe.com/c/pay/cs_test_a1B2c3D4e5F6",
"pack": "300min",
"amount": 599,
"currency": "usd",
"expires_at": 1789112400
}
contact_email sirve solo para recibos y avisos, nunca para iniciar sesión.
pack_id es uno de 45min, 300min, 900min, 1800min, 6000min; nunca
envíes tú mismo amount ni currency, ambos se derivan del paquete en el
servidor. Solo los dos paquetes más pequeños, 45min y 300min, se pueden
comprar al registrarse. Un pack_id mayor se rechaza, y el rechazo trae
details.allowed_packs, que enumera lo que esta cuenta puede comprar ahora
mismo, para que quien llama pueda reintentar sin adivinar. El resto de la
escalera se desbloquea con la antigüedad, no con el volumen: consulta Qué
puede comprar una cuenta nueva más abajo.
accept_terms_version debe coincidir exactamente con la versión de política
vigente en el servidor, o la llamada falla con policy_version_stale, que
indica el valor actual en su cuerpo. Una sugerencia opcional data_region
solo se respeta cuando coincide con la región que ya implica tu ubicación de
red. Un dry_run: true opcional valida todo sin crear una sesión de Stripe
ni realizar ningún cargo; su signup_id lleva el prefijo dry_ y nunca se
puede reclamar.
claim_secret se muestra exactamente una vez, en esta respuesta. Hushscript
solo almacena su hash. Perderlo antes de la llamada de reclamo significa
perder el registro: no existe ninguna ruta de recuperación para un secreto de
reclamo, y el pago retenido en garantía se reembolsa mediante el barrido
descrito más abajo, no se devuelve mediante una búsqueda.
Completa el pago en tu propio navegador
checkout_url es una página de Stripe Checkout alojada. Es el único paso de
todo este flujo que necesita un navegador, y no tiene que ser el navegador de
una persona: un agente puede manejarlo con su propia automatización (llenar
los campos de la tarjeta, enviar, seguir la redirección). Hushscript nunca ve
los datos de la tarjeta en ningún caso; Stripe sí. La ventana para completarlo
y luego reclamar es de 30 minutos, el expires_at de arriba.
Un registro que se paga pero nunca se reclama se reembolsa automáticamente mediante un barrido cada hora, aproximadamente una hora después de que se cierra esa ventana de 30 minutos. El reembolso es completo, porque los minutos solo se acreditan a un saldo en el momento del reclamo, así que un registro sin reclamar nunca tuvo ninguno que consumir.
Reclama la cuenta
POST /v1/agent/accounts/{signup_id}/claim convierte un registro pagado y
sin reclamar en una cuenta real, en una sola llamada.
curl -X POST https://api.hushscript.com/v1/agent/accounts/hsr1:eu:4c3a1f9e7b2d4e6f8a0c1b2d3e4f5061/claim \
-H "Content-Type: application/json" \
-d '{"claim_secret": "cs_9f3d2a1b7e6c4f5a8b9d0e1f2a3b4c5d"}'
{
"user_id": "usr_7d1a2b3c4d5e6f708192a3b4c5d6e7f8",
"pat": "hsr1:eu:pat.k3n2j1.8f7e6d5c4b3a29180716253443526170",
"scopes": [
"transcripts:read",
"transcripts:write",
"transcribe",
"account:read",
"export",
"billing",
"pat:rotate"
],
"balance_seconds": 18000
}
Reclamar es de un solo uso. Crea exactamente una cuenta, con una identidad de
inicio de sesión sintética e irresoluble detrás, concede el paquete pagado
exactamente una vez aunque se reintente la solicitud, y emite exactamente un
PAT: el valor pat de arriba, también mostrado exactamente una vez.
Un secreto incorrecto, un signup_id desconocido, un registro ya reclamado,
uno reembolsado y uno vencido responden todos con el mismo error
agent_claim_invalid. A propósito, quien llama no tiene forma de
distinguirlos a partir de la respuesta. Solo una vez que el secreto en sí es
válido entra en juego el estado del pago: una Checkout Session que todavía no
se liquidó responde wrong_state en su lugar.
El balance_seconds de arriba es todo el saldo inicial. Las cuentas de
agente no reciben ningún bono de bienvenida ni minutos gratis por
verificación de tarjeta como sí recibe la primera cuenta de una persona;
parten de nada más que el paquete que pagaron. Eso es deliberado, no un
vacío: la cuenta ya estaba pagada antes de existir.
Compra más minutos
Desde aquí la cuenta se comporta como cualquier otra, sobre la misma
superficie /v1/ que /developers documenta por completo.
curl -X POST https://api.hushscript.com/v1/billing/purchase \
-H "Authorization: Bearer hsr1:eu:pat.k3n2j1.8f7e6d5c4b3a29180716253443526170" \
-H "Content-Type: application/json" \
-d '{
"pack": "300min",
"quick_payment_method_id": "pm_1PqR2sT3uV4wX5yZ",
"idempotency_key": "purchase-2026-09-11-01"
}'
{
"balance_seconds": 36000
}
Esto necesita el scope billing, que la respuesta de reclamo de arriba ya
concedió, y comparte un límite más estricto de 60 solicitudes por minuto por
cuenta con la ruta de guardar tarjeta, antes de la llamada a Stripe que hace
cualquiera de las dos.
Qué puede comprar una cuenta nueva
El tamaño de paquete se desbloquea según la antigüedad de los pagos liquidados, no según cuánto gasta una cuenta. Una compra cuenta para el siguiente nivel solo una vez que pasaron 7 días desde su propia fecha de pago, así que una cuenta recién creada no puede alcanzar los paquetes grandes comprando rápido.
| Pagos liquidados con más de 7 días | Paquetes que puede comprar |
|---|---|
| Todavía ninguno, incluido un reclamo recién hecho | 45min, 300min |
| Al menos el equivalente a 45 minutos | añade 900min, 1800min |
| Al menos el equivalente a 15 horas | añade 6000min |
Una compra rechazada indica el conjunto actual en details.allowed_packs en
lugar de fallar a ciegas. La llamada de registro aplica la primera fila de
esa tabla, por eso la guía de arriba compra 300min y no algo más grande.
Aparte de la escalera, un tope móvil de consumo de 24 horas limita qué tan
rápido se puede gastar el saldo que todavía no superó en antigüedad la
ventana de disputa.
Transcribe
Subir y transcribir es el mismo flujo multiparte que en cualquier otra cuenta.
curl -X POST https://api.hushscript.com/v1/uploads \
-H "Authorization: Bearer hsr1:eu:pat.k3n2j1.8f7e6d5c4b3a29180716253443526170" \
-H "Content-Type: application/json" \
-d '{
"size_bytes": 48213504,
"duration_seconds": 1860,
"title": "weekly-standup-2026-09-11",
"idempotency_key": "upload-2026-09-11-01"
}'
{
"job_id": "job_3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d",
"part_urls": [
{ "n": 1, "url": "https://r2.hushscript.com/uploads/job_3a2b1c0d.../part-1?X-Amz-Signature=..." }
]
}
Haz PUT de cada parte a su URL prefirmada, luego haz POST a /complete
del mismo job con el n y el etag de cada parte enviada de esa forma.
Después, consulta el job:
curl https://api.hushscript.com/v1/jobs/job_3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d \
-H "Authorization: Bearer hsr1:eu:pat.k3n2j1.8f7e6d5c4b3a29180716253443526170"
{
"id": "job_3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d",
"state": "done",
"transcript_id": "trs_6f5e4d3c2b1a0908f7e6d5c4b3a29180"
}
curl https://api.hushscript.com/v1/transcripts/trs_6f5e4d3c2b1a0908f7e6d5c4b3a29180 \
-H "Authorization: Bearer hsr1:eu:pat.k3n2j1.8f7e6d5c4b3a29180716253443526170"
{
"id": "trs_6f5e4d3c2b1a0908f7e6d5c4b3a29180",
"language": "en",
"duration_seconds": 1860,
"body": "..."
}
Rota la credencial
Una cuenta de máquina no tiene contraseña ni un buzón de correo utilizable, así que no existe la ruta de ‘olvidé mi contraseña’ si un PAT se filtra o simplemente hay que reemplazarlo. La rotación es esa ruta.
curl -X POST https://api.hushscript.com/v1/agent/credentials/rotate \
-H "Authorization: Bearer hsr1:eu:pat.k3n2j1.8f7e6d5c4b3a29180716253443526170"
{
"pat": "hsr1:eu:pat.p9q8r7.1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d",
"pat_id": "p9q8r7",
"scopes": [
"transcripts:read",
"transcripts:write",
"transcribe",
"account:read",
"export",
"billing",
"pat:rotate"
],
"expires_at": null
}
La llamada no lleva cuerpo. Emite de forma atómica un sucesor y revoca el token que autenticó la solicitud, así que el PAT anterior falla en la siguientísima llamada hecha con él. El sucesor conserva los scopes, el permiso de facturación, el nombre, la etiqueta de cliente y la política de vencimiento del predecesor. Esta ruta no toca nada más que el propio token de quien llama: no puede listar, emitir ni revocar ninguna otra credencial de la cuenta. Es la única ruta de recuperación de credenciales que tiene una cuenta de máquina, así que rota antes de descartar el token anterior, no después.
Errores
| Status | Code | Slug | Significado |
|---|---|---|---|
| 401 | 2000 | unauthorized |
Token bearer ausente o inválido |
| 403 | 2023 | pat_scope_missing |
Al token le falta el scope que esta llamada necesita, o la facturación está desactivada para la cuenta |
| 403 | 4021 | pat_purchase_requires_app |
No se indicó ninguna tarjeta guardada, o el cargo fue rechazado; no se cobró nada |
| 403 | 4023 | pat_purchase_requires_authentication |
El emisor de la tarjeta pide una verificación que quien llama no puede completar; la tarjeta en sí está bien |
| 402 | 3001 | insufficient_balance |
Saldo insuficiente para admitir el job |
| 429 | 5000 | rate_limited |
Demasiadas solicitudes; espera el Retry-After |
Estos cuatro son específicos de las cuentas de agente y una cuenta humana nunca los alcanza:
| Status | Code | Slug | Significado |
|---|---|---|---|
| 409 | 4035 | agent_signup_pending |
Todavía hay un registro abierto para este contact_email. Espera a que se reclame, se reembolse o venza, o usa otra dirección |
| 401 | 4036 | agent_claim_invalid |
Secreto incorrecto, registro desconocido, ya reclamado, reembolsado o vencido. Idéntico a propósito |
| 403 | 4037 | agent_pack_locked |
El nivel de esta cuenta todavía no permite ese paquete. Trae details.allowed_packs; reintenta con uno de esos |
| 429 | 4038 | agent_purchase_capped |
3 compras, pagadas o rechazadas, en las últimas 24 horas. Se cuenta por cuenta, a través de todas las credenciales que haya tenido, así que rotar no lo reinicia. Trae details.retry_after_seconds |
Una vez que el secreto de reclamo en sí es válido, una Checkout Session sin
pagar responde wrong_state (4001) en lugar de agent_claim_invalid. El
catálogo completo está en el
documento OpenAPI.
Límites
Las llamadas están limitadas a 1,200 por minuto. Para una cuenta de agente, ese presupuesto pertenece a la cuenta, no al token individual: cada credencial del linaje de rotación consume del mismo cupo, así que rotar un PAT no le da al sucesor una asignación nueva. Las dos escrituras de facturación, guardar una tarjeta y comprar un paquete, comparten un límite más estricto de 60 por minuto por cuenta, antes de la llamada a Stripe que hace cualquiera de las dos. El tope de compra de 24 horas de arriba se cuenta de la misma forma, por cuenta en lugar de por credencial.
Más información
Esta página cubre el ciclo de vida de la cuenta: abrirla, financiarla y mantener viva su credencial. Para todo lo que la cuenta puede hacer después, consulta la API REST, incluido el documento OpenAPI completo, o el servidor MCP para la misma cuenta mediante herramientas en lugar de HTTP puro.