REST API reference

Trainerize API

14 endpoints for Trainerize. Each one is a POST with a JSON body, called with your API key.

Base URL
https://cotlet.dev/api/v1/trainerize
Connects with
Your Trainerize trainer, admin or owner account on the web
Integration page
Trainerize
Trainerize Endpoints
Endpoint Access Description
list_clients read Clients with client type, trainer, tags and last activity.
get_client read Client profile: contact, client type, trainer, tags, goals, and main and add-on programs.
get_body_stats read Body weight, body fat, body measurements and caliper entries for a date range.
list_check_ins read Check-in forms a client submitted, with each question and answer.
list_conversations read Your message conversations with clients and groups, newest first, with unread count.
get_conversation read Messages in one conversation, with sender, time and attachment names.
list_master_programs read Master programs in your library, with program tags and subscriber count.
list_appointments read Appointments on the schedule for a date range, with type, trainer and client.
send_message write Send a message to a client as you in the Trainerize messenger.
subscribe_to_program write Subscribe one or more clients to a master program from a start date.
log_body_stats write Enter body stats for a client on a date, in the client's units.
schedule_appointment write Book an appointment with a client, optionally weekly or monthly.
add_client_tags write Add custom client tags to one or more clients.
set_client_status write Deactivate a client (they lose app access, history is kept) or reactivate them.

POST https://cotlet.dev/api/v1/trainerize/list_clients

Lists the clients you can see, in the order Trainerize shows them. Deactivated clients are left out unless you ask for them with client_type. Filter by tag to get a group, or search by name or email. Pages hold up to 200 clients; pass next_cursor back as cursor for the next page.

Parameters

Parameters: list_clients
NameTypeDescription
client_type enum full_access, offline, basic, prospect, pending or deactivated. Default: all except deactivated.
tag string Only clients with this custom or auto client tag.
search string Match on name or email.
limit integer 1 to 200. Default: 50.
cursor string Next page cursor from the previous call.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/trainerize/list_clients \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("trainerize", "list_clients")
Node.js
const result = await cotlet.call('trainerize', 'list_clients');
CLI
cotlet call trainerize list_clients

Example response

{
  "clients": [
    {
      "client_id": "4821937",
      "name": "Alex Rivera",
      "email": "alex@example.com",
      "client_type": "full_access",
      "trainer": "yourname",
      "tags": [
        "Challenge"
      ],
      "last_active": "2026-10-08T17:40:00Z"
    },
    {
      "client_id": "4821944",
      "name": "Sam Carter",
      "email": "sam@example.com",
      "client_type": "full_access",
      "trainer": "yourname",
      "tags": [
        "Challenge",
        "Online"
      ],
      "last_active": "2026-10-09T06:12:00Z"
    }
  ],
  "next_cursor": null
}

Get client

read

POST https://cotlet.dev/api/v1/trainerize/get_client

Returns one client profile with contact details, client type, trainer, tags, goals and the main and add-on programs the client is on. Use it before a message or a program change to see where the client stands.

Parameters

Parameters: get_client
NameTypeDescription
client_id required string Client ID from list_clients.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/trainerize/get_client \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"client_8c41d2"}'
Python
result = client.call("trainerize", "get_client", {"client_id":"client_8c41d2"})
Node.js
const result = await cotlet.call('trainerize', 'get_client', {"client_id":"client_8c41d2"});
CLI
cotlet call trainerize get_client --data '{"client_id":"client_8c41d2"}'

Example response

{
  "client_id": "4821937",
  "name": "Alex Rivera",
  "email": "alex@example.com",
  "client_type": "full_access",
  "trainer": "yourname",
  "tags": [
    "Challenge"
  ],
  "goals": [
    "Lose 5 kg",
    "Run 5 km"
  ],
  "main_program": {
    "program_id": "552012",
    "name": "4-week Base"
  },
  "add_on_programs": []
}

POST https://cotlet.dev/api/v1/trainerize/get_body_stats

Returns the entries a client logged in the range, oldest first, grouped by date. Default range is the last 90 days.

Parameters

