Bluesky.bot

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

Baixar o documento OpenAPI 3.1

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

NomeLocalTipoDescrição
name (obrigatório)pathstringA parte do nome, por ex. `weather`; `@weather.bluesky.bot` também é aceite.

Respostas

StatusDescriçãoCorpo
200A disponibilidade, com o motivo quando não está disponível.Availability
404Não encontrado. Também devolvido no subdomínio do handle de um bot: a API só é servida no site principal.Error
429Limite de utilização atingido (política `publicApi`, por IP).Error
500Erro inesperado.Error

Exemplo

bash
curl https://bluesky.bot/api/v1/handles/weather/availability

O 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

NomeLocalTipoDescrição
handle (obrigatório)pathstringUm handle completo, por ex. `weather.bluesky.bot` (sem distinção entre maiúsculas e minúsculas).

Respostas

StatusDescriçãoCorpo
200O handle e o seu DID.Resolution
400Não é um handle `*.bluesky.bot` (código `invalid_handle`).Error
404Não encontrado. Também devolvido no subdomínio do handle de um bot: a API só é servida no site principal.Error
429Limite de utilização atingido (política `publicApi`, por IP).Error
500Erro inesperado.Error

Exemplo

bash
curl https://bluesky.bot/api/v1/resolve/weather.bluesky.bot

Bots 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

NomeLocalTipoDescrição
limitqueryinteger (1–100), default 20
cursorquerystringCursor opaco de uma página anterior.
categoryquerystringCategoria exata.
verifiedquerystring: "true", "false"Apenas os bots cujo handle está (true) ou ainda não está (false) ativo no Bluesky.
qquerystringPesquisa sem distinção entre maiúsculas e minúsculas no handle e no nome apresentado.

Respostas

StatusDescriçãoCorpo
200Uma página de bots.BotList
400Parâmetro de pesquisa inválido (código `bad_request`).Error
404Não encontrado. Também devolvido no subdomínio do handle de um bot: a API só é servida no site principal.Error
429Limite de utilização atingido (política `publicApi`, por IP).Error
500Erro inesperado.Error

Exemplo

bash
curl https://bluesky.bot/api/v1/bots

Um bot listado no diretório

GET/bots/{handle}

Parâmetros

NomeLocalTipoDescrição
handle (obrigatório)pathstringUm handle completo, por ex. `weather.bluesky.bot` (sem distinção entre maiúsculas e minúsculas).

Respostas

StatusDescriçãoCorpo
200O bot.Bot
404Não encontrado. Também devolvido no subdomínio do handle de um bot: a API só é servida no site principal.Error
429Limite de utilização atingido (política `publicApi`, por IP).Error
500Erro inesperado.Error

Exemplo

bash
curl https://bluesky.bot/api/v1/bots/weather.bluesky.bot

Trocar 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

StatusDescriçãoCorpo
200Um token para os endpoints `/me/*`.CliToken
400Corpo 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
404Não encontrado. Também devolvido no subdomínio do handle de um bot: a API só é servida no site principal.Error
429Limite de utilização atingido (política `publicApi`, por IP).Error
500Erro inesperado.Error

Exemplo

bash
curl \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"code":"…","code_verifier":"…","redirect_uri":"…"}' \
  https://bluesky.bot/api/v1/cli/token

A conta por trás do token

GET/me

Respostas

StatusDescriçãoCorpo
200A sua conta e a expiração do token.Me
401Token em falta, expirado ou revogado (código `unauthorized`). Execute `bsbot login` novamente.Error
404Não existe esse bot na sua conta, ou é o subdomínio do handle de um bot (a API só é servida no site principal).Error
429Limite 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
500Erro inesperado.Error

Exemplo

bash
curl \
  -H "Authorization: Bearer $BLUESKY_BOT_TOKEN" \
  https://bluesky.bot/api/v1/me

Os 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

