---
title: "Cancel an appointment"
description: "Cancel one of the patient's appointments, by the reference a fresh visoft.patients.lookup answered in history.appointments. The patient's agenda is read again right before the write, and an appointment no longer in it is APPOINTMENT_NOT_CANCELLABLE. minimumNoticeMinutes refuses one that starts sooner (CANCEL_NOTICE_REQUIRED). CANCELLATION_REFUSED: SIIPS did not confirm it (data.message says why). A cancellation whose outcome is unknown answers OUTCOME_UNKNOWN: read the patient's agenda before anything else, never repeat it blindly.\n\n- **Scope:** `visoft:appointments:write`\n- **Credentials:** an API key, a client-credentials token or a person's access token\n- **Effect:** deletes; 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 cancel` · **MCP tool:** `visoft_appointments_cancel`"
---

> 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/cancel`

Cancel one of the patient's appointments, by the reference a fresh visoft.patients.lookup answered in history.appointments. The patient's agenda is read again right before the write, and an appointment no longer in it is APPOINTMENT_NOT_CANCELLABLE. minimumNoticeMinutes refuses one that starts sooner (CANCEL_NOTICE_REQUIRED). CANCELLATION_REFUSED: SIIPS did not confirm it (data.message says why). A cancellation whose outcome is unknown answers OUTCOME_UNKNOWN: read the patient's agenda before anything else, never repeat it blindly.

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

## 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.cancel.documentNumber`; string, required) — The patient's document number: letters and digits only, without dots, spaces or hyphens.
  - pattern `^[A-Za-z0-9]{1,20}$`
- `reference` (`visoft.appointments.cancel.reference`; string, required) — The appointment's reference, exactly as visoft.patients.lookup answered it in history.appointments.
  - minLength 3; maxLength 400
- `connectionId` (`visoft.appointments.cancel.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.cancel.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). The patient's own by default.
  - one of `"CC"`, `"TI"`, `"RC"`, `"AS"`, `"CD"`, `"CE"`, `"DE"`, `"CN"`, `"MS"`, `"SC"`, `"PE"`, `"PT"`, `"SI"`, `"PA"`
- `minimumNoticeMinutes` (`visoft.appointments.cancel.minimumNoticeMinutes`; integer, optional) — Refuse (CANCEL_NOTICE_REQUIRED) when the appointment starts sooner than this: checked against SIIPS's own day and hour, before reading and again right before the write.
  - min 1; max 10080
- `reasonCode` (`visoft.appointments.cancel.reasonCode`; string, optional) — SIIPS's cancellation cause; 06 (Petición cliente) by default.
  - pattern `^\d{2}$`
- `observation` (`visoft.appointments.cancel.observation`; string, optional) — What SIIPS records with the cancellation; "Peticion cliente" by default.
  - minLength 1; maxLength 200

## Example request

```json
{
  "connectionId": "string",
  "documentType": "CC",
  "documentNumber": "string",
  "reference": "string",
  "minimumNoticeMinutes": 1,
  "reasonCode": "string",
  "observation": "string"
}
```

## Code samples

### cURL

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

### 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.cancel({
  documentNumber: "<documentNumber>",
  reference: "<reference>",
});
```

### 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()
    .cancel(&types::VisoftAppointmentsCancelInput {
        document_number: "<documentNumber>".into(),
        reference: "<reference>".into(),
        connection_id: None,
        document_type: None,
        minimum_notice_minutes: None,
        reason_code: None,
        observation: None,
    })
    .await?;
```

### CLI

```bash
arbol visoft appointments cancel --document-number '<documentNumber>' --reference '<reference>'
```

### MCP

```json
{
  "name": "visoft_appointments_cancel",
  "arguments": {
    "documentNumber": "<documentNumber>",
    "reference": "<reference>"
  }
}
```

## Responses

### 200

Successful operation.

#### Example

```json
{
  "success": true,
  "data": {
    "scheduleId": "string",
    "startsAt": "2019-08-24T14:15:22Z",
    "professionalId": "string"
  },
  "error": null,
  "metadata": {
    "requestId": "string"
  }
}
```

- `success` (`visoft.appointments.cancel.response.200.success`; boolean, required)
  - one of `true`
- `data` (`visoft.appointments.cancel.response.200.data`; object, required)
  - `scheduleId` (`visoft.appointments.cancel.response.200.data.scheduleId`; string, required) — The agenda block the appointment was in.
  - `startsAt` (`visoft.appointments.cancel.response.200.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.cancel.response.200.data.professionalId`; string, required) — The professional's SIIPS id.
- `error` (`visoft.appointments.cancel.response.200.error`; unknown, required)
- `metadata` (`visoft.appointments.cancel.response.200.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.cancel.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` (`visoft.appointments.cancel.response.400.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.cancel.response.400.data`; unknown, required)
- `error` (`visoft.appointments.cancel.response.400.error`; object, required) — The request does not match the published schema.
  - `code` (`visoft.appointments.cancel.response.400.error.code`; string, required) — The failure code, stable across releases.
    - one of `"INVALID_INPUT"`
  - `message` (`visoft.appointments.cancel.response.400.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.cancel.response.400.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`visoft.appointments.cancel.response.400.error.data`; object, required)
    - `issues` (`visoft.appointments.cancel.response.400.error.data.issues`; array<object>, optional)
      - `path` (`visoft.appointments.cancel.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.cancel.response.400.error.data.issues.message`; string, required)
        - maxLength 256
