Bluesky.bot

Référence de l’API

Les endpoints publics sont en lecture seule, sans authentification, et limités en débit par IP. Les endpoints `/me/*` servent à l’outil en ligne de commande `bsbot` : ils demandent un jeton (`Authorization: Bearer`), que `bsbot login` obtient via le navigateur (`POST /cli/token`). Ils n’envoient aucun en-tête CORS. Servie uniquement sur le site principal, jamais sur le sous-domaine du handle d’un bot. Versions : la version majeure figure dans le chemin (`/api/v1`) ; la v1 ne reçoit que des changements rétrocompatibles (nouveaux endpoints, nouveaux champs ou paramètres facultatifs). Un changement incompatible sort en `/api/v2`, et la v1 continue alors de fonctionner au moins 6 mois, annoncée par les en-têtes `Deprecation` et `Sunset`. Voir docs/api.md.

URL de base
https://bluesky.bot/api/v1
Version
1.0.0

Télécharger le document OpenAPI 3.1

Un handle est-il libre ?

GET/handles/{name}/availability

Applique exactement les règles serveur d’une réservation : format, noms réservés, mots injurieux, puis si un bot le détient déjà.

Paramètres

NomEmplacementTypeDescription
name (obligatoire)pathstringLa partie nom, par ex. `weather` ; `@weather.bluesky.bot` est aussi accepté.

Réponses

StatutDescriptionCorps
200La disponibilité, avec la raison quand le handle n’est pas disponible.Availability
404Introuvable. Également renvoyé sur le sous-domaine du handle d’un bot : l’API n’est servie que sur le site principal.Error
429Limite de débit atteinte (politique `publicApi`, par IP).Error
500Erreur inattendue.Error

Exemple

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

Le DID derrière un handle réservé

GET/resolve/{handle}

Même réponse que `https://<handle>/.well-known/atproto-did`. Seulement les handles `*.bluesky.bot`.

Paramètres

NomEmplacementTypeDescription
handle (obligatoire)pathstringUn handle complet, par ex. `weather.bluesky.bot` (insensible à la casse).

Réponses

StatutDescriptionCorps
200Le handle et son DID.Resolution
400Pas un handle `*.bluesky.bot` (code `invalid_handle`).Error
404Introuvable. Également renvoyé sur le sous-domaine du handle d’un bot : l’API n’est servie que sur le site principal.Error
429Limite de débit atteinte (politique `publicApi`, par IP).Error
500Erreur inattendue.Error

Exemple

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

Bots inscrits dans l’annuaire

GET/bots

Seulement les bots que leur créateur a inscrits dans l’annuaire, du plus récent au plus ancien. Pagination par curseur : passez le `cursor` d’une page pour obtenir la suivante ; il vaut null sur la dernière page.

Paramètres

NomEmplacementTypeDescription
limitqueryinteger (1–100), default 20
cursorquerystringCurseur opaque d’une page précédente.
categoryquerystringCatégorie exacte.
verifiedquerystring: "true", "false"Seulement les bots dont le handle est (true) ou n’est pas encore (false) actif sur Bluesky.
qquerystringRecherche insensible à la casse dans le handle et le nom affiché.

Réponses

StatutDescriptionCorps
200Une page de bots.BotList
400Paramètre de requête invalide (code `bad_request`).Error
404Introuvable. Également renvoyé sur le sous-domaine du handle d’un bot : l’API n’est servie que sur le site principal.Error
429Limite de débit atteinte (politique `publicApi`, par IP).Error
500Erreur inattendue.Error

Exemple

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

Un bot inscrit dans l’annuaire

GET/bots/{handle}

Paramètres

NomEmplacementTypeDescription
handle (obligatoire)pathstringUn handle complet, par ex. `weather.bluesky.bot` (insensible à la casse).

Réponses

StatutDescriptionCorps
200Le bot.Bot
404Introuvable. Également renvoyé sur le sous-domaine du handle d’un bot : l’API n’est servie que sur le site principal.Error
429Limite de débit atteinte (politique `publicApi`, par IP).Error
500Erreur inattendue.Error

