HTTP Shell JavaScript Java PHP Go Python Ruby

Getlabs API v2

Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

By integrating the Getlabs API, you can bridge the gap between virtual and in-person healthcare, connecting physician-led telemedicine with in-person care from medical professionals. This enables healthcare providers to extend care to the home unlocking high-quality healthcare for more patients at a fraction of the cost.

With a single API call, we enable our partners to provide end-to-end care for their patients and extend their capabilities to treat new conditions & modalities. What if you could treat primary care remotely? Now you can.

Pick and choose the types of diagnostics you need. Your patients select a convenient time and place. The Getlabs API takes care of everything else.

Maintenance Mode: In the event that the Getlabs API is under maintenance a 503 Service Unavailable will be returned with a matching maintenance mode header (maintenance-mode) set to true. Under normal operation the header defaults false.

Authentication

All of the API endpoints are secured with Bearer Tokens. You must pass your token with any endpoint request. To do so include the following header in your request replacing the token with one that you've obtained from the /oauth/token endpoint.

Authorization: Bearer c2FkZnNld3J0Z2Zlcndnd2Z3ZXNndGVydGZ3ZXJmZXd0Z2V3Z3dlNGdmM3dmM3c=

Obtaining a Bearer token

In order to make API requests you will need to obtain an access token. Token requests must send a signed JWT. The JWT must be signed (using HS512 algorithm) with the provided getlabs API token/secret. See OAuth section below for more details.

NOTE: the JWT provided with the token request is valid for a period of 24hrs after first use. The JWT will need to be regenerated after that time. It is recommended to regenerate a signed JWT for each token request.

OAuth

Oauth_Token

Code samples

POST /v2/oauth/token HTTP/1.1

Content-Type: application/json
Accept: application/json

# You can also use wget
curl -X POST /v2/oauth/token \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json'

const inputBody = '{
  "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
  "refresh_token": "string",
  "assertion": "string"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json'
};

fetch('/v2/oauth/token',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/oauth/token");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('POST','/v2/oauth/token', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Content-Type": []string{"application/json"},
        "Accept": []string{"application/json"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("POST", "/v2/oauth/token", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

r = requests.post('/v2/oauth/token', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Content-Type' => 'application/json',
  'Accept' => 'application/json'
}

result = RestClient.post '/v2/oauth/token',
  params: {
  }, headers: headers

p JSON.parse(result)

POST /v2/oauth/token

This endpoint is required to get an access token to access the external api as well as refresh your expired access token

In order to make api requests you will need to get an access token. Token requests must send a JWT as an assertion parameter in the http request payload. The JWT must be signed (using HS512 algorithm) with the provided getlabs api token/secret.

The token payload must contain:

{
   aud: string; // getlabs oauth/token endpoint https://api.getlabs.com/v2/oauth/token
   sub: string; // your getlabs provided client id
   exp: number; // unix timestamp when this jwt bearer token expires
   iat: number; // unix timestamp when this jwt bearer token was issued at
}

Refresh Token: Expired access_token(s) can also be refreshed by using this endpoint, resulting in a fresh access_token and refresh_token.

An assertion with your expired access_token is required. As well as the refresh_token in the http request payload.

Body parameter

{
  "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
  "refresh_token": "string",
  "assertion": "string"
}

Parameters

Name In Type Required Description
body body OauthRequest true none

Example responses

201 Response

{
  "access_token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjE5Nzk2MjEwLTBmZDUtNDFhZi1iOGUzLWM1ODViYzFjN2ExMSIsInR5cGUiOiJQYXJ0bmVyRW50aXR5IiwiaWF0IjoxNjU4NDMzMjU3LCJleHAiOjE2NTg0MzM4NTd9.XQsq-opjVKVmVhvXzU_mGeCqOi3m96ZoHGnLQ90UnFXKQDTTMeTm7lOv9Qd8nNmDab9Ex7VmIKt3Ne8NDvIVWQ",
  "refresh_token": "323abcbc59fd263986d4a2afd0f24385457dd5b6",
  "token_type": "Bearer",
  "expires": "1658433841"
}

Responses

Status Meaning Description Schema
201 Created Access and refresh token details. OauthToken

Availability

Availability_List

Code samples

GET /v2/availability?from=2021-01-01&days=5&street=200%20W.%20Washington%20Street&city=Phoenix&state=AZ&zipCode=85003 HTTP/1.1

Accept: application/json

# You can also use wget
curl -X GET /v2/availability?from=2021-01-01&days=5&street=200%20W.%20Washington%20Street&city=Phoenix&state=AZ&zipCode=85003 \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'


const headers = {
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/availability?from=2021-01-01&days=5&street=200%20W.%20Washington%20Street&city=Phoenix&state=AZ&zipCode=85003',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/availability?from=2021-01-01&days=5&street=200%20W.%20Washington%20Street&city=Phoenix&state=AZ&zipCode=85003");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('GET','/v2/availability', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("GET", "/v2/availability", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.get('/v2/availability', params={
  'from': '2021-01-01',  'days': '5',  'street': '200 W. Washington Street',  'city': 'Phoenix',  'state': 'AZ',  'zipCode': '85003'
}, headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.get '/v2/availability',
  params: {
  'from' => 'string(date)',
'days' => 'number',
'street' => 'string',
'city' => 'string',
'state' => 'string',
'zipCode' => 'string'
}, headers: headers

p JSON.parse(result)

GET /v2/availability

Returns a list of appointment slots grouped by day. Available slots will have a booking key, this key is required when using the appointment endpoint to book an appointment.

Parameters

Name In Type Required Description
from query string(date) true The first date to query appointment availability in the YYYY-MM-DD format
days query number true The number of days to return appointment availability for
street query string true The street address for the appointment
unit query string false The unit number for the appointment
city query string true The city for the appointment
state query string true The 2 character state code for the appointment
zipCode query string true The 5 digit zip code for the appointment

Example responses

200 Response

{
  "serviceable": true,
  "data": [
    {
      "date": "2021-07-01",
      "slots": [
        {
          "key": "yGDknWzB74gP8zpET+HrI3jQVyq4ss/ENX38C1eJSR3D7zCHGloM0URG8V2y1nltsTgvED2q/ZcyJZzfZcWc021/Hg1TWICUkDXl627QDdytvUGsEcy9dqpxtqNLmkCtBRcQHnbgaSIR9E7gZ/5fj6NfTwnRH1coitxlOUCsrm9x76l80saizu9M3L5UqafNB7MtbkcCtfB4h9nubzUXahEbXPq0wFvbt/2VQl7311Vgro9XC3k/CbeBMtiQXhSMqslRop44NJO7Rp6qHEjsrZOJVfcKd3ASuYFEspBi+J+ddRilOS4p06Ai8nhrIx3pbLXoRm4aSqNaLCx5lbldLeh08ozRBt3oBGZDzwxdsYzu8iBgxMMGbH/AUpuR+7Lh9YE=",
          "start": "2021-07-01T12:00:00.000Z",
          "end": "2021-07-01T13:00:00.000Z",
          "expiresAt": "2021-06-22T12:00:00.000Z",
          "price": "2900",
          "priority": true,
          "available": 3
        }
      ]
    }
  ],
  "tz": "America/Phoenix"
}

Responses

Status Meaning Description Schema
200 OK The available appointment timeslots grouped by day AvailabilityResponse
400 Bad Request Invalid request data BadRequest

Appointment

Appointment_List

Code samples

GET /v2/appointment?limit=25&offset=1 HTTP/1.1

Accept: application/json

# You can also use wget
curl -X GET /v2/appointment?limit=25&offset=1 \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'


const headers = {
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/appointment?limit=25&offset=1',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/appointment?limit=25&offset=1");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('GET','/v2/appointment', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("GET", "/v2/appointment", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.get('/v2/appointment', params={
  'limit': '25',  'offset': '1'
}, headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.get '/v2/appointment',
  params: {
  'limit' => 'number',
'offset' => 'number'
}, headers: headers

p JSON.parse(result)

GET /v2/appointment

Parameters

Name In Type Required Description
limit query number true The number of records to limit in the pagination
offset query number true The offset in the pagination
startAt query string(date) false The start date to query appointments in the YYYY-MM-DD format
endAt query string(date) false The end date to query appointments in the YYYY-MM-DD format
order query string(string) false A CSV of appointment propertyName:asc
status query array[string] false An array of statuses to filter results by
state query array[string] false An array of 2 character state codes

Enumerated Values

Parameter Value
status pending
status confirmed
status in-progress
status completed
status cancelled

Example responses

200 Response

{
  "data": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "identifier": "PWDYA7",
      "status": "pending",
      "patient": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "externalId": "string",
        "email": "user@example.com",
        "phoneNumber": "6025554567",
        "firstName": "Jane",
        "lastName": "Doe",
        "dob": "1977-07-08",
        "birthSex": "female",
        "pronouns": "She/Her",
        "guardian": {
          "name": "Jane Doe",
          "relationship": "Mother"
        },
        "insurance": {
          "front": {
            "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
            "name": "lab-order.pdf",
            "purpose": "lab-order",
            "size": 13264,
            "type": "string"
          },
          "rear": {
            "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
            "name": "lab-order.pdf",
            "purpose": "lab-order",
            "size": 13264,
            "type": "string"
          }
        }
      },
      "labOrderDetails": [
        {
          "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
          "contactName": "Jane Doe",
          "contactPhone": "6025554567",
          "labOrderFiles": [
            {
              "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
              "name": "lab-order.pdf",
              "purpose": "lab-order",
              "size": 13264,
              "type": "string"
            }
          ]
        }
      ],
      "startAt": "2021-07-01T12:00:00.000Z",
      "endAt": "2021-07-01T13:00:00.000Z",
      "address": {
        "street": "200 W. Washington Street",
        "unit": "Suite 205",
        "city": "Phoenix",
        "state": "AZ",
        "zipCode": "85003",
        "timezone": "America/Phoenix"
      },
      "isRefundable": true,
      "isRebookable": true,
      "cancellationReason": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "Scheduled time no longer works",
        "isRefundable": true
      },
      "cancellationNote": "string",
      "behalfOf": {
        "firstName": "string",
        "lastName": "string",
        "email": "string",
        "phoneNumber": "string",
        "isLegalGuardian": true,
        "shouldNotify": true
      },
      "parkingInstruction": "Park on street.",
      "specialRequest": "Call on arrival.",
      "specimens": [
        {
          "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
          "name": "lab-order.pdf",
          "purpose": "lab-order",
          "size": 13264,
          "type": "string",
          "url": "string"
        }
      ]
    }
  ],
  "total": 25
}

