API ReferenceCampaignsUpdate campaign lead
PUT/v2/campaigns/:id/leads/:leadId

Update campaign lead

Updates one lead inside a campaign you own — its fields, send status, labels, or scheduled send time. The campaign-scoped counterpart to Update lead, which only reaches leads that aren't in a campaign.

Stablescope: write API KeyLearn about API scopes →

Field updates merge, they don't replace

Only the keys you send inside fields are changed — every other field on the lead keeps its value. Labels are the opposite: the labels array you send replaces the lead's current labels.

Flat shape also accepted

Instead of fields, you can send firstName, lastName, email, company, phone, keyword, and customFields at the top level — they're merged into fields the same way. Don't mix the two shapes in one request.

Request

AuthorizationBearer YOUR_API_KEY
Content-Typeapplication/json

Parameters

FieldTypeRequiredDescription
idstringRequiredCampaign ID.
leadIdstringRequiredLead ID (lead_...) from List campaign leads.
fieldsobjectOptionalField values to set, e.g. { company: "Acme Corp" } — up to 100 entries, each value up to 2,000 characters.
statusenumOptionalPENDING | QUEUED | DRAFTED | SENT | FAILED | CANCELLED | IGNORED.
labelsobject[]Optional{ labelId, name, color }[] — up to 50; color must be a hex code like #7C3AED. Replaces the lead's current labels.
scheduledAtstringOptionalISO 8601 timestamp for when this lead's email should send.
curl -X PUT "https://api.stynar.com/v2/campaigns/cmp_abc123/leads/lead_1a2b3c" \
  -H "Authorization: Bearer esk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"fields":{"company":"Acme Corp"},"labels":[{"labelId":"lbl_1","name":"Hot lead","color":"#7C3AED"}]}'

Response

✓ 200 OK
200 response
{
  "lead": {
    "leadId": "lead_1a2b3c",
    "campaignId": "cmp_abc123",
    "status": "PENDING",
    "fields": {
      "email": "jane@acme.com",
      "firstName": "Jane",
      "company": "Acme Corp"
    },
    "labels": [
      {
        "labelId": "lbl_1",
        "name": "Hot lead",
        "color": "#7C3AED"
      }
    ],
    "updatedAt": "2026-10-03T09:12:00.000Z"
  }
}

Response fields

Errors

StatusCodeMeaning
✕ 400 Bad RequestVALIDATION_FAILEDEmpty body (nothing to update), an unknown status, or a malformed field.
✕ 404 Not FoundNOT_FOUNDCampaign or lead doesn't exist or isn't yours.
✕ 401 UnauthorizedUNAUTHORIZEDMissing, malformed, unknown, revoked, or expired key.
✕ 403 ForbiddenAPI_ACCESS_DISABLEDAPI access is turned off for your account.
✕ 403 ForbiddenINSUFFICIENT_SCOPEThe key doesn't have the scope this endpoint requires.
✕ 409 ConflictCONFLICTThe action can't be applied to the resource's current state.
✕ 429 Too Many RequestsRATE_LIMIT_EXCEEDEDPer-minute or per-second limit hit.
✕ 429 Too Many RequestsQUOTA_EXCEEDEDMonthly quota exhausted.
✕ 500 Internal Server ErrorINTERNAL_ERRORSomething broke on Stynar's end.
Full error reference →