---
title: "Book an appointment"
description: "Book one free slot visoft.availability.lookup answered, by its reference and the contract and service of that search, for the patient with that document. APPOINTMENT_REQUEST_EXISTS: the patient already has a requested appointment for the service. BOOKING_REFUSED: SIIPS refused it (data.message says why). Nothing is booked in either case. A booking whose outcome is unknown answers OUTCOME_UNKNOWN: read the patient's agenda before anything else, never book it again blindly.\n\n- **Scope:** `visoft:appointments:write`\n- **Credentials:** an API key, a client-credentials token or a person's access token\n- **Effect:** writes; not idempotent: check the outcome before you retry\n- **Limits:** request body up to 64 KB, response up to 1 MB\n- **CLI:** `arbol visoft appointments create` · **MCP tool:** `visoft_appointments_create`"
---

> 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: Visoft API › Appointments

`POST /v1/visoft/appointments`

Book one free slot visoft.availability.lookup answered, by its reference and the contract and service of that search, for the patient with that document. APPOINTMENT_REQUEST_EXISTS: the patient already has a requested appointment for the service. BOOKING_REFUSED: SIIPS refused it (data.message says why). Nothing is booked in either case. A booking whose outcome is unknown answers OUTCOME_UNKNOWN: read the patient's agenda before anything else, never book it again blindly.

- **Scope:** `visoft:appointments:write`
- **Credentials:** an API key, a client-credentials token or a person's access token
- **Effect:** writes; not idempotent: check the outcome before you retry
- **Limits:** request body up to 64 KB, response up to 1 MB
- **CLI:** `arbol visoft appointments create` · **MCP tool:** `visoft_appointments_create`

## Authentication

Requires one of the following:

- `arbolHuman`, oauth2, scopes: `visoft:appointments:write`
- `arbolMachine`, oauth2, scopes: `visoft:appointments:write`
- `arbolApiKey`, http, header `Authorization`

## Request body

_Required._

- `documentNumber` (`visoft.appointments.create.documentNumber`; string, required) — The patient's document number: letters and digits only, without dots, spaces or hyphens.
  - pattern `^[A-Za-z0-9]{1,20}$`
- `slot` (`visoft.appointments.create.slot`; object, required) — The free slot, by its reference, and the contract and service the search that found it named.
  - `reference` (`visoft.appointments.create.slot.reference`; string, required) — The free slot's SIIPS key, as visoft.availability.lookup answered it: pass it unchanged to visoft.appointments.create.
    - minLength 7; maxLength 200
  - `contractCode` (`visoft.appointments.create.slot.contractCode`; string, required) — The contract, by the code visoft.contracts.list answers.
    - minLength 1; maxLength 40; pattern `^[A-Za-z0-9_-]+$`
  - `serviceCode` (`visoft.appointments.create.slot.serviceCode`; string, required) — The service, by the code a contract's services answer ("CUPS-890208").
    - minLength 3; maxLength 60; pattern `^[A-Za-z0-9]+-[A-Za-z0-9._-]+$`
- `connectionId` (`visoft.appointments.create.connectionId`; string, optional) — The connection to run on. Optional when the organization has one Visoft connection; required when it has several. Another organization's connection is CONNECTION_NOT_FOUND.
  - minLength 5; maxLength 68; pattern `^con_[0-9A-Za-z]+$`
- `documentType` (`visoft.appointments.create.documentType`; string, optional) — The document's type, as SIIPS codes it: CC (Cédula de Ciudadanía), TI (Tarjeta de Identidad), RC (Registro Civil), AS (Adulto sin Identificación), CD (Carné Diplomático), CE (Cédula de Extranjería), DE (Documento de Extranjero), CN (Certificado de Nacido Vivo), MS (Menor sin Identificación), SC (Salvoconducto), PE (Permiso Especial de Permanencia), PT (Permiso de Protección Temporal), SI (Sin Identificación), PA (Pasaporte). CC by default.
  - one of `"CC"`, `"TI"`, `"RC"`, `"AS"`, `"CD"`, `"CE"`, `"DE"`, `"CN"`, `"MS"`, `"SC"`, `"PE"`, `"PT"`, `"SI"`, `"PA"`
- `visitType` (`visoft.appointments.create.visitType`; string, optional) — How SIIPS classifies the visit: 1 (1ra Vez), C (Control), G (General), R (Remision), S (Sesion), V (Valoracion). 1 by default.
  - one of `"1"`, `"C"`, `"G"`, `"R"`, `"S"`, `"V"`

## Example request

```json
{
  "connectionId": "string",
  "documentType": "CC",
  "documentNumber": "string",
  "slot": {
    "reference": "strings",
    "contractCode": "string",
    "serviceCode": "string"
  },
  "visitType": "1"
}
```

