Machine-readable · version 1

Public JSON API

Read the directory from your own code or agent. No key and no sign-up: send a GET request and you get JSON back.

Base URL
https://boardsandbots.com/api/v1
Format
JSON, UTF-8. Dates are ISO 8601 in UTC.
CORS
Open to every origin (Access-Control-Allow-Origin: *), so a browser page can call it.
Caching
Responses are cached for 5 minutes. Asking more often returns the same data.
Stability
New fields may be added. Existing fields keep their names and meanings within v1.

Responses hold only public entries. Internal scores, our curator's notes and anything about members' accounts are never part of a response. If you show our summaries somewhere, link to the entry's url.

GET/api/v1/entries

Published entries, newest first, with the same filters as the feeds on the site.

Filters combine: an entry must match every one you send. Tag slugs come from /api/v1/tags. Paging: when there are more entries, nextCursor is set and next is the full URL of the next page with your filters kept. Keep requesting next until it is null. Unknown parameters are ignored; a tag slug that does not exist returns an empty list.

Query parameters for /api/v1/entries
ParameterValuesWhat it does
kindtool, build, fail, guide, news, discussionOnly entries of this kind.
areatag slug, e.g. firmwareOnly entries with this area tag.
boardtag slug, e.g. esp32Only entries with this board tag.
instrumenttag slug, e.g. oscilloscopeOnly entries with this instrument tag.
agenttag slug, e.g. claude-codeOnly entries with this agent tag.
interfacetag slug, e.g. mcpOnly entries with this interface tag.
verificationverified, evidence, claimedOnly entries at this verification level.
sortnew (default), hot, topnew: newest first. hot: points weighed against age. top: most upvoted, then newest.
limit1 to 50, default 20Entries per page. Larger values count as 50.
beforea nextCursor valueStart after the last entry of the previous page. Use it with the same sort and filters.

Example request

curl "https://boardsandbots.com/api/v1/entries?limit=1"

Example response

{
  "entries": [
    {
      "slug": "esp-mosaico-an-esp32-s31-modular-devkit-built-for-coding-agents",
      "number": 247,
      "catalogNumber": "BB-0247",
      "url": "https://boardsandbots.com/e/esp-mosaico-an-esp32-s31-modular-devkit-built-for-coding-agents",
      "shortUrl": "https://boardsandbots.com/bb/247",
      "kind": "news",
      "kindName": "News",
      "title": "ESP-Mosaico: an ESP32-S31 modular devkit built for coding agents",
      "summary": "CNX Software reported on 21 October that Espressif sells ESP-Mosaico, a modular ESP32-S31 kit with a square touchscreen, for $59 on its own store. Espressif'…",
      "source": {
        "url": "https://www.cnx-software.com/2026/10/21/esp-mosaico-an-esp32-s31-based-modular-development-platform-for-ai-assisted-hardware-creation/",
        "platform": "blog",
        "author": {
          "name": "Jean-Luc Aufranc",
          "handle": null,
          "url": "https://www.cnx-software.com/"
        },
        "publishedAt": "2026-10-21T07:00:29.000Z"
      },
      "repo": {
        "url": "https://github.com/esp-mosaico/esp-mosaico-vibe",
        "stars": 52,
        "license": null,
        "language": "Python",
        "pushedAt": "2026-10-22T06:55:27.000Z"
      },
      "verification": {
        "level": "claimed",
        "name": "Claimed",
        "evidence": "News article and vendor guide with product photos; no agent session on the board shown."
      },
      "affiliation": null,
      "featured": null,
      "tags": [
        {
          "facet": "board",
          "slug": "esp32",
          "name": "ESP32",
          "url": "https://boardsandbots.com/t/board/esp32"
        },
        {
          "facet": "agent",
          "slug": "claude-code",
          "name": "Claude Code",
          "url": "https://boardsandbots.com/t/agent/claude-code"
        },
        {
          "facet": "agent",
          "slug": "codex",
          "name": "Codex",
          "url": "https://boardsandbots.com/t/agent/codex"
        },
        {
          "facet": "area",
          "slug": "firmware",
          "name": "Firmware & embedded",
          "url": "https://boardsandbots.com/t/area/firmware"
        }
      ],
      "counts": {
        "upvotes": 0,
        "saves": 0,
        "comments": 0
      },
      "publishedAt": "2026-10-21T07:00:29.000Z",
      "updatedAt": "2026-10-21T07:00:29.000Z"
    }
  ],
  "nextCursor": "1792566029000~seed-esp-mosaico-an-esp32-s31-modular-devkit-built-for-coding-ag",
  "next": "https://boardsandbots.com/api/v1/entries?limit=1&before=1792566029000~seed-esp-mosaico-an-esp32-s31-modular-devkit-built-for-coding-ag"
}

