> ## Documentation Index
> Fetch the complete documentation index at: https://api-docs.voicecheap.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Importa contenuti multimediali da un URL (trascrizione)

> Importa nel tuo account un URL HTTPS pubblico diretto di un file audio o video. I reindirizzamenti e le reti private vengono rifiutati; si applicano limiti di file e durata. Usa il fileKey risultante in un'azione di generazione.

Importa nel tuo account un URL HTTPS pubblico diretto di un file audio o video. I reindirizzamenti e le reti private vengono rifiutati; si applicano limiti di file e durata. Usa il fileKey risultante in un'azione di generazione.

```http theme={null}
POST https://api.voicecheap.ai/v1/actions/tools_upload_import
```

## Autenticazione e autorizzazioni

<ParamField header="x-api-key" type="string" required>
  Invia una chiave API VoiceCheap in questa intestazione. È supportato anche Authorization: Bearer con la stessa chiave API. I token di accesso OAuth
  sono accettati solo da MCP, non da questo endpoint REST.
</ParamField>

Autorizzazioni richieste: `transcription:write`.

È necessario un abbonamento a pagamento attivo. Le autorizzazioni non modificano i ruoli del team, la proprietà delle risorse, i crediti multimediali o i limiti del piano.

## Parametri

<ParamField body="url" type="string" required>
  Valore testuale.

  Lunghezza massima: 4096. Formato: "uri".
</ParamField>

<ParamField body="filename" type="string">
  Valore testuale.

  Lunghezza minima: 1. Lunghezza massima: 255. Pattern: `^[^/\\\r\n\0]+$`.
</ParamField>

<ParamField body="kind" type="string" required>
  Valore testuale.

  Valori consentiti: "transcription", "video\_to\_srt", "add\_subtitles", "animated\_captions", "project".
</ParamField>

<ParamField body="requestId" type="string">
  Facoltativo al livello di trasporto: se omesso, il server inserisce un identificatore prima della validazione. Fornisci un tuo UUID v4 stabile per recuperare in sicurezza una risposta persa.

  Formato: "uuid". Pattern: `^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$`.
</ParamField>