Exemple

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

Échanger un code de connexion de la CLI contre un jeton

POST/cli/token

Étape 4 de `bsbot login` : le code à usage unique que /cli/authorize a remis à l’adresse de loopback de la CLI, avec le vérificateur PKCE et la même URI de redirection. Un code sert une seule fois, pendant deux minutes ; une tentative ratée le consomme. Le jeton est valable 30 jours. Limité en débit par IP (`cliToken`).

Réponses

StatutDescriptionCorps
200Un jeton pour les endpoints `/me/*`.CliToken
400Corps mal formé (`bad_request`), ou code inconnu, expiré, déjà utilisé, ou qui ne correspond pas au vérificateur ou à l’URI de redirection (`invalid_grant`).Error
404Introuvable. Également renvoyé sur le sous-domaine du handle d’un bot : l’API n’est servie que sur le site principal.Error
429Limite de débit atteinte (politique `publicApi`, par IP).Error
500Erreur inattendue.Error

Exemple

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

Le compte derrière le jeton

GET/me

Réponses

StatutDescriptionCorps
200Votre compte et l’expiration du jeton.Me
401Jeton absent, expiré ou révoqué (code `unauthorized`). Relancez `bsbot login`.Error
404Aucun bot de ce nom dans votre compte, ou sous-domaine du handle d’un bot (l’API n’est servie que sur le site principal).Error
429Limite de débit atteinte : `publicApi` par IP, `creatorApi` par compte, et `handleChange` par compte pour les réservations, changements, vérifications et libérations (partagée avec le tableau de bord).Error
500Erreur inattendue.Error

Exemple

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

Vos bots

GET/me/bots

Tous les bots de votre compte, inscrits dans l’annuaire ou non, du plus ancien au plus récent. Ajoutez un bot depuis le tableau de bord : il faut se connecter au compte du bot.

Réponses

StatutDescriptionCorps
200Vos bots.MyBotList
401Jeton absent, expiré ou révoqué (code `unauthorized`). Relancez `bsbot login`.Error
404Aucun bot de ce nom dans votre compte, ou sous-domaine du handle d’un bot (l’API n’est servie que sur le site principal).Error
429Limite de débit atteinte : `publicApi` par IP, `creatorApi` par compte, et `handleChange` par compte pour les réservations, changements, vérifications et libérations (partagée avec le tableau de bord).Error
500Erreur inattendue.Error

Exemple

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

Réserver un handle pour l’un de vos bots, et le lui appliquer

POST/me/bots/{did}/claim

Les règles du tableau de bord : format, noms réservés, mots injurieux, disponibilité (garantie par un index unique), délai de grâce des handles libérés. Le handle du bot est ensuite changé sur Bluesky immédiatement ; `switch` indique comment cela s’est passé. Changer le handle d’un bot qui en a déjà un libère l’ancien.

Paramètres

NomEmplacementTypeDescription
did (obligatoire)pathstringLe DID du bot, tel que listé par `GET /me/bots`.

Réponses

StatutDescriptionCorps
200Le handle réservé et le résultat du changement.ClaimResult
400Corps mal formé (`bad_request`), ou nom non autorisé (`invalid_handle`, avec `reason`).Error
401Jeton absent, expiré ou révoqué (code `unauthorized`). Relancez `bsbot login`.Error
403Le bot est suspendu (`forbidden`).Error
404Aucun bot de ce nom dans votre compte, ou sous-domaine du handle d’un bot (l’API n’est servie que sur le site principal).Error
409Un autre bot détient le handle, ou il est dans son délai de grâce (`conflict`, raison `taken`).Error
429Limite de débit atteinte : `publicApi` par IP, `creatorApi` par compte, et `handleChange` par compte pour les réservations, changements, vérifications et libérations (partagée avec le tableau de bord).Error
500Erreur inattendue.Error