- `metadata` (`visoft.appointments.cancel.response.400.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.cancel.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.cancel.response.401.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.cancel.response.401.data`; unknown, required)
- `error` (`visoft.appointments.cancel.response.401.error`; object, required) — A valid access token is required.
  - `code` (`visoft.appointments.cancel.response.401.error.code`; string, required) — The failure code, stable across releases.
    - one of `"UNAUTHORIZED"`
  - `message` (`visoft.appointments.cancel.response.401.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.cancel.response.401.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`visoft.appointments.cancel.response.401.error.data`; object, required) — No fields.
- `metadata` (`visoft.appointments.cancel.response.401.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.cancel.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.cancel.response.403.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.cancel.response.403.data`; unknown, required)
- `error` (`visoft.appointments.cancel.response.403.error`; object, required) — The token does not authorize this operation.
  - `code` (`visoft.appointments.cancel.response.403.error.code`; string, required) — The failure code, stable across releases.
    - one of `"FORBIDDEN"`
  - `message` (`visoft.appointments.cancel.response.403.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.cancel.response.403.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`visoft.appointments.cancel.response.403.error.data`; object, required) — No fields.
- `metadata` (`visoft.appointments.cancel.response.403.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.cancel.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.cancel.response.404.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.cancel.response.404.data`; unknown, required)
- `error` (`visoft.appointments.cancel.response.404.error`; object, required) — The organization has no such connection.
  - `code` (`visoft.appointments.cancel.response.404.error.code`; string, required) — The failure code, stable across releases.
    - one of `"CONNECTION_NOT_FOUND"`
  - `message` (`visoft.appointments.cancel.response.404.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.cancel.response.404.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`visoft.appointments.cancel.response.404.error.data`; object, required) — No fields.
- `metadata` (`visoft.appointments.cancel.response.404.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.cancel.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_NOT_CANCELLABLE`: The appointment is no longer cancellable in the patient's current agenda; read the patient again. Nothing was cancelled.
- `CANCEL_NOTICE_REQUIRED`: The appointment starts sooner than the minimum notice the call asked for. Nothing was cancelled.
- `CANCEL_TIME_UNVERIFIED`: The appointment's day and hour could not be verified against the minimum notice. Nothing was cancelled.

#### Example

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

- `success` (`visoft.appointments.cancel.response.409.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.cancel.response.409.data`; unknown, required)
- `error` (`visoft.appointments.cancel.response.409.error`; one of, required)
  - one of: `VisoftConnectionNotConfiguredFailure`, `VisoftAppointmentNotCancellableFailure`, `VisoftCancelNoticeRequiredFailure`, `VisoftCancelTimeUnverifiedFailure`
  - discriminator: `code`
- `metadata` (`visoft.appointments.cancel.response.409.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.cancel.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.cancel.response.413.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.cancel.response.413.data`; unknown, required)
- `error` (`visoft.appointments.cancel.response.413.error`; object, required) — The request exceeds the allowed size.
  - `code` (`visoft.appointments.cancel.response.413.error.code`; string, required) — The failure code, stable across releases.
    - one of `"REQUEST_TOO_LARGE"`
  - `message` (`visoft.appointments.cancel.response.413.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.cancel.response.413.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`visoft.appointments.cancel.response.413.error.data`; object, required) — No fields.
