BackCoachful

API Documentation

Integrate Coachful with your tools using our REST API. Powers the official Coachful apps on Zapier and OttoKit, and available for custom integrations.

Authentication

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

Test Authentication

GET
/api/zapier/auth/test

Verify your API key and get organization info

Returns:

{
  "organizationName": "My Coaching",
  "coachName": "Jane Smith",
  "organizationId": "..."
}

Triggers (Webhooks)

Subscribe to events via REST Hooks. When events occur in your organization, we POST the event data to your webhook URL.

POST
/api/zapier/hooks

Subscribe to an event. Body: { hookUrl, event }

DELETE
/api/zapier/hooks/:hookId

Unsubscribe from an event

Available Events

client.checkin.completedA client completes a check-in
client.addedA new client joins your organization
program.purchasedA client purchases a program
payment.receivedA payment is received
session.completedA 1:1 coaching session is completed
habit.completedA client completes a habit
goal.achievedA client achieves a goal
intake.call.bookedAn intake session is booked
intake.call.completedAn intake session is completed
group.call.completedA group call is completed
course.joinedA client joins a course

Polling Fallback

GET
/api/zapier/triggers/:event

Poll for recent events (returns last 50)

GET
/api/zapier/triggers/:event/sample

Get sample data for an event

Actions

Perform actions in your Coachful organization. All actions require a POST request with a JSON body.

POST
/api/zapier/actions/create-task

Create a task for a client. Body: { clientEmail, title, date?, listType? }

POST
/api/zapier/actions/create-habit

Create a habit for a client. Body: { clientEmail, text, frequency? }

POST
/api/zapier/actions/send-message

Send a chat message. Body: { message, clientEmail?, channel?, programId?, cohortId? }

POST
/api/zapier/actions/create-post

Create a feed post. Body: { content }

POST
/api/zapier/actions/create-invoice

Create an invoice. Body: { clientEmail, amount, description, currency? }

POST
/api/zapier/actions/enroll-in-program

Enroll a client in a program. Body: { clientEmail, programId, cohortId?, startDate? }

POST
/api/zapier/actions/grant-resource

Grant resource access. Body: { clientEmail, resourceType, resourceId }

Searches

Look up data in your organization. Used for dynamic dropdowns in Zapier and for finding IDs.

GET
/api/zapier/searches/find-client?email=...

Find a client by email, or list all clients

GET
/api/zapier/searches/list-programs

List all programs in your organization

GET
/api/zapier/searches/list-cohorts?programId=...

List cohorts, optionally filtered by program

GET
/api/zapier/searches/list-resources?resourceType=...

List resources by type (course, article, download, video, link, questionnaire)

GET
/api/zapier/searches/list-channels

List org chat channels

GET
/api/zapier/searches/list-checkin-flows

List check-in flow templates

Send Message Targeting

The Send Message action supports multiple targeting modes. Provide exactly one:

  • clientEmail — Send a direct message to a client
  • channel — Post to an org channel (announcements, social, wins, or custom name)
  • programId — Post to a program's community channel
  • programId + cohortId — Post to a cohort's squad channel

Error Handling

All errors return a JSON object with an error field.

400Bad Request — Missing or invalid parameters
401Unauthorized — Invalid or missing API key
403Forbidden — Resource not in your organization
404Not Found — Resource does not exist
429Rate Limited — Too many requests
500Server Error — Something went wrong

Support

Questions about the API? Contact us at hello@coachful.co