Skip to content

Solicitação de acesso à API

Para usar a API de controle de tokens, você precisa primeiro solicitar acesso ao revendedor ou ao administrador. O uso só é liberado depois que o administrador habilitar o recurso.

E-mail de contato: support@bsf.ai

Informe o motivo da solicitação e a conta que deve ser habilitada.


Todos os endpoints de gerenciamento de tokens exigem autenticação de usuário (middleware UserAuth) e aceitam dois métodos:

  • Session Cookie (enviado automaticamente após o login pelo navegador)
  • Access Token (enviado pelo header Authorization, ideal para curl / chamadas programáticas)

Ao usar autenticação por Access Token, envie os seguintes headers:

HeaderObrigatórioDescrição
AuthorizationSimAccess Token do usuário

Todos os exemplos com curl abaixo usam autenticação por Access Token. Substitua:

  • https://api.bsf.ai/ — a URL do seu serviço
  • {ACCESS_TOKEN} — o seu Access Token de usuário

Caminho base: /api/token


Estrutura de dados

Objeto Token

CampoTipoDescrição
idintID do token (chave primária)
user_idintID do usuário proprietário
keystringAPI Key (48 caracteres, gerada automaticamente, com prefixo sk-)
statusintStatus: 1 Ativo / 2 Desativado / 3 Expirado / 4 Cota esgotada
namestringNome do token (máximo de 50 caracteres)
created_timeint64Data de criação (timestamp Unix)
accessed_timeint64Data do último acesso (timestamp Unix)
expired_timeint64Data de expiração (timestamp Unix); -1 significa que nunca expira
remain_quotaintCota restante
unlimited_quotaboolSe a cota é ilimitada
used_quotaintCota já consumida
model_limits_enabledboolSe as restrições de modelo estão ativadas
model_limitsstringModelos permitidos (separados por vírgula, por exemplo gpt-4,claude-3-opus)
allow_ipsstringLista de IPs permitidos (separados por quebra de linha \n, aceita notação CIDR)
groupstringGrupo de canais
cross_group_retryboolRetentativa entre grupos (só tem efeito no grupo auto)

Endpoints da API

1. Listar tokens

GET /api/token/?p={page}&size={pageSize}

Parâmetros de query:

ParâmetroTipoObrigatórioDescrição
pintNãoNúmero da página, começando em 0
sizeintNãoItens por página

Exemplo de resposta:

json
{
  "success": true,
  "message": "",
  "data": {
    "page": 0,
    "page_size": 10,
    "total": 2,
    "items": [
      {
        "id": 1,
        "name": "my-token",
        "status": 1,
        "key": "",
        "created_time": 1710000000,
        "expired_time": -1,
        "remain_quota": 500000,
        "unlimited_quota": false,
        "used_quota": 12000,
        "model_limits_enabled": false,
        "model_limits": "",
        "allow_ips": "",
        "group": "",
        "cross_group_retry": false
      }
    ]
  }
}

Atenção: o campo key vem vazio nas respostas de listagem e não retorna a API Key real.

Exemplo com curl:

bash
curl -X GET 'https://api.bsf.ai/api/token/?p=0&size=10' \
  -H 'Authorization: {ACCESS_TOKEN}'

2. Buscar tokens

GET /api/token/search?keyword={keyword}&token={tokenKey}&p={page}&size={pageSize}

Parâmetros de query:

ParâmetroTipoObrigatórioDescrição
keywordstringNãoBusca aproximada por nome
tokenstringNãoBusca pela Key
pintNãoNúmero da página
sizeintNãoItens por página

A busca tem limite de frequência (middleware SearchRateLimit). A busca aproximada exige no mínimo 2 caracteres e aceita no máximo 2 curingas.

Exemplo com curl:

bash
# Search by name
curl -X GET 'https://api.bsf.ai/api/token/search?keyword=production&p=0&size=10' \
  -H 'Authorization: {ACCESS_TOKEN}'

# Search by Key
curl -X GET 'https://api.bsf.ai/api/token/search?token=abc123&p=0&size=10' \
  -H 'Authorization: {ACCESS_TOKEN}'

3. Consultar um único token

GET /api/token/{id}

Parâmetros de path:

ParâmetroTipoObrigatórioDescrição
idintSimID do token

Exemplo de resposta:

json
{
  "success": true,
  "message": "",
  "data": {
    "id": 1,
    "name": "my-token",
    "key": "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "status": 1,
    "remain_quota": 500000,
    "..."
  }
}

Exemplo com curl:

