---
title: "Update nurture campaign"
method: PUT
path: "/nurture-campaigns/{id}"
tags: ["Nurture Campaigns"]
---

# Update nurture campaign

`PUT /nurture-campaigns/{id}`

## Request

- Base URL: `https://api.100hires.com/v2`
- URL: `https://api.100hires.com/v2/nurture-campaigns/{id}`
- Auth: HTTP bearer

Updates an existing nurture campaign. Pass all steps — mark removed steps with is_deleted=true.

## Path parameters

- `id` integer, required

## Request body

- NurtureCampaignUpdateRequest
  - `title` string, required: Campaign name
  - `workflow_id` integer: Workflow ID this campaign is associated with.
  - `stage_id` integer: Pipeline stage ID that triggers the campaign.
  - `delay_time` integer: Delay before the first step, in seconds (0–86400). Takes precedence over relative_days + relative_time when both are sent.
  - `relative_days` integer: Days after the trigger for the first step. Used together with relative_time.
  - `relative_time` integer: Time of day for the first step, in seconds from midnight (0–86400). Used together with relative_days.
  - `timezone` string: Timezone for scheduled sends (e.g. America/New_York).
  - `send_to_all` boolean: Whether to send to all candidates or only new ones.
  - `response_move_to_stage_id` integer: Stage ID to move candidates to when they respond.
  - `steps` NurtureCampaignStepInput[], required: All steps — mark removed steps with is_deleted=true
    - union: Step input. The required fields depend on the step `type`.
      - NurtureCampaignStepEmailInput
        - `id` integer: Step ID (required for updating existing steps)
        - `type` 'email', required: Step type discriminator.
        - `delay_days` integer, required: Days to wait before executing this step
        - `send_condition` 'if_no_reply' | 'if_no_reply_but_opened', required: Condition for sending this step.
        - `is_deleted` boolean: Set to true to remove this step during update
        - `sender` object, required
          - `type` string, required: Sender type (e.g. "account", "user")
          - `id` integer, required: Sender ID
        - `template_id` integer, required: Email template ID
        - `is_new_thread` boolean: Send as new email thread
        - `schedule_id` integer: Sending schedule ID
        - `is_send_by_carousel` boolean: Send by carousel rotation
      - NurtureCampaignStepSmsInput
        - `id` integer: Step ID (required for updating existing steps)
        - `type` 'sms', required: Step type discriminator.
        - `delay_days` integer, required: Days to wait before executing this step
        - `send_condition` 'if_no_reply' | 'if_no_reply_but_opened', required: Condition for sending this step.
        - `is_deleted` boolean: Set to true to remove this step during update
        - `sender_user_id` integer, required: Sender user ID
        - `template_id` integer, required: SMS template ID
        - `schedule_id` integer: Sending schedule ID
        - `is_send_by_carousel` boolean: Send by carousel rotation
      - NurtureCampaignStepVoicemailInput
        - `id` integer: Step ID (required for updating existing steps)
        - `type` 'voicemail', required: Step type discriminator.
        - `delay_days` integer, required: Days to wait before executing this step
        - `send_condition` 'if_no_reply' | 'if_no_reply_but_opened', required: Condition for sending this step.
        - `is_deleted` boolean: Set to true to remove this step during update
        - `attachment_uuid` string, uuid, required: Voicemail audio file UUID. Reuse the `attachment_uuid` from an existing voicemail step, or upload a new audio file through `POST /attachments` with category `voicemail` and use the returned `uuid`.
        - `schedule_id` integer: Sending schedule ID
      - NurtureCampaignStepMoveToNextStageInput
        - `id` integer: Step ID (required for updating existing steps)
        - `type` 'move_to_next_stage', required: Step type discriminator.
        - `delay_days` integer, required: Days to wait before executing this step
        - `send_condition` 'if_no_reply' | 'if_no_reply_but_opened', required: Condition for sending this step.
        - `is_deleted` boolean: Set to true to remove this step during update
        - `stage_id` integer, required: Target pipeline stage ID
      - NurtureCampaignStepAssignTagInput
        - `id` integer: Step ID (required for updating existing steps)
        - `type` 'assign_tag', required: Step type discriminator.
        - `delay_days` integer, required: Days to wait before executing this step
        - `send_condition` 'if_no_reply' | 'if_no_reply_but_opened', required: Condition for sending this step.
        - `is_deleted` boolean: Set to true to remove this step during update
        - `tag_id` integer, required: Tag ID to assign
      - NurtureCampaignStepAssignTaskInput
        - `id` integer: Step ID (required for updating existing steps)
        - `type` 'assign_task', required: Step type discriminator.
        - `delay_days` integer, required: Days to wait before executing this step
        - `send_condition` 'if_no_reply' | 'if_no_reply_but_opened', required: Condition for sending this step.
        - `is_deleted` boolean: Set to true to remove this step during update
        - `task_template_id` integer, required: Task template ID
        - `assignees` integer[], required: Assignee user IDs
        - `due_in_interval` string: Due date interval, e.g. "P3D"
        - `priority` integer: Task priority

## Response `200`

Updated nurture campaign