Responses

Status Meaning Description Schema
200 OK This is a paged response that will return an array of Appointments. Inline
400 Bad Request Invalid request data BadRequest

Response Schema

Enumerated Values

Property Value
status pending
status confirmed
status in-progress
status completed
status cancelled
birthSex male
birthSex female
birthSex other
purpose lab-order
purpose insurance-front
purpose insurance-rear
purpose lab-order
purpose insurance-front
purpose insurance-rear
purpose lab-order
purpose insurance-front
purpose insurance-rear
purpose lab-order
purpose insurance-front
purpose insurance-rear
purpose lab-order
purpose insurance-front
purpose insurance-rear
purpose lab-order
purpose insurance-front
purpose insurance-rear
purpose specimen

Appointment_Create

Code samples

POST /v2/appointment HTTP/1.1

Content-Type: application/json
Accept: application/json

# You can also use wget
curl -X POST /v2/appointment \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'

const inputBody = '{
  "key": "SFG8HHp01ZNwi+/prwl2CmKSlZZHByJLjf27E5l+f7I+suxFY0QYkTWtxJ4xr5n/IsMm2LTrUADDHRGuzo6F/abaLdGMvHxvf7CSwQxlit7pel3SK0c8HwxllGG3UWq21GV1x/SkvITGDAUUAwFHZ/urGzhgKf4DQkKiZctPVFRvfGq1ash4ZV7HfdbBviswl5w6ORSmYwwae6zQx+//h83DcfO7xIMbjamoJDfoDUS0v5ZftVeN3KjjBdCd4nunBy6YTsEnlVQaJqTa4uSwu++ddZ6/ZTw5nEIgSQjhQL9uJd9YgC3ir4oyw0reI9NsHgp5vdO1TIVSodfMUv8NYB23v3mWKyeI21xehM32wAUs/u0JkXBGrWrUNM+Q2PaP3hZQJrh3DQ==",
  "patientId": "460a6d87-689c-4661-a526-a52450bbe2d7",
  "labOrderDetails": [
    {
      "contactName": "Jane Doe",
      "contactPhone": "6025554567",
      "labOrderFileIds": [
        "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
      ]
    }
  ],
  "paymentMethod": "pm_1DkAUlB70neqlGn3zQESm7pl",
  "behalfOf": {
    "firstName": "string",
    "lastName": "string",
    "email": "string",
    "phoneNumber": "string",
    "isLegalGuardian": true,
    "shouldNotify": true
  },
  "parkingInstruction": "Park on street.",
  "specialRequest": "Call on arrival."
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/appointment',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/appointment");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('POST','/v2/appointment', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Content-Type": []string{"application/json"},
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("POST", "/v2/appointment", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.post('/v2/appointment', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Content-Type' => 'application/json',
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.post '/v2/appointment',
  params: {
  }, headers: headers

p JSON.parse(result)

POST /v2/appointment

Creates a new appointment. There are a couple prerequisite requirements before creating an appointment:

  1. Retrieve a patient ID from the patient endpoint.
  2. Retrieve a booking key from the availability endpoint. The time and location of the appointment is retrieved from this key.
  3. (optional) Upload any required lab order files to the lab order endpoint and use those file IDs when creating the appointment.

Body parameter

{
  "key": "SFG8HHp01ZNwi+/prwl2CmKSlZZHByJLjf27E5l+f7I+suxFY0QYkTWtxJ4xr5n/IsMm2LTrUADDHRGuzo6F/abaLdGMvHxvf7CSwQxlit7pel3SK0c8HwxllGG3UWq21GV1x/SkvITGDAUUAwFHZ/urGzhgKf4DQkKiZctPVFRvfGq1ash4ZV7HfdbBviswl5w6ORSmYwwae6zQx+//h83DcfO7xIMbjamoJDfoDUS0v5ZftVeN3KjjBdCd4nunBy6YTsEnlVQaJqTa4uSwu++ddZ6/ZTw5nEIgSQjhQL9uJd9YgC3ir4oyw0reI9NsHgp5vdO1TIVSodfMUv8NYB23v3mWKyeI21xehM32wAUs/u0JkXBGrWrUNM+Q2PaP3hZQJrh3DQ==",
  "patientId": "460a6d87-689c-4661-a526-a52450bbe2d7",
  "labOrderDetails": [
    {
      "contactName": "Jane Doe",
      "contactPhone": "6025554567",
      "labOrderFileIds": [
        "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
      ]
    }
  ],
  "paymentMethod": "pm_1DkAUlB70neqlGn3zQESm7pl",
  "behalfOf": {
    "firstName": "string",
    "lastName": "string",
    "email": "string",
    "phoneNumber": "string",
    "isLegalGuardian": true,
    "shouldNotify": true
  },
  "parkingInstruction": "Park on street.",
  "specialRequest": "Call on arrival."
}

Parameters

Name In Type Required Description
body body AppointmentBook true none

Example responses

201 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "identifier": "PWDYA7",
  "status": "pending",
  "patient": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "externalId": "string",
    "email": "user@example.com",
    "phoneNumber": "6025554567",
    "firstName": "Jane",
    "lastName": "Doe",
    "dob": "1977-07-08",
    "birthSex": "female",
    "pronouns": "She/Her",
    "guardian": {
      "name": "Jane Doe",
      "relationship": "Mother"
    },
    "insurance": {
      "front": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      },
      "rear": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      }
    }
  },
  "labOrderDetails": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "contactName": "Jane Doe",
      "contactPhone": "6025554567",
      "labOrderFiles": [
        {
          "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
          "name": "lab-order.pdf",
          "purpose": "lab-order",
          "size": 13264,
          "type": "string"
        }
      ]
    }
  ],
  "startAt": "2021-07-01T12:00:00.000Z",
  "endAt": "2021-07-01T13:00:00.000Z",
  "address": {
    "street": "200 W. Washington Street",
    "unit": "Suite 205",
    "city": "Phoenix",
    "state": "AZ",
    "zipCode": "85003",
    "timezone": "America/Phoenix"
  },
  "isRefundable": true,
  "isRebookable": true,
  "cancellationReason": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "name": "Scheduled time no longer works",
    "isRefundable": true
  },
  "cancellationNote": "string",
  "behalfOf": {
    "firstName": "string",
    "lastName": "string",
    "email": "string",
    "phoneNumber": "string",
    "isLegalGuardian": true,
    "shouldNotify": true
  },
  "parkingInstruction": "Park on street.",
  "specialRequest": "Call on arrival.",
  "specimens": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "size": 13264,
      "type": "string",
      "url": "string"
    }
  ]
}

Responses

Status Meaning Description Schema
201 Created The newly created appointment Appointment
400 Bad Request Invalid request data BadRequest

Appointment_Read

Code samples

GET /v2/appointment/{id} HTTP/1.1

Accept: application/json

# You can also use wget
curl -X GET /v2/appointment/{id} \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'


const headers = {
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/appointment/{id}',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/appointment/{id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('GET','/v2/appointment/{id}', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("GET", "/v2/appointment/{id}", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.get('/v2/appointment/{id}', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.get '/v2/appointment/{id}',
  params: {
  }, headers: headers

p JSON.parse(result)

GET /v2/appointment/{id}

Fetches an existing appointment

Parameters

Name In Type Required Description
id path string(uuid) true The appointment ID

Example responses

200 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "identifier": "PWDYA7",
  "status": "pending",
  "patient": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "externalId": "string",
    "email": "user@example.com",
    "phoneNumber": "6025554567",
    "firstName": "Jane",
    "lastName": "Doe",
    "dob": "1977-07-08",
    "birthSex": "female",
    "pronouns": "She/Her",
    "guardian": {
      "name": "Jane Doe",
      "relationship": "Mother"
    },
    "insurance": {
      "front": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      },
      "rear": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      }
    }
  },
  "labOrderDetails": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "contactName": "Jane Doe",
      "contactPhone": "6025554567",
      "labOrderFiles": [
        {
          "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
          "name": "lab-order.pdf",
          "purpose": "lab-order",
          "size": 13264,
          "type": "string"
        }
      ]
    }
  ],
  "startAt": "2021-07-01T12:00:00.000Z",
  "endAt": "2021-07-01T13:00:00.000Z",
  "address": {
    "street": "200 W. Washington Street",
    "unit": "Suite 205",
    "city": "Phoenix",
    "state": "AZ",
    "zipCode": "85003",
    "timezone": "America/Phoenix"
  },
  "isRefundable": true,
  "isRebookable": true,
  "cancellationReason": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "name": "Scheduled time no longer works",
    "isRefundable": true
  },
  "cancellationNote": "string",
  "behalfOf": {
    "firstName": "string",
    "lastName": "string",
    "email": "string",
    "phoneNumber": "string",
    "isLegalGuardian": true,
    "shouldNotify": true
  },
  "parkingInstruction": "Park on street.",
  "specialRequest": "Call on arrival.",
  "specimens": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "size": 13264,
      "type": "string",
      "url": "string"
    }
  ]
}

Responses

Status Meaning Description Schema
200 OK The existing appointment Appointment
404 Not Found The appointment does not exist NotFound

Appointment_Rebook

Code samples

PATCH /v2/appointment/{id}/rebook HTTP/1.1

Content-Type: application/json
Accept: application/json

# You can also use wget
curl -X PATCH /v2/appointment/{id}/rebook \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'