bash
curl -X GET 'https://api.bsf.ai/api/token/1' \
  -H 'Authorization: {ACCESS_TOKEN}'

4. Criar um token

POST /api/token/
Content-Type: application/json

Corpo da requisição:

CampoTipoObrigatórioDescrição
namestringSimNome do token, máximo de 50 caracteres
expired_timeint64NãoData de expiração (timestamp Unix); -1 para nunca expirar
remain_quotaintNãoCota restante (para tokens sem cota ilimitada, faixa de 0 a 1.000.000.000 × QuotaPerUnit)
unlimited_quotaboolNãoSe a cota é ilimitada
model_limits_enabledboolNãoSe as restrições de modelo devem ser ativadas
model_limitsstringNãoModelos permitidos (separados por vírgula)
allow_ipsstringNãoLista de IPs permitidos (separados por quebra de linha, aceita CIDR)
groupstringNãoGrupo de canais
cross_group_retryboolNãoRetentativa entre grupos

Exemplo de requisição:

json
{
  "name": "production-key",
  "expired_time": 1735689600,
  "remain_quota": 1000000,
  "unlimited_quota": false,
  "model_limits_enabled": true,
  "model_limits": "gpt-4,gpt-4o,claude-3-opus",
  "allow_ips": "192.168.1.0/24\n10.0.0.1",
  "group": "default"
}

Resposta:

json
{
  "success": true,
  "message": ""
}

Cada usuário tem um limite máximo de tokens. A criação falha se esse limite for ultrapassado.

Exemplo com curl:

bash
# Create a token with quota and model restrictions
curl -X POST 'https://api.bsf.ai/api/token/' \
  -H 'Authorization: {ACCESS_TOKEN}' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "production-key",
    "expired_time": 1735689600,
    "remain_quota": 1000000,
    "unlimited_quota": false,
    "model_limits_enabled": true,
    "model_limits": "gpt-4,gpt-4o,claude-3-opus",
    "allow_ips": "192.168.1.0/24\n10.0.0.1",
    "group": "default"
  }'

# Create an unlimited, never-expiring token
curl -X POST 'https://api.bsf.ai/api/token/' \
  -H 'Authorization: {ACCESS_TOKEN}' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "unlimited-key",
    "expired_time": -1,
    "unlimited_quota": true
  }'

5. Atualizar um token

5a. Atualizar todos os campos modificáveis

PUT /api/token/
Content-Type: application/json

Corpo da requisição:

CampoTipoObrigatórioDescrição
idintSimID do token a ser atualizado
namestringNãoNome do token
expired_timeint64NãoData de expiração
remain_quotaintNãoCota restante
unlimited_quotaboolNãoSe a cota é ilimitada
model_limits_enabledboolNãoSe as restrições de modelo devem ser ativadas
model_limitsstringNãoModelos permitidos
allow_ipsstringNãoLista de IPs permitidos
groupstringNãoGrupo de canais
cross_group_retryboolNãoRetentativa entre grupos

Exemplo com curl:

bash
# Update token name, quota, and model restrictions
curl -X PUT 'https://api.bsf.ai/api/token/' \
  -H 'Authorization: {ACCESS_TOKEN}' \
  -H 'Content-Type: application/json' \
  -d '{
    "id": 1,
    "name": "renamed-key",
    "remain_quota": 2000000,
    "unlimited_quota": false,
    "model_limits_enabled": true,
    "model_limits": "gpt-4o,claude-3-5-sonnet",
    "expired_time": 1767225600
  }'

5b. Atualizar apenas o status

PUT /api/token/?status_only=1
Content-Type: application/json

Corpo da requisição:

CampoTipoObrigatórioDescrição
idintSimID do token
statusintSim1 Ativar / 2 Desativar

Restrições:

  • Tokens expirados não podem ser ativados, a menos que a data de expiração seja atualizada
  • Tokens com a cota esgotada não podem ser ativados, a menos que tenham cota ilimitada

Exemplo com curl:

bash
# Disable a token
curl -X PUT 'https://api.bsf.ai/api/token/?status_only=1' \
  -H 'Authorization: {ACCESS_TOKEN}' \
  -H 'Content-Type: application/json' \
  -d '{"id": 1, "status": 2}'

# Enable a token
curl -X PUT 'https://api.bsf.ai/api/token/?status_only=1' \
  -H 'Authorization: {ACCESS_TOKEN}' \
  -H 'Content-Type: application/json' \
  -d '{"id": 1, "status": 1}'

Resposta:

json
{
  "success": true,
  "message": "",
  "data": { "...updated token object..." }
}

6. Excluir um token

