Skip to content

Platform

Golden images, from your pipeline.

Primcoat is an API with a dashboard on top — not a dashboard with an API bolted on. Everything you can click, you can automate.

API-first, not API-also

The dashboard is a consumer of the same public API you use. If you can do it in the UI, you can do it from CI — there is no privileged internal endpoint doing the real work.

Async by default

Builds take minutes to hours. Triggering one returns a build ID immediately, and every response while it is still running carries a Retry-After telling you when to look again. Nothing blocks an HTTP connection for two hours.

Safe to retry

Write operations take an idempotency key, so a CI runner that retries on a network blip does not trigger a second build. Rate limits come back with a Retry-After header.

Typed from the spec

The API is described by a versioned OpenAPI 3.x specification, and the client types are generated from it rather than maintained by hand — so the types cannot drift from the API they describe.

Trigger a build

A build request returns immediately with an ID and a queue position. You are never left guessing whether the call went through.

$ curl -X POST https://api.primcoat.app/v1/image-definitions/def_9f2/builds \
    -H "Authorization: Bearer $PRIMCOAT_API_KEY" \
    -H "Idempotency-Key: release-2026-07-13"

202 Accepted
{
  "id": "bld_4c81",
  "status": "queued",
  "queue_position": 2,
  "current_stage": null
}

Poll it without guessing

A running build reports the stage it is in and when it expects to finish, and it tells you how long to wait before asking again. TheRetry-After header is on every response while the build is still going and on none once it is finished — so its absence, not a guess about elapsed time, is how your pipeline knows to stop.

$ curl -si https://api.primcoat.app/v1/builds/bld_4c81 \
    -H "Authorization: Bearer $PRIMCOAT_API_KEY"

200 OK
Retry-After: 60
{
  "id": "bld_4c81",
  "status": "running",
  "current_stage": "harden",
  "stages": [ ... ],
  "estimated_completion_at": "2026-07-13T14:52:00Z"
}

Core resources

Predictable REST paths, versioned under /v1/, with cursor-based pagination.

/v1/image-definitions
Define an OS, a policy, software, and publish targets.
/v1/image-definitions/{id}/builds
Trigger a build of a definition.
/v1/builds
List builds; read status, stages, and queue position.
/v1/builds/{id}/reports/{kind}
Retrieve the SBOM, the CVE report, or the compliance scan.
/v1/builds/{id}/artifacts
The published artifacts, with signatures and attestations.
/v1/builds/{id}/logs
Read the build log.
/v1/policies
The hardening profiles available for an OS family and version.
/v1/sources
The verified base images you can build from, with digests.
/v1/image-definitions/{id}/exceptions
Manage documented exceptions to a hardening policy.
/v1/publish-targets
Manage the destinations you publish to.
/v1/connectors
Manage the credentials those destinations authenticate with.
/v1/channels/{id}/promote
Promote a build through dev, staging, and prod.

Authentication

API keys are scoped per organization with fine-grained permissions — read, trigger builds, or administer. A CI runner that only needs to kick off a build does not need a key that can also delete a publish target.

Wire it into the pipeline you already have.

A versioned REST API, scoped keys, idempotent writes, and async builds your CI can poll without guessing.