Export Meetings
Retrieve a flat list of your organization’s meetings, where you choose exactly which meeting columns to return and which date range to cover. Each record is one meeting (its scheduling details, capacity, pricing, facilitator, and configuration flags) — not its attendees.
This is the API behind the “List Meetings from API” export tool in the organization dashboard. It returns the raw, stored values for each meeting so they can be dropped straight into a spreadsheet, data warehouse, or another system.
When To Use This Endpoint
Use Export Meetings when you want a customizable, spreadsheet-style dump of the meetings themselves over an arbitrary date range. Typical uses:
- Exporting a catalogue or schedule of your meetings into Excel/Google Sheets, a BI tool, or a data warehouse.
- Pulling meeting metadata (titles, types, hosts, prices, capacity, group leader) for a reporting period to build internal reports or reconcile records.
- Syncing meeting definitions into an external system, choosing only the columns you need.
Reach for a different endpoint when:
- You need to know who attended, registered, joined, or was waitlisted — use Meeting Attendance, which returns one row per attendee.
- You need a live, paginated “what’s coming up” feed for display (with attendee counts and group-leader avatars) — use Upcoming Meetings, which returns an enriched, display-ready shape.
In short: Export Meetings = the meetings catalogue, your columns, any date range. Meeting Attendance = the roster. Upcoming Meetings = the display feed.
Endpoint
- GET:
/api/v2/organizations/:id/export_meetings - POST:
/api/v2/organizations/:id/export_meetings
GET is the recommended method — this endpoint only reads data. POST behaves identically and is retained for backwards compatibility with existing integrations.
Authentication
Authorization: Bearer <token>header- Token must resolve to the target organization via
AuthorizeApiRequest. The:idin the URL must be your organization’s id.
Request Parameters
Send the parameters as query-string parameters with GET, or as a JSON body with POST. The parameter names are the same either way; with GET, pass the column list as a repeated column[] parameter (e.g. ?column[]=name&column[]=topic).
| Name | Type | Default | Description |
|---|---|---|---|
column | Array<String> | — | The meeting columns to include in each row. If omitted or empty, the response is { "success": true, "meetings": [] }. See the supported keys below. |
reporting_days | String | all | Date-range preset for which meetings to include (see below). |
start_time | String | — | Start of a custom range. Format: MM/DD/YYYY HH:MM AM/PM (e.g. 11/01/2025 08:00 AM). |
end_time | String | — | End of a custom range. Same format as start_time. |
report_type | String | all_meetings | all_meetings for all of your organization’s meetings, or eap_meetings to limit the export to your Employee Assistance Program (enrolled-member) meetings. |
page | Integer | — | Page number (1-indexed). Supplying this (or per_page) turns on pagination — see Pagination. |
per_page | Integer | 100 | Items per page when pagination is enabled. Clamped to 1..100. |
reporting_days values
| Value | Meetings returned |
|---|---|
all (default) / omitted | Completed (past) meetings only. |
all_past | Completed (past) meetings. |
all_upcoming | Upcoming meetings (not yet ended, not cancelled/completed). |
today | Meetings starting today. |
current_month | Meetings starting in the current month. |
last_week | Meetings starting in the previous week. |
last_month | Meetings starting in the previous month. |
custom | Meetings starting within start_time–end_time (both required). |
Heads up: with no
reporting_days(orall), the export defaults to completed, past meetings only. To export future meetings, passreporting_days=all_upcoming. If bothstart_timeandend_timeare supplied, that explicit range is always applied on top of the preset.
Supported column keys
| Key | Label | Type | Notes |
|---|---|---|---|
name | Name | String | |
meeting_type | Meeting Type | String | e.g. Group, OneToOne. |
start_time | Start Time | String | ISO 8601 datetime (UTC). |
duration | Duration | Integer | Stored duration value. |
status | Status | String | e.g. scheduled, complete, cancel. |
topic | Topic | String | |
special_focus | Special Focus | String | |
host | Host | String | |
location | Location | String | Platform the meeting runs on: heypeers or zoom. |
price | Price | Number | Defaults to 0 when no price is set. |
max_attendees | Max Registrants | Integer | |
meeting_description | Description | String | |
group_leader_id | Group Leader | Integer | null | Returned under the key group_leader, as the leader’s user id (or null). |
privacy | Privacy | Boolean | |
eap | EAP Meeting | Boolean | |
allow_meeting_donation | Donation Allowed | Boolean | |
invitation_only | Invitation Only | Boolean | |
wait_list | Wait List | Boolean |
Each object in the response contains only the keys you requested. With the single exception of group_leader_id (returned as group_leader), the response key matches the column key you sent.
Pagination
By default this endpoint returns every matching meeting in a single response, so existing integrations keep working unchanged. Pagination is opt-in: supply a page and/or per_page parameter and the response switches to a paginated shape that adds a metadata block.
- The default page size is
100;per_pagemay be1..100. - Paginated results are ordered by
start_timeascending, thenid, so page boundaries are stable across requests. - Without
pageorper_page, the response keeps the unpaginated{ "success": true, "meetings": [...] }shape and includes nometadata.
Recommended: new integrations should paginate (e.g.
?page=1&per_page=100) and followmetadata.total_pagesto iterate. For organizations with a large meeting history, an unpaginated call can return a very large payload.
Example Request
GET (recommended)
GET /api/v2/organizations/5/export_meetings?reporting_days=all_upcoming&column[]=name&column[]=meeting_type&column[]=start_time&column[]=status&column[]=group_leader_id&column[]=price
Authorization: Bearer <token>
Accept: application/jsoncurl -G "https://heypeers.com/api/v2/organizations/{ORG_ID}/export_meetings" \
-H "Authorization: Bearer {TOKEN}" \
-H "Accept: application/json" \
--data-urlencode "reporting_days=custom" \
--data-urlencode "start_time=11/01/2025 08:00 AM" \
--data-urlencode "end_time=11/30/2025 05:00 PM" \
--data-urlencode "column[]=name" \
--data-urlencode "column[]=start_time" \
--data-urlencode "column[]=max_attendees" \
--data-urlencode "column[]=location"POST (legacy, still supported)
POST /api/v2/organizations/5/export_meetings
Authorization: Bearer <token>
Content-Type: application/json
Accept: application/json{
"reporting_days": "all_upcoming",
"column": ["name", "meeting_type", "start_time", "status", "group_leader_id", "price"]
}Success Response
200 OK
Default (unpaginated) — returned when neither page nor per_page is supplied:
{
"success": true,
"meetings": [
{
"name": "Morning Grief Support Circle",
"meeting_type": "Group",
"start_time": "2026-05-23T15:00:00.000Z",
"status": "scheduled",
"group_leader": 4501,
"price": 0
},
{
"name": "Evening Recovery Check-in",
"meeting_type": "Group",
"start_time": "2026-05-24T23:30:00.000Z",
"status": "scheduled",
"group_leader": 4502,
"price": 10
}
]
}Paginated — returned when page and/or per_page is supplied:
{
"success": true,
"metadata": {
"page": 1,
"per_page": 100,
"total_pages": 3,
"total_count": 250
},
"meetings": [
{
"name": "Morning Grief Support Circle",
"meeting_type": "Group",
"start_time": "2026-05-23T15:00:00.000Z",
"status": "scheduled",
"group_leader": 4501,
"price": 0
}
]
}Response Fields
| Field | Type | Description |
|---|---|---|
success | Boolean | true when the request succeeds. |
metadata | Object | Pagination details. Only present when the request is paginated (see below). |
meetings | Array | One object per matching meeting. Each object contains exactly the keys you requested via column (with group_leader_id returned as group_leader). |
metadata object (paginated responses only)
| Field | Type | Description |
|---|---|---|
page | Integer | Current page number. |
per_page | Integer | Page size used for the response. |
total_pages | Integer | Total number of pages across the full result set. |
total_count | Integer | Total number of matching meetings across all pages. |
Error Responses
400 Bad Request{ "error": "<message>" }for an unexpected error (also reported to Bugsnag withinfoseverity).
401 Unauthorized{ "error": "Unauthorized Access" }when the bearer token does not resolve to an organization.{ "error": "Not Authorized" }when the token resolves to a different organization than the one in the URL.
Notes
GETandPOSTare equivalent. Both accept the same parameters and return the same response.GETis recommended for new integrations;POSTis kept so existing integrations keep working unchanged.- Pagination is opt-in. Without
page/per_pagethe endpoint returns every matching meeting in a single response (unchanged legacy behaviour). Supplypage/per_pageto paginate — recommended for organizations with a large meeting history, where an unpaginated call can return a very large payload. See Pagination. - Raw stored values. Unlike Upcoming Meetings, this endpoint does not add computed fields (no registered-attendee counts, no group-leader avatar). Values are returned as stored on the meeting record.
- An empty or missing
columnarray is not an error — it returns"meetings": []. report_type=eap_meetingslimits the export to your organization’s enrolled-member (EAP) meetings.- For organizations running an Employee Assistance Program (EAP), the default
all_meetingsscope also includes associated HeyPeers Counseling (HPC) meetings.