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 403 with the code feature_disabled. See Scheduling API overview.
  • Instance tokens name the organization with organization_id or organization_external_id when 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.

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.

Questions? Contact us at support@meetone.io.