Parameters: get_body_stats
NameTypeDescription
client_id required string Client ID from list_clients.
from date Start date. Default: 90 days ago.
to date End date. Default: today.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/trainerize/get_body_stats \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"4821937","from":"2026-08-17","to":"2026-10-12"}'
Python
result = client.call("trainerize", "get_body_stats", {"client_id":"4821937","from":"2026-08-17","to":"2026-10-12"})
Node.js
const result = await cotlet.call('trainerize', 'get_body_stats', {"client_id":"4821937","from":"2026-08-17","to":"2026-10-12"});
CLI
cotlet call trainerize get_body_stats --data '{"client_id":"4821937","from":"2026-08-17","to":"2026-10-12"}'

Example response

{
  "client_id": "4821937",
  "entries": [
    {
      "date": "2026-09-12",
      "body_weight": 84.1,
      "waist": 90
    },
    {
      "date": "2026-09-26",
      "body_weight": 83.2,
      "waist": 89
    }
  ]
}

POST https://cotlet.dev/api/v1/trainerize/list_check_ins

Lists submitted check-in forms, newest first, each with every question and the answer. Leave client_id empty to read all clients. Use since to read only what is new since your last run.

Parameters

Parameters: list_check_ins
NameTypeDescription
client_id string One client. Default: all clients.
since date Only check-ins submitted on or after this date.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/trainerize/list_check_ins \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"since":"2026-10-05"}'
Python
result = client.call("trainerize", "list_check_ins", {"since":"2026-10-05"})
Node.js
const result = await cotlet.call('trainerize', 'list_check_ins', {"since":"2026-10-05"});
CLI
cotlet call trainerize list_check_ins --data '{"since":"2026-10-05"}'

Example response

{
  "check_ins": [
    {
      "check_in_id": "7710342",
      "client_id": "4821937",
      "client_name": "Alex Rivera",
      "submitted_at": "2026-10-06T08:15:00Z",
      "answers": [
        {
          "question": "How is your energy this week?",
          "answer": "2 out of 5"
        },
        {
          "question": "Anything getting in the way?",
          "answer": "Two late shifts, skipped Thursday."
        }
      ]
    }
  ]
}

POST https://cotlet.dev/api/v1/trainerize/list_conversations

Lists your conversations in the Trainerize messenger, newest first, with the other person or group, unread count and a preview of the last message. Set unread_only to see only what needs an answer.

Parameters

Parameters: list_conversations
NameTypeDescription
unread_only boolean Only conversations with unread messages.
limit integer 1 to 100. Default: 30.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/trainerize/list_conversations \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("trainerize", "list_conversations")
Node.js
const result = await cotlet.call('trainerize', 'list_conversations');
CLI
cotlet call trainerize list_conversations

Example response

{
  "conversations": [
    {
      "conversation_id": "3390127",
      "with": {
        "client_id": "4821937",
        "name": "Alex Rivera"
      },
      "unread": 1,
      "last_message": "Can I swap lunges for something easier on my knee?",
      "updated_at": "2026-10-10T07:02:00Z"
    }
  ]
}

POST https://cotlet.dev/api/v1/trainerize/get_conversation

Returns the most recent messages of one conversation, oldest first, so your agent reads the thread in order. Attachments are listed by file name only.

Parameters

Parameters: get_conversation
NameTypeDescription
conversation_id required string Conversation ID from list_conversations.
limit integer Most recent messages, 1 to 200. Default: 50.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/trainerize/get_conversation \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversation_id":"3390127","limit":30}'
Python
result = client.call("trainerize", "get_conversation", {"conversation_id":"3390127","limit":30})
Node.js
const result = await cotlet.call('trainerize', 'get_conversation', {"conversation_id":"3390127","limit":30});
CLI
cotlet call trainerize get_conversation --data '{"conversation_id":"3390127","limit":30}'

Example response

{
  "conversation_id": "3390127",
  "messages": [
    {
      "from": "Alex Rivera",
      "body": "Can I swap lunges for something easier on my knee?",
      "sent_at": "2026-10-10T07:02:00Z",
      "attachments": []
    }
  ]
}

POST https://cotlet.dev/api/v1/trainerize/list_master_programs

Lists the master programs in your library, with tags and how many clients are subscribed. Use the program_id with subscribe_to_program.

Parameters

Parameters: list_master_programs
NameTypeDescription
search string Match on program name.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/trainerize/list_master_programs \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("trainerize", "list_master_programs")
Node.js
const result = await cotlet.call('trainerize', 'list_master_programs');
CLI
cotlet call trainerize list_master_programs

