# Appointment resources endpoints

> Reference for creating, reading, updating and archiving appointment resources, the places where in-person appointments take place, and how they connect to availability types.

Source: https://help.meetone.io/developers/scheduling-api/appointment-resources-endpoints
Last updated: 2026-10-08

---

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](https://help.meetone.io/developers/scheduling-api/availability-types-endpoints) 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](https://help.meetone.io/developers/scheduling-api/overview#feature-requirements).
- 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](https://help.meetone.io/developers/scheduling-api/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.

```bash
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.

```bash
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`:

```json
{
  "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.

```bash
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:

```bash
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](https://help.meetone.io/developers/scheduling-api/availability-types-endpoints).

## Related

- [Availability types endpoints](https://help.meetone.io/developers/scheduling-api/availability-types-endpoints)
- [Appointments endpoints](https://help.meetone.io/developers/scheduling-api/appointments-endpoints)
- [Scheduling API overview](https://help.meetone.io/developers/scheduling-api/overview)

Questions? Contact us at [support@meetone.io](mailto:support@meetone.io).