- NurtureCampaign
  - `id` integer: Campaign ID
  - `type` string: Always "nurture_campaign"
  - `title` string: Campaign name
  - `url_backoffice` string, uri: Absolute backoffice URL to edit this nurture campaign in the 100Hires recruiter app. Use to render deep-links in agent UIs.
  - `send_to_all` boolean: Whether to send to all candidates or only new ones
  - `response_move_to_stage_id` integer, nullable: Stage ID to move candidate when they reply
  - `schedule` object: Campaign schedule configuration
    - `formatted` string: Human-readable schedule description
  - `steps` NurtureCampaignStep[]: Ordered list of campaign steps
    - union: Campaign step. The shape depends on the step `type`.
      - NurtureCampaignStepEmail
        - `id` integer, required: Step ID
        - `type` 'email', required: Step type discriminator.
        - `campaign_id` integer: Parent campaign ID
        - `delay_days` integer, required: Days to wait before executing this step
        - `send_condition` 'if_no_reply' | 'if_no_reply_but_opened', required: Condition to check before executing step
        - `sender` object, required: Mail sender
          - `type` string
          - `id` integer
        - `template_id` integer, required: Email template ID
        - `is_new_thread` boolean: Send as new email thread
        - `schedule_id` integer, nullable: Sending schedule ID
      - NurtureCampaignStepSms
        - `id` integer, required: Step ID
        - `type` 'sms', required: Step type discriminator.
        - `campaign_id` integer: Parent campaign ID
        - `delay_days` integer, required: Days to wait before executing this step
        - `send_condition` 'if_no_reply' | 'if_no_reply_but_opened', required: Condition to check before executing step
        - `sender_user_id` integer, required: Sender user ID
        - `template_id` integer, required: SMS template ID
        - `schedule_id` integer, nullable: Sending schedule ID
      - NurtureCampaignStepVoicemail: Response shape for a voicemail step. Create/update requests use `attachment_uuid`, while responses expand that reference into the full `attachment` payload and do not return `attachment_uuid`.
        - `id` integer, required: Step ID
        - `type` 'voicemail', required: Step type discriminator.
        - `campaign_id` integer: Parent campaign ID
        - `delay_days` integer, required: Days to wait before executing this step
        - `send_condition` 'if_no_reply' | 'if_no_reply_but_opened', required: Condition to check before executing step
        - `attachment` ApiAttachment: Unified attachment shape returned by apiV2 endpoints (resumes, candidate files, application attachments, message attachments, call recordings, voicemail audio in nurture campaigns). `url` is an absolute URL served by the API host (`https://api.100hires.com/v2/attachments/{category}/{uuid}/{file_name}`) and serves the raw file bytes with `Authorization: Bearer <API_KEY>`. The response on `url` sets `Content-Disposition: attachment; filename="..."` with the human-readable filename. Use `uuid` to reference the attachment in other endpoints (e.g. nurture voicemail step).
          - `uuid` string, uuid, required: Unique attachment identifier. Stable across API calls; use in referencing endpoints.
          - `url` string, uri, nullable, required: Absolute download URL (e.g. `https://api.100hires.com/v2/attachments/application/{uuid}/{file_name}`). Hit with `Authorization: Bearer <API_KEY>`.
          - `relative_time` string, required: Human-readable time since upload (e.g. `"2 days ago"`).
          - `file` AttachmentFile, required
            - `is_image` boolean, nullable, required: Whether the file is an image.
            - `orig_file_name` string, required: Original file name.
            - `file_ext` string, required: File extension.
            - `file_type` string, required: File type category.
            - `readable_size` string, required: Human-readable file size.
        - `schedule_id` integer, nullable: Sending schedule ID
      - NurtureCampaignStepMoveToNextStage
        - `id` integer, required: Step ID
        - `type` 'move_to_next_stage', required: Step type discriminator.
        - `campaign_id` integer: Parent campaign ID
        - `delay_days` integer, required: Days to wait before executing this step
        - `send_condition` 'if_no_reply' | 'if_no_reply_but_opened', required: Condition to check before executing step
        - `stage_id` integer, required: Target pipeline stage ID
      - NurtureCampaignStepAssignTag
        - `id` integer, required: Step ID
        - `type` 'assign_tag', required: Step type discriminator.
        - `campaign_id` integer: Parent campaign ID
        - `delay_days` integer, required: Days to wait before executing this step
        - `send_condition` 'if_no_reply' | 'if_no_reply_but_opened', required: Condition to check before executing step
        - `tag_id` integer, required: Tag ID to assign
      - NurtureCampaignStepAssignTask
        - `id` integer, required: Step ID
        - `type` 'assign_task', required: Step type discriminator.
        - `campaign_id` integer: Parent campaign ID
        - `delay_days` integer, required: Days to wait before executing this step
        - `send_condition` 'if_no_reply' | 'if_no_reply_but_opened', required: Condition to check before executing step
        - `task_template_id` integer, required: Task template ID
        - `assignees` integer[], required: Assignee user IDs
        - `due_in_interval` string: Due date interval, e.g. "P3D"
        - `priority` integer: Task priority

## Other responses

- `400`: Validation error
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not found
- `415`: Content-Type must be application/json
- `429`: Too many requests

---

[API](https://skmtc.dev/100hires/apis/100hires-api.md) · [All operations](https://skmtc.dev/100hires/apis/100hires-api/llms.txt) · [OpenAPI document](https://skmtc.dev/100hires/apis/100hires-api/revisions/e63e2d3115f7?raw)
