Pedir o envio de um material
const url = 'https://developers.nexo.winningsales.com.br/v1/knowledge/materials';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"fileName":"example","sizeInBytes":1,"category":"policy","name":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://developers.nexo.winningsales.com.br/v1/knowledge/materials \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "fileName": "example", "sizeInBytes": 1, "category": "policy", "name": "example" }'Confere formato, tamanho e espaço livre, cria o material e devolve uma URL assinada, válida por 15 minutos, para enviar o arquivo direto ao armazenamento com PUT, com o Content-Type devolvido. Depois do envio, confirme a versão: só então o material entra na base e é lido. Um pedido nunca confirmado some sozinho. O arquivo nunca passa pela API: o envio e o download são por link assinado do armazenamento, e cada link gasta a classe file (60 por minuto na empresa, 30 por token). Só administradores, como a Base de conhecimento na tela Calibração; o papel é relido a cada chamada, e para mudar o token precisa do escopo calibration:write.
Authorizations
Seção intitulada “Authorizations”Request Bodyrequired
Seção intitulada “Request Bodyrequired”object
Nome do arquivo com a extensão. A extensão define o formato: pdf, docx, pptx, xlsx, md ou txt
Tamanho do arquivo em bytes, como o navegador informa. O limite é 25 MB
Tipo do material: policy (política), playbook, pricing (preços), product (produto), case, presentation (apresentação) ou other (outro)
Nome do material na base. Ausente: o nome do arquivo
Responses
Seção intitulada “Responses”Material criado e URL de envio
object
O material criado, ainda aguardando o arquivo. Só aparece na lista depois da confirmação
object
Id do material
Nome do material na base
Tipo do material: policy (política), playbook, pricing (preços), product (produto), case, presentation (apresentação) ou other (outro)
Nome do arquivo da versão atual, usado no download
Formato da versão atual
Tamanho da versão atual em bytes. Antes da confirmação, o tamanho informado no pedido
Número da versão atual, começando em 1
Awaiting_upload: o arquivo ainda não foi confirmado; stored: guardado; rejected: recusado na confirmação
Quando a versão atual foi guardada, ou pedida quando ainda não chegou
Quem subiu a versão atual. Null quando a pessoa não está mais na empresa
object
Id de quem subiu
Nome de quem subiu
Id da versão a confirmar depois do envio
Como enviar o arquivo: PUT do corpo cru na URL, com estes cabeçalhos
object
URL assinada para enviar o arquivo direto ao armazenamento
Método HTTP do envio
Cabeçalhos obrigatórios do envio
object
Tipo do conteúdo que o envio precisa mandar, igual ao assinado
Quando a URL de envio deixa de funcionar (15 minutos)
Example
{ "material": { "category": "policy", "format": "pdf", "status": "awaiting_upload" }, "upload": { "method": "PUT" }}Payload inválido (detalhes do zod em meta.errors)
object
Stable machine-readable error code (e.g. identity.email_already_in_use)
Error class name
HTTP status code
Human-readable message, safe to display to end users
Correlation id — send it to support to locate the full trail
Structured details safe for the frontend (field errors, ids)
object
Example generated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "requestId": "example", "meta": { "additionalProperty": "example" }}Token ausente, inválido, expirado ou revogado
object
Stable machine-readable error code (e.g. identity.email_already_in_use)
Error class name
HTTP status code
Human-readable message, safe to display to end users
Correlation id — send it to support to locate the full trail
Structured details safe for the frontend (field errors, ids)
object
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
object
Stable machine-readable error code (e.g. identity.email_already_in_use)
Error class name
HTTP status code
Human-readable message, safe to display to end users
Correlation id — send it to support to locate the full trail
Structured details safe for the frontend (field errors, ids)
object
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" }}Formato não aceito, arquivo acima de 25 MB ou base sem espaço
object
Stable machine-readable error code (e.g. identity.email_already_in_use)
Error class name
HTTP status code
Human-readable message, safe to display to end users
Correlation id — send it to support to locate the full trail
Structured details safe for the frontend (field errors, ids)
object
Example
{ "type": "knowledge.unsupported_format", "title": "UnsupportedMaterialFormatError", "status": 422, "detail": "O arquivo Proposta.key não é aceito. Suba em PDF, DOCX, PPTX, XLSX, MD ou TXT.", "requestId": "019fcae7-3e54-755a-8458-bdb605b324bb", "meta": { "fileName": "Proposta.key", "accepted": "PDF, DOCX, PPTX, XLSX, MD ou TXT" }}Limite de chamadas da empresa ou do token atingido
object
Stable machine-readable error code (e.g. identity.email_already_in_use)
Error class name
HTTP status code
Human-readable message, safe to display to end users
Correlation id — send it to support to locate the full trail
Structured details safe for the frontend (field errors, ids)
object
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 }}O armazenamento não assinou a URL de envio
object
Stable machine-readable error code (e.g. identity.email_already_in_use)
Error class name
HTTP status code
Human-readable message, safe to display to end users
Correlation id — send it to support to locate the full trail
Structured details safe for the frontend (field errors, ids)
object
Example generated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "requestId": "example", "meta": { "additionalProperty": "example" }}