Vai al contenuto principale

Uso automatizzato

Un agente può aprire un account Hushscript, pagarlo, trascrivere registrazioni e recuperare le proprie credenziali, dall'inizio alla fine, senza che una persona debba accedere.

In passato aprire un account Hushscript richiedeva una persona, almeno una volta. Non è più tutta la storia. Un flusso basato sul pagamento anticipato permette a un agente di aprire il proprio account, finanziarlo e gestirlo, senza alcun titolare umano in nessun punto del processo. /developers e /mcp documentano le due interfacce che questo account usa in seguito; questa pagina è la guida per ottenerne uno.

Registrazione

POST /v1/agent/accounts avvia una registrazione headless. Non esiste ancora nessun account, nessun cookie e nessun token: solo un acquisto in sospeso.

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 serve solo per ricevute e avvisi, mai per l’accesso. pack_id è uno tra 45min, 300min, 900min, 1800min, 6000min; non inviare mai tu stesso amount o currency, entrambi sono derivati dal pacchetto lato server. Solo i due pacchetti più piccoli, 45min e 300min, possono essere acquistati in fase di registrazione. Un pack_id più grande viene rifiutato, e il rifiuto include details.allowed_packs, che elenca cosa questo account può acquistare in questo momento, così chi chiama può riprovare senza indovinare. Il resto della scala si sblocca con l’anzianità, non con il volume: vedi Cosa può acquistare un account nuovo più sotto. accept_terms_version deve corrispondere esattamente alla versione delle policy attuale del server, altrimenti la chiamata fallisce con policy_version_stale, che indica il valore attuale nel corpo della risposta. Un suggerimento opzionale data_region viene rispettato solo se concorda con la regione già implicata dalla tua posizione di rete. Un dry_run: true opzionale convalida tutto senza creare una sessione Stripe e senza addebiti; il suo signup_id ha il prefisso dry_ e non può mai essere reclamato.

claim_secret viene mostrato esattamente una volta, in questa risposta. Hushscript ne conserva solo l’hash. Perderlo prima della chiamata di reclamo significa perdere la registrazione: non esiste un percorso di recupero per un claim secret, e il pagamento trattenuto in garanzia viene rimborsato dalla scansione periodica descritta più sotto, non restituito tramite una ricerca.

Completa il pagamento nel tuo browser

checkout_url è una pagina di Stripe Checkout ospitata. È l’unico passaggio dell’intero flusso che richiede un browser, e non deve necessariamente essere il browser di una persona: un agente può pilotarlo con la propria automazione (compilare i campi della carta, inviare, seguire il redirect). Hushscript non vede mai i dati della carta in nessuno dei due casi; li vede Stripe. La finestra per completarlo e poi reclamare è di 30 minuti, il valore expires_at visto sopra.

Una registrazione che viene pagata ma non viene mai reclamata viene rimborsata automaticamente da una scansione oraria, circa un’ora dopo la chiusura di quella finestra di 30 minuti. Il rimborso è totale, perché i minuti vengono accreditati sul saldo solo al momento del reclamo, quindi una registrazione mai reclamata non ne ha mai avuti da consumare.

Reclama l’account

POST /v1/agent/accounts/{signup_id}/claim trasforma una registrazione pagata e non reclamata in un account vero, con un’unica chiamata.

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
}

Il reclamo è a uso singolo. Crea esattamente un account, con dietro un’identità di accesso sintetica e non risolvibile, concede il pacchetto pagato esattamente una volta anche se la richiesta viene ripetuta, e genera esattamente un PAT: il valore pat mostrato sopra, anch’esso mostrato una sola volta.

Un secret sbagliato, un signup_id sconosciuto, una registrazione già reclamata, una rimborsata e una scaduta rispondono tutte con lo stesso errore agent_claim_invalid. Non c’è modo per chi chiama di distinguerle dalla risposta, di proposito. Solo una volta che il secret stesso risulta valido entra in gioco lo stato del pagamento: una Checkout Session non ancora liquidata risponde invece con wrong_state.

Il balance_seconds mostrato sopra è l’intero saldo iniziale. Gli account agente non ricevono alcun bonus di benvenuto né minuti gratuiti dalla verifica della carta come invece accade per il primo account di una persona; partono solo dal pacchetto che hanno pagato. È una scelta deliberata, non una lacuna: l’account era già stato pagato prima ancora di esistere.

Acquista altri minuti

Da qui in poi l’account si comporta come qualsiasi altro, sulla stessa superficie /v1/ che /developers documenta per intero.

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
}

Questo richiede lo scope billing, già concesso dalla risposta di reclamo mostrata sopra, e condivide un limite più stretto di 60 richieste al minuto per account con la rotta di salvataggio della carta, prima della chiamata a Stripe che entrambe effettuano.

Cosa può acquistare un account nuovo