## Code samples

### cURL

```bash
curl https://api.getarbol.com/v1/visoft/appointments \
  --request POST \
  --header "Authorization: Bearer $ARBOL_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
  "documentNumber": "<documentNumber>",
  "slot": {
    "reference": "<reference>",
    "contractCode": "<contractCode>",
    "serviceCode": "<serviceCode>"
  }
}'
```

### 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.visoft.appointments.create({
  documentNumber: "<documentNumber>",
  slot: {
    reference: "<reference>",
    contractCode: "<contractCode>",
    serviceCode: "<serviceCode>",
  },
});
```

### Rust

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

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

let data = arbol
    .visoft()
    .appointments()
    .create(&types::VisoftAppointmentsCreateInput {
        document_number: "<documentNumber>".into(),
        slot: types::VisoftAppointmentsCreateInputSlot {
            reference: "<reference>".into(),
            contract_code: "<contractCode>".into(),
            service_code: "<serviceCode>".into(),
        },
        connection_id: None,
        document_type: None,
        visit_type: None,
    })
    .await?;
```

### CLI

```bash
arbol visoft appointments create --input - <<'JSON'
{
  "documentNumber": "<documentNumber>",
  "slot": {
    "reference": "<reference>",
    "contractCode": "<contractCode>",
    "serviceCode": "<serviceCode>"
  }
}
JSON
```

### MCP

```json
{
  "name": "visoft_appointments_create",
  "arguments": {
    "documentNumber": "<documentNumber>",
    "slot": {
      "reference": "<reference>",
      "contractCode": "<contractCode>",
      "serviceCode": "<serviceCode>"
    }
  }
}
```

## Responses

### 201

Successful operation.

#### Example

```json
{
  "success": true,
  "data": {
    "scheduleId": "string",
    "startsAt": "2019-08-24T14:15:22Z",
    "professionalId": "string",
    "visitType": "string",
    "ticketUrl": "http://example.com"
  },
  "error": null,
  "metadata": {
    "requestId": "string"
  }
}
```

- `success` (`visoft.appointments.create.response.201.success`; boolean, required)
  - one of `true`
- `data` (`visoft.appointments.create.response.201.data`; object, required)
  - `scheduleId` (`visoft.appointments.create.response.201.data.scheduleId`; string, required) — The agenda block the appointment was booked in.
  - `startsAt` (`visoft.appointments.create.response.201.data.startsAt`; string, required) — The moment, as an RFC 3339 instant written in the clinic's own offset (for example "2026-11-04T08:50:00-05:00"), so its first ten characters are the clinic's day and the next eight its hour.
    - format `date-time`
  - `professionalId` (`visoft.appointments.create.response.201.data.professionalId`; string, required) — The professional's SIIPS id.
  - `visitType` (`visoft.appointments.create.response.201.data.visitType`; string, required) — How SIIPS classified the visit.
  - `ticketUrl` (`visoft.appointments.create.response.201.data.ticketUrl`; string | null, required) — The appointment's ticket, a PDF SIIPS publishes, when SIIPS answered its number; null otherwise.
    - format `uri`
