---
title: "List services"
description: "For voice/AI agents set agentMode=true: up to 10 matches, each with summary, a concise Spanish line with its exact id and code to read to the caller, from a complete catalog cache of at most 60 seconds. Use q (name/code, accent-insensitive), active and kind filters; use a short distinctive term and limit 5 for a caller question. Filtered searches inspect all provider pages before returning matching entries. Incomplete scans fail explicitly. Without filters, returns one catalog page. In every mode, follow pageInfo.nextCursor while hasNextPage is true before concluding an entry is absent. An empty completed search means no matching catalog entry, not that the clinic cannot perform the procedure. A generic procedure or missing price does not establish the requested service or tariff, and an active entry does not confirm that the clinic offers it or its requirements, coverage or appointments: verify them with information from the clinic.\n\n- **Scope:** `gmedic:catalogs:read`\n- **Credentials:** an API key, a client-credentials token or a person's access token\n- **Effect:** read-only; safe to retry\n- **Limits:** response up to 256 KB\n- **CLI:** `arbol gmedic services list` · **MCP tool:** `gmedic_services_list`"
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.getarbol.com/llms.txt
> Use this file to discover all available pages before exploring further.

Path: gMedic API › Services

`GET /v1/gmedic/services`

For voice/AI agents set agentMode=true: up to 10 matches, each with summary, a concise Spanish line with its exact id and code to read to the caller, from a complete catalog cache of at most 60 seconds. Use q (name/code, accent-insensitive), active and kind filters; use a short distinctive term and limit 5 for a caller question. Filtered searches inspect all provider pages before returning matching entries. Incomplete scans fail explicitly. Without filters, returns one catalog page. In every mode, follow pageInfo.nextCursor while hasNextPage is true before concluding an entry is absent. An empty completed search means no matching catalog entry, not that the clinic cannot perform the procedure. A generic procedure or missing price does not establish the requested service or tariff, and an active entry does not confirm that the clinic offers it or its requirements, coverage or appointments: verify them with information from the clinic.

- **Scope:** `gmedic:catalogs:read`
- **Credentials:** an API key, a client-credentials token or a person's access token
- **Effect:** read-only; safe to retry
- **Limits:** response up to 256 KB
- **CLI:** `arbol gmedic services list` · **MCP tool:** `gmedic_services_list`

## Authentication

Requires one of the following:

- `arbolHuman`, oauth2, scopes: `gmedic:catalogs:read`
- `arbolMachine`, oauth2, scopes: `gmedic:catalogs:read`
- `arbolApiKey`, http, header `Authorization`

## Query parameters

- `cursor` (`gmedic.services.list.query.cursor`; string, optional) — Opaque cursor returned by pageInfo; omit it to request the first page.
- `direction` (`gmedic.services.list.query.direction`; string, optional) — Direction to traverse the stable keyset ordering from the supplied cursor.
  - one of `"forward"`, `"backward"`; default `"forward"`
- `limit` (`gmedic.services.list.query.limit`; integer, optional) — Maximum items returned in one page. Defaults to 25; larger reads require another cursor.
  - min 1; max 100; default `25`
- `agentMode` (`gmedic.services.list.query.agentMode`; boolean, optional) — Set true for voice/AI agents: at most 10 matches, each with summary, from a complete catalog search and a tenant-isolated catalog cache of at most 60 seconds.
- `refresh` (`gmedic.services.list.query.refresh`; boolean, optional) — Bypass the agent catalog cache and read the provider now.
- `serviceId` (`gmedic.services.list.query.serviceId`; string, optional) — Exact catalog id. Use q for a service name or code.
  - pattern `^[1-9][0-9]{0,14}$`
- `q` (`gmedic.services.list.query.q`; string, optional) — Search name, code and description across the catalog, ignoring accents and case. Use a distinctive word such as lavado. An empty completed search means no matching catalog entry, not that the clinic cannot perform the procedure.
  - minLength 2; maxLength 120; pattern `\S`
- `active` (`gmedic.services.list.query.active`; boolean, optional) — Filter by the explicit catalog active flag. Omit to include unknown states.
- `kind` (`gmedic.services.list.query.kind`; string, optional) — Filter services or products. Use SERVICE for clinical service information.
  - one of `"SERVICE"`, `"PRODUCT"`
