An appointment resource is a place where appointments happen in person, for example a practice or a treatment room. It is what turns an availability type from an online video appointment into an in-person one: a type that points at a resource is held at that place, a type without one is a video appointment.
Requirements
- In-person appointments must be enabled for the organization. Without that feature, every endpoint on this page returns
403with the codefeature_disabled. See Scheduling API overview. - Instance tokens name the organization with
organization_idororganization_external_idwhen they create a resource, and may use them as a filter on lists.
The appointment resource object
| Field | Type | Description |
|---|---|---|
id |
string (uuid) | MeetOne's ID of the resource. |
external_id |
string, nullable | Your key for the resource. Unique within the organization. See Identifiers. |
name |
string | The name of the place, e.g. Praxis 1. |
address |
string, nullable | The address, e.g. Hauptstraße 1, 12345 Musterstadt. |
active |
boolean | false for an archived resource. |
created_at, updated_at |
string (date-time) | Timestamps. |
List and show resources
GET /api/v1/appointment_resources and GET /api/v1/appointment_resources/{id}
| Query parameter | Type | Description |
|---|---|---|
active |
boolean | Only active (true) or archived (false) resources. |
external_id |
string | Only the resource with this external ID. |
organization_id, organization_external_id |
string | Instance tokens: only this organization's resources. |
updated_since |
string (date-time) | Only resources changed at or after this time. |
page, per_page |
integer | Pagination. |
Resources are listed by name.
curl "https://acme.meetone.io/api/v1/appointment_resources?active=true" \
-H "Authorization: Bearer $TOKEN"
Create a resource
POST /api/v1/appointment_resources
Only name is required. address, external_id and active are optional; a new resource is active.
curl -X POST "https://acme.meetone.io/api/v1/appointment_resources" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Praxis 1",
"address": "Hauptstraße 1, 12345 Musterstadt",
"external_id": "location-main"
}'
A successful request returns 201 Created:
{
"data": {
"id": "9c1e7b30-4f2a-4d85-b6a9-3a8e5d0f1c72",
"external_id": "location-main",
"name": "Praxis 1",
"address": "Hauptstraße 1, 12345 Musterstadt",
"active": true,
"created_at": "2026-10-08T10:00:00+02:00",
"updated_at": "2026-10-08T10:00:00+02:00"
}
}
A missing name returns 422 with the code blank; an external_id that is already in use returns 422 with the code taken.
Update a resource
PATCH /api/v1/appointment_resources/{id}
Send only the fields you want to change. Setting active to true brings an archived resource back.
curl -X PATCH "https://acme.meetone.io/api/v1/appointment_resources/9c1e7b30-4f2a-4d85-b6a9-3a8e5d0f1c72" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "address": "Hauptstraße 3, 12345 Musterstadt" }'
Archive a resource
DELETE /api/v1/appointment_resources/{id} returns 204 No Content.
Resources are never deleted, only archived (active: false). Appointments and availability types keep pointing at their resource, and an appointment must not silently turn into a video appointment because its place disappeared. To bring an archived resource back, PATCH it with "active": true.
Link a resource to an availability type
A resource becomes bookable when an availability type points at it, using appointment_resource_id or appointment_resource_external_id on the type:
curl -X POST "https://acme.meetone.io/api/v1/availability_types" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"display_name": "First visit in the practice",
"slot_duration": 30,
"appointment_resource_external_id": "location-main"
}'
Appointments booked for that type take the resource as their place. They have no video call, so their video is null. See Availability types endpoints.
Related
Questions? Contact us at support@meetone.io.