Saltar para o conteúdo
Nesta página
NexiChat API · v1
REST · JSON · SSE

Documentação

Três modelos, um endpoint, formato compatível com a OpenAI. Começa com crédito de teste, cria a tua chave e integra por HTTP com os exemplos abaixo.

Base URL
https://api.nexichat.ai/v1
Consola

Introdução

#

A API Nexi expõe os mesmos três modelos que servem o chat. Um único endpoint, POST https://api.nexichat.ai/v1/chat/{marca}, onde a marca é air, prime ou nova.

O corpo e a resposta seguem o formato chat completions da OpenAI. O caminho é próprio da NexiChat: /chat/prime, por exemplo. Usa os exemplos HTTP abaixo; mudar apenas o base_url de um SDK que chama /chat/completions não é suficiente.

A especificação OpenAPI 3.1 — operações, esquemas, códigos de erro e o que cada um pede para se resolver — está em https://api.nexichat.ai/v1/openapi.json. Serve para gerar um cliente, ou para um agente ler a API sem esta página.

O modelo escolhe-se pelo URL, não por um campo model no corpo. Se mandares esse campo, é ignorado — não é erro, mas também não muda nada.

Primeiro pedido

#

Cria uma chave na consola sem falar com vendas. A primeira conta recebe 1.00 € de crédito de teste, sem carregamento inicial. Cria uma chave na consola e faz a chamada. O teste usa a API de produção e desconta esse crédito; não há um sandbox separado.

curl https://api.nexichat.ai/v1/chat/prime \
  -H "Authorization: Bearer nexi_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [{"role": "user", "content": "Olá!"}]
  }'

A resposta:

200 OK
{
  "id": "chatcmpl-...",
  "object": "chat.completion",
  "created": 1786500000,
  "model": "nexi-prime-v1",
  "choices": [{
    "index": 0,
    "message": { "role": "assistant", "content": "Olá! Em que posso ajudar?" },
    "finish_reason": "stop"
  }],
  "usage": { "prompt_tokens": 12, "completion_tokens": 8, "total_tokens": 20 }
}

Autenticação

#

Cabeçalho Authorization: Bearer nexi_live_… em todos os pedidos.

A chave é mostrada uma única vez, quando a crias. Depois disso só se vê o prefixo — se a perderes, a única saída é revogar e criar outra. Podes ter várias em simultâneo, o que torna a rotação indolor: cria a nova, troca no teu código, revoga a velha.

Nunca ponhas a chave em código que corra no browser ou numa app. Quem abrir as ferramentas de programador lê-a e passa a gastar o teu saldo. As chamadas fazem-se sempre do teu servidor.

Nexi Code CLI

#

O CLI oficial da NexiChat é o Nexi Code: trabalha no teu projeto local pelo terminal. Instala pelo site e usa nexicode login para ligar a conta no browser. Este acesso usa o plano da conta; as chaves e o saldo da API são separados.

macOS / Linux
curl -fsSL https://nexichat.ai/install.sh | bash
nexicode login
nexicode --help
Windows · PowerShell
irm https://nexichat.ai/install.ps1 | iex
nexicode login
nexicode --help

Instalação, permissões e exemplos do Nexi Code

Modelos e preços

#

Preços em euros por milhão de tokens. Sem mensalidade — pagas o que usas.

ModeloURLEntradaSaída
Nexi Air 2
Respostas rápidas, classificação, tarefas simples.
nexi-air-v1
/chat/air0,26 €3,10 €
Nexi Prime 1
O equilibrado. Textos longos, análise, programação.
nexi-prime-v1
/chat/prime1,80 €6,20 €
Nexi Nova 1
Raciocínio. Problemas difíceis, matemática, planeamento.
nexi-nova-v1
/chat/nova3,20 €9,50 €

Os tokens de raciocínio do Nova contam como saída — é assim que o uso é reportado, e é também por isso que ele é o mais caro dos três.

O pedido

#

POST https://api.nexichat.ai/v1/chat/{air|prime|nova} com corpo JSON.

