Integrate Coachful with your tools using our REST API. Powers the official Coachful apps on Zapier and OttoKit, and available for custom integrations.
All API requests require an API key. Generate one from your coach dashboard under Automations → Connections.
Include your API key in the X-API-Key header:
curl -H "X-API-Key: cfk_your_api_key_here" \ https://app.coachful.co/api/zapier/auth/test
Base URL: https://app.coachful.co
Rate Limits: 100 reads/min, 30 writes/min per API key
/api/zapier/auth/testVerify your API key and get organization info
Returns:
{
"organizationName": "My Coaching",
"coachName": "Jane Smith",
"organizationId": "..."
}Subscribe to events via REST Hooks. When events occur in your organization, we POST the event data to your webhook URL.
/api/zapier/hooksSubscribe to an event. Body: { hookUrl, event }
/api/zapier/hooks/:hookIdUnsubscribe from an event
lead.capturedA new lead is capturedfunnel.completedSomeone completes a funnelintake.form.submittedA form or worksheet is submitted, with every answer and uploaded fileintake.call.bookedA discovery or intake call is bookedcoaching.session.scheduledA 1:1 session is booked or confirmedcoaching.session.cancelledA session is cancelledclient.goal.achievedA client achieves a goalpayment.receivedA payment is receivedpayment.refundedA payment is refundedemail.unsubscribedA contact unsubscribes from your emailscoaching.note.createdA note is added through the APIautomation.firedAn automation runs its Send webhook stepEvery answer arrives in form order with its question id, question text, type, a readable value (choice labels, numbers, text) and plain text. Uploaded files include their public URL and file name, and are also listed together under files. Questions hidden by skip logic are left out. Text answers longer than 10,000 characters are shortened and marked truncated: true.
{
"id": "evt_...",
"event": "intake.form.submitted",
"timestamp": "2026-02-24T10:15:00.000Z",
"organizationId": "...",
"data": {
"responseId": "resp_abc123",
"formId": "form_xyz789",
"formName": "Discovery Call Intake",
"formType": "form",
"userId": "user_def456",
"prospectName": "John Doe",
"prospectEmail": "john@example.com",
"prospectPhone": "+1234567890",
"answers": [
{ "questionId": "q_goal", "question": "What is your main goal?",
"type": "long_text", "value": "Lose 20 lbs before my wedding",
"text": "Lose 20 lbs before my wedding" },
{ "questionId": "q_focus", "question": "Which areas do you want help with?",
"type": "multi_choice", "value": ["Nutrition", "Sleep"], "text": "Nutrition, Sleep" },
{ "questionId": "q_ready", "question": "How ready are you to start?",
"type": "scale", "value": 8, "text": "8", "min": 1, "max": 10 },
{ "questionId": "q_bloodwork", "question": "Upload your latest blood work",
"type": "file_upload",
"value": ["https://coachful.b-cdn.net/.../bloodwork.pdf"],
"text": "https://coachful.b-cdn.net/.../bloodwork.pdf",
"files": [{ "url": "https://coachful.b-cdn.net/.../bloodwork.pdf",
"name": "bloodwork.pdf", "contentType": "application/pdf", "sizeBytes": 482113 }] }
],
"answersByQuestionId": { "q_goal": "Lose 20 lbs before my wedding", "q_focus": "Nutrition, Sleep", ... },
"files": [{ "questionId": "q_bloodwork", "question": "Upload your latest blood work",
"url": "https://coachful.b-cdn.net/.../bloodwork.pdf", "name": "bloodwork.pdf",
"contentType": "application/pdf", "sizeBytes": 482113 }],
"totalScore": 12,
"maxPossibleScore": 20,
"submittedAt": "2026-02-24T10:15:00.000Z"
}
}Session events (intake.call.booked, coaching.session.scheduled, coaching.session.cancelled) send sessionId, title, startDateTime, endDateTime, timezone, status, eventType, meetingProvider, meetingUrl, clientId, clientName, clientEmail and the host; cancellations add cancelledAt, cancelledBy and cancellationReason.
/api/zapier/triggers/:eventPoll for recent events (returns last 50)
/api/zapier/triggers/:event/sampleGet sample data for an event
Perform actions in your Coachful organization. All actions require a POST request with a JSON body.
/api/zapier/actions/create-taskCreate a task for a client. Body: { clientEmail, title, date?, listType? }
/api/zapier/actions/create-habitCreate a habit for a client. Body: { clientEmail, text, frequency? }
/api/zapier/actions/send-messageSend a chat message. Body: { message, clientEmail?, channel?, programId?, cohortId? }
/api/zapier/actions/create-postCreate a feed post. Body: { content }
/api/zapier/actions/create-invoiceCreate an invoice. Body: { clientEmail, amount, description, currency? }
/api/zapier/actions/enroll-in-programEnroll a client in a program. Body: { clientEmail, programId, cohortId?, startDate? }
/api/zapier/actions/grant-resourceGrant resource access. Body: { clientEmail, resourceType, resourceId }
Look up data in your organization. Used for dynamic dropdowns in Zapier and for finding IDs.
/api/zapier/searches/find-client?email=...Find a client by email, or list all clients
/api/zapier/searches/list-programsList all programs in your organization
/api/zapier/searches/list-cohorts?programId=...List cohorts, optionally filtered by program
/api/zapier/searches/list-resources?resourceType=...List resources by type (course, article, download, video, link, questionnaire)
/api/zapier/searches/list-channelsList org chat channels
/api/zapier/searches/list-checkin-flowsList check-in flow templates
The Send Message action supports multiple targeting modes. Provide exactly one:
clientEmail — Send a direct message to a clientchannel — Post to an org channel (announcements, social, wins, or custom name)programId — Post to a program's community channelprogramId + cohortId — Post to a cohort's squad channelAll errors return a JSON object with an error field.
400Bad Request — Missing or invalid parameters401Unauthorized — Invalid or missing API key403Forbidden — Resource not in your organization404Not Found — Resource does not exist429Rate Limited — Too many requests500Server Error — Something went wrongQuestions about the API? Contact us at hello@coachful.co