Implementação
Exemplos completos
Exemplos funcionais de envio de áudio para o endpoint https://SEU_DOMINIO/api/v1/external-audio, usando credenciais seguras e multipart/form-data.
Selecione a linguagem
API_URL="https://SEU_DOMINIO/api/v1/external-audio"
QUALITY_SPY_TOKEN="${QUALITY_SPY_TOKEN:-SEU_TOKEN}"
curl -X POST "$API_URL" \
-H "Authorization: Bearer $QUALITY_SPY_TOKEN" \
-F 'metadata={
"id": "OCC-001",
"id_ocorrencia": "CALL-0001",
"funcionarionome": "João Silva",
"funcionarioemail": "joao@empresa.com",
"duracao_gravacao": 320,
"horario_inicio": "2026-07-09T09:30:00",
"ocorrencia_descricao": "Cobrança"
}' \
-F "audio=@gravacao.mp3" \
--fail-with-body
const API_URL = 'https://SEU_DOMINIO/api/v1/external-audio';
const QUALITY_SPY_TOKEN = 'SEU_TOKEN';
const audioInput = document.querySelector('#audio');
const metadata = {
id: 'OCC-001',
id_ocorrencia: 'CALL-0001',
funcionarionome: 'João Silva',
funcionarioemail: 'joao@empresa.com',
duracao_gravacao: 320,
horario_inicio: '2026-07-09T09:30:00',
ocorrencia_descricao: 'Cobrança',
};
const formData = new FormData();
formData.append('metadata', JSON.stringify(metadata));
formData.append('audio', audioInput.files[0]);
try {
const response = await fetch(API_URL, {
method: 'POST',
headers: {
Authorization: `Bearer ${QUALITY_SPY_TOKEN}`,
},
body: formData,
});
const responseBody = await response.text();
console.log(responseBody);
if (!response.ok) {
throw new Error(`Falha no envio: ${response.status}`);
}
} catch (error) {
console.error('Erro ao enviar áudio:', error);
}
import { readFile } from 'node:fs/promises';
import { Blob } from 'node:buffer';
const API_URL = 'https://SEU_DOMINIO/api/v1/external-audio';
const QUALITY_SPY_TOKEN = process.env.QUALITY_SPY_TOKEN || 'SEU_TOKEN';
const metadata = {
id: 'OCC-001',
id_ocorrencia: 'CALL-0001',
funcionarionome: 'João Silva',
funcionarioemail: 'joao@empresa.com',
duracao_gravacao: 320,
horario_inicio: '2026-07-09T09:30:00',
ocorrencia_descricao: 'Cobrança',
};
try {
const audioBuffer = await readFile('gravacao.mp3');
const formData = new FormData();
formData.append('metadata', JSON.stringify(metadata));
formData.append('audio', new Blob([audioBuffer]), 'gravacao.mp3');
const response = await fetch(API_URL, {
method: 'POST',
headers: {
Authorization: `Bearer ${QUALITY_SPY_TOKEN}`,
},
body: formData,
});
const responseBody = await response.text();
console.log(responseBody);
if (!response.ok) {
throw new Error(`Falha no envio: ${response.status}`);
}
} catch (error) {
console.error('Erro ao enviar áudio:', error);
}
import json
import os
import requests
API_URL = "https://SEU_DOMINIO/api/v1/external-audio"
QUALITY_SPY_TOKEN = os.getenv("QUALITY_SPY_TOKEN", "SEU_TOKEN")
metadata = {
"id": "OCC-001",
"id_ocorrencia": "CALL-0001",
"funcionarionome": "João Silva",
"funcionarioemail": "joao@empresa.com",
"duracao_gravacao": 320,
"horario_inicio": "2026-07-09T09:30:00",
"ocorrencia_descricao": "Cobrança",
}
try:
with open("gravacao.mp3", "rb") as audio_file:
response = requests.post(
API_URL,
headers={"Authorization": f"Bearer {QUALITY_SPY_TOKEN}"},
data={"metadata": json.dumps(metadata)},
files={"audio": audio_file},
timeout=60,
)
print(response.text)
response.raise_for_status()
except requests.RequestException as error:
print(f"Erro ao enviar áudio: {error}")
<?php
$apiUrl = 'https://SEU_DOMINIO/api/v1/external-audio';
$qualitySpyToken = getenv('QUALITY_SPY_TOKEN') ?: 'SEU_TOKEN';
$metadata = json_encode([
'id' => 'OCC-001',
'id_ocorrencia' => 'CALL-0001',
'funcionarionome' => 'João Silva',
'funcionarioemail' => 'joao@empresa.com',
'duracao_gravacao' => 320,
'horario_inicio' => '2026-07-09T09:30:00',
'ocorrencia_descricao' => 'Cobrança',
]);
$curl = curl_init($apiUrl);
curl_setopt_array($curl, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $qualitySpyToken,
],
CURLOPT_POSTFIELDS => [
'metadata' => $metadata,
'audio' => new CURLFile('gravacao.mp3'),
],
]);
$responseBody = curl_exec($curl);
$statusCode = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);
if ($responseBody === false) {
error_log('Erro ao enviar áudio: ' . curl_error($curl));
} else {
echo $responseBody;
if ($statusCode < 200 || $statusCode >= 300) {
error_log('Falha no envio. Status: ' . $statusCode);
}
}
curl_close($curl);
Estrutura para integração em lote
Em integrações com múltiplos áudios, trate cada item como uma unidade independente de envio, com metadados próprios e identificação própria.
{
"items": [
{
"metadata": {
"id": "OCC-001",
"id_ocorrencia": "CALL-0001"
},
"audio_path": "gravacao-001.mp3"
},
{
"metadata": {
"id": "OCC-002",
"id_ocorrencia": "CALL-0002"
},
"audio_path": "gravacao-002.mp3"
}
]
}
- Cada áudio deve possuir identificação própria.
- Limites de concorrência devem ser definidos com o responsável pela API.
- Não existe limite público presumido nesta documentação.
- Registre o estado de cada item para evitar duplicidade e facilitar reprocessamento controlado.