- `connectionId` (`gmedic.services.list.query.connectionId`; string, optional) — The connection id.
  - pattern `^con_[0-9A-Za-z]{26}$`
- `id` (`gmedic.services.list.query.id`; string, optional) — Deprecated: use `serviceId`. Answered until 2027-01-28.
  - pattern `^[1-9][0-9]{0,14}$`

## Code samples

### cURL

```bash
curl https://api.getarbol.com/v1/gmedic/services \
  --header "Authorization: Bearer $ARBOL_API_KEY"
```

### TypeScript

```typescript
import { createClient } from "@arbol-ai/sdk";

const arbol = createClient({
  baseUrl: "https://api.getarbol.com",
  token: process.env.ARBOL_API_KEY!,
});

const { data } = await arbol.gmedic.services.list();
```

### Rust

```rust
use arbol_sdk::{types, Client, Credential};

let arbol = Client::new(Credential::ApiKey(std::env::var("ARBOL_API_KEY")?))?;

let data = arbol
    .gmedic()
    .services()
    .list(&types::GmedicServicesListInput::default())
    .await?;
```

### CLI

```bash
arbol gmedic services list
```

### MCP

```json
{
  "name": "gmedic_services_list",
  "arguments": {}
}
```

## Responses

### 200

Successful operation.

#### Example

```json
{
  "success": true,
  "data": {
    "data": [
      {
        "id": "string",
        "key": "string",
        "code": "string",
        "name": "string",
        "description": "string",
        "type": {
          "id": "string",
          "name": "string",
          "label": "string",
          "value": "string"
        },
        "active": true,
        "summary": "string"
      }
    ],
    "object": "list",
    "pageInfo": {
      "hasNextPage": true,
      "hasPreviousPage": true,
      "nextCursor": "string",
      "previousCursor": "string"
    }
  },
  "error": null,
  "metadata": {
    "requestId": "string"
  }
}
```

- `success` (`gmedic.services.list.response.200.success`; boolean, required)
  - one of `true`
- `data` (`gmedic.services.list.response.200.data`; object, required)
  - `data` (`gmedic.services.list.response.200.data.data`; array<object>, required) — Items admitted by this resource contract within the verified organization.
    - `id` (`gmedic.services.list.response.200.data.data.id`; string, required)
      - pattern `^[1-9][0-9]{0,14}$`
    - `key` (`gmedic.services.list.response.200.data.data.key`; string | null, optional)
      - maxLength 20000
    - `code` (`gmedic.services.list.response.200.data.data.code`; string | null, optional)
      - maxLength 20000
    - `name` (`gmedic.services.list.response.200.data.data.name`; string | null, optional)
      - maxLength 20000
    - `description` (`gmedic.services.list.response.200.data.data.description`; string | null, optional)
      - maxLength 20000
    - `type` (`gmedic.services.list.response.200.data.data.type`; object | null, optional)
      - `id` (`gmedic.services.list.response.200.data.data.type.id`; string, required)
        - pattern `^[1-9][0-9]{0,14}$`
      - `name` (`gmedic.services.list.response.200.data.data.type.name`; string | null, optional)
        - maxLength 20000
      - `label` (`gmedic.services.list.response.200.data.data.type.label`; string | null, optional)
        - maxLength 20000
      - `value` (`gmedic.services.list.response.200.data.data.type.value`; string | null, optional)
        - maxLength 20000
    - `active` (`gmedic.services.list.response.200.data.data.active`; boolean | null, optional)
    - `summary` (`gmedic.services.list.response.200.data.data.summary`; string, optional) — With agentMode: the entry as one concise Spanish line, with its exact id and code, to read to the caller.
      - maxLength 600
  - `object` (`gmedic.services.list.response.200.data.object`; string, required) — Discriminator for a resource list response.
  - `pageInfo` (`gmedic.services.list.response.200.data.pageInfo`; object, required) — Opaque navigation cursors for this page’s stable keyset order.
    - `hasNextPage` (`gmedic.services.list.response.200.data.pageInfo.hasNextPage`; boolean, required) — Whether a later page exists in the current ordering.
    - `hasPreviousPage` (`gmedic.services.list.response.200.data.pageInfo.hasPreviousPage`; boolean, required) — Whether an earlier page exists in the current ordering.
    - `nextCursor` (`gmedic.services.list.response.200.data.pageInfo.nextCursor`; string | null, required) — Opaque cursor for the next page, or null when there is none.
    - `previousCursor` (`gmedic.services.list.response.200.data.pageInfo.previousCursor`; string | null, required) — Opaque cursor for the previous page, or null when there is none.