CampoNotas
messages
arrayobrigatório
De 1 a 200 mensagens. Cada uma tem role e content.
stream
boolean
Predefinido false. A true, a resposta vem em SSE.
tools
array
Até 64 funções que o modelo pode pedir para executares.
max_tokens
integer
Teto de tokens gerados. Sem isto, usa o máximo do modelo.
temperature
number
De 0 a 2. Mais baixo é mais determinístico; 0 para classificação e extração.

Mensagens

#

Quatro papéis, e cada um tem uma forma própria.

roleFormaPara quê
systemcontentAs instruções. A identidade Nexi vai sempre à frente das tuas.
usercontentO que a pessoa escreveu.
assistantcontent e/ou tool_callsRespostas anteriores. É assim que se dá histórico ao modelo.
toolcontent + tool_call_idO resultado de uma função que executaste.

Cada mensagem aceita até 200 000 caracteres. A conversa é stateless: mandas o histórico todo em cada pedido, e nada fica guardado do lado da Nexi.

A resposta

#

O texto está em choices[0].message.content. O usage traz a contagem de tokens — é por ele que o custo é calculado, e bate certo com o que aparece na consola.

finish_reasonSignifica
stopO modelo terminou por si.
lengthBateu no max_tokens. A resposta está cortada a meio.
tool_callsEstá à espera que executes uma função.
Cada resposta traz o cabeçalho x-request-id. Regista-o nos teus logs: é por ele que o suporte encontra o pedido exato, e sem ele um "falhou ontem à tarde" é impossível de investigar.

Streaming

#

Com "stream": true a resposta é SSE: linhas data: com o mesmo formato da OpenAI e data: [DONE] no fim. O texto vem em choices[0].delta.content.

text/event-stream
data: {"object":"chat.completion.chunk",
       "choices":[{"index":0,"delta":{"content":"Olá"}}]}

data: {"object":"chat.completion.chunk",
       "choices":[{"index":0,"delta":{"content":"!"}}]}

data: [DONE]
curl https://api.nexichat.ai/v1/chat/nova \
  -H "Authorization: Bearer nexi_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [{"role": "user", "content": "Explica a relatividade"}],
    "stream": true
  }' --no-buffer
Desliga o buffer do teu lado (--no-buffer no curl, stream=True no requests). Sem isso recebes tudo de uma vez no fim e o streaming não serve de nada — que é a queixa nº1 de quem integra SSE pela primeira vez.

Ferramentas

#

O modelo pode pedir que executes funções tuas. São três passos, e o do meio é teu: a API nunca executa nada — devolve o pedido, tu corres a função e mandas o resultado de volta.

curl https://api.nexichat.ai/v1/chat/prime \
  -H "Authorization: Bearer nexi_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [{"role": "user", "content": "Que tempo faz no Porto?"}],
    "tools": [{
      "type": "function",
      "function": {
        "name": "meteorologia",
        "description": "Tempo atual numa cidade",
        "parameters": {
          "type": "object",
          "properties": {"cidade": {"type": "string"}},
          "required": ["cidade"]
        }
      }
    }]
  }'
Cada tool_call tem de receber a sua resposta role: "tool", com o tool_call_id a bater certo. Um histórico com a chamada mas sem o resultado é rejeitado — e a partir daí a conversa inteira falha, não só essa mensagem.

Listar modelos

#

GET https://api.nexichat.ai/v1/models devolve a lista no formato da OpenAI. Útil para preencher um seletor sem os nomes ficarem escritos à mão no teu código.

200 OK
{
  "object": "list",
  "data": [
    { "id": "nexi-air-v1",   "object": "model", "owned_by": "nexichat" },
    { "id": "nexi-prime-v1", "object": "model", "owned_by": "nexichat" },
    { "id": "nexi-nova-v1",  "object": "model", "owned_by": "nexichat" }
  ]
}

Erros

#

Sempre o mesmo formato. O code é estável e serve para ramificar no teu código; a message é para humanos e pode mudar sem aviso.