StatusDescriçãoCorpo
200Os seus bots.MyBotList
401Token em falta, expirado ou revogado (código `unauthorized`). Execute `bsbot login` novamente.Error
404Não existe esse bot na sua conta, ou é o subdomínio do handle de um bot (a API só é servida no site principal).Error
429Limite 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
500Erro inesperado.Error

Exemplo

bash
curl \
  -H "Authorization: Bearer $BLUESKY_BOT_TOKEN" \
  https://bluesky.bot/api/v1/me/bots

Reivindicar 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

NomeLocalTipoDescrição
did (obrigatório)pathstringO DID do bot, tal como listado por `GET /me/bots`.

Respostas

StatusDescriçãoCorpo
200O handle reivindicado e o resultado da mudança.ClaimResult
400Corpo mal formado (`bad_request`), ou um nome não permitido (`invalid_handle`, com `reason`).Error
401Token em falta, expirado ou revogado (código `unauthorized`). Execute `bsbot login` novamente.Error
403O bot está suspenso (`forbidden`).Error
404Não existe esse bot na sua conta, ou é o subdomínio do handle de um bot (a API só é servida no site principal).Error
409Outro bot tem o handle, ou ele está no período de carência (`conflict`, motivo `taken`).Error
429Limite 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
500Erro inesperado.Error

Exemplo

bash
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/claim

Pedir novamente ao PDS do bot que use o handle reivindicado

POST/me/bots/{did}/switch

Parâmetros

NomeLocalTipoDescrição
did (obrigatório)pathstringO DID do bot, tal como listado por `GET /me/bots`.

Respostas

StatusDescriçãoCorpo
200O resultado da mudança.SwitchResult
401Token em falta, expirado ou revogado (código `unauthorized`). Execute `bsbot login` novamente.Error
404Não existe esse bot na sua conta, ou é o subdomínio do handle de um bot (a API só é servida no site principal).Error
429Limite 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
500Erro inesperado.Error

Exemplo

bash
curl \
  -X POST \
  -H "Authorization: Bearer $BLUESKY_BOT_TOKEN" \
  https://bluesky.bot/api/v1/me/bots/did:plc:yourbot/switch

Verificar se o handle reivindicado está ativo no Bluesky

POST/me/bots/{did}/verify

Parâmetros

NomeLocalTipoDescrição
did (obrigatório)pathstringO DID do bot, tal como listado por `GET /me/bots`.

Respostas

StatusDescriçãoCorpo
200O resultado da verificação.SwitchResult
401Token em falta, expirado ou revogado (código `unauthorized`). Execute `bsbot login` novamente.Error
404Não existe esse bot na sua conta, ou é o subdomínio do handle de um bot (a API só é servida no site principal).Error
429Limite 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
500Erro inesperado.Error

Exemplo

bash
curl \
  -X POST \
  -H "Authorization: Bearer $BLUESKY_BOT_TOKEN" \
  https://bluesky.bot/api/v1/me/bots/did:plc:yourbot/verify

Libertar 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

NomeLocalTipoDescrição
did (obrigatório)pathstringO DID do bot, tal como listado por `GET /me/bots`.

Respostas

StatusDescriçãoCorpo
200O handle libertado e o resultado da reposição.ReleaseResult
401Token em falta, expirado ou revogado (código `unauthorized`). Execute `bsbot login` novamente.Error
403O bot está suspenso (`forbidden`).Error
404Não existe esse bot na sua conta, ou é o subdomínio do handle de um bot (a API só é servida no site principal).Error
409O bot não tem nenhum handle para libertar (`conflict`, motivo `no_handle`).Error
429Limite 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
500Erro inesperado.Error

Exemplo

bash
curl \
  -X POST \
  -H "Authorization: Bearer $BLUESKY_BOT_TOKEN" \
  https://bluesky.bot/api/v1/me/bots/did:plc:yourbot/release

Revogar o token deste pedido

DELETE/me/token

O que o `bsbot logout` chama.