- `metadata` (`visoft.appointments.cancel.response.413.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.cancel.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.cancel.response.415.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.cancel.response.415.data`; unknown, required)
- `error` (`visoft.appointments.cancel.response.415.error`; object, required) — The request content type is not supported.
  - `code` (`visoft.appointments.cancel.response.415.error.code`; string, required) — The failure code, stable across releases.
    - one of `"UNSUPPORTED_MEDIA_TYPE"`
  - `message` (`visoft.appointments.cancel.response.415.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.cancel.response.415.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`visoft.appointments.cancel.response.415.error.data`; object, required) — No fields.
- `metadata` (`visoft.appointments.cancel.response.415.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.cancel.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.
- `APPOINTMENT_REFERENCE_INVALID`: The reference is not one a patient's appointments answered. Nothing was cancelled.
- `CANCELLATION_REFUSED`: SIIPS did not confirm the cancellation (data.message says why). Nothing is retried.

#### Example

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

- `success` (`visoft.appointments.cancel.response.422.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.cancel.response.422.data`; unknown, required)
- `error` (`visoft.appointments.cancel.response.422.error`; one of, required)
  - one of: `VisoftCredentialsRejectedFailure`, `VisoftAgencyNotServedFailure`, `VisoftAppointmentReferenceInvalidFailure`, `VisoftCancellationRefusedFailure`
  - discriminator: `code`
- `metadata` (`visoft.appointments.cancel.response.422.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.cancel.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.cancel.response.429.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.cancel.response.429.data`; unknown, required)
- `error` (`visoft.appointments.cancel.response.429.error`; object, required) — The request rate limit was exceeded. Try again later.
  - `code` (`visoft.appointments.cancel.response.429.error.code`; string, required) — The failure code, stable across releases.
    - one of `"RATE_LIMITED"`
  - `message` (`visoft.appointments.cancel.response.429.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.cancel.response.429.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `true`
  - `data` (`visoft.appointments.cancel.response.429.error.data`; object, required) — No fields.
- `metadata` (`visoft.appointments.cancel.response.429.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.cancel.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.cancel.response.500.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.cancel.response.500.data`; unknown, required)
- `error` (`visoft.appointments.cancel.response.500.error`; object, required) — The service could not complete the operation.
  - `code` (`visoft.appointments.cancel.response.500.error.code`; string, required) — The failure code, stable across releases.
    - one of `"INTERNAL_ERROR"`
  - `message` (`visoft.appointments.cancel.response.500.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.cancel.response.500.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `false`
  - `data` (`visoft.appointments.cancel.response.500.error.data`; object, required) — No fields.
- `metadata` (`visoft.appointments.cancel.response.500.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.cancel.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.cancel.response.502.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.cancel.response.502.data`; unknown, required)
- `error` (`visoft.appointments.cancel.response.502.error`; one of, required)
  - one of: `OutcomeUnknownFailure`, `VisoftProviderUnavailableFailure`
  - discriminator: `code`
- `metadata` (`visoft.appointments.cancel.response.502.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.cancel.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.cancel.response.503.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.cancel.response.503.data`; unknown, required)
- `error` (`visoft.appointments.cancel.response.503.error`; object, required) — The upstream service could not complete the request.
  - `code` (`visoft.appointments.cancel.response.503.error.code`; string, required) — The failure code, stable across releases.
    - one of `"UPSTREAM_UNAVAILABLE"`
  - `message` (`visoft.appointments.cancel.response.503.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.cancel.response.503.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `true`
  - `data` (`visoft.appointments.cancel.response.503.error.data`; object, required) — No fields.
- `metadata` (`visoft.appointments.cancel.response.503.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.cancel.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.cancel.response.504.success`; boolean, required)
  - one of `false`
- `data` (`visoft.appointments.cancel.response.504.data`; unknown, required)
- `error` (`visoft.appointments.cancel.response.504.error`; object, required) — The upstream service did not respond before its deadline.
  - `code` (`visoft.appointments.cancel.response.504.error.code`; string, required) — The failure code, stable across releases.
    - one of `"UPSTREAM_TIMEOUT"`
  - `message` (`visoft.appointments.cancel.response.504.error.message`; string, required) — What went wrong, for people; it never contains input values.
  - `retryable` (`visoft.appointments.cancel.response.504.error.retryable`; boolean, required) — Whether repeating the same request may succeed.
    - one of `true`
  - `data` (`visoft.appointments.cancel.response.504.error.data`; object, required) — No fields.
- `metadata` (`visoft.appointments.cancel.response.504.metadata`; object, required) — What every answer carries besides its data or error.
  - `requestId` (`visoft.appointments.cancel.response.504.metadata.requestId`; string, required) — Request correlation identifier, also sent as X-Request-Id.


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