> For the complete documentation index, see [llms.txt](https://docs.stellic.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.stellic.com/stellic-partner-api/exports/export-appointments.md).

# Export appointments

Use this endpoint to export appointments, one row per appointment and student guest; an appointment with no student guest has no row. Rows come newest first. Bound it with `start` and `end` (send both or neither), which keep appointments whose scheduled start is on or after `start` and whose scheduled end is on or before `end`. Pass `fields`, a comma-separated list, to choose columns. With more than 5,000 appointments in the range (or in total, without `start` and `end`) and no `delivery_channel`, it runs as a background export you download with [`GET /get_export_url/`](/stellic-partner-api/exports/poll-an-async-export-and-fetch-its-presigned-url.md).

## GET /exports/all\_appointments

>

```json
{"openapi":"3.0.0","info":{"title":"Stellic for Developers","version":"1.0"},"tags":[{"name":"Exports","description":"Institution-wide datasets as CSV or JSON. Small datasets come back inline; large ones run in the background and return a `file_name` you poll with `GET /get_export_url/` for a download link."}],"servers":[{"url":"https://{institution}.stellic.com/partnerapi/v1","variables":{"institution":{"default":"{institution}","description":"Your institution's Stellic subdomain: the part before `.stellic.com` in the URL you use to sign in. It becomes the host in every request, as in `https://{institution}.stellic.com/partnerapi/v1/...`. Replace the `{institution}` placeholder with your subdomain before sending."}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Personal Access Token issued by your Stellic integration partner. Send it as `Authorization: Bearer <token>` on every request. One token per institution; do not share across environments."}}},"paths":{"/exports/all_appointments":{"get":{"tags":["Exports"],"parameters":[{"name":"fields","in":"query","required":false,"description":"Comma-separated list of appointment fields to include. Standard columns retain the response's column order, regardless of this list's order. An unrecognized name adds an empty column headed by that name.\nAvailable fields (all returned if 'fields' is omitted):\n  - date\n  - time\n  - duration\n  - status\n  - type\n  - location\n  - location_type\n  - timeblock_name\n  - created_by\n  - cancelled_by\n  - rescheduled_by\n  - note\n  - note_tags\n  - questions\n  - visibility\n  - queue_joined_time\n  - queue_wait_time\n  - queue_status\n  - queue_served_by\n  - queue_meeting_start\n  - queue_meeting_end\n  - queue_meeting_duration\n  - student_id\n  - student_username\n  - student_first_name\n  - student_last_name\n  - student_email\n  - programs\n  - level\n  - student_campus\n  - student_schools\n  - student_advisors\n  - student_primary_advisor\n  - staff_username\n  - staff_first_name\n  - staff_last_name\n  - staff_email\n  - staff_department\n  - staff_roles\n  - staff_groups\n","schema":{"type":"string"}},{"name":"output_format","in":"query","required":false,"description":"`csv` (default) or `json` (an array of row objects keyed by column name). If you omit it and send the header `Accept: application/json` (exactly that value), the export is produced as `json`; an explicit `output_format` always wins.","schema":{"type":"string","enum":["csv","json"],"default":"csv"}},{"name":"delivery_channel","in":"query","required":false,"description":"`http_file` or `http_response` returns the export in the response; `s3` runs it in the background. If omitted, more than 5,000 non-private appointments, excluding cancelled and rescheduled appointments by default, trigger a background export. The count uses the start/end window when supplied.","schema":{"type":"string","enum":["http_file","http_response","s3"]}},{"name":"start","in":"query","required":false,"description":"Lower bound on the appointment's **scheduled start**: include appointments whose scheduled start is on or after this timestamp. This filters on when the appointment is scheduled, not when it was created or last changed. ISO 8601 with a timezone offset, e.g. `2025-07-16T00:00:00+05:00`; send the `+` as `%2B` (`2025-07-16T00:00:00%2B05:00`). `start` and `end` must be supplied together or both omitted; passing only one returns 400. Validate both timestamps before sending them: malformed values can return 400 when delivery_channel is omitted, 500 with http_file or http_response, or fail the background job with s3. Parameters other than those listed here are passed to the appointment search; an unrecognized parameter returns 500 or fails the background job.","schema":{"type":"string","format":"date-time"}},{"name":"end","in":"query","required":false,"description":"Upper bound on the appointment's **scheduled end**: include appointments whose scheduled end is on or before this timestamp. Pair it with `start` to select appointments that fall inside the window. ISO 8601 with a timezone offset, e.g. `2025-07-17T00:00:00+05:00`; send the `+` as `%2B`. Passing only one of `start`/`end` returns 400. Validate both timestamps before sending them: malformed values can return 400 when delivery_channel is omitted, 500 with http_file or http_response, or fail the background job with s3.","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"The rows, in the response as CSV or, with `output_format=json`, as a JSON array of row objects keyed by column name. With no delivery_channel, over 5,000 non-private appointments in the start/end range (or in total), excluding cancelled and rescheduled appointments by default, run in the background. With delivery_channel=s3, the export also runs in the background. A background response is the job object with data.file_name to poll on GET /get_export_url/. An empty export is a header-only CSV or an empty JSON array.","content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"type":"object"}},{"type":"object"}]}},"text/csv":{"schema":{"type":"string","format":"csv","description":"CSV with one row per (appointment, student guest) pair; an appointment with several student guests has one row per guest, and one with no student guest has no row. Private appointments are left out. Cancelled and rescheduled appointments are excluded by default. The full default column set (used when `fields` is omitted) is listed below; passing `fields` restricts the output to the matching subset. Six student columns (first name, last name, both ID columns, email, campus) are access-controlled: for a student the account behind your token can't view, those cells contain `[no access]`. Other columns are not hidden by this access check. Columns with several values join them with `, `.\n- `Student's First Name`, `Student's Last Name` - the student guest's name.\n- `Student's ID` - the student's SIS ID.\n- The student's username, headed by your institution's username label (default `Student's Username`). If the label is `Student's ID`, the default CSV has two `Student's ID` headers. JSON keeps only the last column for each duplicate header, so of these two ID columns only the username is retained. Use CSV to retain columns with duplicate headers. The examples use distinct headers.\n- `Student's Email` - the student's email address.\n- `Student's Campus` - the student's campus.\n- `Student's Schools` - the student's schools.\n- `Student's Declared Programs` - the student's declared programs.\n- `Student's Advisors` - all of the student's advisors.\n- `Student's Primary Advisor` - the student's primary advisor.\n- `Student's Level` - the student's class level (e.g., Junior, Senior).\n- `Location Type` - `In Person`, `Phone Call`, `Video Call`, or `Other`.\n- `Location Value` - the specific location (room, video link, or phone number).\n- `Date of Appointment` - the appointment's start date in the time zone of the account behind your token, `MM/DD/YYYY`.\n- `Time of Appointment` - start time as `HH:MM AM/PM` in the time zone of the account behind your token (e.g., `09:00 AM`).\n- `Duration (in minutes)` - appointment length in minutes, as a decimal number (e.g., `30.0`).\n- `Status` - the student's attendance: `Attended`, `Not Attended`, `Rescheduled`, `Removed`, `Declined`, or `Not Recorded` with the default appointment filters. A student guest marked cancelled on an appointment that isn't cancelled shows as `Declined`.\n- `Appointment Type` - `One-on-one`, `Group`, or `Drop-in`.\n- `Created By` - `Student` if the student guest is the organizer, otherwise `Admin`.\n- `Cancelled By`, `Rescheduled By` - `Student` or `Admin`; the text `None` if no cancelling or rescheduling account is recorded.\n- `Timeblock` - name of the timeblock the appointment was booked against.\n- `Appointment Note` - note text on the appointment.\n- `Appointment Note Tags` - display names of the tags on the appointment's note; blank when there is no note or no tags.\n- `Visibility` - `Public` (private appointments are excluded).\n- `Queue Joined Time` - for an appointment that came through a queue, the time of day the student joined the queue (`HH:MM AM/PM`, the token account's time zone); blank otherwise.\n- `Queue Wait Time (minutes)` - minutes the student waited in the queue, to one decimal; blank for appointments that did not come through a queue.\n- `Queue Status` - the queue entry's status (for example `waiting`, `in_meeting`, `completed`, `no_show`); blank for appointments that did not come through a queue.\n- `Served By` - full name of the staff member who last updated the queue entry's status; blank for appointments that did not come through a queue.\n- `Meeting Start`, `Meeting End` - the appointment's start and end time of day (`HH:MM AM/PM`, the token account's time zone).\n- `Meeting Duration (minutes)` - minutes between the appointment's start and end, to one decimal.\n- `Staff First Name`, `Staff Last Name`, `Staff Username`, `Staff Email` - the host staff member.\n- `Staff Roles`, `Staff Groups`, `Staff Department` - the host's roles, groups, and department.\n- Booking-question columns follow the standard columns, headed by each question's label. Only questions answered in the exported appointments get a column; their order can vary. These columns are included by default, or selected with `questions` in `fields`. There is no standalone `questions` column in the default output. A questions-only selection with no answered questions retains a `questions` placeholder column.\n\nRows are ordered by scheduled start, newest first. With no `delivery_channel`, more than 5,000 non-private appointments in the `start` to `end` range (or in total, without `start` and `end`), excluding cancelled and rescheduled appointments by default, trigger a background-export JSON response instead; poll `GET /get_export_url/` to fetch the file.\n"}}}},"400":{"description":"Bad Request. The body is {\"errors\": [{\"message\": \"...\"}]}. Validation messages are not wrapped in brackets. Causes include sending only one of start/end, an invalid datetime rejected while choosing delivery when delivery_channel is omitted, or an unsupported output_format or delivery_channel. Sending fields without date is supported. Malformed timestamps do not consistently return 400: with explicit http_file or http_response they can return 500, or fail an explicitly requested s3 background job. Validate both timestamps before sending them.\n\nWhen the export runs in the background, errors found while building it fail the job instead.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - Invalid or missing API token","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"The account behind your token lacks permission to view other staff members' appointments, or your IP address isn't on the allowlist. A permission failure while building a background export fails the job after the initial job response.","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"An unrecognized appointment-search parameter fails an inline export. Malformed start/end timestamps can also return this response with explicit delivery_channel=http_file or delivery_channel=http_response. Send only the listed parameters and validate both timestamps before sending them. With delivery_channel=s3, these errors fail the background job after the initial job response.","content":{"application/json":{"schema":{"type":"object"}}}}}}}}}
```

#### Notes

{% hint style="warning" %}
**Send only the parameters listed here.** Any other query parameter goes to the appointment search. One the search doesn't recognize fails the export with a 500, or fails the background job. One it recognizes, such as `status`, changes which appointments come back.
{% endhint %}

* The account behind your token needs permission to view other staff members' appointments. Without it, the call returns a 403. A background export returns the job first and then fails.
* Private appointments are left out. By default, cancelled and rescheduled appointments are too.
* Columns the account can't view show `[no access]`. For a student the account can't view, this covers the student's name, both ID columns, email, and campus. Other columns are not hidden by this access check.
* Dates and times are in the time zone of the account behind your token. This covers `Date of Appointment` (`MM/DD/YYYY`), `Time of Appointment`, `Queue Joined Time`, `Meeting Start`, and `Meeting End`.
* Some columns hold categories, not names. With the default appointment filters, `Status` is the student's attendance: `Attended`, `Not Attended`, `Rescheduled`, `Removed`, `Declined`, or `Not Recorded`. A student guest marked cancelled on an appointment that isn't cancelled shows as `Declined`. `Created By`, `Cancelled By`, and `Rescheduled By` are `Student` or `Admin`. `Cancelled By` and `Rescheduled By` are the text `None` when no cancelling or rescheduling account is recorded.
* **`fields` picks columns, not their order.** Standard columns always come in the order shown in the response. An unrecognized name adds an empty column headed by that name.
* Booking questions get one column each, after the other columns, headed by the question's label. A question gets a column only if someone answered it in the exported appointments, and the order of these columns can change between exports. They're included by default; with `fields`, include `questions` to get them.
* The username column is headed by your institution's username label (`Student's Username` unless your institution set another). In the default output, it sits next to `Student's ID`, which holds the SIS ID. If your institution's username label is `Student's ID`, the default CSV has two `Student's ID` headers. JSON keeps only the last column for each duplicate header, so of these two ID columns only the username is retained. Use CSV to retain columns with duplicate headers.
* **Send `+` in `start` and `end` as `%2B`.** Both take ISO 8601 with an offset, for example `2025-07-16T00:00:00%2B05:00`. Validate both timestamps before sending them. Malformed values can return 500 with `delivery_channel=http_file` or `delivery_channel=http_response`, or fail the job with `delivery_channel=s3`.
* An empty export is a CSV with only the header row, or `[]` in JSON.

#### Related APIs

* [`GET /get_export_url/`](/stellic-partner-api/exports/poll-an-async-export-and-fetch-its-presigned-url.md) to download a background export.
* [`GET /exports/all_notes`](/stellic-partner-api/exports/export-all-advising-notes.md) for advising notes.
* [`GET /exports/{property}`](/stellic-partner-api/exports/bulk-export-dispatcher.md) for formats, delivery, and errors.