GET/api/v1/entries/:slug

One entry with our briefing and the source's quote, if there is one.

Answers 404 when no public entry has the slug and 410 when the entry was removed (for example after a takedown request).

Example request

curl "https://boardsandbots.com/api/v1/entries/esp-mosaico-an-esp32-s31-modular-devkit-built-for-coding-agents"

Example response

{
  "entry": {
    "slug": "esp-mosaico-an-esp32-s31-modular-devkit-built-for-coding-agents",
    "number": 247,
    "catalogNumber": "BB-0247",
    "url": "https://boardsandbots.com/e/esp-mosaico-an-esp32-s31-modular-devkit-built-for-coding-agents",
    "shortUrl": "https://boardsandbots.com/bb/247",
    "kind": "news",
    "kindName": "News",
    "title": "ESP-Mosaico: an ESP32-S31 modular devkit built for coding agents",
    "summary": "CNX Software reported on 21 October that Espressif sells ESP-Mosaico, a modular ESP32-S31 kit with a square touchscreen, for $59 on its own store. Espressif'…",
    "source": {
      "url": "https://www.cnx-software.com/2026/10/21/esp-mosaico-an-esp32-s31-based-modular-development-platform-for-ai-assisted-hardware-creation/",
      "platform": "blog",
      "author": {
        "name": "Jean-Luc Aufranc",
        "handle": null,
        "url": "https://www.cnx-software.com/"
      },
      "publishedAt": "2026-10-21T07:00:29.000Z"
    },
    "repo": {
      "url": "https://github.com/esp-mosaico/esp-mosaico-vibe",
      "stars": 52,
      "license": null,
      "language": "Python",
      "pushedAt": "2026-10-22T06:55:27.000Z"
    },
    "verification": {
      "level": "claimed",
      "name": "Claimed",
      "evidence": "News article and vendor guide with product photos; no agent session on the board shown."
    },
    "affiliation": null,
    "featured": null,
    "tags": [
      {
        "facet": "board",
        "slug": "esp32",
        "name": "ESP32",
        "url": "https://boardsandbots.com/t/board/esp32"
      },
      {
        "facet": "agent",
        "slug": "claude-code",
        "name": "Claude Code",
        "url": "https://boardsandbots.com/t/agent/claude-code"
      },
      {
        "facet": "agent",
        "slug": "codex",
        "name": "Codex",
        "url": "https://boardsandbots.com/t/agent/codex"
      },
      {
        "facet": "area",
        "slug": "firmware",
        "name": "Firmware & embedded",
        "url": "https://boardsandbots.com/t/area/firmware"
      }
    ],
    "counts": {
      "upvotes": 0,
      "saves": 0,
      "comments": 0
    },
    "publishedAt": "2026-10-21T07:00:29.000Z",
    "updatedAt": "2026-10-21T07:00:29.000Z",
    "status": "published",
    "bodyMd": "The kit pairs an ESP32-S31 core board, with 16 MB of PSRAM, a 2.16-inch 480 x 480 touchscreen, an IMU and two magnetometers, with a base board, a camera modu…",
    "quote": null
  }
}

GET/api/v1/tags

Every tag with how many published entries carry it, grouped by facet, most used first.

The example shows the first three of the response's tags.