const inputBody = '{
  "key": "SFG8HHp01ZNwi+/prwl2CmKSlZZHByJLjf27E5l+f7I+suxFY0QYkTWtxJ4xr5n/IsMm2LTrUADDHRGuzo6F/abaLdGMvHxvf7CSwQxlit7pel3SK0c8HwxllGG3UWq21GV1x/SkvITGDAUUAwFHZ/urGzhgKf4DQkKiZctPVFRvfGq1ash4ZV7HfdbBviswl5w6ORSmYwwae6zQx+//h83DcfO7xIMbjamoJDfoDUS0v5ZftVeN3KjjBdCd4nunBy6YTsEnlVQaJqTa4uSwu++ddZ6/ZTw5nEIgSQjhQL9uJd9YgC3ir4oyw0reI9NsHgp5vdO1TIVSodfMUv8NYB23v3mWKyeI21xehM32wAUs/u0JkXBGrWrUNM+Q2PaP3hZQJrh3DQ=="
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/appointment/{id}/rebook',
{
  method: 'PATCH',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/appointment/{id}/rebook");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('PATCH','/v2/appointment/{id}/rebook', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Content-Type": []string{"application/json"},
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("PATCH", "/v2/appointment/{id}/rebook", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.patch('/v2/appointment/{id}/rebook', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Content-Type' => 'application/json',
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.patch '/v2/appointment/{id}/rebook',
  params: {
  }, headers: headers

p JSON.parse(result)

PATCH /v2/appointment/{id}/rebook

Change the time or address of an existing appointment. A new booking key must first be retrieved from the availability endpoint.

Body parameter

{
  "key": "SFG8HHp01ZNwi+/prwl2CmKSlZZHByJLjf27E5l+f7I+suxFY0QYkTWtxJ4xr5n/IsMm2LTrUADDHRGuzo6F/abaLdGMvHxvf7CSwQxlit7pel3SK0c8HwxllGG3UWq21GV1x/SkvITGDAUUAwFHZ/urGzhgKf4DQkKiZctPVFRvfGq1ash4ZV7HfdbBviswl5w6ORSmYwwae6zQx+//h83DcfO7xIMbjamoJDfoDUS0v5ZftVeN3KjjBdCd4nunBy6YTsEnlVQaJqTa4uSwu++ddZ6/ZTw5nEIgSQjhQL9uJd9YgC3ir4oyw0reI9NsHgp5vdO1TIVSodfMUv8NYB23v3mWKyeI21xehM32wAUs/u0JkXBGrWrUNM+Q2PaP3hZQJrh3DQ=="
}

Parameters

Name In Type Required Description
id path string(uuid) true The appointment ID
body body AppointmentBookingKey true none

Example responses

200 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "identifier": "PWDYA7",
  "status": "pending",
  "patient": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "externalId": "string",
    "email": "user@example.com",
    "phoneNumber": "6025554567",
    "firstName": "Jane",
    "lastName": "Doe",
    "dob": "1977-07-08",
    "birthSex": "female",
    "pronouns": "She/Her",
    "guardian": {
      "name": "Jane Doe",
      "relationship": "Mother"
    },
    "insurance": {
      "front": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      },
      "rear": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      }
    }
  },
  "labOrderDetails": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "contactName": "Jane Doe",
      "contactPhone": "6025554567",
      "labOrderFiles": [
        {
          "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
          "name": "lab-order.pdf",
          "purpose": "lab-order",
          "size": 13264,
          "type": "string"
        }
      ]
    }
  ],
  "startAt": "2021-07-01T12:00:00.000Z",
  "endAt": "2021-07-01T13:00:00.000Z",
  "address": {
    "street": "200 W. Washington Street",
    "unit": "Suite 205",
    "city": "Phoenix",
    "state": "AZ",
    "zipCode": "85003",
    "timezone": "America/Phoenix"
  },
  "isRefundable": true,
  "isRebookable": true,
  "cancellationReason": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "name": "Scheduled time no longer works",
    "isRefundable": true
  },
  "cancellationNote": "string",
  "behalfOf": {
    "firstName": "string",
    "lastName": "string",
    "email": "string",
    "phoneNumber": "string",
    "isLegalGuardian": true,
    "shouldNotify": true
  },
  "parkingInstruction": "Park on street.",
  "specialRequest": "Call on arrival.",
  "specimens": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "size": 13264,
      "type": "string",
      "url": "string"
    }
  ]
}

Responses

Status Meaning Description Schema
200 OK The modified appointment Appointment
400 Bad Request Invalid request data BadRequest
404 Not Found The appointment does not exist NotFound

Appointment_Cancel

Code samples

PATCH /v2/appointment/{id}/cancel HTTP/1.1

Content-Type: application/json
Accept: application/json

# You can also use wget
curl -X PATCH /v2/appointment/{id}/cancel \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'

const inputBody = '{
  "cancellationReasonId": "bbe18b64-79e3-4309-b8ed-556d65f0d00a",
  "note": "Circumstances caused the patient to be unable to make it"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/appointment/{id}/cancel',
{
  method: 'PATCH',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/appointment/{id}/cancel");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('PATCH','/v2/appointment/{id}/cancel', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Content-Type": []string{"application/json"},
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("PATCH", "/v2/appointment/{id}/cancel", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.patch('/v2/appointment/{id}/cancel', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Content-Type' => 'application/json',
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.patch '/v2/appointment/{id}/cancel',
  params: {
  }, headers: headers

p JSON.parse(result)

PATCH /v2/appointment/{id}/cancel

Cancels an existing appointment. A cancellation reason ID from the cancellation-reason endpoint is required. If the reason is "Other" then a note explaining the reason is also required.

Body parameter

{
  "cancellationReasonId": "bbe18b64-79e3-4309-b8ed-556d65f0d00a",
  "note": "Circumstances caused the patient to be unable to make it"
}

Parameters

Name In Type Required Description
id path string(uuid) true The appointment ID
body body AppointmentCancel true none

Example responses

200 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "identifier": "PWDYA7",
  "status": "pending",
  "patient": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "externalId": "string",
    "email": "user@example.com",
    "phoneNumber": "6025554567",
    "firstName": "Jane",
    "lastName": "Doe",
    "dob": "1977-07-08",
    "birthSex": "female",
    "pronouns": "She/Her",
    "guardian": {
      "name": "Jane Doe",
      "relationship": "Mother"
    },
    "insurance": {
      "front": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      },
      "rear": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      }
    }
  },
  "labOrderDetails": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "contactName": "Jane Doe",
      "contactPhone": "6025554567",
      "labOrderFiles": [
        {
          "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
          "name": "lab-order.pdf",
          "purpose": "lab-order",
          "size": 13264,
          "type": "string"
        }
      ]
    }
  ],
  "startAt": "2021-07-01T12:00:00.000Z",
  "endAt": "2021-07-01T13:00:00.000Z",
  "address": {
    "street": "200 W. Washington Street",
    "unit": "Suite 205",
    "city": "Phoenix",
    "state": "AZ",
    "zipCode": "85003",
    "timezone": "America/Phoenix"
  },
  "isRefundable": true,
  "isRebookable": true,
  "cancellationReason": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "name": "Scheduled time no longer works",
    "isRefundable": true
  },
  "cancellationNote": "string",
  "behalfOf": {
    "firstName": "string",
    "lastName": "string",
    "email": "string",
    "phoneNumber": "string",
    "isLegalGuardian": true,
    "shouldNotify": true
  },
  "parkingInstruction": "Park on street.",
  "specialRequest": "Call on arrival.",
  "specimens": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "size": 13264,
      "type": "string",
      "url": "string"
    }
  ]
}

Responses

Status Meaning Description Schema
200 OK The cancelled appointment Appointment
400 Bad Request Invalid request data BadRequest
404 Not Found The appointment does not exist NotFound

Lab Order Details

AppointmentLabOrder_Create

Code samples

POST /v2/appointment/{appointmentId}/lab-order-details HTTP/1.1

Content-Type: application/json
Accept: application/json

# You can also use wget
curl -X POST /v2/appointment/{appointmentId}/lab-order-details \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'

const inputBody = '{
  "contactName": "Jane Doe",
  "contactPhone": "6025554567",
  "labOrderFileIds": [
    "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
  ]
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/appointment/{appointmentId}/lab-order-details',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/appointment/{appointmentId}/lab-order-details");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('POST','/v2/appointment/{appointmentId}/lab-order-details', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Content-Type": []string{"application/json"},
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("POST", "/v2/appointment/{appointmentId}/lab-order-details", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.post('/v2/appointment/{appointmentId}/lab-order-details', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Content-Type' => 'application/json',
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.post '/v2/appointment/{appointmentId}/lab-order-details',
  params: {
  }, headers: headers

p JSON.parse(result)

POST /v2/appointment/{appointmentId}/lab-order-details

Adds lab order details to an existing appointment. Only appointments with a status of "pending" can be modified.

Body parameter

{
  "contactName": "Jane Doe",
  "contactPhone": "6025554567",
  "labOrderFileIds": [
    "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
  ]
}

Parameters

Name In Type Required Description
appointmentId path string(uuid) true The appointment ID
body body LabOrderDetails true The new lab order details

Example responses

200 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "identifier": "PWDYA7",
  "status": "pending",
  "patient": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "externalId": "string",
    "email": "user@example.com",
    "phoneNumber": "6025554567",
    "firstName": "Jane",
    "lastName": "Doe",
    "dob": "1977-07-08",
    "birthSex": "female",
    "pronouns": "She/Her",
    "guardian": {
      "name": "Jane Doe",
      "relationship": "Mother"
    },
    "insurance": {
      "front": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      },
      "rear": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      }
    }
  },
  "labOrderDetails": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "contactName": "Jane Doe",
      "contactPhone": "6025554567",
      "labOrderFiles": [
        {
          "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
          "name": "lab-order.pdf",
          "purpose": "lab-order",
          "size": 13264,
          "type": "string"
        }
      ]
    }
  ],
  "startAt": "2021-07-01T12:00:00.000Z",
  "endAt": "2021-07-01T13:00:00.000Z",
  "address": {
    "street": "200 W. Washington Street",
    "unit": "Suite 205",
    "city": "Phoenix",
    "state": "AZ",
    "zipCode": "85003",
    "timezone": "America/Phoenix"
  },
  "isRefundable": true,
  "isRebookable": true,
  "cancellationReason": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "name": "Scheduled time no longer works",
    "isRefundable": true
  },
  "cancellationNote": "string",
  "behalfOf": {
    "firstName": "string",
    "lastName": "string",
    "email": "string",
    "phoneNumber": "string",
    "isLegalGuardian": true,
    "shouldNotify": true
  },
  "parkingInstruction": "Park on street.",
  "specialRequest": "Call on arrival.",
  "specimens": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "size": 13264,
      "type": "string",
      "url": "string"
    }
  ]
}

Responses

Status Meaning Description Schema
200 OK The updated appointment Appointment
400 Bad Request Invalid request data BadRequest
404 Not Found The appointment does not exist NotFound

AppointmentLabOrder_Delete

Code samples

DELETE /v2/appointment/{appointmentId}/lab-order-details/{id} HTTP/1.1

