Replace a draft's rules
https://api.norreach.app/v1/campaigns/{id}/rulesReplaces the rules of a draft campaign (when a contact replies, opens, clicks, accepts, books or bounces → place an AI call, pause, complete or book a meeting). A live campaign is cloned to change — 409.
curl -X PUT "https://api.norreach.app/v1/campaigns/{id}/rules" \
-H "Authorization: Bearer $NORREACH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"rules": [
{
"name": "Stop on reply",
"when": {
"event": "replied"
},
"then": {
"action": "pause"
}
}
]
}'{
"id": "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f",
"object": "campaign",
"name": "Summer nurses — Stockholm",
"status": "draft",
"kind": "sequence",
"channels": [
"email",
"sms"
],
"step_count": 2,
"brand_id": null,
"schedule_at": null,
"created_at": "2026-11-04T09:12:33.120Z",
"steps": [
{
"channel": "email",
"wait_hours": 0,
"template": "Subject: Nurses for the summer\n\nHi {{first_name}}, …"
},
{
"channel": "sms",
"wait_hours": 48,
"template": "Hi {{first_name}}, did you see my email?"
}
],
"rules": [
{
"name": "Stop on reply",
"when": {
"event": "replied"
},
"then": {
"action": "pause"
}
}
],
"settings": {
"approve_before_send": "manual"
},
"stats": {
"enrolled": 120,
"in_progress": 80,
"paused": 4,
"completed": 20,
"replied": 14,
"meetings_booked": 2,
"sent": 210,
"delivered": 204,
"opened": 96,
"clicked": 12
}
}Authorizations
Bearer authentication: send Authorization: Bearer <key>, with an API key or an OAuth access token. The key needs the scope campaigns:write. API keys and scopes
Path parameters
An id (UUID).
Headers
Any unique string (≤ 255). The same key with the same request returns the first answer for 24 hours.
Body
application/json
Show child attributesHide child attributes
activepausedShow child attributesHide child attributes
repliedopenedclickedconnection_acceptedmeeting_bookedbouncedShow child attributesHide child attributes
ai_callpausecompletebook_meetingResponse
200application/json— Replace a draft's rules
An id (UUID).
draft, active, paused, completed, archived or needs_review.
broadcastsequencemultichannelThe channel mix of the sequence, in order.
RFC 3339 UTC timestamp with milliseconds.
The sequence (the step shape above).
The campaign's own settings override.
The campaign's numbers right now.
Show child attributesHide child attributes
Errors
Errors are application/problem+json with a stable code.
| Status | Code | Meaning |
|---|---|---|
| 400 | bad_request | The request couldn't be read. |
| 400 | unknown_field | The request has a field this operation doesn't know. |
| 401 | unauthorized | A valid API key is required. |
| 403 | insufficient_scope | This API key doesn't have the scope this operation needs. |
| 403 | feature_not_enabled | The API isn't switched on for this workspace. |
| 403 | role_forbidden | The key's creator's role can't do this. |
| 404 | not_found | That doesn't exist. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. |
| 409 | conflict | That conflicts with the current state. |
| 413 | too_large | The request body is too large. |
| 422 | validation_failed | The request has invalid fields. |
| 422 | idempotency_mismatch | This Idempotency-Key was used with a different request. |
| 429 | rate_limited | Too many requests. Slow down and try again. |
| 500 | server_error | Something went wrong on our side. |
| 503 | unavailable | The API isn't available right now. Try again shortly. |