Respostas

StatusDescriçãoCorpo
204Revogado. Sem corpo.
401Token em falta, expirado ou revogado (código `unauthorized`). Execute `bsbot login` novamente.Error
404Não existe esse bot na sua conta, ou é o subdomínio do handle de um bot (a API só é servida no site principal).Error
429Limite 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
500Erro inesperado.Error

Exemplo

bash
curl \
  -X DELETE \
  -H "Authorization: Bearer $BLUESKY_BOT_TOKEN" \
  https://bluesky.bot/api/v1/me/token

Esquemas

Error

CampoTipoDescriçã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.reasonstringCom `invalid_handle`, `conflict` e `forbidden`: por ex. `reserved`, `taken`, `no_handle`, `suspended`.
error.parameterstringO parâmetro de pesquisa inválido.
error.retryAfterSecondsinteger (1–)Com `rate_limited`.

Availability

CampoTipoDescrição
name (obrigatório)stringO nome normalizado (tal como escrito quando é inválido).
handle (obrigatório)string | nullO 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

CampoTipoDescrição
handle (obrigatório)string
did (obrigatório)string

Bot

CampoTipoDescrição
did (obrigatório)string
handle (obrigatório)string
displayName (obrigatório)string | null
avatar (obrigatório)string | nullURL do avatar.
description (obrigatório)string | null
category (obrigatório)string | null
verifiedAt (obrigatório)string | null, date-timeQuando se confirmou que o handle está ativo no Bluesky; null se ainda não.

BotList

CampoTipoDescrição
bots (obrigatório)Bot[]
cursor (obrigatório)string | nullCursor da página seguinte; null na última página.

CliTokenRequest

CampoTipoDescrição
code (obrigatório)string
code_verifier (obrigatório)stringO verificador PKCE (RFC 7636).
redirect_uri (obrigatório)stringO mesmo `http://127.0.0.1:<port>/callback` que em /cli/authorize.

CliToken

CampoTipoDescrição
token (obrigatório)stringMantenha-o secreto: age em seu nome em `/me/*`.
tokenType (obrigatório)string = "Bearer"
expiresAt (obrigatório)string, date-time
creator (obrigatório)Account

Account

CampoTipoDescrição
did (obrigatório)string
handle (obrigatório)stringO seu handle do Bluesky.
displayNamestring | null

Me

CampoTipoDescrição
creator (obrigatório)Account
token (obrigatório)object
token.name (obrigatório)stringO 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

CampoTipoDescrição
did (obrigatório)string
handle (obrigatório)string | nullO handle `*.bluesky.bot` reivindicado; null quando não há nenhum.
previousHandle (obrigatório)string | nullO handle do bot antes de ter um aqui.
displayName (obrigatório)string | null
avatar (obrigatório)string | null
verifiedAt (obrigatório)string | null, date-timeQuando se confirmou que o handle reivindicado está ativo no Bluesky.
listed (obrigatório)booleanApresentado no diretório público.
status (obrigatório)string: "active", "suspended"

MyBotList

CampoTipoDescrição
bots (obrigatório)MyBot[]

ClaimRequest

CampoTipoDescrição
name (obrigatório)stringA parte do nome, por ex. `weather` para `weather.bluesky.bot`.

SwitchOutcome

CampoTipoDescrição
status (obrigatório)string: "verified", "pending", "manual"
verifiedAtstring, date-time
reasonstring: "reauthorize", "pds_refused", "pds_unreachable"

ClaimResult

CampoTipoDescrição
handle (obrigatório)string
switch (obrigatório)SwitchOutcome

SwitchResult

CampoTipoDescrição
switch (obrigatório)SwitchOutcome

ReleaseResult

CampoTipoDescrição
handle (obrigatório)stringO 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.handlestring
revert.reasonstring: "reauthorize", "pds_refused", "pds_unreachable", "no_previous_handle"
revert.previousHandlestring | null