Accept: application/json

# You can also use wget
curl -X DELETE /v2/appointment/{appointmentId}/lab-order-details/{id} \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'


const headers = {
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/appointment/{appointmentId}/lab-order-details/{id}',
{
  method: 'DELETE',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/appointment/{appointmentId}/lab-order-details/{id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('DELETE','/v2/appointment/{appointmentId}/lab-order-details/{id}', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("DELETE", "/v2/appointment/{appointmentId}/lab-order-details/{id}", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.delete('/v2/appointment/{appointmentId}/lab-order-details/{id}', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.delete '/v2/appointment/{appointmentId}/lab-order-details/{id}',
  params: {
  }, headers: headers

p JSON.parse(result)

DELETE /v2/appointment/{appointmentId}/lab-order-details/{id}

Remove lab order details from an existing appointment. Each appointment requires at least one lab order, if the last one needs to be deleted add a new one first. Only appointments with a status of "pending" can be modified.

Parameters

Name In Type Required Description
id path string(uuid) true The lab order details ID to be deleted
appointmentId path string(uuid) true The appointment ID

Example responses

200 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "identifier": "PWDYA7",
  "status": "pending",
  "patient": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "externalId": "string",
    "email": "user@example.com",
    "phoneNumber": "6025554567",
    "firstName": "Jane",
    "lastName": "Doe",
    "dob": "1977-07-08",
    "birthSex": "female",
    "pronouns": "She/Her",
    "guardian": {
      "name": "Jane Doe",
      "relationship": "Mother"
    },
    "insurance": {
      "front": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      },
      "rear": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      }
    }
  },
  "labOrderDetails": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "contactName": "Jane Doe",
      "contactPhone": "6025554567",
      "labOrderFiles": [
        {
          "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
          "name": "lab-order.pdf",
          "purpose": "lab-order",
          "size": 13264,
          "type": "string"
        }
      ]
    }
  ],
  "startAt": "2021-07-01T12:00:00.000Z",
  "endAt": "2021-07-01T13:00:00.000Z",
  "address": {
    "street": "200 W. Washington Street",
    "unit": "Suite 205",
    "city": "Phoenix",
    "state": "AZ",
    "zipCode": "85003",
    "timezone": "America/Phoenix"
  },
  "isRefundable": true,
  "isRebookable": true,
  "cancellationReason": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "name": "Scheduled time no longer works",
    "isRefundable": true
  },
  "cancellationNote": "string",
  "behalfOf": {
    "firstName": "string",
    "lastName": "string",
    "email": "string",
    "phoneNumber": "string",
    "isLegalGuardian": true,
    "shouldNotify": true
  },
  "parkingInstruction": "Park on street.",
  "specialRequest": "Call on arrival.",
  "specimens": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "size": 13264,
      "type": "string",
      "url": "string"
    }
  ]
}

Responses

Status Meaning Description Schema
200 OK The updated appointment Appointment
400 Bad Request Invalid request data BadRequest
404 Not Found The appointment or lab order details does not exist NotFound

Patient

Patient_Create

Code samples

POST /v2/patient HTTP/1.1

Content-Type: application/json
Accept: application/json

# You can also use wget
curl -X POST /v2/patient \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'

const inputBody = '{
  "externalId": "string",
  "email": "user@example.com",
  "phoneNumber": "6025554567",
  "firstName": "Jane",
  "lastName": "Doe",
  "dob": "1977-07-08",
  "birthSex": "female",
  "pronouns": "She/Her",
  "guardian": {
    "name": "Jane Doe",
    "relationship": "Mother"
  },
  "insurance": {
    "frontId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1",
    "rearId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
  }
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/patient',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/patient");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('POST','/v2/patient', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Content-Type": []string{"application/json"},
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("POST", "/v2/patient", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.post('/v2/patient', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Content-Type' => 'application/json',
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.post '/v2/patient',
  params: {
  }, headers: headers

p JSON.parse(result)

POST /v2/patient

Returns either an existing patient that matches the passed information or creates a new patient.

The patient's email, date of birth and birth sex are used to look up the patient. If the patient's email address already exists but the date of birth or birth sex does not match our records then a bad request error is returned.

If the phone number provided already exists on another patient's profile a bad request error is returned.

Body parameter

{
  "externalId": "string",
  "email": "user@example.com",
  "phoneNumber": "6025554567",
  "firstName": "Jane",
  "lastName": "Doe",
  "dob": "1977-07-08",
  "birthSex": "female",
  "pronouns": "She/Her",
  "guardian": {
    "name": "Jane Doe",
    "relationship": "Mother"
  },
  "insurance": {
    "frontId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1",
    "rearId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
  }
}

Parameters

Name In Type Required Description
body body Patient true none

Example responses

201 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "externalId": "string",
  "email": "user@example.com",
  "phoneNumber": "6025554567",
  "firstName": "Jane",
  "lastName": "Doe",
  "dob": "1977-07-08",
  "birthSex": "female",
  "pronouns": "She/Her",
  "guardian": {
    "name": "Jane Doe",
    "relationship": "Mother"
  },
  "insurance": {
    "front": {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "size": 13264,
      "type": "string"
    },
    "rear": {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "size": 13264,
      "type": "string"
    }
  }
}

Responses

Status Meaning Description Schema
201 Created The requested patient Patient
400 Bad Request Invalid request data BadRequest

Patient_Read

Code samples

GET /v2/patient/{id} HTTP/1.1

Accept: application/json

# You can also use wget
curl -X GET /v2/patient/{id} \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'


const headers = {
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/patient/{id}',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/patient/{id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('GET','/v2/patient/{id}', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("GET", "/v2/patient/{id}", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.get('/v2/patient/{id}', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.get '/v2/patient/{id}',
  params: {
  }, headers: headers

p JSON.parse(result)

GET /v2/patient/{id}

Fetches an existing patient

Parameters

Name In Type Required Description
id path string(uuid) true The patient ID

Example responses

200 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "externalId": "string",
  "email": "user@example.com",
  "phoneNumber": "6025554567",
  "firstName": "Jane",
  "lastName": "Doe",
  "dob": "1977-07-08",
  "birthSex": "female",
  "pronouns": "She/Her",
  "guardian": {
    "name": "Jane Doe",
    "relationship": "Mother"
  },
  "insurance": {
    "front": {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "size": 13264,
      "type": "string"
    },
    "rear": {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "size": 13264,
      "type": "string"
    }
  }
}

Responses

Status Meaning Description Schema
200 OK The patient's details Patient
404 Not Found The patient does not exist NotFound

Patient_Update

Code samples

PATCH /v2/patient/{id} HTTP/1.1

Content-Type: application/json
Accept: application/json

# You can also use wget
curl -X PATCH /v2/patient/{id} \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'

const inputBody = '{
  "externalId": "string",
  "guardian": {
    "name": "Jane Doe",
    "relationship": "Mother"
  },
  "insurance": {
    "frontId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1",
    "rearId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
  }
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/patient/{id}',
{
  method: 'PATCH',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/patient/{id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('PATCH','/v2/patient/{id}', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Content-Type": []string{"application/json"},
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("PATCH", "/v2/patient/{id}", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.patch('/v2/patient/{id}', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Content-Type' => 'application/json',
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.patch '/v2/patient/{id}',
  params: {
  }, headers: headers

p JSON.parse(result)

PATCH /v2/patient/{id}

Updates an existing patient's details

Body parameter

{
  "externalId": "string",
  "guardian": {
    "name": "Jane Doe",
    "relationship": "Mother"
  },
  "insurance": {
    "frontId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1",
    "rearId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
  }
}

Parameters

Name In Type Required Description
id path string(uuid) true The patient ID
body body PatientUpdate true none

Example responses

200 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "externalId": "string",
  "email": "user@example.com",
  "phoneNumber": "6025554567",
  "firstName": "Jane",
  "lastName": "Doe",
  "dob": "1977-07-08",
  "birthSex": "female",
  "pronouns": "She/Her",
  "guardian": {
    "name": "Jane Doe",
    "relationship": "Mother"
  },
  "insurance": {
    "front": {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "size": 13264,
      "type": "string"
    },
    "rear": {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "size": 13264,
      "type": "string"
    }
  }
}

Responses

Status Meaning Description Schema
200 OK The patient's details Patient
404 Not Found The patient does not exist NotFound

Appointment Requests (Private Beta - Not Generally Available)

AppointmentRequest_Read

Code samples

GET /v2/appointment-requests/{id} HTTP/1.1

Accept: application/json

# You can also use wget
curl -X GET /v2/appointment-requests/{id} \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'


const headers = {
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/appointment-requests/{id}',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/appointment-requests/{id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('GET','/v2/appointment-requests/{id}', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("GET", "/v2/appointment-requests/{id}", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.get('/v2/appointment-requests/{id}', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.get '/v2/appointment-requests/{id}',
  params: {
  }, headers: headers

p JSON.parse(result)

GET /v2/appointment-requests/{id}

Fetches an existing appointment request

Parameters

Name In Type Required Description
id path string(uuid) true The appointment request ID

Example responses

200 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "status": "pending",
  "patient": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "externalId": "string",
    "email": "user@example.com",
    "phoneNumber": "6025554567",
    "firstName": "Jane",
    "lastName": "Doe",
    "dob": "1977-07-08",
    "birthSex": "female",
    "pronouns": "She/Her",
    "guardian": {
      "name": "Jane Doe",
      "relationship": "Mother"
    },
    "insurance": {
      "front": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      },
      "rear": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      }
    }
  },
  "appointmentData": {
    "patientId": "5629a84d-a302-47c2-82f3-430f2a100a74",
    "partnerId": "112a778e-0a54-4cf9-9390-e1b7c4b7b7f9",
    "address": {
      "street": "600 E Washington St",
      "city": "Phoenix",
      "state": "AZ",
      "zipCode": "85004",
      "unit": null
    }
  },
  "cancellationReason": "malformed-data",
  "createdAt": "2019-08-24T14:15:22Z",
  "updatedAt": "2019-08-24T14:15:22Z",
  "appointmentId": "string",
  "lastNotifiedAt": "2019-08-24T14:15:22Z",
  "timesNotified": 0
}

Responses

Status Meaning Description Schema
200 OK The existing appointment request AppointmentRequest
404 Not Found The appointment request does not exist NotFound

AppointmentRequest_Create

Code samples

POST /v2/appointment-requests HTTP/1.1

Content-Type: application/json
Accept: application/json

# You can also use wget
curl -X POST /v2/appointment-requests \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'

const inputBody = '{
  "address": {
    "street": "200 W. Washington Street",
    "unit": "Suite 205",
    "city": "Phoenix",
    "state": "AZ",
    "zipCode": "85003"
  },
  "labOrderDetails": [
    {
      "contactName": "Jane Doe",
      "contactPhone": "6025554567",
      "labOrderFileIds": [
        "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
      ]
    }
  ],
  "patientId": "460a6d87-689c-4661-a526-a52450bbe2d7",
  "insurance": {
    "frontId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1",
    "rearId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
  },
  "parkingInstruction": "Park on street.",
  "specialRequest": "Call on arrival.",
  "shouldNotifyPatient": true
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/appointment-requests',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/appointment-requests");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('POST','/v2/appointment-requests', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Content-Type": []string{"application/json"},
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("POST", "/v2/appointment-requests", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.post('/v2/appointment-requests', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Content-Type' => 'application/json',
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.post '/v2/appointment-requests',
  params: {
  }, headers: headers

p JSON.parse(result)

POST /v2/appointment-requests

Creates a new appointment request. An appointment request is a partially completed appointment where the patient is responsible for completing the booking. The patient will be notified to schedule the appointment via SMS after the request is created. If you have all the data required to book an appointment, please use the POST /appointment endpoint.

There are a couple prerequisite requirements before creating an appointment request:

  1. Retrieve a patient ID from the patient endpoint.
  2. (optional) Upload any required lab order files to the lab order endpoint and use those file IDs when creating the appointment request.

Body parameter

{
  "address": {
    "street": "200 W. Washington Street",
    "unit": "Suite 205",
    "city": "Phoenix",
    "state": "AZ",
    "zipCode": "85003"
  },
  "labOrderDetails": [
    {
      "contactName": "Jane Doe",
      "contactPhone": "6025554567",
      "labOrderFileIds": [
        "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
      ]
    }
  ],
  "patientId": "460a6d87-689c-4661-a526-a52450bbe2d7",
  "insurance": {
    "frontId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1",
    "rearId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
  },
  "parkingInstruction": "Park on street.",
  "specialRequest": "Call on arrival.",
  "shouldNotifyPatient": true
}

Parameters

Name In Type Required Description
body body CreateAppointmentRequest true none

Example responses

201 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "status": "pending",
  "patient": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "externalId": "string",
    "email": "user@example.com",
    "phoneNumber": "6025554567",
    "firstName": "Jane",
    "lastName": "Doe",
    "dob": "1977-07-08",
    "birthSex": "female",
    "pronouns": "She/Her",
    "guardian": {
      "name": "Jane Doe",
      "relationship": "Mother"
    },
    "insurance": {
      "front": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      },
      "rear": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "size": 13264,
        "type": "string"
      }
    }
  },
  "appointmentData": {
    "patientId": "5629a84d-a302-47c2-82f3-430f2a100a74",
    "partnerId": "112a778e-0a54-4cf9-9390-e1b7c4b7b7f9",
    "address": {
      "street": "600 E Washington St",
      "city": "Phoenix",
      "state": "AZ",
      "zipCode": "85004",
      "unit": null
    }
  },
  "cancellationReason": "malformed-data",
  "createdAt": "2019-08-24T14:15:22Z",
  "updatedAt": "2019-08-24T14:15:22Z",
  "appointmentId": "string",
  "lastNotifiedAt": "2019-08-24T14:15:22Z",
  "timesNotified": 0
}

