Pular para o conteúdo principal
Início

Documentação

API SummitCli

everything que você precisa para integrar: autenticação por API Key, inferência com streaming SSE, formatos de erro e a referência completa de endpoints.

Primeiros passos

O essencial em 30 segundos

Consulte os modelos disponíveis (sem autenticação) e faça a primeira chamada com sua API Key.

# 1. Descubra os modelos (não exige autenticação)
curl https://api.summitcli.tech/api/v1/models
# 2. Faça uma chamada com sua API Key
curl https://api.summitcli.tech/api/v1/chat/completions \
-H 'Authorization: Bearer sk-summit-...' \
-H 'Content-Type: application/json' \
-d '{
"model": "SLUG_DO_MODELO",
"messages": [{"role": "user", "content": "Olá"}]
}'

Autenticação

Dois mecanismos — não misture

A API usa dois mecanismos diferentes, e cada grupo de endpoints exige um deles. Este é o ponto que mais gera erro de integração.

EndpointO que usarDe um script?
/api/v1/billing/balancesessão + Origin❌ Não
/api/v1/billing/subscriptionsessão + Origin❌ Não
/api/v1/keyssessão + Origin❌ Não
/api/v1/mesessão + Origin❌ Não
/api/v1/modelspública✅ Sim
/api/v1/chat/completionsAPI Key✅ Sim
/api/v1/keyssessão + Origin❌ Não
/api/v1/preferences/localeOrigin❌ Não
/api/v1/billing/subscriptionsessão + Origin❌ Não
/api/v1/keyssessão + Origin❌ Não

A regra prática

Se o seu código roda num servidor e chama a API em loop, use API Key. Os endpoints de painel exigem cookie de sessão e um header Origin igual à origem, o que torna impossível chamá-los de um backend. Isso é proteção contra CSRF, não um esquema de autenticação de servidor.

Anatomia de uma API Key

sk-summit-3kJ9xQmR2vB8nT5wL0pZaYdHcE4uFgN1sIoO7rCjXl
└─┬───┘└────────────┬─────────────┘
   │                └─ 32 bytes aleatórios em base64url
   └─ prefixo fixo
  • •Criada em POST /api/v1/keys, pelo próprio usuário, sem fila de aprovação.
  • •O segredo em texto puro aparece uma única vez, na resposta da criação. Só o hash SHA-256 fica no banco — não há endpoint para recuperá-lo.
  • •Depois você só vê a máscara sk-summit-abc…wxyz. A revogação em DELETE /api/v1/keys é imediata e definitiva.

Uma chave por ambiente

Se o mesmo processo chama produção e staging, use duas chaves — revogar uma não derruba a outra.

Chaves de API

Criando sua primeira chave

A criação acontece no painel autenticado (cookie de sessão), não por API Key:

curl -X POST https://api.summitcli.tech/api/v1/keys \
-H 'Content-Type: application/json' \
-H 'Origin: https://summitcli.tech' \
-b 'summit_session=SEU_COOKIE_DE_SESSAO' \
-d '{"name":"Meu backend"}'

Para restringir a chave a modelos específicos, mande modelIds (UUIDs que saem de GET /api/v1/models). Omitir significa que ela vale para todos os modelos ativos.

Guarde o secretKey agora

Não tem como recuperar. Se perder, revogue a chave e crie outra.

Gateway

Inferência

POST /api/v1/chat/completions é o endpoint principal. Exige chave ativa, um modelo liberado para ela e um plano recorrente ativo.

CampoTipoPadrãoLimite
modelstring—obrigatório, 1–128 chars
messagesarray—obrigatório, 1–200 itens
messages[].roleenum—system · user · assistant
messages[].contentstring—1–200.000 chars
streambooleanfalse—
temperaturenumber0.7—
max_tokensinteger1024—

Corpos acima de 1 MB são recusados com 413.

Streaming

Streaming (SSE)

Com "stream": true a resposta vem como text/event-stream e os tokens chegam conforme são gerados, em vez de tudo de uma vez.

import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["SUMMIT_API_KEY"],
base_url="https://api.summitcli.tech/v1",
)
stream = client.chat.completions.create(
model="SLUG_DO_MODELO",
messages=[{"role": "user", "content": "Escreva um haiku sobre TypeScript"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)

Descarte a linha data: [DONE]

Cada evento é uma linha data: {json}, e o stream termina com data: [DONE]. Descartar essa linha final é o erro mais comum — o loop nunca encerra ou quebra em JSONDecodeError.

Erros

Tratamento de erros

O gateway e o painel usam dois formatos diferentes, de propósito. O gateway segue o OpenAI; o painel usa um envelope próprio.

gateway /chat/completions · /models

{
  "error": {
    "message": "API key inválida.",
    "type": "invalid_request_error"
  }
}

painel /keys · /billing/* · /me

{
  "success": false,
  "error": {
    "code": "SUBSCRIPTION_REQUIRED",
    "message": "Você ainda não possui um plano ativo."
  },
  "meta": { "timestamp": "..." }
}

Se seu código normaliza erros, trate os dois. O code do envelope é estável e serve para lógica de controle; a mensagem é para humanos e pode mudar.

StatuscodeCausaO que fazer
400VALIDATION_ERRORJSON malformado ou campo inválidoConfira os tipos e limites da tabela
401UNAUTHORIZEDChave ausente, inválida, revogada ou sem permissão no modeloVerifique o header Authorization e o prefixo sk-summit-
402SUBSCRIPTION_REQUIREDChave válida, mas sem plano recorrente ativoAtive um plano — não é bug, é assinatura
403FORBIDDENSaldo insuficiente ou modelo indisponível para a chaveRecarregue a carteira ou libere o modelo
413—Corpo acima de 1 MBReduza o histórico ou o conteúdo das mensagens
429RATE_LIMITEDLimite de requisições excedido (por IP e por chave)Backoff exponencial
import time
import urllib.error
MAX_TENTATIVAS = 5
for tentativa in range(MAX_TENTATIVAS):
try:
return chamar_api()
except urllib.error.HTTPError as erro:
# 429 é transiente. 401/402/403 são permanentes: retry só gasta cota.
if erro.code != 429 or tentativa == MAX_TENTATIVAS - 1:
raise
time.sleep(2 ** tentativa) # 1s, 2s, 4s, 8s...

Não faça retry cego

401, 402 e 403 são estados permanentes — retry só gasta cota. 429 e 5xx são transientes.

Referência

Todos os endpoints

Clique em um endpoint para ver a descrição.

Antes de produção

Checklist de produção

  • A chave está em variável de ambiente, nunca no código ou no git
  • Uma chave por ambiente (prod / staging), para revogação independente
  • Você consulta GET /api/v1/models em vez de assumir o slug do modelo
  • Você trata 402 como "precisa de assinatura", não como bug
  • Você faz backoff em 429; não retenta em 401/402/403
  • Em streaming, você descarta a linha data: [DONE]
  • Assinatura ativa antes de tráfego real — 402 não gasta o saldo, mas não gera resposta
  • Saldo monitorado — saldo zerado vira 403 no meio do fluxo