Cloud Overview
How CI systems send build data to BuildButler via the ingest REST API.
BuildButler Cloud is a hosted analytics backend and frontend that receives build data from any CI system. All integrations — whether a CLI reporter or an org-level webhook — funnel data into the same REST API at https://api.buildbutler.dev.
Architecture
Authentication
Every ingest request must include your API key in the Authorization header:
Get your API key from Settings → API Keys in the BuildButler dashboard.
Ingest Endpoints
All endpoints accept application/json and return application/json.
Base URL: https://api.buildbutler.dev/ingest
POST /ingest/builds
Records a completed build. This is the primary record that all other data references.
| Field | Type | Required | Notes |
|---|---|---|---|
jobName | string | Yes | Pipeline/workflow/job name |
buildNumber | integer | Yes | Build number |
status | string | Yes | success, failure, unstable, aborted, in_progress |
duration | integer | Yes | Duration in milliseconds |
startedAt | string | Yes | ISO 8601 datetime |
completedAt | string | Yes | ISO 8601 datetime |
jenkinsInstanceId | string | Yes | Unique identifier for the CI server or repo |
branch | string | No | Source branch |
commitSha | string | No | Commit hash |
cause | string | No | Trigger reason (e.g. push, pull_request, schedule) |
source | string | No | CI system identifier (e.g. github-actions, gitlab, buildkite) |
externalRunId | string (UUID) | No | Deterministic UUID for deduplication — same ID = upsert, not duplicate |
Returns the stored build record including its id (UUID), which is required for subsequent /stages, /tests, and /build-logs calls.
POST /ingest/pipeline-stages
Records the stages (jobs/steps) that make up a build.
| Field | Type | Required | Notes |
|---|---|---|---|
buildId | UUID | Yes | id returned by /ingest/builds |
stages[].stageName | string | Yes | Stage/job/step name |
stages[].stageOrder | integer | Yes | Order of execution (0-based) |
stages[].status | string | Yes | success, failure, unstable, aborted, in_progress, skipped |
stages[].duration | integer | Yes | Duration in milliseconds |
POST /ingest/tests
Records JUnit-style test results linked to a build.
POST /ingest/agents
Reports the current state of CI agents/runners, including queue data.
POST /ingest/build-logs
Uploads the full console log for a build. Stored in Cloudflare R2 and accessible from the build detail view.
POST /ingest/security-reports
Records security scan results (SAST, dependency vulnerabilities) linked to a build.
How CI integrations use the API
The @buildbutler/ci CLI package handles all of this automatically — it auto-detects the CI environment from env vars, collects the relevant data, and calls the ingest endpoints in the correct order.
For webhook integrations, the BuildButler webhook receiver (/webhooks/github, /webhooks/gitlab, etc.) translates the CI system's native payload format into ingest API calls internally.
Either way, you never call the ingest API directly — the CLI or webhook does it for you.
| Integration method | Who calls the ingest API |
|---|---|
@buildbutler/ci CLI | The CLI, running inside your CI job |
| Org-level webhook | BuildButler's webhook receiver |
| Jenkins plugin | The plugin, running inside the Jenkins agent |