Responses

Status Meaning Description Schema
201 Created The newly created appointment request AppointmentRequest
400 Bad Request Invalid request data BadRequest

AppointmentRequest_List

Code samples

GET /v2/appointment-requests?limit=25&offset=1 HTTP/1.1

Accept: application/json

# You can also use wget
curl -X GET /v2/appointment-requests?limit=25&offset=1 \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'


const headers = {
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/appointment-requests?limit=25&offset=1',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/appointment-requests?limit=25&offset=1");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('GET','/v2/appointment-requests', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("GET", "/v2/appointment-requests", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.get('/v2/appointment-requests', params={
  'limit': '25',  'offset': '1'
}, headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.get '/v2/appointment-requests',
  params: {
  'limit' => 'number',
'offset' => 'number'
}, headers: headers

p JSON.parse(result)

GET /v2/appointment-requests

Parameters

Name In Type Required Description
limit query number true The number of records to limit in the pagination
offset query number true The offset in the pagination
order query string(string) false A CSV of appointment propertyName:asc
status query array[string] false An array of statuses to filter results by

Enumerated Values

Parameter Value
status pending
status processed
status notified
status unresponsive
status scheduled
status fulfilled
status errored
status cancelled

Example responses

200 Response

{
  "data": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "status": "pending",
      "patient": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "externalId": "string",
        "email": "user@example.com",
        "phoneNumber": "6025554567",
        "firstName": "Jane",
        "lastName": "Doe",
        "dob": "1977-07-08",
        "birthSex": "female",
        "pronouns": "She/Her",
        "guardian": {
          "name": "Jane Doe",
          "relationship": "Mother"
        },
        "insurance": {
          "front": {
            "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
            "name": "lab-order.pdf",
            "purpose": "lab-order",
            "size": 13264,
            "type": "string"
          },
          "rear": {
            "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
            "name": "lab-order.pdf",
            "purpose": "lab-order",
            "size": 13264,
            "type": "string"
          }
        }
      },
      "appointmentData": {
        "patientId": "5629a84d-a302-47c2-82f3-430f2a100a74",
        "partnerId": "112a778e-0a54-4cf9-9390-e1b7c4b7b7f9",
        "address": {
          "street": "600 E Washington St",
          "city": "Phoenix",
          "state": "AZ",
          "zipCode": "85004",
          "unit": null
        }
      },
      "cancellationReason": "malformed-data",
      "createdAt": "2019-08-24T14:15:22Z",
      "updatedAt": "2019-08-24T14:15:22Z",
      "appointmentId": "string",
      "lastNotifiedAt": "2019-08-24T14:15:22Z",
      "timesNotified": 0
    }
  ],
  "total": 25
}

Responses

Status Meaning Description Schema
200 OK This is a paged response that will return an array of appointment requests Inline
400 Bad Request Invalid request data BadRequest

Response Schema

Enumerated Values

Property Value
status pending
status processed
status notified
status unresponsive
status scheduled
status fulfilled
status errored
status cancelled
birthSex male
birthSex female
birthSex other
purpose lab-order
purpose insurance-front
purpose insurance-rear
purpose lab-order
purpose insurance-front
purpose insurance-rear
purpose lab-order
purpose insurance-front
purpose insurance-rear
purpose lab-order
purpose insurance-front
purpose insurance-rear
cancellationReason malformed-data
cancellationReason not-serviceable
cancellationReason null

File

File_Create

Code samples

POST /v2/file HTTP/1.1

Content-Type: application/json
Accept: application/json

# You can also use wget
curl -X POST /v2/file \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'

