Build Status

ReferenceUpdated June 14, 2026

Build Status

Poll a campaign's build readiness. This is the signal that tells you when a campaign is ready for email generation.


Poll build status

GET /api/v1/campaigns/:id/build-status · scope campaigns:read

A single derived readiness view (there is no stored build record). Reports each wizard stage plus an overall of draft | building | ready | failed. The campaign is ready for email generation when overall is ready.

Path parameters

ParameterTypeDescription
idstring (UUID)Campaign ID.

Example request

curl -X GET "https://app.machfive.io/api/v1/campaigns/CAMPAIGN_ID/build-status" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response (200 OK)

{
  "campaign_id": "b3f...",
  "overall": "building",
  "stages": {
    "target_audience": "ready",
    "social_proof": "ready",
    "lead_magnet": "ready",
    "risk_reversal": "ready",
    "value_proposition": "ready"
  }
}

Stage values: pending (not started), processing (in progress), ready (done), failed. Not every stage uses every value: target_audience, social_proof, lead_magnet, and risk_reversal report only pending or ready. Only value_proposition reports processing (while options generate) and failed. The stages mirror the wizard steps you drive directly (the ones with a selection). After you submit value propositions, the campaign finishes building in the background — there's nothing more to submit, so that phase isn't a named stage; just poll overall until it's ready.

In the example above, value_proposition is ready (your selection is in) while overall is building — that pairing is expected: submitting VPs is what starts the build. Earlier, while VP options are still generating, value_proposition is processing and overall is draft.

You don't need overall: "ready" to start generating. Once value propositions are selected, you can submit leads via generate / generate-batch right away — requests are accepted while overall is still building and queue until the build completes. ready simply confirms the build has fully finished.

You can equivalently poll the campaign.build job from GET /api/v1/jobs/:id — its status is derived from the same signals and persisted on completion. See Jobs and Conventions → Async jobs.