API Reference
Mail2Follow integrates with Zapier to let users connect their follow-up tracking to thousands of other apps. This page documents the endpoints that power the integration.
Authentication
Mail2Follow uses OAuth 2.0 via Google. After the OAuth flow completes, all subsequent requests
must include a Bearer token in the Authorization header.
OAuth scopes
/api/integrations/zapier/me Test authentication Verifies the access token and returns the authenticated user's account details.
Response 200
{
"id": "usr_abc123",
"email": "[email protected]",
"name": "Sarah Johnson",
"plan": "pro"
} Triggers
Triggers notify Zapier when something happens in Mail2Follow. Mail2Follow uses REST hooks (webhook subscriptions) with a polling sample endpoint as fallback.
Trigger keys
/api/integrations/zapier/subscribe Subscribe webhook Registers a webhook URL for a given trigger. Called when a user turns on a Zap.
Request body
{
"hookUrl": "https://hooks.zapier.com/hooks/catch/123/abc",
"event": "new_followup"
} Response 201
{
"id": "sub_xyz789",
"hookUrl": "https://hooks.zapier.com/hooks/catch/123/abc",
"event": "new_followup"
} /api/integrations/zapier/subscribe/:id Unsubscribe webhook Removes a webhook subscription. Called when a user turns off a Zap.
Path parameters
| Parameter | Type | Description |
|---|---|---|
| id | string | Subscription ID returned by POST subscribe |
Response 200
{} /api/integrations/zapier/triggers/:key/sample Polling fallback Returns sample records for a trigger key. Used by Zapier as a polling fallback and to let users test their Zaps during setup.
Path parameters
| Parameter | Values |
|---|---|
| key | new_followup · followup_overdue · reply_received · followup_resolved |
Response 200 — example for new_followup
[
{
"id": "followup_abc123",
"threadId": "thread_xyz789",
"recipientEmail": "[email protected]",
"recipientName": "Sarah Johnson",
"emailSubject": "Re: Web redesign proposal",
"emailType": "proposal",
"dueDate": "2026-05-03T09:00:00Z",
"daysUntilDue": 5,
"createdAt": "2026-04-28T14:30:00Z"
}
] Webhook payload shape
When a trigger fires, Mail2Follow sends a POST request to the registered hookUrl with this body:
{
"event": "new_followup",
"data": {
"id": "followup_abc123",
"threadId": "thread_xyz789",
"recipientEmail": "[email protected]",
"recipientName": "Sarah Johnson",
"emailSubject": "Re: Web redesign proposal",
"emailType": "proposal",
"dueDate": "2026-05-03T09:00:00Z",
"daysUntilDue": 5,
"createdAt": "2026-04-28T14:30:00Z"
}
} Actions
Actions let users create or modify Mail2Follow data from other apps via Zapier.
/api/integrations/zapier/actions/create_followup Creates a follow-up reminder for a Gmail thread.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| threadId | string | Yes | Gmail thread ID |
| emailType | string | No | proposal · invoice · application · general |
| reminderDays | integer | No | Days until reminder fires (default: auto from emailType) |
Example request
{
"threadId": "thread_xyz789",
"emailType": "proposal",
"reminderDays": 5
} Response 201
{
"id": "followup_def456",
"threadId": "thread_xyz789",
"emailType": "proposal",
"status": "pending",
"reminderDays": 5,
"dueDate": "2026-05-03T09:00:00Z",
"createdAt": "2026-04-28T14:30:00Z"
} /api/integrations/zapier/actions/resolve_followup Marks a follow-up as resolved. Useful when a reply is logged externally (e.g. via CRM) and you want to close the reminder in Mail2Follow.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| followupId | string | Yes | ID of the follow-up to resolve |
Example request
{
"followupId": "followup_abc123"
} Response 200
{
"id": "followup_abc123",
"status": "resolved",
"resolvedAt": "2026-04-28T14:30:00Z"
} Error responses
All errors follow the same envelope. The code field is machine-readable.
{
"error": {
"code": "FOLLOWUP_NOT_FOUND",
"message": "Follow-up followup_abc123 not found."
}
} | Status | Meaning |
|---|---|
| 401 | Missing or invalid Bearer token |
| 403 | Token valid but action not permitted (e.g. free plan limit) |
| 404 | Resource not found |
| 422 | Validation error — check error.message for details |
| 429 | Rate limit exceeded |
Questions about the integration? Contact support →