const inputBody = '{
  "name": "lab-order.pdf",
  "purpose": "lab-order",
  "data": "string"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/file',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/file");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('POST','/v2/file', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Content-Type": []string{"application/json"},
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("POST", "/v2/file", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.post('/v2/file', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Content-Type' => 'application/json',
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.post '/v2/file',
  params: {
  }, headers: headers

p JSON.parse(result)

POST /v2/file

Uploads a Base64 encoded file. If attaching a lab order file to an appointment it is first uploaded to this endpoint and the ID is used when creating the appointment. File types accepted are png, jpeg, tif, and pdf.

Body parameter

{
  "name": "lab-order.pdf",
  "purpose": "lab-order",
  "data": "string"
}

Parameters

Name In Type Required Description
body body File true none

Example responses

201 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "name": "lab-order.pdf",
  "purpose": "lab-order",
  "size": 13264,
  "type": "string"
}

Responses

Status Meaning Description Schema
201 Created The newly created file File
400 Bad Request Invalid request data BadRequest

Cancellation Reasons

CancellationReasons_List

Code samples

GET /v2/cancellation-reason HTTP/1.1

Accept: application/json

# You can also use wget
curl -X GET /v2/cancellation-reason \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'


const headers = {
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/cancellation-reason',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/cancellation-reason");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('GET','/v2/cancellation-reason', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("GET", "/v2/cancellation-reason", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.get('/v2/cancellation-reason', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.get '/v2/cancellation-reason',
  params: {
  }, headers: headers

p JSON.parse(result)

GET /v2/cancellation-reason

Returns a list of reasons an appointment can be cancelled. A cancellation reason ID is needed to cancel an appointment

Example responses

200 Response

[
  {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "name": "Scheduled time no longer works",
    "isRefundable": true
  }
]

Responses

Status Meaning Description Schema
200 OK An array of all the cancellation reasons Inline

Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [CancellationReason] false none none
» id string(uuid) true read-only The ID of the cancellation reason
» name string true read-only What the cancellation reason is used for
» isRefundable boolean true read-only If true the patient is entitled to a refund after cancelling the appointment

Account

Account_Read

Code samples

GET /v2/account HTTP/1.1

Accept: application/json

# You can also use wget
curl -X GET /v2/account \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'


const headers = {
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/account',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/account");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('GET','/v2/account', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("GET", "/v2/account", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.get('/v2/account', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.get '/v2/account',
  params: {
  }, headers: headers

p JSON.parse(result)

GET /v2/account

Fetches user account settings

Example responses

200 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "name": "string",
  "paymentMethod": "invoice",
  "skipLabOrder": true
}

Responses

Status Meaning Description Schema
200 OK The users' account record Account
404 Not Found The account does not exist NotFound

Service Area

read

Code samples

GET /v2/service-area/zip-code/{zipCode} HTTP/1.1

Accept: application/json

# You can also use wget
curl -X GET /v2/service-area/zip-code/{zipCode} \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'


const headers = {
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/service-area/zip-code/{zipCode}',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/service-area/zip-code/{zipCode}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('GET','/v2/service-area/zip-code/{zipCode}', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("GET", "/v2/service-area/zip-code/{zipCode}", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.get('/v2/service-area/zip-code/{zipCode}', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.get '/v2/service-area/zip-code/{zipCode}',
  params: {
  }, headers: headers

p JSON.parse(result)

GET /v2/service-area/zip-code/{zipCode}

Fetches a service area for a given zip code. It can be used to determine if Getlabs is able to book appointments for a given zip code.

Parameters

Name In Type Required Description
zipCode path string true The 5 digit zip code for the service area

Example responses

200 Response

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "city": "Phoenix",
  "county": "Maricopa County",
  "state": "AZ",
  "zipCode": "85003",
  "timezone": "America/Phoenix",
  "startDate": "2021-01-01T07:00:00.000Z",
  "endDate": "2022-01-01T07:00:00.000Z",
  "isActive": true
}

Responses

Status Meaning Description Schema
200 OK The service area details ServiceArea
404 Not Found No service area exists for the given zip code NotFound

Payment

create setup intent

Code samples

POST /v2/payment/setup HTTP/1.1

Content-Type: application/json
Accept: application/json

# You can also use wget
curl -X POST /v2/payment/setup \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer {access-token}'

const inputBody = '{
  "patientId": "460a6d87-689c-4661-a526-a52450bbe2d7"
}';
const headers = {
  'Content-Type':'application/json',
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('/v2/payment/setup',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

URL obj = new URL("/v2/payment/setup");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
    new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();
System.out.println(response.toString());

<?php

require 'vendor/autoload.php';

$headers = array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'Authorization' => 'Bearer {access-token}',
);

$client = new \GuzzleHttp\Client();

// Define array of request body.
$request_body = array();

try {
    $response = $client->request('POST','/v2/payment/setup', array(
        'headers' => $headers,
        'json' => $request_body,
       )
    );
    print_r($response->getBody()->getContents());
 }
 catch (\GuzzleHttp\Exception\BadResponseException $e) {
    // handle exception or api errors.
    print_r($e->getMessage());
 }

 // ...

package main

import (
       "bytes"
       "net/http"
)

func main() {

    headers := map[string][]string{
        "Content-Type": []string{"application/json"},
        "Accept": []string{"application/json"},
        "Authorization": []string{"Bearer {access-token}"},
    }

    data := bytes.NewBuffer([]byte{jsonReq})
    req, err := http.NewRequest("POST", "/v2/payment/setup", data)
    req.Header = headers

    client := &http.Client{}
    resp, err := client.Do(req)
    // ...
}

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.post('/v2/payment/setup', headers = headers)

print(r.json())

require 'rest-client'
require 'json'

headers = {
  'Content-Type' => 'application/json',
  'Accept' => 'application/json',
  'Authorization' => 'Bearer {access-token}'
}

result = RestClient.post '/v2/payment/setup',
  params: {
  }, headers: headers

p JSON.parse(result)

POST /v2/payment/setup

Creates a setup intent with Stripe. This is needed to collect a patient's credit card details using Stripe's client API. This endpoint is only used by partners who have opted for their patients to directly pay for the appointment.

Body parameter

{
  "patientId": "460a6d87-689c-4661-a526-a52450bbe2d7"
}

Parameters

Name In Type Required Description
body body PaymentCreateSetup true none

Example responses

201 Response

{
  "clientSecret": "seti_1Jv3iKB60neqlRn35yPUsJN6_secret_KaEA3x316GYgEyYZUgdiUo2K1cwoDbw"
}

Responses

Status Meaning Description Schema
201 Created The created Stripe setup intent PaymentSetup
400 Bad Request Invalid request data BadRequest

Schemas

OauthToken

{
  "access_token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjE5Nzk2MjEwLTBmZDUtNDFhZi1iOGUzLWM1ODViYzFjN2ExMSIsInR5cGUiOiJQYXJ0bmVyRW50aXR5IiwiaWF0IjoxNjU4NDMzMjU3LCJleHAiOjE2NTg0MzM4NTd9.XQsq-opjVKVmVhvXzU_mGeCqOi3m96ZoHGnLQ90UnFXKQDTTMeTm7lOv9Qd8nNmDab9Ex7VmIKt3Ne8NDvIVWQ",
  "refresh_token": "323abcbc59fd263986d4a2afd0f24385457dd5b6",
  "token_type": "Bearer",
  "expires": "1658433841"
}

Properties

Name Type Required Restrictions Description
access_token string true none Access token required for all api calls
refresh_token string true none Refresh token to be used to refresh your expired access_token
token_type string true none Token type. At this point it will always be Bearer
expires number true none Expire timestamp of your access token

OauthRequest

{
  "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
  "refresh_token": "string",
  "assertion": "string"
}

Properties

Name Type Required Restrictions Description
grant_type string true none Grant type that you're requesting
refresh_token string false none If your grant type is 'refresh_token' provide your existing refresh token
assertion string false none The value of the "assertion" parameter MUST contain a single JWT.

Enumerated Values

Property Value
grant_type urn:ietf:params:oauth:grant-type:jwt-bearer
grant_type refresh_token

Timeslot

{
  "key": "yGDknWzB74gP8zpET+HrI3jQVyq4ss/ENX38C1eJSR3D7zCHGloM0URG8V2y1nltsTgvED2q/ZcyJZzfZcWc021/Hg1TWICUkDXl627QDdytvUGsEcy9dqpxtqNLmkCtBRcQHnbgaSIR9E7gZ/5fj6NfTwnRH1coitxlOUCsrm9x76l80saizu9M3L5UqafNB7MtbkcCtfB4h9nubzUXahEbXPq0wFvbt/2VQl7311Vgro9XC3k/CbeBMtiQXhSMqslRop44NJO7Rp6qHEjsrZOJVfcKd3ASuYFEspBi+J+ddRilOS4p06Ai8nhrIx3pbLXoRm4aSqNaLCx5lbldLeh08ozRBt3oBGZDzwxdsYzu8iBgxMMGbH/AUpuR+7Lh9YE=",
  "start": "2021-07-01T12:00:00.000Z",
  "end": "2021-07-01T13:00:00.000Z",
  "expiresAt": "2021-06-22T12:00:00.000Z",
  "price": "2900",
  "priority": true,
  "available": 3
}

Properties

Name Type Required Restrictions Description
key string¦null true none The key used when booking an appointment. A key is valid for 60 minutes after generation, to book an appointment after that a new key is needed.
start string(date-time) true none The appointment start time
end string(date-time) true none The appointment end time
expiresAt string(date-time)¦null true none The time the booking key expires. Afterwards it cannot be used to book an appointment.
price number true none The price for the appointment in cents
priority boolean true none If an appointment is a priority slot then a lab order must be uploaded in order to book
available number true none The number of appointments available for the timeslot

DaySlots

{
  "date": "2021-07-01",
  "slots": [
    {
      "key": "yGDknWzB74gP8zpET+HrI3jQVyq4ss/ENX38C1eJSR3D7zCHGloM0URG8V2y1nltsTgvED2q/ZcyJZzfZcWc021/Hg1TWICUkDXl627QDdytvUGsEcy9dqpxtqNLmkCtBRcQHnbgaSIR9E7gZ/5fj6NfTwnRH1coitxlOUCsrm9x76l80saizu9M3L5UqafNB7MtbkcCtfB4h9nubzUXahEbXPq0wFvbt/2VQl7311Vgro9XC3k/CbeBMtiQXhSMqslRop44NJO7Rp6qHEjsrZOJVfcKd3ASuYFEspBi+J+ddRilOS4p06Ai8nhrIx3pbLXoRm4aSqNaLCx5lbldLeh08ozRBt3oBGZDzwxdsYzu8iBgxMMGbH/AUpuR+7Lh9YE=",
      "start": "2021-07-01T12:00:00.000Z",
      "end": "2021-07-01T13:00:00.000Z",
      "expiresAt": "2021-06-22T12:00:00.000Z",
      "price": "2900",
      "priority": true,
      "available": 3
    }
  ]
}

Properties

Name Type Required Restrictions Description
date string(date) true none The date the appointment slots are for
slots [Timeslot] true none none

AvailabilityResponse

{
  "serviceable": true,
  "data": [
    {
      "date": "2021-07-01",
      "slots": [
        {
          "key": "yGDknWzB74gP8zpET+HrI3jQVyq4ss/ENX38C1eJSR3D7zCHGloM0URG8V2y1nltsTgvED2q/ZcyJZzfZcWc021/Hg1TWICUkDXl627QDdytvUGsEcy9dqpxtqNLmkCtBRcQHnbgaSIR9E7gZ/5fj6NfTwnRH1coitxlOUCsrm9x76l80saizu9M3L5UqafNB7MtbkcCtfB4h9nubzUXahEbXPq0wFvbt/2VQl7311Vgro9XC3k/CbeBMtiQXhSMqslRop44NJO7Rp6qHEjsrZOJVfcKd3ASuYFEspBi+J+ddRilOS4p06Ai8nhrIx3pbLXoRm4aSqNaLCx5lbldLeh08ozRBt3oBGZDzwxdsYzu8iBgxMMGbH/AUpuR+7Lh9YE=",
          "start": "2021-07-01T12:00:00.000Z",
          "end": "2021-07-01T13:00:00.000Z",
          "expiresAt": "2021-06-22T12:00:00.000Z",
          "price": "2900",
          "priority": true,
          "available": 3
        }
      ]
    }
  ],
  "tz": "America/Phoenix"
}

Properties

Name Type Required Restrictions Description
serviceable boolean true none If the address is serviceable by Getlabs this will be true otherwise false
data [DaySlots] true none An array containing all the dates requested
tz string false none The timezone where the appointment will take place

ValidationError

{
  "property": "email",
  "constraints": {
    "isNotEmpty": "property should not be empty"
  },
  "children": [
    {
      "property": "email",
      "constraints": {
        "isNotEmpty": "property should not be empty"
      },
      "children": []
    }
  ]
}

Properties

Name Type Required Restrictions Description
property string true read-only The property name that the errors are for
constraints object false read-only An object containing all of the errors. The key is the error name and the value is the description.
children [ValidationError] true read-only An array of ValidationErrors for the children of this property

BadRequest

{
  "statusCode": 400,
  "message": [
    {
      "property": "email",
      "constraints": {
        "isNotEmpty": "property should not be empty"
      },
      "children": [
        {}
      ]
    }
  ],
  "error": "Bad Request"
}

Properties

Name Type Required Restrictions Description
statusCode number true read-only The http status code
message [ValidationError] true read-only An array containing all ValidationErrors for the request
error string true read-only A string describing the type of error

Enumerated Values

Property Value
statusCode 400
error Bad Request

PagedResponse

{
  "data": [
    []
  ],
  "total": 25
}

Properties

Name Type Required Restrictions Description
data [array] false read-only An array of pageable data
total number false read-only The total record count available

Guardian

{
  "name": "Jane Doe",
  "relationship": "Mother"
}

Properties

Name Type Required Restrictions Description
name string¦null false none Name of the patient's guardian, this is required if the patient is under 18 years old
relationship string¦null false none Patient's relationship to the guardian, this is required if the patient is under 18 years old

File

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "name": "lab-order.pdf",
  "purpose": "lab-order",
  "data": "string",
  "size": 13264,
  "type": "string"
}

Properties

Name Type Required Restrictions Description
id string(uuid) false read-only none
name string true none File name
purpose string true none The purpose of this file, must be one of the available options
data string true write-only Base64 encoded file contents, maximum size of 25 MB. The file MIME types allowed differ depending on the file "purpose":
* lab-order can be one of: application/pdf, image/png, image/jpeg, image/tiff
* insurance-front, insurance-rear can be one of: image/png, image/jpeg, image/tiff
size number true read-only The file size in bytes
type string true read-only Type of the file.

Enumerated Values

Property Value
purpose lab-order
purpose insurance-front
purpose insurance-rear

Insurance

{
  "front": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "name": "lab-order.pdf",
    "purpose": "lab-order",
    "data": "string",
    "size": 13264,
    "type": "string"
  },
  "rear": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "name": "lab-order.pdf",
    "purpose": "lab-order",
    "data": "string",
    "size": 13264,
    "type": "string"
  },
  "frontId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1",
  "rearId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
}

