Quickstart
Create an API key, make your first call and create a one-off event with its sequence in five minutes.
Create an API key
In the app, open Settings, Integrations, New API key. Give it a name ("Make", "my-crm"), pick the scopes, and copy the key: it is shown once. See API keys.
Check who you are
curl https://app.groupilot.com/api/v1/me \
-H "Authorization: Bearer gp_live_xxxxxxxxxxxxxxxx"{
"project": { "id": "…", "name": "Marie Coaching", "slug": "marie-coaching", "timezone": "Europe/Paris", "billing": "active", "automation_blocked": false, "created_at": "2026-10-01T09:00:00+02:00" },
"channel": { "state": "connected", "phone_masked": "+33 6 •• •• •• 12", "connected_at": "2026-11-03T09:10:00+01:00" },
"key": { "id": "…", "key_id": "gp_live_ab12", "scopes": ["read", "write"] },
"limits": { "read_per_minute": 120, "write_per_minute": 30, "broadcasts_per_day": 8, "adhoc_messages_per_day": 30, "media_per_day": 50 }
}channel is null while no number is linked. billing is active, trialing or inactive. A 403 means the API is not turned on for this project yet, or the key lacks the scope: the message says which.
Create a sequence
curl -X PUT https://app.groupilot.com/api/v1/sequences/sync \
-H "Authorization: Bearer gp_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"external_id": "launch-nov",
"name": "Launch webinar",
"messages": [
{ "external_id": "m1", "timing": "J-1 10:00", "type": "text", "text": "Tomorrow {J:jour} at 8 pm, live." },
{ "external_id": "m2", "timing": "J0 19:55", "type": "text", "text": "We are live in 5 minutes.", "ghost_mention": true }
]
}'The response returns the sequence with its id and created: true. Calling it again with the same external_id updates it instead of creating a duplicate.
Create the event, its date, and link the sequence
curl -X POST https://app.groupilot.com/api/v1/events \
-H "Authorization: Bearer gp_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7d2c1b7e-launch-nov" \
-d '{
"name": "Launch webinar",
"slug": "launch-webinar",
"type": "punctual",
"community": { "days_before": 5 }
}'The response includes smart_link: that is the link to put on the confirmation page. The event has no date yet: add one, then link the sequence.
curl -X POST "https://app.groupilot.com/api/v1/events/<event_id>/occurrences" \
-H "Authorization: Bearer gp_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "scheduled_at_local": "2026-11-20T20:00" }'curl -X PUT "https://app.groupilot.com/api/v1/events/<event_id>/sequence" \
-H "Authorization: Bearer gp_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "sequence_id": "<id from the previous step>" }'The community is created 5 days before the live, the two messages are planned for it (created_jobs: 2).
Watch the planned sends
curl "https://app.groupilot.com/api/v1/events/<event_id>/jobs?status=scheduled&order=asc" \
-H "Authorization: Bearer gp_live_xxxxxxxxxxxxxxxx"The response is { "items": [...], "next_cursor": null }. Each item has a status (scheduled, billing_paused, overdue, sent, partial, failed, canceled), its send_at, its content and per-community delivery counts. The same list is in the Messages tab of the event in the app. Full shape in the Messages reference.
Next
- Sync your sequences for the full semantics of
syncand resync. - Webhooks to be told when a member joins or a send fails.
- Limits and errors before you ship.