Exemple

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

Redemander au PDS du bot d’utiliser son handle réservé

POST/me/bots/{did}/switch

Paramètres

NomEmplacementTypeDescription
did (obligatoire)pathstringLe DID du bot, tel que listé par `GET /me/bots`.

Réponses

StatutDescriptionCorps
200Le résultat du changement.SwitchResult
401Jeton absent, expiré ou révoqué (code `unauthorized`). Relancez `bsbot login`.Error
404Aucun bot de ce nom dans votre compte, ou sous-domaine du handle d’un bot (l’API n’est servie que sur le site principal).Error
429Limite de débit atteinte : `publicApi` par IP, `creatorApi` par compte, et `handleChange` par compte pour les réservations, changements, vérifications et libérations (partagée avec le tableau de bord).Error
500Erreur inattendue.Error

Exemple

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

Vérifier si le handle réservé est actif sur Bluesky

POST/me/bots/{did}/verify

Paramètres

NomEmplacementTypeDescription
did (obligatoire)pathstringLe DID du bot, tel que listé par `GET /me/bots`.

Réponses

StatutDescriptionCorps
200Le résultat de la vérification.SwitchResult
401Jeton absent, expiré ou révoqué (code `unauthorized`). Relancez `bsbot login`.Error
404Aucun bot de ce nom dans votre compte, ou sous-domaine du handle d’un bot (l’API n’est servie que sur le site principal).Error
429Limite de débit atteinte : `publicApi` par IP, `creatorApi` par compte, et `handleChange` par compte pour les réservations, changements, vérifications et libérations (partagée avec le tableau de bord).Error
500Erreur inattendue.Error

Exemple

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

Libérer le handle d’un bot

POST/me/bots/{did}/release

Le bot retrouve son handle Bluesky précédent quand c’est possible, le handle cesse d’être résolu, et il reste bloqué pour les autres pendant son délai de grâce.

Paramètres

NomEmplacementTypeDescription
did (obligatoire)pathstringLe DID du bot, tel que listé par `GET /me/bots`.

Réponses

StatutDescriptionCorps
200Le handle libéré et le résultat du retour en arrière.ReleaseResult
401Jeton absent, expiré ou révoqué (code `unauthorized`). Relancez `bsbot login`.Error
403Le bot est suspendu (`forbidden`).Error
404Aucun bot de ce nom dans votre compte, ou sous-domaine du handle d’un bot (l’API n’est servie que sur le site principal).Error
409Le bot n’a aucun handle à libérer (`conflict`, raison `no_handle`).Error
429Limite de débit atteinte : `publicApi` par IP, `creatorApi` par compte, et `handleChange` par compte pour les réservations, changements, vérifications et libérations (partagée avec le tableau de bord).Error
500Erreur inattendue.Error

Exemple

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

Révoquer le jeton de cette requête

DELETE/me/token

Ce qu’appelle `bsbot logout`.

Réponses

StatutDescriptionCorps
204Révoqué. Pas de corps.
401Jeton absent, expiré ou révoqué (code `unauthorized`). Relancez `bsbot login`.Error
404Aucun bot de ce nom dans votre compte, ou sous-domaine du handle d’un bot (l’API n’est servie que sur le site principal).Error
429Limite de débit atteinte : `publicApi` par IP, `creatorApi` par compte, et `handleChange` par compte pour les réservations, changements, vérifications et libérations (partagée avec le tableau de bord).Error
500Erreur inattendue.Error

Exemple

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

Schémas

Error

ChampTypeDescription
error (obligatoire)object
error.code (obligatoire)string: "bad_request", "invalid_handle", "not_found", "rate_limited", "internal_error", "unauthorized", "forbidden", "conflict", "invalid_grant"
error.message (obligatoire)string
error.reasonstringAvec `invalid_handle`, `conflict` et `forbidden` : par ex. `reserved`, `taken`, `no_handle`, `suspended`.
error.parameterstringLe paramètre de requête invalide.
error.retryAfterSecondsinteger (1–)Avec `rate_limited`.