Properties

Name Type Required Restrictions Description
front File¦null false read-only The file object representing the image of the front of the insurance
rear File¦null false read-only The file object representing the image of the rear of the insurance
frontId File(uuid) false write-only A file ID with a purpose of 'insurance-front' uploaded using the file endpoint
rearId File(uuid) false write-only A file ID with a purpose of 'insurance-rear' uploaded using the file endpoint

Patient

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "externalId": "string",
  "email": "user@example.com",
  "phoneNumber": "6025554567",
  "firstName": "Jane",
  "lastName": "Doe",
  "dob": "1977-07-08",
  "birthSex": "female",
  "pronouns": "She/Her",
  "guardian": {
    "name": "Jane Doe",
    "relationship": "Mother"
  },
  "insurance": {
    "front": {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "data": "string",
      "size": 13264,
      "type": "string"
    },
    "rear": {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "data": "string",
      "size": 13264,
      "type": "string"
    },
    "frontId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1",
    "rearId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
  }
}

Properties

Name Type Required Restrictions Description
id string(uuid) false read-only The patient's ID
externalId string¦null false none External identifier for the patient
email string(email) true none Email address
phoneNumber string true none 10 digit phone number
firstName string true none First name
lastName string true none Last name
dob string(date) true none Date of birth (YYYY-MM-DD)
birthSex string true none Birth sex
pronouns string¦null false none The patient's preferred pronouns
guardian Guardian false none The patient's guardian, this is required if the patient is under 18 years old
insurance Insurance false none Images of the patient's insurance

Enumerated Values

Property Value
birthSex male
birthSex female
birthSex other

LabOrderDetails

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "contactName": "Jane Doe",
  "contactPhone": "6025554567",
  "labOrderFiles": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "data": "string",
      "size": 13264,
      "type": "string"
    }
  ],
  "labOrderFileIds": [
    "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
  ]
}

Properties

Name Type Required Restrictions Description
id string(uuid) false read-only The ID of this entity
contactName string¦null false none Name of the person/doctor's office who has the lab order details. Required if labOrderFileIds/labOrderFiles are NOT set AND the appointment is NOT a priority appointment.
contactPhone string¦null false none 10 digit phone number of the person/doctor's office who has the lab order details. Required if labOrderFileIds/labOrderFiles are NOT set AND the appointment is NOT a priority appointment.
labOrderFiles [File] false read-only An array of all files attached. If you have already uploaded files using the /file endpoint please use labOrderFileIds.
labOrderFileIds [string] false write-only An array of file IDs that were previously uploaded (and returned) using the /file endpoint. Required if contactName and contactPhone are not set OR if trying to schedule a priority appointment and/or have already uploaded files using the /file endpoint.

Address

{
  "street": "200 W. Washington Street",
  "unit": "Suite 205",
  "city": "Phoenix",
  "state": "AZ",
  "zipCode": "85003",
  "timezone": "America/Phoenix"
}

Properties

Name Type Required Restrictions Description
street string true none Street address
unit string¦null false none Unit number
city string true none City
state string true none 2 character state code
zipCode string true none 5 digit zip code for the appointment
timezone string¦null false read-only The timezone for the address

CancellationReason

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "name": "Scheduled time no longer works",
  "isRefundable": true
}

Properties

Name Type Required Restrictions Description
id string(uuid) true read-only The ID of the cancellation reason
name string true read-only What the cancellation reason is used for
isRefundable boolean true read-only If true the patient is entitled to a refund after cancelling the appointment

BehalfOf

{
  "firstName": "string",
  "lastName": "string",
  "email": "string",
  "phoneNumber": "string",
  "isLegalGuardian": true,
  "shouldNotify": true
}

Properties

Name Type Required Restrictions Description
firstName string false none First name of the person booking on behalf of
lastName string false none Last name of the person booking on behalf of
email string false none Email of the person booking on behalf of
phoneNumber string false none Phone number of the person booking on behalf of
isLegalGuardian boolean false none Are you the the patient's parent, legal guardian, or caretaker
shouldNotify boolean false none Should we notify you of the patient's appointment status?

ExtendedFile

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "name": "lab-order.pdf",
  "purpose": "lab-order",
  "data": "string",
  "size": 13264,
  "type": "string",
  "url": "string"
}

Properties

Name Type Required Restrictions Description
id string(uuid) false read-only none
name string true none File name
purpose string true none The purpose of this file, must be one of the available options
data string true write-only Base64 encoded file contents, maximum size of 25 MB. The file MIME types allowed differ depending on the file "purpose":
* lab-order can be one of: application/pdf, image/png, image/jpeg, image/tiff
* insurance-front, insurance-rear can be one of: image/png, image/jpeg, image/tiff
size number true read-only The file size in bytes
type string true read-only Type of the file.
url string true read-only Signed, expiring url for the file.

Enumerated Values

Property Value
purpose lab-order
purpose insurance-front
purpose insurance-rear
purpose specimen

Appointment

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "identifier": "PWDYA7",
  "status": "pending",
  "patient": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "externalId": "string",
    "email": "user@example.com",
    "phoneNumber": "6025554567",
    "firstName": "Jane",
    "lastName": "Doe",
    "dob": "1977-07-08",
    "birthSex": "female",
    "pronouns": "She/Her",
    "guardian": {
      "name": "Jane Doe",
      "relationship": "Mother"
    },
    "insurance": {
      "front": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "data": "string",
        "size": 13264,
        "type": "string"
      },
      "rear": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "data": "string",
        "size": 13264,
        "type": "string"
      },
      "frontId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1",
      "rearId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
    }
  },
  "labOrderDetails": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "contactName": "Jane Doe",
      "contactPhone": "6025554567",
      "labOrderFiles": [
        {
          "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
          "name": "lab-order.pdf",
          "purpose": "lab-order",
          "data": "string",
          "size": 13264,
          "type": "string"
        }
      ],
      "labOrderFileIds": [
        "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
      ]
    }
  ],
  "startAt": "2021-07-01T12:00:00.000Z",
  "endAt": "2021-07-01T13:00:00.000Z",
  "address": {
    "street": "200 W. Washington Street",
    "unit": "Suite 205",
    "city": "Phoenix",
    "state": "AZ",
    "zipCode": "85003",
    "timezone": "America/Phoenix"
  },
  "isRefundable": true,
  "isRebookable": true,
  "cancellationReason": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "name": "Scheduled time no longer works",
    "isRefundable": true
  },
  "cancellationNote": "string",
  "behalfOf": {
    "firstName": "string",
    "lastName": "string",
    "email": "string",
    "phoneNumber": "string",
    "isLegalGuardian": true,
    "shouldNotify": true
  },
  "parkingInstruction": "Park on street.",
  "specialRequest": "Call on arrival.",
  "specimens": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "data": "string",
      "size": 13264,
      "type": "string",
      "url": "string"
    }
  ]
}

Properties

Name Type Required Restrictions Description
id string(uuid) true read-only none
identifier string true read-only A short identifier to reference the appointment
status string true read-only The current status of the appointment

Pending = Appointment is yet to be readied
Confirmed = Appointment has been readied and waiting to be serviced
In-progress = Specialist is on-route/arrived at patient's home
Completed = Successful lab draw
Cancelled = Appointment canceled by us or the patient
patient Patient true none Patient details for the appointment
labOrderDetails [LabOrderDetails] true none Lab order details for the appointment
startAt string(date-time) true none Appointment start time
endAt string(date-time) true none Appointment end time
address Address true none Address where the appointment will take place
isRefundable boolean true read-only True if cancelling the appointment will result in a refund
isRebookable boolean true read-only True if the start time of the appointment can be changed
cancellationReason CancellationReason¦null false read-only The reason the appointment was cancelled
cancellationNote string¦null false read-only Any extra information as to why the appointment was cancelled
behalfOf BehalfOf¦null false none Details of the person booking on behalf of the patient.
parkingInstruction string¦null false none Instructions for parking.
specialRequest string¦null false none Special request notes.
specimens [ExtendedFile] true read-only Specimens collected for the appointment. Specimens will only exist on completed/near-complete appointments.

Enumerated Values

Property Value
status pending
status confirmed
status in-progress
status completed
status cancelled

AppointmentBook

