Follow-Ups

Send sequenced follow-up emails to leads or contacts on a schedule.

All Follow-Ups endpoints require JWT authentication via the Authorization: Bearer <token> header.

Core Endpoints

GET /follow-up-topics List follow-up topics
JWT Required

Returns topics visible to the current user based on scope: - `mine` — only the user's own topics - `team` — topics where the creator is the user's manager - `company` — all topics in the org

Query Parameters

NameTypeRequiredDescription
scope string Optional Values: mine, team, company
is_active integer Optional Values: 0, 1
search string Optional
page integer Optional Default: 1

Code Examples

curl -X GET "https://crm.revorbit.com/api/follow-up-topics" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-topics",
  {
    method: "GET",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
POST /follow-up-topics Create a follow-up topic
JWT Required

Optional `interview_template_id` links a qualifying-interview template to the topic, enabling the `{{Interview.link}}` merge tag in its emails. On first send each recipient gets a personal invite (pre-filled from lead data); all steps reuse the same link and the sequence auto-pauses when the interview is submitted.

Code Examples

curl -X POST "https://crm.revorbit.com/api/follow-up-topics" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-topics",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
GET /follow-up-topics/{id} Get a follow-up topic with templates and assignment counts
JWT Required

Query Parameters

NameTypeRequiredDescription
string Optional

Code Examples

curl -X GET "https://crm.revorbit.com/api/follow-up-topics/{id}" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-topics/{id}",
  {
    method: "GET",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
PUT /follow-up-topics/{id} Update topic settings (creator only)
JWT Required

Accepts the same fields as create, including `interview_template_id` (nullable) which enables the `{{Interview.link}}` merge tag.

Query Parameters

NameTypeRequiredDescription
string Optional

Code Examples

curl -X PUT "https://crm.revorbit.com/api/follow-up-topics/{id}" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-topics/{id}",
  {
    method: "PUT",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
DELETE /follow-up-topics/{id} Delete a topic (creator only — must have no active assignments)
JWT Required

Query Parameters

NameTypeRequiredDescription
string Optional

Code Examples

curl -X DELETE "https://crm.revorbit.com/api/follow-up-topics/{id}" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-topics/{id}",
  {
    method: "DELETE",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
POST /follow-up-topics/{id}/copy Duplicate a visible topic as a new private (scope=mine) inactive topic
JWT Required

Query Parameters

NameTypeRequiredDescription
string Optional

Code Examples

curl -X POST "https://crm.revorbit.com/api/follow-up-topics/{id}/copy" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-topics/{id}/copy",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
POST /follow-up-topics/{topicId}/templates Add a new email template to a topic's sequence
JWT Required

Query Parameters

NameTypeRequiredDescription
string Optional

Code Examples

curl -X POST "https://crm.revorbit.com/api/follow-up-topics/{topicId}/templates" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-topics/{topicId}/templates",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
PUT /follow-up-topics/{topicId}/templates/reorder Reorder a topic's templates by passing an ordered array of template_ids
JWT Required

Query Parameters

NameTypeRequiredDescription
string Optional

Code Examples

curl -X PUT "https://crm.revorbit.com/api/follow-up-topics/{topicId}/templates/reorder" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-topics/{topicId}/templates/reorder",
  {
    method: "PUT",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
GET /follow-up-templates/{id} Get one template
JWT Required

Query Parameters

NameTypeRequiredDescription
string Optional

Code Examples

curl -X GET "https://crm.revorbit.com/api/follow-up-templates/{id}" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-templates/{id}",
  {
    method: "GET",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
PUT /follow-up-templates/{id} Update a template (topic creator only)
JWT Required

Query Parameters

NameTypeRequiredDescription
string Optional

Code Examples

curl -X PUT "https://crm.revorbit.com/api/follow-up-templates/{id}" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-templates/{id}",
  {
    method: "PUT",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
DELETE /follow-up-templates/{id} Delete a template (topic creator only — blocked if referenced in send history)
JWT Required

Query Parameters

NameTypeRequiredDescription
string Optional

Code Examples

curl -X DELETE "https://crm.revorbit.com/api/follow-up-templates/{id}" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-templates/{id}",
  {
    method: "DELETE",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
POST /follow-up-templates/{id}/test-send Send a rendered preview of a template to the requesting user
JWT Required

Query Parameters

NameTypeRequiredDescription
string Optional

Code Examples

curl -X POST "https://crm.revorbit.com/api/follow-up-templates/{id}/test-send" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-templates/{id}/test-send",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
GET /follow-up-assignments List follow-up assignments (filterable by topic, status, recipient)
JWT Required

Query Parameters

NameTypeRequiredDescription
string Optional
string Optional
string Optional
string Optional

Code Examples

curl -X GET "https://crm.revorbit.com/api/follow-up-assignments" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-assignments",
  {
    method: "GET",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
POST /follow-up-assignments Create one or many assignments (single or bulk)
JWT Required

Body shape — single: `{topic_id, recipient_type, recipient_id, override_unsubscribed?}`. Body shape — bulk: `{topic_id, recipients: [{type, id}, ...], override_unsubscribed?}`. Returns `{created: [...], skipped: [{type, id, reason, ...}]}` — skipped includes `not_found`, `no_email`, `already_assigned`, `suppressed:hard_bounce`, `unsubscribed:topic`, etc.

Code Examples

curl -X POST "https://crm.revorbit.com/api/follow-up-assignments" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-assignments",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
POST /follow-up-assignments/preflight Pre-flight a list of recipients against the suppression list
JWT Required

Returns `{ok: [...], blocked: [{reason, ...}]}` so the UI can show what will be skipped before confirming.

Code Examples

curl -X POST "https://crm.revorbit.com/api/follow-up-assignments/preflight" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-assignments/preflight",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
GET /follow-up-assignments/{id} Get one assignment with full send history
JWT Required

Query Parameters

NameTypeRequiredDescription
string Optional

Code Examples

curl -X GET "https://crm.revorbit.com/api/follow-up-assignments/{id}" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-assignments/{id}",
  {
    method: "GET",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
PUT /follow-up-assignments/{id} Change assignment status (pause/resume/stop)
JWT Required

Query Parameters

NameTypeRequiredDescription
string Optional

Code Examples

curl -X PUT "https://crm.revorbit.com/api/follow-up-assignments/{id}" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-assignments/{id}",
  {
    method: "PUT",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
DELETE /follow-up-assignments/{id} Unassign — removes the assignment record (send history preserved on cascade FK)
JWT Required

Query Parameters

NameTypeRequiredDescription
string Optional

Code Examples

curl -X DELETE "https://crm.revorbit.com/api/follow-up-assignments/{id}" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/follow-up-assignments/{id}",
  {
    method: "DELETE",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
GET /public/follow-up-unsubscribe Render the unsubscribe page or one-click unsubscribe (topic-specific by default)
JWT Required

Query Parameters

NameTypeRequiredDescription
string Optional

Code Examples

curl -X GET "https://crm.revorbit.com/api/public/follow-up-unsubscribe" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/public/follow-up-unsubscribe",
  {
    method: "GET",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();
POST /public/follow-up-unsubscribe Apply unsubscribe (one-click or form submission)
JWT Required

Used by Gmail/Outlook one-click List-Unsubscribe headers (RFC 8058) and by the manage-preferences form. Marks active assignments for this email as 'unsubscribed' and adds to follow_up_unsubscribes.

Code Examples

curl -X POST "https://crm.revorbit.com/api/public/follow-up-unsubscribe" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
const response = await fetch(
  "https://crm.revorbit.com/api/public/follow-up-unsubscribe",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer YOUR_JWT_TOKEN",
    }
  }
);
const data = await response.json();