Developer API

Publish firmware and inspect project status

Use API keys to publish merged `.bin` files from GitHub Actions, PlatformIO, or another release pipeline, and to fetch your project statuses and publishing stats.

Publish endpoint

POST /api/v1/firmware/publish

Send `Authorization: Bearer <api_key>` and upload a multipart field named `firmware` containing the merged `.bin` file. The project must already exist in your dashboard.

Projects endpoint

GET /api/v1/projects

Uses the same API key header. Without a slug it returns a lightweight project list; with `project_slug` it returns detailed version, target, and firmware build data for one project.

Required fields

project_slugExisting mission/project slug owned by the API key account.
versionRelease version, for example `v1.2.0`.
board_slugExisting target board slug. Use `allow_unspecified_board=1` to upload an unresolved target for later assignment.
firmwareMerged `.bin` file.

Publishing the same project version and board target again overwrites that firmware build. If the board is unresolved, ESPVerse matches by version and target label.

Status API

List your projects

curl -H "Authorization: Bearer ${ESPVERSE_API_KEY}" \
  "https://espverse.com/api/v1/projects"

Without a slug, the response is a lightweight list with project status, visibility, URLs, and basic stats.

{
  "ok": true,
  "mode": "list",
  "count": 1,
  "projects": [
    {
      "name": "Smartwatch",
      "slug": "smartwatch",
      "status": "published",
      "visibility": "public",
      "stats": {
        "flashes": 128,
        "rating_average": 4.8,
        "rating_count": 24,
        "supported_boards": 8
      }
    }
  ]
}
curl -H "Authorization: Bearer ${ESPVERSE_API_KEY}" \
  "https://espverse.com/api/v1/projects?project_slug=smartwatch"

Pass `project_slug` or `slug` to return one detailed project with `versions[]`, `targets[]`, and `builds[]` including manifest/download URLs.

{
  "ok": true,
  "mode": "detail",
  "project_slug": "smartwatch",
  "project": {
    "name": "Smartwatch",
    "slug": "smartwatch",
    "status": "published",
    "stats": {
      "flashes": 128,
      "versions": 2,
      "builds": 8,
      "published_builds": 8
    },
    "versions": [
      { "version": "v6.3", "status": "published", "published_build_count": 8 }
    ],
    "builds": [
      {
        "version": "v6.3",
        "status": "published",
        "target": { "board_slug": "m5_dial", "resolved": true },
        "flash_count": 42,
        "manifest_url": "/api/builds/123/manifest"
      }
    ]
  }
}

Project badge

Show it is flashable on ESPVerse

Preview

Flashable on ESPVerse

Replace `YOUR_PROJECT_SLUG` with the project slug from your ESPVerse mission page.

README snippets

<a href="https://espverse.com/missions/YOUR_PROJECT_SLUG"><img src="https://espverse.com/assets/images/espverse_badge.png" alt="Flashable on ESPVerse" width="200"></a>
<a href="https://espverse.com/missions/YOUR_PROJECT_SLUG"><img src="https://espverse.com/assets/images/espverse_badge.png" alt="Flashable on ESPVerse" width="200"></a>

cURL

Direct upload

curl -X POST "https://espverse.com/api/v1/firmware/publish" \
  -H "Authorization: Bearer ${ESPVERSE_API_KEY}" \
  -F "project_slug=smartwatch" \
  -F "version=v6.3" \
  -F "board_slug=m5_dial" \
  -F "chip_family=ESP32-S3" \
  -F "flash_offset=0x0" \
  -F "status=draft" \
  -F "allow_unspecified_board=0" \
  -F "firmware=@.pio/build/m5_dial/firmware.bin;type=application/octet-stream"