Referência da API
Os endpoints públicos são só de leitura, sem autenticação e com limite de utilização por IP. Os endpoints `/me/*` destinam-se à ferramenta de linha de comandos `bsbot`: precisam de um token (`Authorization: Bearer`), que o `bsbot login` obtém através do navegador (`POST /cli/token`). Não enviam cabeçalhos CORS. Servida apenas no site principal, nunca no subdomínio do handle de um bot. Versões: a versão principal está no caminho (`/api/v1`); a v1 só recebe alterações compatíveis (novos endpoints, novos campos ou parâmetros opcionais). Uma alteração incompatível sai como `/api/v2`, e a v1 continua a funcionar pelo menos 6 meses, anunciada com os cabeçalhos `Deprecation` e `Sunset`. Veja docs/api.md.
- URL base
- https://bluesky.bot/api/v1
- Versão
- 1.0.0
Um handle está livre?
GET/handles/{name}/availability
Aplica exatamente as regras do servidor para uma reivindicação: formato, nomes reservados, palavras ofensivas e, por fim, se algum bot já o tem.
Parâmetros
| Nome | Local | Tipo | Descrição |
|---|---|---|---|
| name (obrigatório) | path | string | A parte do nome, por ex. `weather`; `@weather.bluesky.bot` também é aceite. |
Respostas
| Status | Descrição | Corpo |
|---|---|---|
| 200 | A disponibilidade, com o motivo quando não está disponível. | Availability |
| 404 | Não encontrado. Também devolvido no subdomínio do handle de um bot: a API só é servida no site principal. | Error |
| 429 | Limite de utilização atingido (política `publicApi`, por IP). | Error |
| 500 | Erro inesperado. | Error |
Exemplo
curl https://bluesky.bot/api/v1/handles/weather/availabilityO DID por trás de um handle reivindicado
GET/resolve/{handle}
A mesma resposta que `https://<handle>/.well-known/atproto-did`. Apenas handles `*.bluesky.bot`.
Parâmetros
| Nome | Local | Tipo | Descrição |
|---|---|---|---|
| handle (obrigatório) | path | string | Um handle completo, por ex. `weather.bluesky.bot` (sem distinção entre maiúsculas e minúsculas). |
Respostas
| Status | Descrição | Corpo |
|---|---|---|
| 200 | O handle e o seu DID. | Resolution |
| 400 | Não é um handle `*.bluesky.bot` (código `invalid_handle`). | Error |
| 404 | Não encontrado. Também devolvido no subdomínio do handle de um bot: a API só é servida no site principal. | Error |
| 429 | Limite de utilização atingido (política `publicApi`, por IP). | Error |
| 500 | Erro inesperado. | Error |
Exemplo
curl https://bluesky.bot/api/v1/resolve/weather.bluesky.botBots listados no diretório
GET/bots
Apenas os bots que o criador colocou no diretório, do mais recente para o mais antigo. Paginação por cursor: passe o `cursor` de uma página para obter a seguinte; é null na última página.
Parâmetros
| Nome | Local | Tipo | Descrição |
|---|---|---|---|
| limit | query | integer (1–100), default 20 | |
| cursor | query | string | Cursor opaco de uma página anterior. |
| category | query | string | Categoria exata. |
| verified | query | string: "true", "false" | Apenas os bots cujo handle está (true) ou ainda não está (false) ativo no Bluesky. |
| q | query | string | Pesquisa sem distinção entre maiúsculas e minúsculas no handle e no nome apresentado. |
Respostas
| Status | Descrição | Corpo |
|---|---|---|
| 200 | Uma página de bots. | BotList |
| 400 | Parâmetro de pesquisa inválido (código `bad_request`). | Error |
| 404 | Não encontrado. Também devolvido no subdomínio do handle de um bot: a API só é servida no site principal. | Error |
| 429 | Limite de utilização atingido (política `publicApi`, por IP). | Error |
| 500 | Erro inesperado. | Error |
Exemplo
curl https://bluesky.bot/api/v1/botsUm bot listado no diretório
GET/bots/{handle}
Parâmetros
| Nome | Local | Tipo | Descrição |
|---|---|---|---|
| handle (obrigatório) | path | string | Um handle completo, por ex. `weather.bluesky.bot` (sem distinção entre maiúsculas e minúsculas). |
Respostas
| Status | Descrição | Corpo |
|---|---|---|
| 200 | O bot. | Bot |
| 404 | Não encontrado. Também devolvido no subdomínio do handle de um bot: a API só é servida no site principal. | Error |
| 429 | Limite de utilização atingido (política `publicApi`, por IP). | Error |
| 500 | Erro inesperado. | Error |
Exemplo
curl https://bluesky.bot/api/v1/bots/weather.bluesky.botTrocar um código de início de sessão da CLI por um token
POST/cli/token
Passo 4 do `bsbot login`: o código de utilização única que /cli/authorize entregou ao endereço de loopback da CLI, com o verificador PKCE e o mesmo URI de redirecionamento. Um código serve uma vez e durante dois minutos; uma tentativa falhada inutiliza-o. O token é válido 30 dias. Limite de utilização por IP (`cliToken`).
Respostas
| Status | Descrição | Corpo |
|---|---|---|
| 200 | Um token para os endpoints `/me/*`. | CliToken |
| 400 | Corpo mal formado (`bad_request`), ou um código desconhecido, expirado, já usado, ou que não corresponde ao verificador ou ao URI de redirecionamento (`invalid_grant`). | Error |
| 404 | Não encontrado. Também devolvido no subdomínio do handle de um bot: a API só é servida no site principal. | Error |
| 429 | Limite de utilização atingido (política `publicApi`, por IP). | Error |
| 500 | Erro inesperado. | Error |
Exemplo
curl \
-X POST \
-H "Content-Type: application/json" \
-d '{"code":"…","code_verifier":"…","redirect_uri":"…"}' \
https://bluesky.bot/api/v1/cli/tokenA conta por trás do token
GET/me
Respostas
| Status | Descrição | Corpo |
|---|---|---|
| 200 | A sua conta e a expiração do token. | Me |
| 401 | Token em falta, expirado ou revogado (código `unauthorized`). Execute `bsbot login` novamente. | Error |
| 404 | Não existe esse bot na sua conta, ou é o subdomínio do handle de um bot (a API só é servida no site principal). | Error |
| 429 | Limite de utilização atingido: `publicApi` por IP, `creatorApi` por conta e `handleChange` por conta para reivindicações, mudanças, verificações e libertações (partilhado com o painel). | Error |
| 500 | Erro inesperado. | Error |
Exemplo
curl \
-H "Authorization: Bearer $BLUESKY_BOT_TOKEN" \
https://bluesky.bot/api/v1/meOs seus bots
GET/me/bots
Todos os bots da sua conta, no diretório ou não, do mais antigo para o mais recente. Adicione um bot a partir do painel: é preciso entrar na conta do bot.
Respostas
| Status | Descrição | Corpo |
|---|---|---|
| 200 | Os seus bots. | MyBotList |
| 401 | Token em falta, expirado ou revogado (código `unauthorized`). Execute `bsbot login` novamente. | Error |
| 404 | Não existe esse bot na sua conta, ou é o subdomínio do handle de um bot (a API só é servida no site principal). | Error |
| 429 | Limite de utilização atingido: `publicApi` por IP, `creatorApi` por conta e `handleChange` por conta para reivindicações, mudanças, verificações e libertações (partilhado com o painel). | Error |
| 500 | Erro inesperado. | Error |
Exemplo
curl \
-H "Authorization: Bearer $BLUESKY_BOT_TOKEN" \
https://bluesky.bot/api/v1/me/botsReivindicar um handle para um dos seus bots e aplicá-lo
POST/me/bots/{did}/claim
As próprias regras do painel: formato, nomes reservados, palavras ofensivas, disponibilidade (garantida por um índice único) e período de carência dos handles libertados. Depois, o handle do bot é mudado no Bluesky de imediato; `switch` diz como correu. Mudar o handle de um bot que já tem um liberta o antigo.
Parâmetros
| Nome | Local | Tipo | Descrição |
|---|---|---|---|
| did (obrigatório) | path | string | O DID do bot, tal como listado por `GET /me/bots`. |
Respostas
| Status | Descrição | Corpo |
|---|---|---|
| 200 | O handle reivindicado e o resultado da mudança. | ClaimResult |
| 400 | Corpo mal formado (`bad_request`), ou um nome não permitido (`invalid_handle`, com `reason`). | Error |
| 401 | Token em falta, expirado ou revogado (código `unauthorized`). Execute `bsbot login` novamente. | Error |
| 403 | O bot está suspenso (`forbidden`). | Error |
| 404 | Não existe esse bot na sua conta, ou é o subdomínio do handle de um bot (a API só é servida no site principal). | Error |
| 409 | Outro bot tem o handle, ou ele está no período de carência (`conflict`, motivo `taken`). | Error |
| 429 | Limite de utilização atingido: `publicApi` por IP, `creatorApi` por conta e `handleChange` por conta para reivindicações, mudanças, verificações e libertações (partilhado com o painel). | Error |
| 500 | Erro inesperado. | Error |
Exemplo
curl \
-X POST \
-H "Authorization: Bearer $BLUESKY_BOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"weather"}' \
https://bluesky.bot/api/v1/me/bots/did:plc:yourbot/claimPedir novamente ao PDS do bot que use o handle reivindicado
POST/me/bots/{did}/switch
Parâmetros
| Nome | Local | Tipo | Descrição |
|---|---|---|---|
| did (obrigatório) | path | string | O DID do bot, tal como listado por `GET /me/bots`. |
Respostas
| Status | Descrição | Corpo |
|---|---|---|
| 200 | O resultado da mudança. | SwitchResult |
| 401 | Token em falta, expirado ou revogado (código `unauthorized`). Execute `bsbot login` novamente. | Error |
| 404 | Não existe esse bot na sua conta, ou é o subdomínio do handle de um bot (a API só é servida no site principal). | Error |
| 429 | Limite de utilização atingido: `publicApi` por IP, `creatorApi` por conta e `handleChange` por conta para reivindicações, mudanças, verificações e libertações (partilhado com o painel). | Error |
| 500 | Erro inesperado. | Error |
Exemplo
curl \
-X POST \
-H "Authorization: Bearer $BLUESKY_BOT_TOKEN" \
https://bluesky.bot/api/v1/me/bots/did:plc:yourbot/switchVerificar se o handle reivindicado está ativo no Bluesky
POST/me/bots/{did}/verify
Parâmetros
| Nome | Local | Tipo | Descrição |
|---|---|---|---|
| did (obrigatório) | path | string | O DID do bot, tal como listado por `GET /me/bots`. |
Respostas
| Status | Descrição | Corpo |
|---|---|---|
| 200 | O resultado da verificação. | SwitchResult |
| 401 | Token em falta, expirado ou revogado (código `unauthorized`). Execute `bsbot login` novamente. | Error |
| 404 | Não existe esse bot na sua conta, ou é o subdomínio do handle de um bot (a API só é servida no site principal). | Error |
| 429 | Limite de utilização atingido: `publicApi` por IP, `creatorApi` por conta e `handleChange` por conta para reivindicações, mudanças, verificações e libertações (partilhado com o painel). | Error |
| 500 | Erro inesperado. | Error |
Exemplo
curl \
-X POST \
-H "Authorization: Bearer $BLUESKY_BOT_TOKEN" \
https://bluesky.bot/api/v1/me/bots/did:plc:yourbot/verifyLibertar o handle de um bot
POST/me/bots/{did}/release
O bot volta ao handle anterior do Bluesky quando possível, o handle deixa de ser resolvido e fica bloqueado para os outros durante o período de carência.
Parâmetros
| Nome | Local | Tipo | Descrição |
|---|---|---|---|
| did (obrigatório) | path | string | O DID do bot, tal como listado por `GET /me/bots`. |
Respostas
| Status | Descrição | Corpo |
|---|---|---|
| 200 | O handle libertado e o resultado da reposição. | ReleaseResult |
| 401 | Token em falta, expirado ou revogado (código `unauthorized`). Execute `bsbot login` novamente. | Error |
| 403 | O bot está suspenso (`forbidden`). | Error |
| 404 | Não existe esse bot na sua conta, ou é o subdomínio do handle de um bot (a API só é servida no site principal). | Error |
| 409 | O bot não tem nenhum handle para libertar (`conflict`, motivo `no_handle`). | Error |
| 429 | Limite de utilização atingido: `publicApi` por IP, `creatorApi` por conta e `handleChange` por conta para reivindicações, mudanças, verificações e libertações (partilhado com o painel). | Error |
| 500 | Erro inesperado. | Error |
Exemplo
curl \
-X POST \
-H "Authorization: Bearer $BLUESKY_BOT_TOKEN" \
https://bluesky.bot/api/v1/me/bots/did:plc:yourbot/releaseRevogar o token deste pedido
DELETE/me/token
O que o `bsbot logout` chama.
Respostas
| Status | Descrição | Corpo |
|---|---|---|
| 204 | Revogado. Sem corpo. | |
| 401 | Token em falta, expirado ou revogado (código `unauthorized`). Execute `bsbot login` novamente. | Error |
| 404 | Não existe esse bot na sua conta, ou é o subdomínio do handle de um bot (a API só é servida no site principal). | Error |
| 429 | Limite de utilização atingido: `publicApi` por IP, `creatorApi` por conta e `handleChange` por conta para reivindicações, mudanças, verificações e libertações (partilhado com o painel). | Error |
| 500 | Erro inesperado. | Error |
Exemplo
curl \
-X DELETE \
-H "Authorization: Bearer $BLUESKY_BOT_TOKEN" \
https://bluesky.bot/api/v1/me/tokenEsquemas
Error
| Campo | Tipo | Descrição |
|---|---|---|
| error (obrigatório) | object | |
| error.code (obrigatório) | string: "bad_request", "invalid_handle", "not_found", "rate_limited", "internal_error", "unauthorized", "forbidden", "conflict", "invalid_grant" | |
| error.message (obrigatório) | string | |
| error.reason | string | Com `invalid_handle`, `conflict` e `forbidden`: por ex. `reserved`, `taken`, `no_handle`, `suspended`. |
| error.parameter | string | O parâmetro de pesquisa inválido. |
| error.retryAfterSeconds | integer (1–) | Com `rate_limited`. |
Availability
| Campo | Tipo | Descrição |
|---|---|---|
| name (obrigatório) | string | O nome normalizado (tal como escrito quando é inválido). |
| handle (obrigatório) | string | null | O handle completo, por ex. `weather.bluesky.bot`; null quando o nome é inválido. |
| available (obrigatório) | boolean | |
| reason (obrigatório) | null | string: "required", "too_short", "too_long", "invalid_characters", "invalid_hyphen", "reserved", "not_allowed", "taken" | Porque não está disponível; null quando está. Os nomes têm 3 a 30 caracteres entre a-z, 0-9 e hífenes isolados. |
Resolution
| Campo | Tipo | Descrição |
|---|---|---|
| handle (obrigatório) | string | |
| did (obrigatório) | string |
Bot
| Campo | Tipo | Descrição |
|---|---|---|
| did (obrigatório) | string | |
| handle (obrigatório) | string | |
| displayName (obrigatório) | string | null | |
| avatar (obrigatório) | string | null | URL do avatar. |
| description (obrigatório) | string | null | |
| category (obrigatório) | string | null | |
| verifiedAt (obrigatório) | string | null, date-time | Quando se confirmou que o handle está ativo no Bluesky; null se ainda não. |
BotList
| Campo | Tipo | Descrição |
|---|---|---|
| bots (obrigatório) | Bot[] | |
| cursor (obrigatório) | string | null | Cursor da página seguinte; null na última página. |
CliTokenRequest
| Campo | Tipo | Descrição |
|---|---|---|
| code (obrigatório) | string | |
| code_verifier (obrigatório) | string | O verificador PKCE (RFC 7636). |
| redirect_uri (obrigatório) | string | O mesmo `http://127.0.0.1:<port>/callback` que em /cli/authorize. |
CliToken
| Campo | Tipo | Descrição |
|---|---|---|
| token (obrigatório) | string | Mantenha-o secreto: age em seu nome em `/me/*`. |
| tokenType (obrigatório) | string = "Bearer" | |
| expiresAt (obrigatório) | string, date-time | |
| creator (obrigatório) | Account |
Account
| Campo | Tipo | Descrição |
|---|---|---|
| did (obrigatório) | string | |
| handle (obrigatório) | string | O seu handle do Bluesky. |
| displayName | string | null |
Me
| Campo | Tipo | Descrição |
|---|---|---|
| creator (obrigatório) | Account | |
| token (obrigatório) | object | |
| token.name (obrigatório) | string | O nome da máquina indicado no início de sessão. |
| token.createdAt (obrigatório) | string, date-time | |
| token.expiresAt (obrigatório) | string, date-time |
MyBot
| Campo | Tipo | Descrição |
|---|---|---|
| did (obrigatório) | string | |
| handle (obrigatório) | string | null | O handle `*.bluesky.bot` reivindicado; null quando não há nenhum. |
| previousHandle (obrigatório) | string | null | O handle do bot antes de ter um aqui. |
| displayName (obrigatório) | string | null | |
| avatar (obrigatório) | string | null | |
| verifiedAt (obrigatório) | string | null, date-time | Quando se confirmou que o handle reivindicado está ativo no Bluesky. |
| listed (obrigatório) | boolean | Apresentado no diretório público. |
| status (obrigatório) | string: "active", "suspended" |
MyBotList
| Campo | Tipo | Descrição |
|---|---|---|
| bots (obrigatório) | MyBot[] |
ClaimRequest
| Campo | Tipo | Descrição |
|---|---|---|
| name (obrigatório) | string | A parte do nome, por ex. `weather` para `weather.bluesky.bot`. |
SwitchOutcome
| Campo | Tipo | Descrição |
|---|---|---|
| status (obrigatório) | string: "verified", "pending", "manual" | |
| verifiedAt | string, date-time | |
| reason | string: "reauthorize", "pds_refused", "pds_unreachable" |
ClaimResult
| Campo | Tipo | Descrição |
|---|---|---|
| handle (obrigatório) | string | |
| switch (obrigatório) | SwitchOutcome |
SwitchResult
| Campo | Tipo | Descrição |
|---|---|---|
| switch (obrigatório) | SwitchOutcome |
ReleaseResult
| Campo | Tipo | Descrição |
|---|---|---|
| handle (obrigatório) | string | O handle libertado. |
| revert (obrigatório) | object | `reverted`: o bot voltou a `handle`. `manual`: mude o handle do bot no Bluesky por si; `reason` diz porquê. |
| revert.status (obrigatório) | string: "reverted", "manual" | |
| revert.handle | string | |
| revert.reason | string: "reauthorize", "pds_refused", "pds_unreachable", "no_previous_handle" | |
| revert.previousHandle | string | null |