curl --request PATCH \
--url https://api.tryfuse.ai/api/v1/business/campaigns/{campaignId}/steps/{stepId} \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"subject": "<string>",
"body": "<string>",
"topic": "<string>",
"daysBetween": 182
}
'import requests
url = "https://api.tryfuse.ai/api/v1/business/campaigns/{campaignId}/steps/{stepId}"
payload = {
"subject": "<string>",
"body": "<string>",
"topic": "<string>",
"daysBetween": 182
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
subject: '<string>',
body: JSON.stringify('<string>'),
topic: '<string>',
daysBetween: 182
})
};
fetch('https://api.tryfuse.ai/api/v1/business/campaigns/{campaignId}/steps/{stepId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"stepId": "6a8dce2ef83628aea1088041"
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Edit a sequence step
Writes one sequence step’s content. Send subject and body together for a manual step (the pair replaces the step’s whole template), topic for an ai_generated or ai_reply step - setting a topic also regenerates the step’s title with AI - and daysBetween to change the wait before the step. At least one field must be present. A manual campaign cannot be approved until every step has a subject and body, which is what makes this endpoint the missing piece for a machine caller. Only the token owner may edit steps. Rate limit: 30 requests/minute and 1,000/day per token owner, shared by every campaign, scheduled-send, campaign-template and knowledge-hub endpoint.
Errors:
404CAMPAIGN_NOT_FOUND— No campaign with this id exists, it belongs to another account (including a campaign delegated to you or shared by your team’s visibility settings), or it has been deleted.404SEQUENCE_STEP_NOT_FOUND— No step with this id belongs to this campaign.422CONNECTION_NOTE_TOO_LONG— The step is a linkedin_connection, whose body is the invitation note LinkedIn caps at 200 characters, and the body sent is longer.422VALIDATION_FAILED— Empty body, unknown key, subject without body (or the reverse), or a value out of range;paramnames the field.429RATE_LIMITED— More than 30 campaign requests in a minute, or 1,000 in a day, for this token owner (the bucket is shared by every /business/campaigns, /business/scheduled-sends, /business/campaign-templates and /business/knowledge-hubs call).500UNEXPECTED_ERROR— An unhandled failure; the detail stays in our logs and is never returned.
Requires one of the following token scopes: campaigns.
curl --request PATCH \
--url https://api.tryfuse.ai/api/v1/business/campaigns/{campaignId}/steps/{stepId} \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"subject": "<string>",
"body": "<string>",
"topic": "<string>",
"daysBetween": 182
}
'import requests
url = "https://api.tryfuse.ai/api/v1/business/campaigns/{campaignId}/steps/{stepId}"
payload = {
"subject": "<string>",
"body": "<string>",
"topic": "<string>",
"daysBetween": 182
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
subject: '<string>',
body: JSON.stringify('<string>'),
topic: '<string>',
daysBetween: 182
})
};
fetch('https://api.tryfuse.ai/api/v1/business/campaigns/{campaignId}/steps/{stepId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"stepId": "6a8dce2ef83628aea1088041"
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Authorizations
Your API token (af_…) as the Basic-auth username, with an empty password.
Path Parameters
The campaign's id (24-character hex ObjectId), as returned by POST /business/campaigns or as the campaignId of a GET /business/campaigns row.
The sequence step's id, as returned by GET /business/campaigns/{campaignId}/steps (24-character hex ObjectId).
Body
New subject line for a manual step (up to 500 characters, may be empty); must be sent together with body because the pair replaces the step's whole template. Silently ignored on ai_generated / ai_reply steps.
500New message body for a manual step (up to 50000 characters, may be empty; HTML is allowed on email steps, {Variable} tokens and spintax substitute at send time); must be sent together with subject. On a linkedin_connection step this is the invitation note LinkedIn caps at 200 characters — a longer body answers 422 CONNECTION_NOTE_TOO_LONG. Silently ignored on ai_generated / ai_reply steps.
50000Free text: what this step should say, in your own words — there is no fixed set of topics. Up to 1000 characters. An AI step writes each message from it, and setting it also regenerates the step's title with AI. Stored but not rendered for manual steps.
1000Whole days to wait after the previous step (or after the campaign start for the first step) before this step is due, 0-365.
0 <= x <= 365Response
Success
The step that was updated.