Pular para o conteúdo

Pedir um ZIP com várias conversas

POST
/v1/downloads/bundles
curl --request POST \
--url https://developers.nexo.winningsales.com.br/v1/downloads/bundles \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "meetingIds": [], "sessionIds": [], "threadIds": [], "includeAudio": false }'

Reuniões (transcrição em PDF e, com includeAudio, o MP3), sessões de WhatsApp e conversas de e-mail num ZIP só, de 1 a 30 conversas e até 300 MB. O ZIP é montado em segundo plano direto no lake; acompanhe em GET /v1/downloads/bundles/{id} até status ready, que traz a URL assinada. Sempre por link: o arquivo fica no lake e a resposta é a URL assinada do S3, válida por 15 minutos, que já baixa com o nome do arquivo; nenhum arquivo passa pela API. O vendedor baixa as reuniões que organizou, as próprias conversas de WhatsApp e de e-mail e as de contatos dos próprios negócios (o e-mail do CRM, pelo negócio em que foi registrado); estar vinculada a um negócio dele não basta; admin e líder de vendas baixam as do time. Exige o escopo conversations:read e todo download fica registrado. Além do limite de chamadas do token: Limite de pedidos de ZIP: 10 por pessoa e 60 pela empresa inteira, numa janela de 1 hora que começa no primeiro pedido e zera ao fim; acima disso responde 429 até a janela fechar. A conta é a mesma no app, na API pública (/v1) e no MCP.

Media typeapplication/json

O lote: de 1 a 30 conversas no total, somando reuniões, sessões de WhatsApp e e-mails

object
meetingIds

Reuniões gravadas a incluir no ZIP: a transcrição em PDF e, com includeAudio, o MP3. Repetidas contam uma vez

Array<string>
default: <= 30 items
sessionIds

Sessões de WhatsApp a incluir no ZIP, cada uma como a conversa em PDF. Repetidas contam uma vez

Array<string>
default: <= 30 items
threadIds

Conversas de e-mail a incluir no ZIP (thread da caixa conectada ou e-mail registrado no CRM), cada uma em PDF. Repetidas contam uma vez

Array<string>
default: <= 30 items
includeAudio

True inclui o MP3 de cada reunião que tem áudio, além da transcrição em PDF

boolean

O pedido, ainda montando

Media typeapplication/json
object
id
required

Id do lote

string format: uuid
status
required

Montando, pronto para baixar ou falhou

string
Allowed values: building ready failed
itemCount
required

Quantas conversas entraram no pedido, somando reuniões, WhatsApp e e-mail

integer
includeAudio
required

Se o pedido incluiu os áudios

boolean
sizeInBytes
required

Tamanho do ZIP quando pronto

integer
nullable
failureReason
required

Por que falhou: lote acima do limite de tamanho, nenhuma conversa com conteúdo para baixar, ou erro inesperado

string
nullable
Allowed values: too_large empty unexpected
fileName
required

Nome sugerido para o ZIP

string
url
required

URL assinada do ZIP quando pronto, válida por poucos minutos; null antes disso

string format: uri
nullable
expiresAt
required

Quando a URL deixa de funcionar

string format: date-time
nullable
createdAt
required

Quando o lote foi pedido

string format: date-time
readyAt
required

Quando o ZIP ficou pronto

string format: date-time
nullable

Example

{
"status": "building",
"failureReason": "too_large"
}

Lote vazio, acima de 30 conversas ou com id inválido

Media typeapplication/json
object
type
required

Stable machine-readable error code (e.g. identity.email_already_in_use)

string
title
required

Error class name

string
status
required

HTTP status code

integer
detail
required

Human-readable message, safe to display to end users

string
requestId
required

Correlation id — send it to support to locate the full trail

string
nullable
meta

Structured details safe for the frontend (field errors, ids)

object
key
additional properties

Example generated

{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"requestId": "example",
"meta": {
"additionalProperty": "example"
}
}

Token ausente, inválido, expirado ou revogado

Media typeapplication/json
object
type
required

Stable machine-readable error code (e.g. identity.email_already_in_use)

string
title
required

Error class name

string
status
required

HTTP status code

integer
detail
required

Human-readable message, safe to display to end users

string
requestId
required

Correlation id — send it to support to locate the full trail

string
nullable
meta

Structured details safe for the frontend (field errors, ids)

object
key
additional properties

Example

{
"type": "public_api.invalid_credential",
"title": "InvalidCredentialError",
"status": 401,
"detail": "Token de acesso inválido, expirado ou revogado. Crie um novo token de acesso no Nexo.",
"requestId": "019fcae7-3e54-755a-8458-bdb605b324bb"
}

Papel, escopo do token ou plano não permitem a operação

Media typeapplication/json
object
type
required

Stable machine-readable error code (e.g. identity.email_already_in_use)

string
title
required

Error class name

string
status
required

HTTP status code

integer
detail
required

Human-readable message, safe to display to end users

string
requestId
required

Correlation id — send it to support to locate the full trail

string
nullable
meta

Structured details safe for the frontend (field errors, ids)

object
key
additional properties

Example

{
"type": "public_api.insufficient_scope",
"title": "InsufficientScopeError",
"status": 403,
"detail": "Este token não tem o escopo conversations:read, exigido por esta operação. Gere um token com esse escopo.",
"requestId": "019fcae7-3e54-755a-8458-bdb605b324bb",
"meta": {
"operation": "conversations.reading",
"scope": "conversations:read"
}
}

Alguma conversa inexistente ou fora da visibilidade

Media typeapplication/json
object
type
required

Stable machine-readable error code (e.g. identity.email_already_in_use)

string
title
required

Error class name

string
status
required

HTTP status code

integer
detail
required

Human-readable message, safe to display to end users

string
requestId
required

Correlation id — send it to support to locate the full trail

string
nullable
meta

Structured details safe for the frontend (field errors, ids)

object
key
additional properties

Example

{
"type": "meetings.not_found",
"title": "MeetingNotFoundError",
"status": 404,
"detail": "Reunião não encontrada.",
"requestId": "019fcae7-3e54-755a-8458-bdb605b324bb",
"meta": {
"meetingId": "019fcae7-3e54-755a-8458-bdb605b324aa"
}
}

Limite de pedidos de ZIP: 10 por pessoa e 60 pela empresa inteira, numa janela de 1 hora que começa no primeiro pedido e zera ao fim; acima disso responde 429 até a janela fechar. A conta é a mesma no app, na API pública (/v1) e no MCP.

Limite de chamadas da empresa ou do token atingido

Media typeapplication/json
object
type
required

Stable machine-readable error code (e.g. identity.email_already_in_use)

string
title
required

Error class name

string
status
required

HTTP status code

integer
detail
required

Human-readable message, safe to display to end users

string
requestId
required

Correlation id — send it to support to locate the full trail

string
nullable
meta

Structured details safe for the frontend (field errors, ids)

object
key
additional properties

Example

{
"type": "public_api.rate_limited",
"title": "PublicRateLimitedError",
"status": 429,
"detail": "Muitas chamadas em pouco tempo. Tente de novo em 12 segundos.",
"requestId": "019fcae7-3e54-755a-8458-bdb605b324bb",
"meta": {
"class": "content",
"limitedBy": "company",
"limit": 120,
"windowSeconds": 60,
"retryAfterSeconds": 12
}
}