Query parameters for /api/v1/tags
ParameterValuesWhat it does
facetarea, board, instrument, agent, interfaceOnly the tags in this facet.

Example request

curl "https://boardsandbots.com/api/v1/tags?facet=board"

Example response

{
  "tags": [
    {
      "facet": "board",
      "facetName": "Board",
      "slug": "esp32",
      "name": "ESP32",
      "count": 69,
      "url": "https://boardsandbots.com/t/board/esp32",
      "feed": "https://boardsandbots.com/t/board/esp32/feed.xml"
    },
    {
      "facet": "board",
      "facetName": "Board",
      "slug": "stm32",
      "name": "STM32",
      "count": 23,
      "url": "https://boardsandbots.com/t/board/stm32",
      "feed": "https://boardsandbots.com/t/board/stm32/feed.xml"
    },
    {
      "facet": "board",
      "facetName": "Board",
      "slug": "rp2040",
      "name": "Raspberry Pi Pico (RP2040/RP2350)",
      "count": 19,
      "url": "https://boardsandbots.com/t/board/rp2040",
      "feed": "https://boardsandbots.com/t/board/rp2040/feed.xml"
    }
  ]
}

MCP/mcp

A remote MCP server for AI agents. An agent can search the directory and answer questions such as "which MCP servers support a Saleae?" without scraping pages. Read-only, no key and no sign-in.

Add it to Claude Code

claude mcp add --transport http boards-and-bots https://boardsandbots.com/mcp

Other clients: add a remote server with the Streamable HTTP transport and the URL https://boardsandbots.com/mcp. There is nothing to configure beyond the URL.

Transport
Streamable HTTP. Send each JSON-RPC message with POST; answers are single JSON objects. GET answers 405: there is no standalone event stream.
Protocol
2026-07-28 (no handshake, version in each request's _meta) and the earlier 2025-11-25, 2025-06-18, 2025-03-26 with initialize. Stateless: no sessions.
Rate limit
60 requests per 60 seconds per IP address. Over that you get 429 with a Retry-After header.
CORS
Open to every origin, so a browser-based client can connect.
Tools on the MCP server
ToolArguments (? optional)What it returns
search_entriesquerykind?limit?Entries matching your words, best match first. For free-text questions.
get_entryidOne entry by catalog number (BB-0142), slug or URL, with our briefing and the source quote.
list_tools_forboard?instrument?agent?interface?area?kind?sort?limit?cursor?Tool entries tagged with a board, instrument, agent, interface or area. Filters combine.
latestkind?since?limit?cursor?The newest entries, optionally of one kind and since a date.

Results carry entries in the same shape as this API (the entry object), both as structuredContent and as JSON text. A value the tool cannot use (an unknown board, a limit over 50) comes back as a tool result with isError: true and a sentence saying what to change.

Example request

curl -s https://boardsandbots.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"latest","arguments":{"limit":1}}}'

Example response

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\"kind\":null,\"since\":null,\"count\":1,\"nextCursor\":\"1792566029000~seed-esp-mosaico-an-esp32-s31-modular-devkit-built-for-coding-ag\",\"entries\":[{\"slug\":\"esp-mos…"
      }
    ],
    "structuredContent": {
      "kind": null,
      "since": null,
      "count": 1,
      "nextCursor": "1792566029000~seed-esp-mosaico-an-esp32-s31-modular-devkit-built-for-coding-ag",
      "entries": [
        {
          "slug": "esp-mosaico-an-esp32-s31-modular-devkit-built-for-coding-agents",
          "number": 247,
          "catalogNumber": "BB-0247",
          "url": "https://boardsandbots.com/e/esp-mosaico-an-esp32-s31-modular-devkit-built-for-coding-agents",
          "shortUrl": "https://boardsandbots.com/bb/247",
          "kind": "news",
          "kindName": "News",
          "title": "ESP-Mosaico: an ESP32-S31 modular devkit built for coding agents",
          "summary": "CNX Software reported on 21 October that Espressif sells ESP-Mosaico, a modular ESP32-S31 kit with a square touchscreen, for $59 on its own store. Espressif'…",
          "source": {
            "url": "https://www.cnx-software.com/2026/10/21/esp-mosaico-an-esp32-s31-based-modular-development-platform-for-ai-assisted-hardware-creation/",
            "platform": "blog",
            "author": {
              "name": "Jean-Luc Aufranc",
              "handle": null,
              "url": "https://www.cnx-software.com/"
            },
            "publishedAt": "2026-10-21T07:00:29.000Z"
          },
          "repo": {
            "url": "https://github.com/esp-mosaico/esp-mosaico-vibe",
            "stars": 52,
            "license": null,
            "language": "Python",
            "pushedAt": "2026-10-22T06:55:27.000Z"
          },
          "verification": {
            "level": "claimed",
            "name": "Claimed",
            "evidence": "News article and vendor guide with product photos; no agent session on the board shown."
          },
          "affiliation": null,
          "featured": null,
          "tags": [
            {
              "facet": "board",
              "slug": "esp32",
              "name": "ESP32",
              "url": "https://boardsandbots.com/t/board/esp32"
            },
            {
              "facet": "agent",
              "slug": "claude-code",
              "name": "Claude Code",
              "url": "https://boardsandbots.com/t/agent/claude-code"
            },
            {
              "facet": "agent",
              "slug": "codex",
              "name": "Codex",
              "url": "https://boardsandbots.com/t/agent/codex"
            },
            {
              "facet": "area",
              "slug": "firmware",
              "name": "Firmware & embedded",
              "url": "https://boardsandbots.com/t/area/firmware"
            }
          ],
          "counts": {
            "upvotes": 0,
            "saves": 0,
            "comments": 0
          },
          "publishedAt": "2026-10-21T07:00:29.000Z",
          "updatedAt": "2026-10-21T07:00:29.000Z"
        }
      ]
    },
    "isError": false
  }
}