La dimensione dei pacchetti si sblocca in base all’anzianità dei pagamenti liquidati, non in base a quanto spende un account. Un acquisto conta per il livello successivo solo una volta trascorsi 7 giorni dalla propria data di pagamento, quindi un account appena creato non può raggiungere i pacchetti più grandi acquistando in fretta.

Pagamenti liquidati con più di 7 giorni Pacchetti che può acquistare
Ancora nessuno, incluso un reclamo appena effettuato 45min, 300min
Almeno l’equivalente di 45 minuti aggiunge 900min, 1800min
Almeno l’equivalente di 15 ore aggiunge 6000min

Un acquisto rifiutato indica l’insieme attuale in details.allowed_packs invece di fallire alla cieca. La chiamata di registrazione applica la prima riga di quella tabella, motivo per cui la guida qui sopra acquista 300min e non qualcosa di più grande. Indipendentemente dalla scala, un limite di consumo mobile su 24 ore limita quanto velocemente può essere speso il saldo che non ha ancora superato in anzianità la finestra di contestazione.

Trascrivi

Caricare e trascrivere seguono lo stesso flusso multipart di qualsiasi altro account.

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=..." }
  ]
}

Esegui PUT di ogni parte sul suo URL prefirmato, poi esegui POST su /complete dello stesso job con n ed etag di ogni parte inviata in questo modo. Poi interroga periodicamente il 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": "..."
}

Ruota la credenziale

Un account macchina non ha password né una casella email utilizzabile, quindi non esiste un percorso di “password dimenticata” se un PAT trapela o deve semplicemente essere sostituito. La rotazione è quel percorso.

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 chiamata non richiede un corpo. Genera atomicamente un successore e revoca il token che ha autenticato la richiesta, così il vecchio PAT fallisce già alla chiamata successiva effettuata con esso. Il successore mantiene gli scope, il permesso di fatturazione, il nome, l’etichetta client e la policy di scadenza del predecessore. Questa rotta tocca solo il token di chi chiama: non può elencare, generare o revocare nessun’altra credenziale sull’account. È l’unico percorso di recupero delle credenziali che un account macchina possiede, quindi ruota prima che il vecchio token venga scartato, non dopo.

Errori

Status Code Slug Meaning
401 2000 unauthorized Token bearer mancante o non valido
403 2023 pat_scope_missing Al token manca lo scope richiesto da questa chiamata, oppure la fatturazione è disattivata per l’account
403 4021 pat_purchase_requires_app Non è stata indicata nessuna carta salvata, oppure l’addebito è stato rifiutato; nessun importo è stato addebitato
403 4023 pat_purchase_requires_authentication L’emittente della carta richiede una verifica che chi chiama non può completare; la carta in sé è valida
402 3001 insufficient_balance Saldo insufficiente per ammettere il job
429 5000 rate_limited Troppe richieste; attendi il valore di Retry-After

Questi quattro sono specifici degli account agente e non vengono mai raggiunti da un account umano:

Status Code Slug Meaning
409 4035 agent_signup_pending Una registrazione per questo contact_email è ancora aperta. Attendi che venga reclamata, rimborsata o scada, oppure usa un indirizzo diverso
401 4036 agent_claim_invalid Secret sbagliato, registrazione sconosciuta, già reclamata, rimborsata o scaduta. Identico di proposito
403 4037 agent_pack_locked Il livello di questo account non consente ancora quel pacchetto. Include details.allowed_packs; riprova con uno di quelli
429 4038 agent_purchase_capped 3 acquisti, andati a buon fine o rifiutati, nelle ultime 24 ore. Conteggiati per account attraverso ogni credenziale che ha posseduto, quindi la rotazione non azzera il conteggio. Include details.retry_after_seconds

Una volta che il claim secret risulta valido, una Checkout Session non pagata risponde con wrong_state (4001) invece che con agent_claim_invalid. Il catalogo completo è il documento OpenAPI.

Limiti

Le chiamate sono limitate a 1.200 al minuto. Per un account agente quel budget appartiene all’account, non al singolo token: ogni credenziale nella catena di rotazione attinge dallo stesso budget, quindi ruotare un PAT non assegna al successore un’allocazione nuova. Le due scritture di fatturazione, salvare una carta e acquistare un pacchetto, condividono un limite più stretto di 60 al minuto per account, prima della chiamata a Stripe che entrambe effettuano. Il limite di acquisto di 24 ore visto sopra viene conteggiato allo stesso modo, per account e non per credenziale.

Per saperne di più

Questa pagina copre il ciclo di vita dell’account: aprirlo, finanziarlo e mantenerne viva la credenziale. Per tutto quello che l’account può fare in seguito, vedi la REST API, incluso il documento OpenAPI completo, oppure il server MCP per lo stesso account tramite strumenti invece che HTTP grezzo.

Inizia a trascrivere – 30 minuti da provare

Un blocco da $1 conferma la tua carta e viene rilasciato subito — non ti viene mai addebitato nulla, e i tuoi 30 minuti gratuiti arrivano immediatamente.

Inizia – 30 minuti gratuiti