<Accordion title="Schema di input completo">
  Il JSON Schema seguente conserva i nomi esatti dei campi, i tipi annidati, i valori predefiniti, i limiti e i valori accettati esposti dalla discovery. Le ulteriori regole tra campi sono elencate nelle note sull'operazione.

  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "url": {
        "type": "string",
        "maxLength": 4096,
        "format": "uri"
      },
      "filename": {
        "type": "string",
        "minLength": 1,
        "maxLength": 255,
        "pattern": "^[^/\\\\\\r\\n\\0]+$"
      },
      "kind": {
        "type": "string",
        "enum": ["transcription", "video_to_srt", "add_subtitles", "animated_captions", "project"]
      },
      "requestId": {
        "description": "UUID v4 for this action. Reuse the same ID with identical arguments on retries.",
        "type": "string",
        "format": "uuid",
        "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"
      }
    },
    "required": ["url", "kind"],
    "additionalProperties": false
  }
  ```
</Accordion>

## Idempotenza

Usa un UUID v4 in requestId o nell'intestazione HTTP Idempotency-Key per ogni modifica. Riutilizza lo stesso identificatore e argomenti identici dopo un errore di rete. Se vengono forniti entrambi, devono coincidere. Ripetere una richiesta salvata non ripete l'operazione e non consuma un'altra chiamata mensile. Le richieste non riuscite o interrotte non vengono riavviate automaticamente.

Ogni modifica può restituire HTTP 202 quando un nuovo tentativo trova la stessa richiesta ancora in esecuzione, anche se la prima esecuzione è normalmente sincrona. Se l'esecuzione è completata ma resultStored è false, un nuovo tentativo restituisce HTTP 200 con lo stato della richiesta salvata anziché il risultato originale. Recupera l'output tramite l'azione di cronologia, risultato o download del relativo dominio.

## Esempi di richiesta

Sostituisci gli identificatori delle risorse e le chiavi multimediali di esempio con i valori restituiti per il tuo account. Mantieni stabile l'identificatore della richiesta quando ripeti la stessa modifica.

<RequestExample>
  ```bash cURL theme={null}
  curl --request POST 'https://api.voicecheap.ai/v1/actions/tools_upload_import' \
    --header "x-api-key: $VOICECHEAP_API_KEY" \
    --header 'Content-Type: application/json' \
    --data '{"url":"https://media.example.com/interview.mp4","filename":"interview.mp4","kind":"transcription","requestId":"13579bdf-2468-4ace-8bdf-0123456789ab"}'
  ```

  ```javascript JavaScript theme={null}
  const input = {
    url: 'https://media.example.com/interview.mp4',
    filename: 'interview.mp4',
    kind: 'transcription',
    requestId: '13579bdf-2468-4ace-8bdf-0123456789ab',
  };
  const response = await fetch('https://api.voicecheap.ai/v1/actions/tools_upload_import', {
    method: 'POST',
    headers: {
      'x-api-key': process.env.VOICECHEAP_API_KEY,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(input),
  });
  const body = await response.json();
  if (!response.ok) throw new Error(body.code + ': ' + body.message);
  console.log(body);
  ```

  ```python Python theme={null}
  import os
  import requests

  response = requests.post(
      "https://api.voicecheap.ai/v1/actions/tools_upload_import",
      headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
      json={"url": "https://media.example.com/interview.mp4", "filename": "interview.mp4", "kind": "transcription", "requestId": "13579bdf-2468-4ace-8bdf-0123456789ab"},
      timeout=120,
  )
  body = response.json()
  if not response.ok:
      raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
  print(body)
  ```
</RequestExample>

## Risposta

Questa operazione restituisce HTTP 202 mentre è in esecuzione. Salva requestId e interroga action\_request\_get con questo identificatore e il nome dell'operazione originale. Gli stati del polling sono running, completed, failed e interrupted. Un risultato completato può rimandare a un processo multimediale separato; prosegui con l'azione di stato o di output specifica dell'operazione.

Riferimento multimediale importato di proprietà dell'attore, con dimensione, durata, tipo multimediale e URL di lettura convalidati. Questo è l'output dell'azione completata, dopo il polling.

<ResponseExample>
  ```json HTTP 202 theme={null}
  {
    "data": {
      "requestId": "13579bdf-2468-4ace-8bdf-0123456789ab",
      "status": "running",
      "pollAction": "action_request_get",
      "pollAfterSeconds": 5
    },
    "requestId": "13579bdf-2468-4ace-8bdf-0123456789ab"
  }
  ```

  ```json HTTP 200 theme={null}
  {
    "data": {
      "fileKey": "uploads/account-user/a1b2c3d4-e5f6-4789-8abc-def012345678-interview.mp4",
      "fileName": "interview.mp4",
      "fileSize": 1048576,
      "durationSeconds": 60,
      "mimeType": "video/mp4",
      "uploadType": "video",
      "readUrl": "https://media.example.com/uploads/account-user/a1b2c3d4-e5f6-4789-8abc-def012345678-interview.mp4"
    },
    "requestId": "13579bdf-2468-4ace-8bdf-0123456789ab"
  }
  ```

  ```json HTTP 202 replay_running theme={null}
  {
    "data": {
      "requestId": "13579bdf-2468-4ace-8bdf-0123456789ab",
      "operation": "tools_upload_import",
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "status": "running",
      "pollAfterSeconds": 5
    },
    "requestId": "13579bdf-2468-4ace-8bdf-0123456789ab"
  }
  ```

  ```json HTTP 200 replay_completed_without_result theme={null}
  {
    "data": {
      "requestId": "13579bdf-2468-4ace-8bdf-0123456789ab",
      "operation": "tools_upload_import",
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "status": "completed",
      "resultStored": false,
      "message": "The action completed. Retrieve its output from the corresponding history or resource action."
    },
    "requestId": "13579bdf-2468-4ace-8bdf-0123456789ab"
  }
  ```
</ResponseExample>

## Campi del risultato

| Campo | Descrizione |
| - | - |
| `data.fileKey` | Riferimento completato di proprietà dell'utente per l'azione di generazione. |
| `data.fileName` | Nome del file importato dopo la sanitizzazione. |
| `data.fileSize` | Byte della sorgente scaricati. |
| `data.durationSeconds` | Durata rilevata del file sorgente in secondi. |
| `data.mimeType` | Tipo MIME multimediale dedotto dall'estensione supportata del nome del file. |
| `data.uploadType` | audio o video. |
| `data.readUrl` | URL temporaneo per leggere il file sorgente importato; la generazione usa fileKey. |

## Recupera e monitora questa richiesta

Usa lo stesso identificatore anche dopo una connessione persa. Se resultStored è false, recupera l'output tramite la corrispondente azione di cronologia, risultato o download. Non avviare mai una seconda generazione solo per verificarne l'avanzamento.

```bash theme={null}
curl --request POST 'https://api.voicecheap.ai/v1/actions/action_request_get' \
  --header "x-api-key: $VOICECHEAP_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{"requestId":"13579bdf-2468-4ace-8bdf-0123456789ab","operation":"tools_upload_import"}'
```

```json HTTP 200 theme={null}
{
  "data": {
    "requestId": "13579bdf-2468-4ace-8bdf-0123456789ab",
    "operation": "tools_upload_import",
    "status": "completed",
    "createdAt": 1792144800000,
    "updatedAt": 1792144820000,
    "resultStored": true,
    "result": {
      "fileKey": "uploads/account-user/a1b2c3d4-e5f6-4789-8abc-def012345678-interview.mp4",
      "fileName": "interview.mp4",
      "fileSize": 1048576,
      "durationSeconds": 60,
      "mimeType": "video/mp4",
      "uploadType": "video",
      "readUrl": "https://media.example.com/uploads/account-user/a1b2c3d4-e5f6-4789-8abc-def012345678-interview.mp4"
    }
  }
}
```

## Note sull'operazione

* Richiede un abbonamento a pagamento e l'autorizzazione dell'azione. Il piano personale del chiamante per gli strumenti viene ricontrollato al momento dell'esecuzione; gli strumenti salvati e i riferimenti ai caricamenti appartengono a quel chiamante, anche quando la credenziale è associata a un team.
* Un'azione riuscita consuma una chiamata mensile condivisa API/MCP. Beginner consente 500, Starter 5,000 e Creator 25,000 chiamate al mese; Pro, Scale ed Enterprise non hanno un limite mensile. Si applicano comunque i limiti al minuto: rispettivamente 30, 60, 120, 180, 300 e 600. Le quote di generazione degli strumenti sono separate.
* Usa un requestId UUID v4, oppure un header Idempotency-Key identico, e mantieni la stessa azione, lo stesso ID e gli stessi argomenti nei tentativi successivi. La ripetizione di un risultato memorizzato nella cache non consuma un'altra chiamata mensile.
* Il prefisso di caricamento seleziona l'autorizzazione richiesta. tools utilizza transcription:write, subtitles utilizza subtitles:write, projects utilizza projects:write e voices utilizza voices:write.
* Per strumenti, sottotitoli e progetti, kind accetta transcription, video\_to\_srt, add\_subtitles, animated\_captions o project. Il kind selezionato determina i limiti del flusso di lavoro; il prefisso non impone un kind.
* Il kind scelto applica i propri limiti: transcription 200 MiB; video\_to\_srt e add\_subtitles 300 MiB; animated\_captions 250 MiB e solo audio; project usa il limite di caricamento del piano (Beginner 5 GiB, Starter 10 GiB, Creator 20 GiB, Pro 30 GiB, Scale 40 GiB, Enterprise 60 GiB). I contenuti multimediali autonomi durano al massimo 2 ore. I sottotitoli consentono 30 minuti su Beginner e 60 minuti sui piani pubblici superiori, più una tolleranza del contenitore di 2 secondi. La durata del progetto è al massimo di 2 ore, o 3 ore su Enterprise.
* Questa azione viene eseguita in modo asincrono. Interroga periodicamente action\_request\_get con il nome dell'operazione e il requestId originale fino al completamento, prima di prelevare fileKey dal risultato.
* Usa un URL HTTPS pubblico diretto a un file audio o video. Reindirizzamenti, credenziali, frammenti, porte diverse da 443 e indirizzi DNS non pubblici vengono rifiutati. Una pagina di visualizzazione YouTube non è un URL multimediale diretto; usa le azioni YouTube dedicate.
* filename è facoltativo quando il percorso dell'URL termina con un nome di file multimediale supportato. Il nome del file salvato viene sanificato. Il server rileva la durata effettiva prima di restituire un fileKey.
* L'importazione prepara il contenuto multimediale e consuma una chiamata di integrazione mensile riuscita; la quota giornaliera di generazioni dello strumento viene consumata solo dalla generazione successiva.

## Utilizzo

Ogni invocazione riuscita consuma una chiamata API/MCP mensile. Si applicano anche i crediti multimediali e le quote di generazione proprie dell'operazione.

## Errori

| Stato HTTP | Codice | Significato o risoluzione |
| - | - | - |
| 400 | `CREDENTIAL_IN_QUERY` | Le credenziali sono state fornite in un parametro di query access\_token o api\_key. Invia le credenziali negli header. |
| 400 | `EMPTY_MEDIA` | L'URL diretto del contenuto multimediale ha restituito un corpo vuoto. |
| 400 | `FILE_TOO_LARGE` | Il contenuto di origine dichiarato o scaricato supera il limite di caricamento del tipo scelto. |
| 400 | `IDEMPOTENCY_CONFLICT` | Gli ID della richiesta nell'header e nel corpo sono diversi. |
| 400 | `INVALID_FILE_TYPE` | Il nome del file fornito o ricavato dall'URL non ha un'estensione supportata per il tipo scelto. |
| 400 | `INVALID_MEDIA_DURATION` | Non è possibile rilevare la durata del contenuto multimediale scaricato oppure questa supera il limite del piano per il tipo scelto. |
| 400 | `INVALID_MEDIA_TYPE` | Il tipo di contenuto della risposta non è audio, video, application/ogg o application/octet-stream. |
| 400 | `INVALID_MEDIA_URL` | Usa un URL HTTPS diretto senza credenziali utente, frammenti o una porta diversa da 443; fornisci un nome file multimediale valido. |
| 400 | `INVALID_REQUEST_ID` | requestId o Idempotency-Key non è un UUID v4. |
| 400 | `MEDIA_DOWNLOAD_REFUSED` | Il download diretto non ha restituito HTTP 200. I reindirizzamenti vengono rifiutati. |
| 400 | `MEDIA_IMPORT_FAILED` | Impossibile scaricare, analizzare o salvare il file sorgente; controlla l'URL pubblico e il formato multimediale. |
| 400 | `MEDIA_URL_NOT_PUBLIC` | Il nome host non può essere risolto oppure almeno un indirizzo risolto è privato o comunque non pubblico. |
| 400 | `VALIDATION_ERROR` | Gli argomenti non soddisfano lo schema dell'azione oppure è stato fornito un argomento sconosciuto. |
| 401 | `API_KEY_EXPIRED` | La chiave API è scaduta. |
| 401 | `INVALID_API_KEY` | Fornisci una chiave API valida e non scaduta. |
| 401 | `INVALID_CREDENTIAL` | L'header Authorization non è valido oppure è in conflitto con x-api-key. |
| 401 | `MISSING_CREDENTIAL` | Non è stata fornita alcuna credenziale utilizzabile negli header, oppure la credenziale superava 4096 caratteri. |
| 401 | `USER_NOT_FOUND` | L'account associato alla credenziale non esiste più. |
| 403 | `ACCOUNT_UNAVAILABLE` | L'account che esegue l'azione o quello di fatturazione non è disponibile o è in fase di eliminazione. |
| 403 | `AMBIGUOUS_TEAM_API_KEY` | L'utente della credenziale appartiene a più di un team, quindi il contesto di fatturazione è ambiguo. |
| 403 | `INSUFFICIENT_SCOPE` | La chiave API o la connessione MCP non dispone dell'autorizzazione richiesta per l'azione. |
| 403 | `INTEGRATION_PLAN_UNSUPPORTED` | Impossibile verificare i limiti di integrazione dell'account. |
| 403 | `PAID_SUBSCRIPTION_REQUIRED` | L'utente autenticato non dispone più di un abbonamento a pagamento quando questa azione dello strumento viene eseguita. |
| 403 | `SUBSCRIPTION_REQUIRED` | Usa un abbonamento a pagamento attivo. |
| 403 | `TEAM_OWNER_NOT_FOUND` | Non è stato possibile trovare l'account effettivo del proprietario del team. |
| 409 | `CONCURRENT_ACTION_LIMIT_REACHED` | Questo account ha già 10 azioni di integrazione in esecuzione. Interroga una richiesta esistente prima di avviarne un'altra. |
| 409 | `IDEMPOTENCY_CONFLICT` | Riutilizza un identificatore solo con la stessa operazione e gli stessi argomenti. |
| 429 | `INTEGRATION_MONTHLY_LIMIT_REACHED` | Le chiamate utilizzate e in attesa hanno raggiunto la quota mensile API/MCP condivisa. |
| 429 | `INTEGRATION_RATE_LIMIT_REACHED` | L'account ha raggiunto il limite di integrazione al minuto; controlla retryAfterSeconds. |
| 500 | `INTERNAL_ERROR` | Controlla lo stato della richiesta salvata e la cronologia delle risorse prima di decidere se ripetere una modifica. |
| 503 | `ACTION_RESULT_UNAVAILABLE` | L'azione è stata eseguita, ma non è stato possibile confermare la memorizzazione del risultato della richiesta. Interroga periodicamente la stessa azione con lo stesso requestId e controlla la cronologia della risorsa prima di avviare un'altra scrittura. |
| 503 | `SERVER_RESTARTING` | Il server si sta riavviando. Riprova tra poco e mantieni lo stesso identificatore della richiesta per una modifica. |

```json theme={null}
{
  "code": "INSUFFICIENT_SCOPE",
  "message": "This credential does not permit the requested action.",
  "status": 403,
  "details": {
    "requiredScopes": ["transcription:write"]
  }
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.