429 Too Many Requests
{
  "error": {
    "code": "rate_limit_rpm",
    "message": "Rate limit exceeded for your tier."
  }
}
HTTPcodeQuando acontece
400invalid_requestO corpo não passou a validação. A mensagem diz qual o campo.
400tools_unsupportedMandaste tools a um modelo que não as suporta.
401invalid_api_keyChave em falta, malformada ou revogada.
402insufficient_balanceSaldo esgotado. Carrega na consola.
404unknown_modelA marca no URL não é air, prime nem nova.
429rate_limit_rpmPedidos por minuto acima do teu tier.
429rate_limit_tpmTokens por minuto acima do teu tier.
429daily_spend_limit_reachedBateste no teto diário definido na consola.
502upstream_errorO modelo falhou. Repetir costuma resolver.
503model_unavailableModelo temporariamente indisponível.

Os 429 e o 502 valem a pena repetir com recuo exponencial. Os 4xx restantes não — repetir um invalid_request dá sempre o mesmo resultado.

Limites

#

O tier sobe sozinho com o que a conta tem: conta o maior valor entre o total carregado e o saldo atual. Não há formulário nem espera. Se a tua integração precisar de mais desde o primeiro dia, fala connosco: podemos fixar um tier mínimo na conta.

TierRequisitoPedidos/minTokens/min
1menos de 10 €1010 000
2de 10 € a 100 €100200 000
3mais de 100 €5001 000 000

Cada pedido conta para o limite por minuto, também os recusados com 429: repetir sem esperar só prolonga a espera. Um pedido recusado por tokens não gasta tokens. Antes de chamar o modelo, a API reserva uma estimativa do input mais o max_tokens; no fim conta só o uso real. Um max_tokens à medida da resposta que esperas deixa caber mais pedidos no mesmo minuto.

Podes ainda definir um teto de gasto diário na consola. Ao atingi-lo, a API devolve daily_spend_limit_reached até ao dia seguinte — é uma rede contra um ciclo infinito no teu código, não um limite comercial.

As respostas autenticadas de chat incluem RateLimit-Policy e RateLimit: limite, saldo e segundos até renovar as janelas reais de pedidos e tokens. São uma fotografia desse pedido; chamadas em paralelo podem consumir o saldo entretanto. Em streaming, os tokens incluem a reserva do pedido, reconciliada no fim.

Exemplo de cabeçalhos · Tier 1
RateLimit-Policy: "requests";q=10;w=60;qu="requests", "tokens";q=10000;w=60;qu="tokens"
RateLimit: "requests";r=9;t=30, "tokens";r=9000;t=30

Um erro 429 inclui Retry-After em segundos e o mesmo valor em error.retry_after. Respeita esse tempo antes de repetir automaticamente. No teto diário, podes reduzir max_tokens, rever o teto na consola ou aguardar o dia seguinte em UTC. Para clientes antigos, X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset descrevem a janela de pedidos; o último é uma data Unix em segundos.

Versões e alterações

#

A API pública usa versões no URL: /v1/chat/prime e /v1/models. A versão atual é v1. Adições compatíveis, como campos opcionais ou novos modelos, podem entrar na mesma versão. Os clientes devem ignorar campos de resposta desconhecidos. Alterações incompatíveis ao contrato exigem uma nova versão principal.

Não há uma data de descontinuação anunciada para v1. Quando houver uma migração, esta documentação indicará o contrato novo, as diferenças e as datas antes da remoção. Só os endpoints com descontinuação anunciada receberão Deprecation (RFC 9745) e, quando existir uma data de fim, Sunset (RFC 8594). O cabeçalho Link; rel="service-doc" aponta para esta política.

Boas práticas

#
FazPorquê
Guarda o x-request-idSem ele, investigar um pedido que falhou há dois dias é impossível.
Recuo exponencial nos 429Repetir de imediato só agrava — e conta para o limite outra vez.
Teto de gasto diárioUm ciclo infinito no teu código custa dinheiro real até alguém reparar.
Uma chave por ambienteRevogar a de testes não pode derrubar produção.
Air para o que é simplesClassificar, extrair e resumir não precisam do Nova. A diferença de preço é de 6×.

Pronto para começar

Cria a tua chave e faz o primeiro pedido em menos de um minuto.

Abrir a consola