Example response

{
  "programs": [
    {
      "program_id": "552031",
      "name": "6-week Shred",
      "tags": [
        "fat loss"
      ],
      "subscribers": 14
    },
    {
      "program_id": "552012",
      "name": "4-week Base",
      "tags": [
        "beginner"
      ],
      "subscribers": 31
    }
  ]
}

POST https://cotlet.dev/api/v1/trainerize/list_appointments

Lists appointments in the range, earliest first, with type, trainer and client. Admins and managers can read another trainer's schedule with trainer_id; other roles see their own.

Parameters

Parameters: list_appointments
NameTypeDescription
from required date Start date.
to required date End date.
trainer_id string Admins and managers: another trainer. Default: you.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/trainerize/list_appointments \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-01","to":"2026-10-01"}'
Python
result = client.call("trainerize", "list_appointments", {"from":"2026-10-01","to":"2026-10-01"})
Node.js
const result = await cotlet.call('trainerize', 'list_appointments', {"from":"2026-10-01","to":"2026-10-01"});
CLI
cotlet call trainerize list_appointments --data '{"from":"2026-10-01","to":"2026-10-01"}'

Example response

{
  "appointments": [
    {
      "appointment_id": "90311102",
      "client_id": "4821944",
      "appointment_type": "1-on-1 Appointment",
      "start": "2026-10-13T08:00:00-04:00",
      "end": "2026-10-13T09:00:00-04:00",
      "trainer": "yourname"
    }
  ]
}

Send message

write Confirm

POST https://cotlet.dev/api/v1/trainerize/send_message

Sends a message to one client in the Trainerize messenger under your name. The client sees it in the app. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: send_message
NameTypeDescription
client_id required string Client ID from list_clients.
body required string Message text.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/trainerize/send_message \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"client_8c41d2","body":"body"}'
Python
result = client.call("trainerize", "send_message", {"client_id":"client_8c41d2","body":"body"})
Node.js
const result = await cotlet.call('trainerize', 'send_message', {"client_id":"client_8c41d2","body":"body"});
CLI
cotlet call trainerize send_message --data '{"client_id":"client_8c41d2","body":"body"}'

Example response

{
  "conversation_id": "3390127",
  "message_id": "88120045",
  "status": "sent",
  "sent_at": "2026-10-10T09:05:00-04:00"
}

Subscribe to program

write Confirm

POST https://cotlet.dev/api/v1/trainerize/subscribe_to_program

Subscribes the clients to a master program as their main program or as an add-on, starting on the date you give. The program appears in each client's app. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: subscribe_to_program
NameTypeDescription
program_id required string Program ID from list_master_programs.
client_ids required string[] Clients to subscribe.
start_date required date First day of the program.
program_type enum main or add_on. Default: main.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/trainerize/subscribe_to_program \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"program_id":"552047","client_ids":["4821937","4821944"],"start_date":"2026-10-19","program_type":"main"}'
Python
result = client.call("trainerize", "subscribe_to_program", {"program_id":"552047","client_ids":["4821937","4821944"],"start_date":"2026-10-19","program_type":"main"})
Node.js
const result = await cotlet.call('trainerize', 'subscribe_to_program', {"program_id":"552047","client_ids":["4821937","4821944"],"start_date":"2026-10-19","program_type":"main"});
CLI
cotlet call trainerize subscribe_to_program --data '{"program_id":"552047","client_ids":["4821937","4821944"],"start_date":"2026-10-19","program_type":"main"}'

Example response

{
  "program_id": "552031",
  "program_type": "main",
  "start_date": "2026-10-19",
  "subscribed": [
    {
      "client_id": "4821937",
      "status": "subscribed"
    },
    {
      "client_id": "4821944",
      "status": "subscribed"
    }
  ]
}

Log body stats

write Confirm

POST https://cotlet.dev/api/v1/trainerize/log_body_stats

Enters body stats for one client on one date, in the client's units. The entry shows in the client's progress. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: log_body_stats
NameTypeDescription
client_id required string Client ID from list_clients.
date required date Day of the measurement.
stats required object Any of body_weight, body_fat_percent, waist, hips, chest, neck and other body measurements.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/trainerize/log_body_stats \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"client_8c41d2","date":"2026-10-01","stats":"stats"}'
Python
result = client.call("trainerize", "log_body_stats", {"client_id":"client_8c41d2","date":"2026-10-01","stats":"stats"})
Node.js
const result = await cotlet.call('trainerize', 'log_body_stats', {"client_id":"client_8c41d2","date":"2026-10-01","stats":"stats"});
CLI
cotlet call trainerize log_body_stats --data '{"client_id":"client_8c41d2","date":"2026-10-01","stats":"stats"}'