DELETE /api/token/{id}

Parâmetros de path:

ParâmetroTipoObrigatórioDescrição
idintSimID do token

Exemplo com curl:

bash
curl -X DELETE 'https://api.bsf.ai/api/token/1' \
  -H 'Authorization: {ACCESS_TOKEN}'

Resposta:

json
{
  "success": true,
  "message": ""
}

A exclusão é lógica (soft delete) — os dados não são removidos imediatamente.


7. Excluir tokens em lote

POST /api/token/batch
Content-Type: application/json

Corpo da requisição:

json
{
  "ids": [1, 2, 3]
}

Resposta:

json
{
  "success": true,
  "message": "",
  "data": 3
}

data é a quantidade de tokens realmente excluídos.

Exemplo com curl:

bash
curl -X POST 'https://api.bsf.ai/api/token/batch' \
  -H 'Authorization: {ACCESS_TOKEN}' \
  -H 'Content-Type: application/json' \
  -d '{"ids": [1, 2, 3]}'

Consulta de uso do token

Este endpoint usa autenticação por Bearer Token (ou seja, a própria API Key consulta o seu uso) e não exige login do usuário.

GET /api/usage/token/
Authorization: Bearer sk-xxxxxxxx

Exemplo com curl:

bash
curl -X GET 'https://api.bsf.ai/api/usage/token/' \
  -H 'Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

Exemplo de resposta:

json
{
  "code": true,
  "message": "ok",
  "data": {
    "object": "token_usage",
    "name": "my-token",
    "total_usd_granted": 2.024,
    "total_usd_used": 0.024,
    "total_usd_available": 2.0,
    "unlimited_quota": false,
    "model_limits": {
      "gpt-4": true,
      "claude-3-opus": true
    },
    "model_limits_enabled": true,
    "expires_at": 1735689600,
    "user_usd_available": 88.5
  }
}
CampoDescrição
total_usd_grantedCota total concedida ao token (USD); equivale a total_usd_available + total_usd_used
total_usd_usedCota já usada pelo token (USD)
total_usd_availableCota restante disponível no token (USD)
unlimited_quotaSe a cota é ilimitada
model_limitsMapeamento das restrições de modelo
expires_atData de expiração; 0 significa que nunca expira
user_usd_availableSaldo restante da conta do usuário (USD). Quando a cota ilimitada está ativada, este campo representa o limite realmente utilizável

Estatísticas diárias de uso do token

GET /api/token/{id}/usage?start_date={start}&end_date={end}

Exige autenticação com login do usuário (igual aos endpoints de gerenciamento de tokens).

Parâmetros de path:

ParâmetroTipoObrigatórioDescrição
idintSimID do token

Parâmetros de query:

ParâmetroTipoObrigatórioDescrição
start_datestringNãoData inicial, no formato YYYY-MM-DD
end_datestringNãoData final, no formato YYYY-MM-DD

Limites:

  • Sem parâmetros, o padrão é consultar o último 1 dia
  • No máximo 7 dias; se ultrapassar, o período é truncado automaticamente para start_date + 7 days
  • Os resultados ficam em cache por 10 minutos para reduzir a carga sobre o banco de dados

Exemplo de resposta:

json
{
  "success": true,
  "data": {
    "token_id": 1,
    "token_name": "my-token",
    "start_date": "2026-03-20",
    "end_date": "2026-03-26",
    "daily": [
      {
        "date": "2026-03-20",
        "usd": 0.35,
        "requests": 12,
        "prompt_tokens": 5000,
        "completion_tokens": 2000
      }
    ]
  }
}

Descrição dos campos de daily:

CampoDescrição
dateData (YYYY-MM-DD)
usdGasto do dia (USD)
requestsNúmero de requisições
prompt_tokensQuantidade de tokens de entrada
completion_tokensQuantidade de tokens de saída

Exemplos com curl:

bash
# Query last 1 day (default)
curl -X GET 'https://api.bsf.ai/api/token/1/usage' \
  -H 'Authorization: {ACCESS_TOKEN}'

# Query specific date range (max 7 days)
curl -X GET 'https://api.bsf.ai/api/token/1/usage?start_date=2026-03-20&end_date=2026-03-26' \
  -H 'Authorization: {ACCESS_TOKEN}'

Conversão de unidades de cota

UnidadeDescrição
quotaUnidade interna
USDUnidade exibida ao usuário
Conversão1 USD = 500,000 quota (ou seja, US$ 0,002 / 1K tokens)

Formato da resposta de erro

json
{
  "success": false,
  "message": "error message"
}