Build Status
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
| Parameter | Type | Description |
|---|---|---|
id | string (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_propositionisready(your selection is in) whileoverallisbuilding— that pairing is expected: submitting VPs is what starts the build. Earlier, while VP options are still generating,value_propositionisprocessingandoverallisdraft.
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 whileoverallis stillbuildingand queue until the build completes.readysimply 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.