Example response

{
  "client_id": "4821937",
  "date": "2026-10-10",
  "status": "logged",
  "stats": {
    "body_weight": 82.4,
    "waist": 88
  }
}

Schedule appointment

write Confirm

POST https://cotlet.dev/api/v1/trainerize/schedule_appointment

Books an appointment of the type you name, with the client, at the start time you give. A weekly or monthly repeat creates one appointment per date up to repeat_until. Notes are visible to the client. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: schedule_appointment
NameTypeDescription
client_id required string Client ID from list_clients.
appointment_type required string Appointment type name, e.g. 1-on-1 Appointment.
start required datetime ISO 8601 with time zone.
repeat enum none, weekly or monthly. Default: none.
repeat_until date Last date of a repeating appointment.
notes string Appointment notes. The client can see them.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/trainerize/schedule_appointment \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"4821937","appointment_type":"1-on-1 Appointment","start":"2026-10-13T07:00:00-04:00","repeat":"weekly","repeat_until":"2026-11-10"}'
Python
result = client.call("trainerize", "schedule_appointment", {"client_id":"4821937","appointment_type":"1-on-1 Appointment","start":"2026-10-13T07:00:00-04:00","repeat":"weekly","repeat_until":"2026-11-10"})
Node.js
const result = await cotlet.call('trainerize', 'schedule_appointment', {"client_id":"4821937","appointment_type":"1-on-1 Appointment","start":"2026-10-13T07:00:00-04:00","repeat":"weekly","repeat_until":"2026-11-10"});
CLI
cotlet call trainerize schedule_appointment --data '{"client_id":"4821937","appointment_type":"1-on-1 Appointment","start":"2026-10-13T07:00:00-04:00","repeat":"weekly","repeat_until":"2026-11-10"}'

Example response

{
  "appointment_id": "90311284",
  "client_id": "4821937",
  "appointment_type": "1-on-1 Appointment",
  "start": "2026-10-13T07:00:00-04:00",
  "end": "2026-10-13T08:00:00-04:00",
  "repeat": "weekly",
  "occurrences": 5,
  "trainer": "yourname"
}

Add client tags

write Confirm

POST https://cotlet.dev/api/v1/trainerize/add_client_tags

Adds existing custom client tags to the clients. Tags group clients for list_clients and for your own filters in Trainerize. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: add_client_tags
NameTypeDescription
client_ids required string[] Clients to tag.
tags required string[] Existing custom client tag names.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/trainerize/add_client_tags \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_ids":["client ids"],"tags":["tags"]}'
Python
result = client.call("trainerize", "add_client_tags", {"client_ids":["client ids"],"tags":["tags"]})
Node.js
const result = await cotlet.call('trainerize', 'add_client_tags', {"client_ids":["client ids"],"tags":["tags"]});
CLI
cotlet call trainerize add_client_tags --data '{"client_ids":["client ids"],"tags":["tags"]}'

Example response

{
  "tags": [
    "Challenge"
  ],
  "tagged": [
    "4821937",
    "4821944"
  ],
  "status": "tagged"
}

Set client status

write Confirm

POST https://cotlet.dev/api/v1/trainerize/set_client_status

Deactivates a client, who then loses access to the app while the history is kept, or reactivates a deactivated one. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: set_client_status
NameTypeDescription
client_id required string Client ID from list_clients.
status required enum deactivated or active.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/trainerize/set_client_status \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"client_8c41d2","status":"deactivated"}'
Python
result = client.call("trainerize", "set_client_status", {"client_id":"client_8c41d2","status":"deactivated"})
Node.js
const result = await cotlet.call('trainerize', 'set_client_status', {"client_id":"client_8c41d2","status":"deactivated"});
CLI
cotlet call trainerize set_client_status --data '{"client_id":"client_8c41d2","status":"deactivated"}'

Example response

{
  "client_id": "4821944",
  "status": "deactivated"
}