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.
https://api.nexichat.ai/v1Introduçã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.
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:
{
"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.
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.
curl -fsSL https://nexichat.ai/install.sh | bash
nexicode login
nexicode --helpirm https://nexichat.ai/install.ps1 | iex
nexicode login
nexicode --helpModelos e preços
#Preços em euros por milhão de tokens. Sem mensalidade — pagas o que usas.
| Modelo | URL | Entrada | Saída |
|---|---|---|---|
Nexi Air 2 Respostas rápidas, classificação, tarefas simples. nexi-air-v1 | /chat/air | 0,26 € | 3,10 € |
Nexi Prime 1 O equilibrado. Textos longos, análise, programação. nexi-prime-v1 | /chat/prime | 1,80 € | 6,20 € |
Nexi Nova 1 Raciocínio. Problemas difíceis, matemática, planeamento. nexi-nova-v1 | /chat/nova | 3,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.
| Campo | Notas |
|---|---|
messagesarrayobrigatório | De 1 a 200 mensagens. Cada uma tem role e content. |
streamboolean | Predefinido false. A true, a resposta vem em SSE. |
toolsarray | Até 64 funções que o modelo pode pedir para executares. |
max_tokensinteger | Teto de tokens gerados. Sem isto, usa o máximo do modelo. |
temperaturenumber | 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.
| role | Forma | Para quê |
|---|---|---|
system | content | As instruções. A identidade Nexi vai sempre à frente das tuas. |
user | content | O que a pessoa escreveu. |
assistant | content e/ou tool_calls | Respostas anteriores. É assim que se dá histórico ao modelo. |
tool | content + tool_call_id | O 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_reason | Significa |
|---|---|
stop | O modelo terminou por si. |
length | Bateu no max_tokens. A resposta está cortada a meio. |
tool_calls | Está à espera que executes uma função. |
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.
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--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"]
}
}
}]
}'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.
{
"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.
{
"error": {
"code": "rate_limit_rpm",
"message": "Rate limit exceeded for your tier."
}
}| HTTP | code | Quando acontece |
|---|---|---|
| 400 | invalid_request | O corpo não passou a validação. A mensagem diz qual o campo. |
| 400 | tools_unsupported | Mandaste tools a um modelo que não as suporta. |
| 401 | invalid_api_key | Chave em falta, malformada ou revogada. |
| 402 | insufficient_balance | Saldo esgotado. Carrega na consola. |
| 404 | unknown_model | A marca no URL não é air, prime nem nova. |
| 429 | rate_limit_rpm | Pedidos por minuto acima do teu tier. |
| 429 | rate_limit_tpm | Tokens por minuto acima do teu tier. |
| 429 | daily_spend_limit_reached | Bateste no teto diário definido na consola. |
| 502 | upstream_error | O modelo falhou. Repetir costuma resolver. |
| 503 | model_unavailable | Modelo 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.
| Tier | Requisito | Pedidos/min | Tokens/min |
|---|---|---|---|
| 1 | menos de 10 € | 10 | 10 000 |
| 2 | de 10 € a 100 € | 100 | 200 000 |
| 3 | mais de 100 € | 500 | 1 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.
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=30Um 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
#| Faz | Porquê |
|---|---|
| Guarda o x-request-id | Sem ele, investigar um pedido que falhou há dois dias é impossível. |
| Recuo exponencial nos 429 | Repetir de imediato só agrava — e conta para o limite outra vez. |
| Teto de gasto diário | Um ciclo infinito no teu código custa dinheiro real até alguém reparar. |
| Uma chave por ambiente | Revogar a de testes não pode derrubar produção. |
| Air para o que é simples | Classificar, 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.