Availability

ChampTypeDescription
name (obligatoire)stringLe nom normalisé (tel que saisi s’il est invalide).
handle (obligatoire)string | nullLe handle complet, par ex. `weather.bluesky.bot` ; null quand le nom est invalide.
available (obligatoire)boolean
reason (obligatoire)null | string: "required", "too_short", "too_long", "invalid_characters", "invalid_hyphen", "reserved", "not_allowed", "taken"Pourquoi il n’est pas disponible ; null s’il l’est. Les noms font 3 à 30 caractères parmi a-z, 0-9 et des tirets isolés.

Resolution

ChampTypeDescription
handle (obligatoire)string
did (obligatoire)string

Bot

ChampTypeDescription
did (obligatoire)string
handle (obligatoire)string
displayName (obligatoire)string | null
avatar (obligatoire)string | nullURL de l’avatar.
description (obligatoire)string | null
category (obligatoire)string | null
verifiedAt (obligatoire)string | null, date-timeQuand le handle a été confirmé actif sur Bluesky ; null sinon.

BotList

ChampTypeDescription
bots (obligatoire)Bot[]
cursor (obligatoire)string | nullCurseur de la page suivante ; null sur la dernière page.

CliTokenRequest

ChampTypeDescription
code (obligatoire)string
code_verifier (obligatoire)stringLe vérificateur PKCE (RFC 7636).
redirect_uri (obligatoire)stringLa même `http://127.0.0.1:<port>/callback` que sur /cli/authorize.

CliToken

ChampTypeDescription
token (obligatoire)stringGardez-le secret : il agit en votre nom sur `/me/*`.
tokenType (obligatoire)string = "Bearer"
expiresAt (obligatoire)string, date-time
creator (obligatoire)Account

Account

ChampTypeDescription
did (obligatoire)string
handle (obligatoire)stringVotre handle Bluesky.
displayNamestring | null

Me

ChampTypeDescription
creator (obligatoire)Account
token (obligatoire)object
token.name (obligatoire)stringLe nom de machine donné à la connexion.
token.createdAt (obligatoire)string, date-time
token.expiresAt (obligatoire)string, date-time

MyBot

ChampTypeDescription
did (obligatoire)string
handle (obligatoire)string | nullLe handle `*.bluesky.bot` réservé ; null s’il n’y en a pas.
previousHandle (obligatoire)string | nullLe handle du bot avant qu’il n’en obtienne un ici.
displayName (obligatoire)string | null
avatar (obligatoire)string | null
verifiedAt (obligatoire)string | null, date-timeQuand le handle réservé a été confirmé actif sur Bluesky.
listed (obligatoire)booleanAffiché dans l’annuaire public.
status (obligatoire)string: "active", "suspended"

MyBotList

ChampTypeDescription
bots (obligatoire)MyBot[]

ClaimRequest

ChampTypeDescription
name (obligatoire)stringLa partie nom, par ex. `weather` pour `weather.bluesky.bot`.

SwitchOutcome

ChampTypeDescription
status (obligatoire)string: "verified", "pending", "manual"
verifiedAtstring, date-time
reasonstring: "reauthorize", "pds_refused", "pds_unreachable"

ClaimResult

ChampTypeDescription
handle (obligatoire)string
switch (obligatoire)SwitchOutcome

SwitchResult

ChampTypeDescription
switch (obligatoire)SwitchOutcome

ReleaseResult

ChampTypeDescription
handle (obligatoire)stringLe handle libéré.
revert (obligatoire)object`reverted` : le bot a retrouvé `handle`. `manual` : changez vous-même le handle du bot sur Bluesky ; `reason` indique pourquoi.
revert.status (obligatoire)string: "reverted", "manual"
revert.handlestring
revert.reasonstring: "reauthorize", "pds_refused", "pds_unreachable", "no_previous_handle"
revert.previousHandlestring | null