Request access

Reference

API

Every endpoint, with the fields it takes and what it returns.

Base URL https://api.useblackforge.com/v1. JSON in and out. Send your key as Authorization: Bearer bf_live_.... Every response has an x-request-id header. The limit is 300 requests a minute per key.

Endpoints

Method and pathDoes
POST /jobsStart a job
GET /jobsList your team's jobs, newest first, 50 per page
GET /jobs/{id}One job, with stage, result, GPUs and cost so far
POST /jobs/{id}/stopStop a job in any stage
GET /jobs/{id}/logsLogs. Add ?follow=true for a server sent event stream
GET /jobs/{id}/heatHeat samples for the job's GPUs
POST /sessionsStart a shell or notebook session
GET /forgesForges, free GPUs and wait estimates per plan
GET /forges/{id}/heatHeat samples for a whole forge
GET /bankHour bank blocks and balances
GET /usageBilled seconds by plan, forge and day. ?month=2026-09
GET /ledger/{month}A forge's monthly heat ledger
GET /incidentsThe incident log

POST /jobs

Fields are listed on Jobs. Returns 201 with the job, or 422 naming the field that is wrong.

curl https://api.useblackforge.com/v1/jobs \
  -H "Authorization: Bearer $BF_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "image": "ghcr.io/yourlab/train:latest",
    "command": ["torchrun", "--nproc-per-node=8", "train.py"],
    "gpus": 8,
    "plan": "bank",
    "limit": "2d",
    "tags": { "project": "tide-7b" }
  }'

The job object

{
  "id": "job_2a4k1",
  "forge": "f1",
  "plan": "bank",
  "stage": "strike",
  "result": null,
  "gpus": ["gpu0", "gpu1", "gpu2", "gpu3", "gpu4", "gpu5", "gpu6", "gpu7"],
  "node": "a",
  "queue_ahead": null,
  "started_at": "2026-10-21T08:14:02Z",
  "ended_at": null,
  "billed_seconds": 92160,
  "cost_usd": 79.10,
  "tags": { "project": "tide-7b" }
}

stage is queue, heat, strike or quench. result stays null until the job ends, then is one of succeeded, failed, stopped, preempted or hardware. billed_seconds counts GPU seconds, so 8 GPUs for one hour is 28,800.

GET /forges

{
  "forges": [{
    "id": "f1", "region": "is-south", "gpu": "b200-180gb", "gpus": 16,
    "free": { "strike": 5, "ember": 9 },
    "wait_minutes": { "strike": 0, "ember": 2 },
    "anvils": 1
  }]
}

Pagination

List endpoints return next. Pass it back as ?after= to get the next page. A missing next means you have everything.

Errors

See Errors for every code.