- `error` (`visoft.appointments.create.response.201.error`; unknown, required)
- `metadata` (`visoft.appointments.create.response.201.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.create.response.201.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` (`visoft.appointments.create.response.400.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.create.response.400.data`; unknown, required)
- `error` (`visoft.appointments.create.response.400.error`; object, required) — The request does not match the published schema.
  - `code` (`visoft.appointments.create.response.400.error.code`; string, required) — The failure code, stable across releases.
    - one of `"INVALID_INPUT"`
  - `message` (`visoft.appointments.create.response.400.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.create.response.400.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`visoft.appointments.create.response.400.error.data`; object, required)
    - `issues` (`visoft.appointments.create.response.400.error.data.issues`; array<object>, optional)
      - `path` (`visoft.appointments.create.response.400.error.data.issues.path`; string, required) — RFC 6901 JSON Pointer to the refused field; empty for the whole input.
        - maxLength 256
      - `message` (`visoft.appointments.create.response.400.error.data.issues.message`; string, required)
        - maxLength 256
- `metadata` (`visoft.appointments.create.response.400.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.create.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` (`visoft.appointments.create.response.401.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.create.response.401.data`; unknown, required)
- `error` (`visoft.appointments.create.response.401.error`; object, required) — A valid access token is required.
  - `code` (`visoft.appointments.create.response.401.error.code`; string, required) — The failure code, stable across releases.
    - one of `"UNAUTHORIZED"`
  - `message` (`visoft.appointments.create.response.401.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.create.response.401.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`visoft.appointments.create.response.401.error.data`; object, required) — No fields.
- `metadata` (`visoft.appointments.create.response.401.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.create.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` (`visoft.appointments.create.response.403.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.create.response.403.data`; unknown, required)
- `error` (`visoft.appointments.create.response.403.error`; object, required) — The token does not authorize this operation.
  - `code` (`visoft.appointments.create.response.403.error.code`; string, required) — The failure code, stable across releases.
    - one of `"FORBIDDEN"`
  - `message` (`visoft.appointments.create.response.403.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.create.response.403.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`visoft.appointments.create.response.403.error.data`; object, required) — No fields.
- `metadata` (`visoft.appointments.create.response.403.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.create.response.403.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.

### 404

`CONNECTION_NOT_FOUND`: The organization has no such connection.

#### Example

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

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

### 409

- `CONNECTION_NOT_CONFIGURED`: The organization has no active Visoft connection for this call; an administrator connects Visoft in Account.
- `APPOINTMENT_REQUEST_EXISTS`: The patient already has a requested appointment for that service. Nothing was booked.

#### Example

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

- `success` (`visoft.appointments.create.response.409.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.create.response.409.data`; unknown, required)
- `error` (`visoft.appointments.create.response.409.error`; one of, required)
  - one of: `VisoftConnectionNotConfiguredFailure`, `VisoftAppointmentRequestExistsFailure`
  - discriminator: `code`
- `metadata` (`visoft.appointments.create.response.409.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.create.response.409.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.

### 413

`REQUEST_TOO_LARGE`: The request exceeds the allowed size.

#### Example

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

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

### 415

`UNSUPPORTED_MEDIA_TYPE`: The request content type is not supported.

#### Example

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

- `success` (`visoft.appointments.create.response.415.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.create.response.415.data`; unknown, required)
- `error` (`visoft.appointments.create.response.415.error`; object, required) — The request content type is not supported.
  - `code` (`visoft.appointments.create.response.415.error.code`; string, required) — The failure code, stable across releases.
    - one of `"UNSUPPORTED_MEDIA_TYPE"`
  - `message` (`visoft.appointments.create.response.415.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.create.response.415.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`visoft.appointments.create.response.415.error.data`; object, required) — No fields.
- `metadata` (`visoft.appointments.create.response.415.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.create.response.415.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.

### 422

- `CREDENTIALS_REJECTED`: The organization's connection to this integration couldn't complete the request. Don't retry it automatically; if it keeps happening, contact your Arbol team.
- `AGENCY_NOT_SERVED`: The cost centre is not one of the connection's clinic: use one visoft.clinic.get lists.
- `BOOKING_REFUSED`: SIIPS refused the booking (data.message says why). Nothing was booked.

#### Example

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

- `success` (`visoft.appointments.create.response.422.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.create.response.422.data`; unknown, required)
- `error` (`visoft.appointments.create.response.422.error`; one of, required)
  - one of: `VisoftCredentialsRejectedFailure`, `VisoftAgencyNotServedFailure`, `VisoftBookingRefusedFailure`
  - discriminator: `code`
- `metadata` (`visoft.appointments.create.response.422.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.create.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` (`visoft.appointments.create.response.429.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.create.response.429.data`; unknown, required)
- `error` (`visoft.appointments.create.response.429.error`; object, required) — The request rate limit was exceeded. Try again later.
  - `code` (`visoft.appointments.create.response.429.error.code`; string, required) — The failure code, stable across releases.
    - one of `"RATE_LIMITED"`
  - `message` (`visoft.appointments.create.response.429.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.create.response.429.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `true`
  - `data` (`visoft.appointments.create.response.429.error.data`; object, required) — No fields.
- `metadata` (`visoft.appointments.create.response.429.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.create.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` (`visoft.appointments.create.response.500.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.create.response.500.data`; unknown, required)
- `error` (`visoft.appointments.create.response.500.error`; object, required) — The service could not complete the operation.
  - `code` (`visoft.appointments.create.response.500.error.code`; string, required) — The failure code, stable across releases.
    - one of `"INTERNAL_ERROR"`
  - `message` (`visoft.appointments.create.response.500.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.create.response.500.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`visoft.appointments.create.response.500.error.data`; object, required) — No fields.
- `metadata` (`visoft.appointments.create.response.500.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.create.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_UNAVAILABLE`: The clinical system did not answer or could not complete the request.

#### Example

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

- `success` (`visoft.appointments.create.response.502.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.create.response.502.data`; unknown, required)
- `error` (`visoft.appointments.create.response.502.error`; one of, required)
  - one of: `OutcomeUnknownFailure`, `VisoftProviderUnavailableFailure`
  - discriminator: `code`
- `metadata` (`visoft.appointments.create.response.502.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.create.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.

#### Example

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

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


Source: https://docs.getarbol.com/api/visoft/appointments/create/index.md