The entry object

Lists return entries in this shape; the single-entry endpoint adds status, bodyMd and quote.

Fields of an entry
FieldTypeMeaning
slugstringStable id. Never changes after publish.
numbercatalogNumbernumber, stringCatalog number (142) and how we print it (BB-0142).
urlshortUrlstringThe entry page and its short link (/bb/142).
kindkindNamestringOne of tool, build, fail, guide, news, discussion, and its display name.
titlestringOur title for the entry.
summarystringOur summary, at most 60 words. Never the author's text.
sourceobjecturl, platform (github, youtube, blog ...), author { name, handle, url } or null, publishedAt.
repoobject or nullurl, stars, license, language, pushedAt for entries with a code repository.
verificationobjectlevel (verified, evidence, claimed), name, and evidence: our note on what we saw.
affiliationobject or nullkind (team, sponsored) and label, when the entry is about something we make or a sponsor paid for.
featuredstring or nullpick or build-of-the-week.
tagsarray{ facet, slug, name, url } for each tag.
countsobjectupvotes, saves, comments.
publishedAtupdatedAtstringISO 8601, UTC.
statusstringEntry endpoint only: published, or archived (outdated, kept so links work).
bodyMdstring or nullEntry endpoint only: our briefing, or the member's post, as Markdown. Sanitize it before you render it as HTML.
quotestring or nullEntry endpoint only: a quote from the source, 25 words at most; credit source.author when you show it.

Errors

Errors use the HTTP status (400 for a bad parameter, 404 not found, 410 removed) and a JSON body with a machine-readable error, a sentence in message, and for 400 the parameters that were wrong:

{
  "error": "bad_request",
  "message": "One or more query parameters are not valid. See /api for the accepted values.",
  "issues": [
    {
      "param": "kind",
      "message": "Invalid option: expected one of \"tool\"|\"build\"|\"fail\"|\"guide\"|\"news\"|\"discussion\""
    }
  ]
}

Feeds, sitemap and llms.txt

RSS 2.0 feeds carry the newest 50 entries with our summaries, refreshed every few minutes.