- `error` (`gmedic.services.list.response.200.error`; unknown, required)
- `metadata` (`gmedic.services.list.response.200.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`gmedic.services.list.response.200.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.

### 400

`INVALID_INPUT`: The request does not match the published schema.

#### Example

```json
{
  "success": false,
  "data": null,
  "error": {
    "code": "INVALID_INPUT",
    "message": "string",
    "retryable": false,
    "data": {
      "issues": [
        {
          "path": "string",
          "message": "string"
        }
      ]
    }
  },
  "metadata": {
    "requestId": "string"
  }
}
```

- `success` (`gmedic.services.list.response.400.success`; boolean, required)
  - one of `false`
- `data` (`gmedic.services.list.response.400.data`; unknown, required)
- `error` (`gmedic.services.list.response.400.error`; object, required) — The request does not match the published schema.
  - `code` (`gmedic.services.list.response.400.error.code`; string, required) — The failure code, stable across releases.
    - one of `"INVALID_INPUT"`
  - `message` (`gmedic.services.list.response.400.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`gmedic.services.list.response.400.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`gmedic.services.list.response.400.error.data`; object, required)
    - `issues` (`gmedic.services.list.response.400.error.data.issues`; array<object>, optional)
      - `path` (`gmedic.services.list.response.400.error.data.issues.path`; string, required) — RFC 6901 JSON Pointer to the refused field; empty for the whole input.
        - maxLength 256
      - `message` (`gmedic.services.list.response.400.error.data.issues.message`; string, required)
        - maxLength 256
- `metadata` (`gmedic.services.list.response.400.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`gmedic.services.list.response.400.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.

### 401

`UNAUTHORIZED`: A valid access token is required.

#### Example

```json
{
  "success": false,
  "data": null,
  "error": {
    "code": "UNAUTHORIZED",
    "message": "string",
    "retryable": false,
    "data": {}
  },
  "metadata": {
    "requestId": "string"
  }
}
```

- `success` (`gmedic.services.list.response.401.success`; boolean, required)
  - one of `false`
- `data` (`gmedic.services.list.response.401.data`; unknown, required)
- `error` (`gmedic.services.list.response.401.error`; object, required) — A valid access token is required.
  - `code` (`gmedic.services.list.response.401.error.code`; string, required) — The failure code, stable across releases.
    - one of `"UNAUTHORIZED"`
  - `message` (`gmedic.services.list.response.401.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`gmedic.services.list.response.401.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`gmedic.services.list.response.401.error.data`; object, required) — No fields.
- `metadata` (`gmedic.services.list.response.401.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`gmedic.services.list.response.401.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.

### 403

`FORBIDDEN`: The token does not authorize this operation.

#### Example

```json
{
  "success": false,
  "data": null,
  "error": {
    "code": "FORBIDDEN",
    "message": "string",
    "retryable": false,
    "data": {}
  },
  "metadata": {
    "requestId": "string"
  }
}
```

- `success` (`gmedic.services.list.response.403.success`; boolean, required)
  - one of `false`
- `data` (`gmedic.services.list.response.403.data`; unknown, required)
- `error` (`gmedic.services.list.response.403.error`; object, required) — The token does not authorize this operation.
  - `code` (`gmedic.services.list.response.403.error.code`; string, required) — The failure code, stable across releases.
    - one of `"FORBIDDEN"`
  - `message` (`gmedic.services.list.response.403.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`gmedic.services.list.response.403.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`gmedic.services.list.response.403.error.data`; object, required) — No fields.
- `metadata` (`gmedic.services.list.response.403.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`gmedic.services.list.response.403.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.

### 404

- `CONNECTION_NOT_FOUND`: This organization has no gMedic connection with this id.
- `RECORD_NOT_FOUND`: gMedic has no record with one of the ids sent.

#### Example

```json
{
  "success": false,
  "data": null,
  "error": {
    "code": "CONNECTION_NOT_FOUND",
    "message": "string",
    "retryable": false,
    "data": {}
  },
  "metadata": {
    "requestId": "string"
  }
}
```

- `success` (`gmedic.services.list.response.404.success`; boolean, required)
  - one of `false`
- `data` (`gmedic.services.list.response.404.data`; unknown, required)
- `error` (`gmedic.services.list.response.404.error`; one of, required)
  - one of: `GmedicConnectionNotFoundFailure`, `GmedicRecordNotFoundFailure`
  - discriminator: `code`
- `metadata` (`gmedic.services.list.response.404.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`gmedic.services.list.response.404.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.

### 409

`NOT_CONFIGURED`: This organization has no verified gMedic connection.

#### Example

```json
{
  "success": false,
  "data": null,
  "error": {
    "code": "NOT_CONFIGURED",
    "message": "string",
    "retryable": false,
    "data": {}
  },
  "metadata": {
    "requestId": "string"
  }
}
```

- `success` (`gmedic.services.list.response.409.success`; boolean, required)
  - one of `false`
- `data` (`gmedic.services.list.response.409.data`; unknown, required)
- `error` (`gmedic.services.list.response.409.error`; object, required) — This organization has no verified gMedic connection.
  - `code` (`gmedic.services.list.response.409.error.code`; string, required) — The failure code, stable across releases.
    - one of `"NOT_CONFIGURED"`
  - `message` (`gmedic.services.list.response.409.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`gmedic.services.list.response.409.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`gmedic.services.list.response.409.error.data`; object, required) — No fields.
- `metadata` (`gmedic.services.list.response.409.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`gmedic.services.list.response.409.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.

### 422

`PROVIDER_INPUT_REJECTED`: gMedic rejected the supplied fields.

#### Example

```json
{
  "success": false,
  "data": null,
  "error": {
    "code": "PROVIDER_INPUT_REJECTED",
    "message": "string",
    "retryable": false,
    "data": {}
  },
  "metadata": {
    "requestId": "string"
  }
}
```

- `success` (`gmedic.services.list.response.422.success`; boolean, required)
  - one of `false`
- `data` (`gmedic.services.list.response.422.data`; unknown, required)
- `error` (`gmedic.services.list.response.422.error`; object, required) — gMedic rejected the supplied fields.
  - `code` (`gmedic.services.list.response.422.error.code`; string, required) — The failure code, stable across releases.
    - one of `"PROVIDER_INPUT_REJECTED"`
  - `message` (`gmedic.services.list.response.422.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`gmedic.services.list.response.422.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`gmedic.services.list.response.422.error.data`; object, required) — No fields.
- `metadata` (`gmedic.services.list.response.422.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`gmedic.services.list.response.422.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.

### 429

`RATE_LIMITED`: The request rate limit was exceeded. Try again later.

#### Example

```json
{
  "success": false,
  "data": null,
  "error": {
    "code": "RATE_LIMITED",
    "message": "string",
    "retryable": true,
    "data": {}
  },
  "metadata": {
    "requestId": "string"
  }
}
```

- `success` (`gmedic.services.list.response.429.success`; boolean, required)
  - one of `false`
- `data` (`gmedic.services.list.response.429.data`; unknown, required)
- `error` (`gmedic.services.list.response.429.error`; object, required) — The request rate limit was exceeded. Try again later.
  - `code` (`gmedic.services.list.response.429.error.code`; string, required) — The failure code, stable across releases.
    - one of `"RATE_LIMITED"`
  - `message` (`gmedic.services.list.response.429.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`gmedic.services.list.response.429.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `true`
  - `data` (`gmedic.services.list.response.429.error.data`; object, required) — No fields.
- `metadata` (`gmedic.services.list.response.429.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`gmedic.services.list.response.429.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.

### 500

`INTERNAL_ERROR`: The service could not complete the operation.

#### Example

```json
{
  "success": false,
  "data": null,
  "error": {
    "code": "INTERNAL_ERROR",
    "message": "string",
    "retryable": false,
    "data": {}
  },
  "metadata": {
    "requestId": "string"
  }
}
```

- `success` (`gmedic.services.list.response.500.success`; boolean, required)
  - one of `false`
- `data` (`gmedic.services.list.response.500.data`; unknown, required)
- `error` (`gmedic.services.list.response.500.error`; object, required) — The service could not complete the operation.
  - `code` (`gmedic.services.list.response.500.error.code`; string, required) — The failure code, stable across releases.
    - one of `"INTERNAL_ERROR"`
  - `message` (`gmedic.services.list.response.500.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`gmedic.services.list.response.500.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`gmedic.services.list.response.500.error.data`; object, required) — No fields.
- `metadata` (`gmedic.services.list.response.500.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`gmedic.services.list.response.500.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.

### 502

- `OUTCOME_UNKNOWN`: The operation may have been applied; check its result before repeating it.
- `PROVIDER_ACCESS_REJECTED`: The configured gMedic account did not authorize this operation.
- `PROVIDER_RESPONSE_INVALID`: gMedic returned an unexpected response.

#### Example

```json
{
  "success": false,
  "data": null,
  "error": {
    "code": "OUTCOME_UNKNOWN",
    "message": "string",
    "retryable": false,
    "data": {}
  },
  "metadata": {
    "requestId": "string"
  }
}
```

- `success` (`gmedic.services.list.response.502.success`; boolean, required)
  - one of `false`
- `data` (`gmedic.services.list.response.502.data`; unknown, required)
- `error` (`gmedic.services.list.response.502.error`; one of, required)
  - one of: `OutcomeUnknownFailure`, `GmedicProviderAccessRejectedFailure`, `GmedicProviderResponseInvalidFailure`
  - discriminator: `code`
- `metadata` (`gmedic.services.list.response.502.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`gmedic.services.list.response.502.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.

### 503

- `UPSTREAM_UNAVAILABLE`: The upstream service could not complete the request.
- `CATALOG_SEARCH_INCOMPLETE`: The service catalog search could not be completed within its limits. Service absence cannot be concluded.
- `PROVIDER_UNAVAILABLE`: gMedic is temporarily unavailable.

#### Example

```json
{
  "success": false,
  "data": null,
  "error": {
    "code": "UPSTREAM_UNAVAILABLE",
    "message": "string",
    "retryable": true,
    "data": {}
  },
  "metadata": {
    "requestId": "string"
  }
}
```

- `success` (`gmedic.services.list.response.503.success`; boolean, required)
  - one of `false`
- `data` (`gmedic.services.list.response.503.data`; unknown, required)
- `error` (`gmedic.services.list.response.503.error`; one of, required)
  - one of: `UpstreamUnavailableFailure`, `GmedicCatalogSearchIncompleteFailure`, `GmedicProviderUnavailableFailure`
  - discriminator: `code`
- `metadata` (`gmedic.services.list.response.503.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`gmedic.services.list.response.503.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.

### 504

`UPSTREAM_TIMEOUT`: The upstream service did not respond before its deadline.

#### Example

```json
{
  "success": false,
  "data": null,
  "error": {
    "code": "UPSTREAM_TIMEOUT",
    "message": "string",
    "retryable": true,
    "data": {}
  },
  "metadata": {
    "requestId": "string"
  }
}
```

- `success` (`gmedic.services.list.response.504.success`; boolean, required)
  - one of `false`
- `data` (`gmedic.services.list.response.504.data`; unknown, required)
- `error` (`gmedic.services.list.response.504.error`; object, required) — The upstream service did not respond before its deadline.
  - `code` (`gmedic.services.list.response.504.error.code`; string, required) — The failure code, stable across releases.
    - one of `"UPSTREAM_TIMEOUT"`
  - `message` (`gmedic.services.list.response.504.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`gmedic.services.list.response.504.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `true`
  - `data` (`gmedic.services.list.response.504.error.data`; object, required) — No fields.
- `metadata` (`gmedic.services.list.response.504.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`gmedic.services.list.response.504.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.


Source: https://docs.getarbol.com/api/gmedic/services/list/index.md