{
  "key": "SFG8HHp01ZNwi+/prwl2CmKSlZZHByJLjf27E5l+f7I+suxFY0QYkTWtxJ4xr5n/IsMm2LTrUADDHRGuzo6F/abaLdGMvHxvf7CSwQxlit7pel3SK0c8HwxllGG3UWq21GV1x/SkvITGDAUUAwFHZ/urGzhgKf4DQkKiZctPVFRvfGq1ash4ZV7HfdbBviswl5w6ORSmYwwae6zQx+//h83DcfO7xIMbjamoJDfoDUS0v5ZftVeN3KjjBdCd4nunBy6YTsEnlVQaJqTa4uSwu++ddZ6/ZTw5nEIgSQjhQL9uJd9YgC3ir4oyw0reI9NsHgp5vdO1TIVSodfMUv8NYB23v3mWKyeI21xehM32wAUs/u0JkXBGrWrUNM+Q2PaP3hZQJrh3DQ==",
  "patientId": "460a6d87-689c-4661-a526-a52450bbe2d7",
  "labOrderDetails": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "contactName": "Jane Doe",
      "contactPhone": "6025554567",
      "labOrderFiles": [
        {
          "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
          "name": "lab-order.pdf",
          "purpose": "lab-order",
          "data": "string",
          "size": 13264,
          "type": "string"
        }
      ],
      "labOrderFileIds": [
        "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
      ]
    }
  ],
  "paymentMethod": "pm_1DkAUlB70neqlGn3zQESm7pl",
  "behalfOf": {
    "firstName": "string",
    "lastName": "string",
    "email": "string",
    "phoneNumber": "string",
    "isLegalGuardian": true,
    "shouldNotify": true
  },
  "parkingInstruction": "Park on street.",
  "specialRequest": "Call on arrival."
}

Properties

Name Type Required Restrictions Description
key string true none The booking key retrieved from the availability endpoint. A key is valid for 60 minutes after generation, to book an appointment after that a new key is needed.
patientId string(uuid) true none The patient's ID as retrieved from the /patient endpoint
labOrderDetails [LabOrderDetails] true none An array of LabOrderDetails objects. If the key being used is for a priority appointment then labOrderFileIds must be provided for at least one LabOrderDetail.
paymentMethod string false none The Stripe payment method ID fetched using the Stripe client API. This is only required if your account is setup to bill patients directly.
behalfOf BehalfOf false none Details of the person booking on behalf of the patient
parkingInstruction string false none Instructions for parking.
specialRequest string false none Special instruction notes.

NotFound

{
  "statusCode": 404,
  "message": "Not Found"
}

Properties

Name Type Required Restrictions Description
statusCode number true read-only The http status code
message string true read-only A string describing the type of error

Enumerated Values

Property Value
statusCode 404
message Not Found

AppointmentBookingKey

{
  "key": "SFG8HHp01ZNwi+/prwl2CmKSlZZHByJLjf27E5l+f7I+suxFY0QYkTWtxJ4xr5n/IsMm2LTrUADDHRGuzo6F/abaLdGMvHxvf7CSwQxlit7pel3SK0c8HwxllGG3UWq21GV1x/SkvITGDAUUAwFHZ/urGzhgKf4DQkKiZctPVFRvfGq1ash4ZV7HfdbBviswl5w6ORSmYwwae6zQx+//h83DcfO7xIMbjamoJDfoDUS0v5ZftVeN3KjjBdCd4nunBy6YTsEnlVQaJqTa4uSwu++ddZ6/ZTw5nEIgSQjhQL9uJd9YgC3ir4oyw0reI9NsHgp5vdO1TIVSodfMUv8NYB23v3mWKyeI21xehM32wAUs/u0JkXBGrWrUNM+Q2PaP3hZQJrh3DQ=="
}

Properties

Name Type Required Restrictions Description
key string true none The booking key retrieved from the availability endpoint. A key is valid for 60 minutes after generation, to book an appointment after that a new key is needed.

AppointmentCancel

{
  "cancellationReasonId": "bbe18b64-79e3-4309-b8ed-556d65f0d00a",
  "note": "Circumstances caused the patient to be unable to make it"
}

Properties

Name Type Required Restrictions Description
cancellationReasonId string(uuid) true none The ID of the cancellation reason as retrieved from the cancellation-reason endpoint
note string false none Extra information as to why the appointment is being cancelled, this is required if the cancellation reason is "other"

PatientUpdate

{
  "externalId": "string",
  "guardian": {
    "name": "Jane Doe",
    "relationship": "Mother"
  },
  "insurance": {
    "front": {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "data": "string",
      "size": 13264,
      "type": "string"
    },
    "rear": {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "data": "string",
      "size": 13264,
      "type": "string"
    },
    "frontId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1",
    "rearId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
  }
}

Properties

Name Type Required Restrictions Description
externalId string¦null false none External identifier for the patient
guardian Guardian false none The patient's guardian, this is required if the patient is under 18 years old
insurance Insurance false none Images of the patient's insurance

AppointmentRequest

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "status": "pending",
  "patient": {
    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
    "externalId": "string",
    "email": "user@example.com",
    "phoneNumber": "6025554567",
    "firstName": "Jane",
    "lastName": "Doe",
    "dob": "1977-07-08",
    "birthSex": "female",
    "pronouns": "She/Her",
    "guardian": {
      "name": "Jane Doe",
      "relationship": "Mother"
    },
    "insurance": {
      "front": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "data": "string",
        "size": 13264,
        "type": "string"
      },
      "rear": {
        "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
        "name": "lab-order.pdf",
        "purpose": "lab-order",
        "data": "string",
        "size": 13264,
        "type": "string"
      },
      "frontId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1",
      "rearId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
    }
  },
  "appointmentData": {
    "patientId": "5629a84d-a302-47c2-82f3-430f2a100a74",
    "partnerId": "112a778e-0a54-4cf9-9390-e1b7c4b7b7f9",
    "address": {
      "street": "600 E Washington St",
      "city": "Phoenix",
      "state": "AZ",
      "zipCode": "85004",
      "unit": null
    }
  },
  "cancellationReason": "malformed-data",
  "createdAt": "2019-08-24T14:15:22Z",
  "updatedAt": "2019-08-24T14:15:22Z",
  "appointmentId": "string",
  "lastNotifiedAt": "2019-08-24T14:15:22Z",
  "timesNotified": 0
}

Properties

Name Type Required Restrictions Description
id string(uuid) true read-only The appointment request's ID
status string true read-only The status of the appointment request
patient Patient true read-only The patient the appointment request is for
appointmentData object¦null false read-only The appointment data
cancellationReason string¦null false read-only The reason the appointment request was cancelled
createdAt string(date-time) true read-only Datetime when the appointment request was created
updatedAt string(date-time) true read-only Datetime when the appointment request was updated
appointmentId string¦null false read-only The ID of the appointment created for this request.
lastNotifiedAt string(date-time)¦null false read-only Datetime when the user was last notified about this request.
timesNotified number¦null false read-only Number of times the user has been notified.

Enumerated Values

Property Value
status pending
status processed
status notified
status unresponsive
status scheduled
status fulfilled
status errored
status cancelled
cancellationReason malformed-data
cancellationReason not-serviceable
cancellationReason null

CreateAppointmentRequest

{
  "address": {
    "street": "200 W. Washington Street",
    "unit": "Suite 205",
    "city": "Phoenix",
    "state": "AZ",
    "zipCode": "85003",
    "timezone": "America/Phoenix"
  },
  "labOrderDetails": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "contactName": "Jane Doe",
      "contactPhone": "6025554567",
      "labOrderFiles": [
        {
          "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
          "name": "lab-order.pdf",
          "purpose": "lab-order",
          "data": "string",
          "size": 13264,
          "type": "string"
        }
      ],
      "labOrderFileIds": [
        "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
      ]
    }
  ],
  "patientId": "460a6d87-689c-4661-a526-a52450bbe2d7",
  "insurance": {
    "front": {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "data": "string",
      "size": 13264,
      "type": "string"
    },
    "rear": {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "name": "lab-order.pdf",
      "purpose": "lab-order",
      "data": "string",
      "size": 13264,
      "type": "string"
    },
    "frontId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1",
    "rearId": "9b45fe45-79ed-40aa-9bc3-f358a7c6e6d1"
  },
  "parkingInstruction": "Park on street.",
  "specialRequest": "Call on arrival.",
  "shouldNotifyPatient": true
}

Properties

Name Type Required Restrictions Description
address Address true none The address where the appointment will take place
labOrderDetails [LabOrderDetails] false none An array of LabOrderDetails objects.
patientId string(uuid) true none The patient's ID as retrieved from the /patient endpoint
insurance Insurance false none Images of the patient's insurance
parkingInstruction string false none Instructions for parking
specialRequest string false none Special instruction notes
shouldNotifyPatient boolean false none Whether the patient should be sent a notification automatically to create an appointment.

Account

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "name": "string",
  "paymentMethod": "invoice",
  "skipLabOrder": true
}

Properties

Name Type Required Restrictions Description
id string(uuid) true read-only The partner's ID
name string true none Partner name
paymentMethod string true none Partner payment method type
skipLabOrder boolean false none Allows the skip lab order feature to be enabled for this partner

Enumerated Values

Property Value
paymentMethod invoice
paymentMethod patient-credit-card

ServiceArea

{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "city": "Phoenix",
  "county": "Maricopa County",
  "state": "AZ",
  "zipCode": "85003",
  "timezone": "America/Phoenix",
  "startDate": "2021-01-01T07:00:00.000Z",
  "endDate": "2022-01-01T07:00:00.000Z",
  "isActive": true
}

Properties

Name Type Required Restrictions Description
id string(uuid) true read-only The ID of the service area
city string¦null true read-only The city for the service area
county string¦null true read-only The county for the service area
state string true read-only The 2 character state code for the service area
zipCode string true read-only The 5 digit zip code for the service area
timezone string true read-only The timezone for the service area
startDate string(date-time) true read-only The earliest appointment date allowed for the service area
endDate string(date-time)¦null true read-only The last appointment date allowed for the service area. If it is null there is no scheduled end date.
isActive boolean true read-only True if the current date is in between the start and end date. Appointments can still be booked for inactive service areas starting for their start date.

PaymentCreateSetup

{
  "patientId": "460a6d87-689c-4661-a526-a52450bbe2d7"
}

Properties

Name Type Required Restrictions Description
patientId string(uuid) true none The patient's ID as retrieved from the /patient endpoint

PaymentSetup

{
  "clientSecret": "seti_1Jv3iKB60neqlRn35yPUsJN6_secret_KaEA3x316GYgEyYZUgdiUo2K1cwoDbw"
}

Properties

Name Type Required Restrictions Description
clientSecret string true read-only The Stripe client secret for this setup intent. It is used on the front end with the Stripe library to collect credit card information from the patient.