Resource Guru API (1.0.0)

Download OpenAPI specification:Download

Overview

This is a REST-style API that uses serialized JSON and OAuth2 authentication. We are very interested in making our API, and this documentation, as good as it possibly can be so please send any feedback to happytohelp@resourceguruapp.com. Any thoughts or suggestions will be gratefully received.

Making Requests

Encoding

The API expects all data to be UTF-8 encoded.

The Base URL

All requests start with the https://api.resourceguruapp.com/ base URL.

  • All requests are done via SSL.
  • All responses are in JSON.

Making a Basic Request

With the exception of Accounts all requests must be prefixed with the Account URL ID.

To make a request for all the Resources on the Example Corp account, the request URL will look something like this https://api.resourceguruapp.com/v1/example-corp/resources.

Rate Limiting

Request Limits

Each registered application is allowed up to 200 requests per minute. If this limit is exceeded, the server will respond with a 429 Rate Limit Exceeded error for any extra requests made within that minute.

Rate Limiting Headers

When you make a request, the server response will include three important headers related to rate limiting:

  • Retry-After: This header indicates how many seconds you should wait before sending another request if the rate limit has been exceeded.

  • X-RateLimit-Remaining: This header tells you how many more requests you can make within the current minute without exceeding the rate limit.

  • X-RateLimit-Limit: This header shows the maximum number of requests that can be made per minute. Normally, this is set to 200.

OAuth2 Token Limits

  • You can request up to 20 OAuth2 tokens per minute for a single user.
  • The daily limit for issuing OAuth2 tokens to a single user is 1,000.

CORS

Resource Guru provides headers to allow CORS requests to the API. You will need to authenticate using a valid OAuth2 token.

Response Codes

  • 200 OK
  • 201 Created
  • 204 No Content
  • 400 Bad Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 422 Unprocessable Entity
  • 5xx Resource Guru is having trouble

Authentication

OAuth2 authentication

In order to make authenticated calls to Resource Guru's API, your application must first obtain an OAuth2 access token. To register your app go to https://app.resourceguruapp.com/developers.

Resource Guru implements OAuth2 with the authentication code flow.

Once you have authenticated, you can get information about the authenticated user by calling GET https://api.resourceguruapp.com/v1/me. More details about the request and response are available below.

Getting access to a user's Resource Guru account requires going through a step of authentication. We offer OAuth2 as the standard way to authenticate with our API as this offers a simple flow for users to allow app access without you having to store their credentials.

HTTP Basic authentication

For convenience, Resource Guru's API will accept credentials provided through the HTTP Basic Authorization header. This is intended for exploration of the API only. We apply a global rate limit to HTTP Basic authorizations based on compute resources available at the given time, and provide no SLA. HTTP Basic authentication may be disabled without warning.

Considerations when Single Sign On is required

If your account is configured to require SSO for logins, API access through OAuth2 is only available when authenticating as the account owner. This restriction ensures that users who have been removed from your identity provider (IdP) aren't able to continue accessing your Resource Guru account with unexpired API tokens.

Getting started

We recommend using an OAuth2 library for the platform you're working with, rather than working from scratch. A fairly comprehensive list of libraries can be found here.

  1. Register an app at developers.resourceguruapp.com. Your app will be assigned a client_id and client_secret that will be used to identify your app when users authenticate with the API. You'll need to provide a redirect_uri where we'll send the verification code for authentication. Just use a fake URL like http://localhost/oauth if you haven't got one yet. Any Redirect URI given must be secure (HTTPS) unless it redirects to localhost.

  2. Configure your OAuth2 library to use the client_id, client_secret and redirect_uri for your app. You'll need to configure these URLs as well:

    • https://api.resourceguruapp.com/oauth/authorize to request authorization (must be requested with an HTTP GET request).
    • https://api.resourceguruapp.com/oauth/token to retrieve tokens (must be requested with an HTTP POST request).
  3. Authenticate with the API. We'll provide code samples using the intridea/oauth2 library in Ruby.

    Quick start using user's login credentials

    This method is only recommended for private apps, such as data imports and exports or internal business reporting. It's useful to get started quickly without all of the overhead of OAuth2 though, which makes it great for exploration. This should not be used for integrating 3rd party apps with Resource Guru as it requires knowing the user's private credentials.

    We support the OAuth2 password grant type. To authenticate, make an HTTP POST to /oauth/token with the following:

    {
      "grant_type"    : "password",
      "username"      : "user@example.com",
      "password"      : "secret",
      "client_id"     : "the_client_id",
      "client_secret" : "the_client_secret"
    }
    

    You'll receive the access token back in the response:

    {
      "access_token": "the_oauth_access_token",
      "refresh_token": "the_oauth_refresh_token",
      "token_type": "bearer",
      "expires_in": 604800
    }
    

    To use this with the OAuth2 Ruby library is easy:

    client = OAuth2::Client.new(client_id, client_secret, site: "https://api.resourceguruapp.com")
    token = client.password.get_token("user@example.com", "secret")
    token.get("/v1/example-corp/resources")
    

    The password grant method shown above is great for getting started quickly, but is impractical for apps that require users to authenticate with Resource Guru as you would have to store the user's Resource Guru login credentials.

    We support the standard auth code flow as well. Here is a code sample in Ruby of how to authenticate this way.

    require 'oauth2'
    
    client_id = ENV["CLIENT_ID"]
    client_secret = ENV["CLIENT_SECRET"]
    redirect_uri = ENV["REDIRECT_URI"]
    
    client = OAuth2::Client.new(client_id, client_secret, site: 'https://api.resourceguruapp.com')
    
    puts client.auth_code.authorize_url(redirect_uri: redirect_uri)
    

    Go to the URL provided to authorize with the API. This is the URL you'll direct users to to allow your app to access the API. When you've authorized with the API, the browser will be redirected to the redirect_uri you provided and the authorization code will be sent as a parameter in the URL. For example if your redirect_uri was https://localhost/oauth/callback, the user will be redirected to https://localhost/oauth/callback?code=<the code>

    Use this code to retrieve an access token and refresh token:

    code = "code sent to the redirect_uri in the previous step"
    access_token = client.auth_code.get_token(code, redirect_uri: redirect_uri)
    access_token.get("/v1/example-corp/resources")
    

    Save the values returned as access_token.token, access_token.refresh_token and access_token.expires_at for later usage.

    To connect to the API with a known token:

    client_id = ENV["CLIENT_ID"]
    client_secret = ENV["CLIENT_SECRET"]
    redirect_uri = ENV["REDIRECT_URI"]
    oauth_token = ENV["OAUTH_TOKEN"]
    refresh_token = ENV["REFRESH_TOKEN"]
    expires_at = ENV["EXPIRY"]
    
    client = OAuth2::Client.new(client_id, client_secret, site: 'https://api.resourceguruapp.com')
    access_token = OAuth2::AccessToken.new(client, oauth_token, refresh_token: refresh_token, expires_at: expires_at)
    access_token.get("/v1/example-corp/resources")
    

    In the above example using the token expiry time stamp is optional, but the OAuth2 library will automatically handle refreshing tokens if it is provided.

  4. Tokens expire after 7 days and need to be refreshed. When authenticating, a refresh token and expiration timestamp is provided. Use the refresh token to retrieve a new access token. Most OAuth2 client libraries will handle this automatically.

    client_id = ENV["CLIENT_ID"]
    client_secret = ENV["CLIENT_SECRET"]
    redirect_uri = ENV["REDIRECT_URI"]
    oauth_token = ENV["OAUTH_TOKEN"]
    refresh_token = ENV["REFRESH_TOKEN"]
    expires_at = ENV["EXPIRY"]
    
    client = OAuth2::Client.new(client_id, client_secret, site: 'https://api.resourceguruapp.com')
    access_token = OAuth2::AccessToken.new(client, oauth_token, refresh_token: refresh_token, expires_at: expires_at)
    new_access_token = access_token.refresh
    new_access_token.get("/v1/example-corp/bookings")
    

    The old access token will be expired immediately and the new access token will have to be used from that point on. Make sure you save the new access token, refresh token and expiration timestamps when doing this.

Examples

Python 3

from urllib.parse import urlencode
import json
import requests

client_id     = 'APPLICATION_CLIENT_ID'
client_secret = 'APPLICATION_SECRET'
redirect_uri  = 'REDIRECT_URI'
authorize_url = "https://api.resourceguruapp.com/oauth/authorize?client_id=%(client_id)s&redirect_uri=%(redirect_uri)s&response_type=code" % locals()

# Visit the Auth URL -> authorize_url defined above
# Get code token after authorizing
returned_code = input("Enter the code from the authorization step: ")

parameters = {
  'client_id': client_id,
  'client_secret': client_secret,
  'code': returned_code,
  'grant_type': "authorization_code",
  'redirect_uri': redirect_uri
}

token_url = 'https://api.resourceguruapp.com/oauth/token'
token     = requests.post(token_url, urlencode(parameters)).json()
headers   = { "Authorization": "Bearer " + token['access_token'] }

resources = requests.get("https://api.resourceguruapp.com/v1/example-account-id/resources", headers=headers).json()

# Now let's play in an interactive console
import code;code.interact(local=dict(globals(),**locals()))

Bash

#!/bin/bash

client_id='APPLICATION_CLIENT_ID'
client_secret='APPLICATION_SECRET'
redirect_uri='REDIRECT_URI'
authorize_url="https://api.resourceguruapp.com/oauth/authorize?client_id=$client_id&redirect_uri=$redirect_uri&response_type=code"
token_url='https://api.resourceguruapp.com/oauth/token'

echo "Please follow the given link: $authorize_url"
echo "Please provide the given code, followed by [ENTER]:"

read code

token_data=`curl --data "grant_type=authorization_code" --data-urlencode "client_id=$client_id" --data-urlencode "client_secret=$client_secret" --data-urlencode "code=$code" --data-urlencode "redirect_uri=$redirect_uri" $token_url`
token=`echo $token_data | jsawk 'return this.access_token'`

resources_url="https://api.resourceguruapp.com/v1/example-account-id/resources"

echo `curl -H "Authorization: Bearer $token" $resources_url`

Ruby

require "oauth2"

client_id = "APPLICATION_CLIENT_ID"
client_secret = "APPLICATION_SECRET"
redirect_uri = "REDIRECT_URI"

client = OAuth2::Client.new(client_id, client_secret, { site: { url: 'https://api.resourceguruapp.com'}})
authorize_url = client.auth_code.authorize_url(redirect_uri: redirect_uri)

# Visit the Auth URL -> authorize_url defined above to get the code
puts "Enter the code from the authorization step"
code = gets.strip

access_token = client.auth_code.get_token(code, redirect_uri: redirect_uri)

access_token.get("/v1/example-account-id/resources")

# Now let's play in an interactive console
require "IRB"
IRB.start

Data types

ISO8601 date format

The ISO8601 format is used for dates and times throughout the Resource Guru API.

An ISO8601 date string is formatted as YYYY-MM-DD. For example: 2020-01-31.

An ISO8601 date time string is formatted as YYYY-MM-DDTHH:mm:ssZ. For example: 2020-01-31T12:34:56Z

Day of week

Days of the week are represented as integers from 0-6.

API Day
0 Sunday
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday

Timezones

Timezone references in the Resource Guru API use the names of Rails ActiveSupport timezones.

Offset Name
(GMT-11:00) American Samoa
(GMT-11:00) International Date Line West
(GMT-11:00) Midway Island
(GMT-10:00) Hawaii
(GMT-09:00) Alaska
(GMT-08:00) Pacific Time (US & Canada)
(GMT-08:00) Tijuana
(GMT-07:00) Arizona
(GMT-07:00) Chihuahua
(GMT-07:00) Mazatlan
(GMT-07:00) Mountain Time (US & Canada)
(GMT-06:00) Central America
(GMT-06:00) Central Time (US & Canada)
(GMT-06:00) Guadalajara
(GMT-06:00) Mexico City
(GMT-06:00) Monterrey
(GMT-06:00) Saskatchewan
(GMT-05:00) Bogota
(GMT-05:00) Eastern Time (US & Canada)
(GMT-05:00) Indiana (East)
(GMT-05:00) Lima
(GMT-05:00) Quito
(GMT-04:30) Caracas
(GMT-04:00) Atlantic Time (Canada)
(GMT-04:00) Georgetown
(GMT-04:00) La Paz
(GMT-04:00) Santiago
(GMT-03:30) Newfoundland
(GMT-03:00) Brasilia
(GMT-03:00) Buenos Aires
(GMT-03:00) Greenland
(GMT-02:00) Mid-Atlantic
(GMT-01:00) Azores
(GMT-01:00) Cape Verde Is.
(GMT+00:00) Casablanca
(GMT+00:00) Dublin
(GMT+00:00) Edinburgh
(GMT+00:00) Lisbon
(GMT+00:00) London
(GMT+00:00) Monrovia
(GMT+00:00) UTC
(GMT+01:00) Amsterdam
(GMT+01:00) Belgrade
(GMT+01:00) Berlin
(GMT+01:00) Bern
(GMT+01:00) Bratislava
(GMT+01:00) Brussels
(GMT+01:00) Budapest
(GMT+01:00) Copenhagen
(GMT+01:00) Ljubljana
(GMT+01:00) Madrid
(GMT+01:00) Paris
(GMT+01:00) Prague
(GMT+01:00) Rome
(GMT+01:00) Sarajevo
(GMT+01:00) Skopje
(GMT+01:00) Stockholm
(GMT+01:00) Vienna
(GMT+01:00) Warsaw
(GMT+01:00) West Central Africa
(GMT+01:00) Zagreb
(GMT+02:00) Athens
(GMT+02:00) Bucharest
(GMT+02:00) Cairo
(GMT+02:00) Harare
(GMT+02:00) Helsinki
(GMT+02:00) Istanbul
(GMT+02:00) Jerusalem
(GMT+02:00) Kyiv
(GMT+02:00) Pretoria
(GMT+02:00) Riga
(GMT+02:00) Sofia
(GMT+02:00) Tallinn
(GMT+02:00) Vilnius
(GMT+03:00) Baghdad
(GMT+03:00) Kuwait
(GMT+03:00) Minsk
(GMT+03:00) Nairobi
(GMT+03:00) Riyadh
(GMT+03:30) Tehran
(GMT+04:00) Abu Dhabi
(GMT+04:00) Baku
(GMT+04:00) Moscow
(GMT+04:00) Muscat
(GMT+04:00) St. Petersburg
(GMT+04:00) Tbilisi
(GMT+04:00) Volgograd
(GMT+04:00) Yerevan
(GMT+04:30) Kabul
(GMT+05:00) Islamabad
(GMT+05:00) Karachi
(GMT+05:00) Tashkent
(GMT+05:30) Chennai
(GMT+05:30) Kolkata
(GMT+05:30) Mumbai
(GMT+05:30) New Delhi
(GMT+05:30) Sri Jayawardenepura
(GMT+05:45) Kathmandu
(GMT+06:00) Almaty
(GMT+06:00) Astana
(GMT+06:00) Dhaka
(GMT+06:00) Ekaterinburg
(GMT+06:30) Rangoon
(GMT+07:00) Bangkok
(GMT+07:00) Hanoi
(GMT+07:00) Jakarta
(GMT+07:00) Novosibirsk
(GMT+08:00) Beijing
(GMT+08:00) Chongqing
(GMT+08:00) Hong Kong
(GMT+08:00) Krasnoyarsk
(GMT+08:00) Kuala Lumpur
(GMT+08:00) Perth
(GMT+08:00) Singapore
(GMT+08:00) Taipei
(GMT+08:00) Ulaan Bataar
(GMT+08:00) Urumqi
(GMT+09:00) Irkutsk
(GMT+09:00) Osaka
(GMT+09:00) Sapporo
(GMT+09:00) Seoul
(GMT+09:00) Tokyo
(GMT+09:30) Adelaide
(GMT+09:30) Darwin
(GMT+10:00) Brisbane
(GMT+10:00) Canberra
(GMT+10:00) Guam
(GMT+10:00) Hobart
(GMT+10:00) Melbourne
(GMT+10:00) Port Moresby
(GMT+10:00) Sydney
(GMT+10:00) Yakutsk
(GMT+11:00) New Caledonia
(GMT+11:00) Vladivostok
(GMT+12:00) Auckland
(GMT+12:00) Fiji
(GMT+12:00) Kamchatka
(GMT+12:00) Magadan
(GMT+12:00) Marshall Is.
(GMT+12:00) Solomon Is.
(GMT+12:00) Wellington
(GMT+13:00) Nuku'alofa
(GMT+13:00) Samoa
(GMT+13:00) Tokelau Is.

Accounts

Operations for retrieving accounts.

Get account

Returns details for the specific account by its unique identifier.

path Parameters
id
required
integer >= 1
Example: 1

The unique identifier of the account.

Responses

Response samples

Content type
application/json
{}

Update account

Returns updated account.

path Parameters
id
required
integer >= 1
Example: 1

The unique identifier of the account.

Request Body schema: application/json

Update account with given data.

booking_approvals
required
boolean

Enable/Disable Approval Workflow

default_booking_approver_ids
required
Array of integers[ items >= 1 ]

Array of user ids for the default booking approvers.

apply_to_all_resources
required
boolean

Set default approvers on all resources.

Responses

Request samples

Content type
application/json
{
  • "booking_approvals": true,
  • "default_booking_approver_ids": [
    ],
  • "apply_to_all_resources": true
}

Response samples

Content type
application/json
{}

List accounts

Returns an array of active accounts and suspended accounts.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Activities

Operations for retrieving the activity log for an event.

List booking activities

Search activities for a specific booking.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the booking.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Bookings

Operations for creating, retrieving or modifying the bookings for an account.

List bookings

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
start_date
string <iso-date-string>
Example: start_date=2020-01-01

Include only bookings starting on or after this date.

end_date
string <iso-date-string>
Example: end_date=2021-12-31

Include only bookings ending on or before this date.

approval_states
Array of strings
Items Enum: "pending" "approved" "declined"
Example: approval_states=approved&approval_states=declined

Include only bookings having one of these states.

calendar
string
Enum: "0" "1"
Example: calendar=1

Include all related days for the booking that match our query.

resource_ids
Array of strings
Example: resource_ids=42&resource_ids=50

Include bookings only for these specified resources. Set this parameter multiple times to include bookings for more than one resource.

string or QueryEntityId (string)
Example: booker_id=me

Only return bookings that were booked by the given User ID. Return only my bookings when using the special value booker_id=me.

waiting
string
Default: "0"
Enum: "0" "1"
Example: waiting=1

If set to 1, only bookings that are currently on the waiting list are returned. If set to 0, all bookings are returned.

include_archived_resources
string
Default: "1"
Enum: "0" "1"
Example: include_archived_resources=1

If set to 1, bookings with archived resources will be included. If set to 0, bookings with archived resources are excluded.

include_deleted_resources
string
Default: "1"
Enum: "0" "1"
Example: include_deleted_resources=1

If set to 1, bookings with deleted resources will be included. If set to 0, bookings with deleted resources will be excluded.

include_non_bookable_resources
string
Default: "1"
Enum: "0" "1"
Example: include_non_bookable_resources=1

If set to 1, bookings for non-bookable resources will be included. If set to 0, bookings for non-bookable resources will be excluded.

group_id
string^\d+$
Example: group_id=1

Include only bookings that belong to the specified group_id

limit
string^\d+$
Default: null
Example: limit=50

The maximum number of results to return.

offset
string^\d+$
Default: "0"
Example: offset=10

The number of results to skip over. Useful for pagination.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create booking

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Request Body schema: application/json

The information for the new booking.

resource_id
integer >= 1

The unique identifier of the booked resource. Must supply either this or resource_ids

resource_ids
Array of integers non-empty [ items >= 1 ]

The unique identifier of all booked resources. Must supply either this or resource_id

start_date
required
string <iso-date-string>

First date of the booking.

end_date
required
string <iso-date-string>

Last date of the booking.

duration
required
integer [ 1 .. 1440 ]

The length of each booking in minutes

start_time
integer or null [ 0 .. 1440 ]

A time represented by the number of minutes elapsed since midnight

details
string <= 65535 characters
Default: ""

Extra details for the booking.

booker_id
integer >= 1

The unique identifier of the user that this event is booked by, defaults to the authenticated User.

billable
boolean
Default: false

Indicates whether this booking is billable or non-billable. If null, it defaults to the assigned project's billable setting, or false if no project is assigned.

project_id
integer or null >= 1
Default: null

Unique identifier of the Project this Booking is for. (Can be null)

client_id
integer or null >= 1
Default: null

Unique identifier of the Client this Booking is for. (Can be null)

allow_waiting
boolean
Deprecated
Default: false

If set to true, this booking will be added to the waiting list if there is insufficient availability. This will be removed in future versions. Use the clash_resolution field instead.

allow_overtime
boolean
Deprecated
Default: false

If set to true, this booking will add additional overtime to the resource if there is insufficient availability. This will be removed in future versions. Use the clash_resolution field instead.

(Weekly Recurrence (object or null)) or (Monthly Recurrence (object or null)) or (Yearly Recurrence (object or null))

A recurrence rule defines a rule or repeating pattern for recurring events

(string or null) or (string or null)
Default: null

Specified timezone for the booking, or null/empty string for the local resource's timezones

tentative
boolean

When true this is a tentative booking. Tentative bookings do not take up availability.

clash_resolution
string
Enum: "add_to_waiting_list" "book_with_overtime" "increase_availability"

How to resolve the booking clash if present. The option add_to_waiting_list moves the clashing booking to the waiting list. The option book_with_overtime adds additional overtime to the resource and increases availability to accommodate the booking. The option increase_availability only increases availability and does not add overtime to the resource.

Responses

Request samples

Content type
application/json
{
  • "resource_id": 1,
  • "resource_ids": [
    ],
  • "start_date": "2020-12-31",
  • "end_date": "2020-12-31",
  • "duration": 60,
  • "start_time": 540,
  • "details": "",
  • "booker_id": 1,
  • "billable": false,
  • "project_id": 1,
  • "client_id": 1,
  • "allow_waiting": false,
  • "allow_overtime": false,
  • "rrule": {
    },
  • "timezone": null,
  • "tentative": true,
  • "clash_resolution": "add_to_waiting_list"
}

Response samples

Content type
application/json
{
  • "id": 1,
  • "resource_id": 1,
  • "resource_ids": [
    ],
  • "booker": {
    },
  • "start_date": "2020-12-31",
  • "end_date": "2020-12-31",
  • "duration": 60,
  • "start_time": 540,
  • "durations": [
    ],
  • "details": "string",
  • "notes": "string",
  • "billable": true,
  • "project_id": 1,
  • "client_id": 1,
  • "refreshable": true,
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z",
  • "last_updated_by": 1,
  • "rrule": {
    },
  • "group_id": 1,
  • "sequence_no": 0,
  • "timezone": "UTC",
  • "tentative": true,
  • "approval_state": {
    },
  • "aggregated_approval_state": {
    }
}

Get booking

Returns a specific booking by its unique identifier.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the booking.

Responses

Response samples

Content type
application/json
{
  • "id": 1,
  • "resource_id": 1,
  • "resource_ids": [
    ],
  • "booker": {
    },
  • "start_date": "2020-12-31",
  • "end_date": "2020-12-31",
  • "duration": 60,
  • "start_time": 540,
  • "durations": [
    ],
  • "details": "string",
  • "notes": "string",
  • "billable": true,
  • "project_id": 1,
  • "client_id": 1,
  • "refreshable": true,
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z",
  • "last_updated_by": 1,
  • "rrule": {
    },
  • "group_id": 1,
  • "sequence_no": 0,
  • "timezone": "UTC",
  • "tentative": true,
  • "approval_state": {
    },
  • "aggregated_approval_state": {
    }
}

Update booking

Update a specific booking by its unique identifier.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the booking.

query Parameters
affects
string
Enum: "all" "following" "single"

Specify how the operation affects other occurrences of a repeat booking.

Request Body schema: application/json

The information to update in the existing booking.

resource_id
integer >= 1

The unique identifier of the booked resource.

resource_ids
Array of integers non-empty [ items >= 1 ]
start_date
string <iso-date-string>

First date of the booking.

end_date
string <iso-date-string>

Last date of the booking.

duration
integer [ 1 .. 1440 ]

The length of each booking in minutes

start_time
integer or null [ 0 .. 1440 ]

A time represented by the number of minutes elapsed since midnight

details
string <= 65535 characters

Extra details for the booking.

booker_id
integer >= 1

The unique identifier of the user who booked the resource.

billable
boolean

If true, then the booking is billable.

project_id
integer or null >= 1

Unique identifier of the Project this Booking is for. (Can be null)

client_id
integer or null >= 1

Unique identifier of the Client this Booking is for. (Can be null)

allow_waiting
boolean
Deprecated
Default: false

If set to true, this booking will be added to the waiting list if there is insufficient availability. This will be removed in future versions. Use the clash_resolution field instead.

allow_overtime
boolean
Deprecated
Default: false

If set to true, this booking will add additional overtime to the resource if there is insufficient availability. This will be removed in future versions. Use the clash_resolution field instead.

(Weekly Recurrence (object or null)) or (Monthly Recurrence (object or null)) or (Yearly Recurrence (object or null))

A recurrence rule defines a rule or repeating pattern for recurring events

(string or null) or (string or null)
Default: null

Specified timezone for the booking, or null/empty string for the local resource's timezones

tentative
boolean

When true this is a tentative booking. Tentative bookings do not take up availability.

clash_resolution
string
Enum: "add_to_waiting_list" "book_with_overtime" "increase_availability"

How to resolve the booking clash if present. The option add_to_waiting_list moves the clashing booking to the waiting list. The option book_with_overtime adds additional overtime to the resource and increases availability to accommodate the booking. The option increase_availability only increases availability and does not add overtime to the resource.

Responses

Request samples

Content type
application/json
{
  • "resource_id": 1,
  • "resource_ids": [
    ],
  • "start_date": "2020-12-31",
  • "end_date": "2020-12-31",
  • "duration": 60,
  • "start_time": 540,
  • "details": "string",
  • "booker_id": 1,
  • "billable": true,
  • "project_id": 1,
  • "client_id": 1,
  • "allow_waiting": false,
  • "allow_overtime": false,
  • "rrule": {
    },
  • "timezone": null,
  • "tentative": true,
  • "clash_resolution": "add_to_waiting_list"
}

Response samples

Content type
application/json
{
  • "id": 1,
  • "resource_id": 1,
  • "resource_ids": [
    ],
  • "booker": {
    },
  • "start_date": "2020-12-31",
  • "end_date": "2020-12-31",
  • "duration": 60,
  • "start_time": 540,
  • "durations": [
    ],
  • "details": "string",
  • "notes": "string",
  • "billable": true,
  • "project_id": 1,
  • "client_id": 1,
  • "refreshable": true,
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z",
  • "last_updated_by": 1,
  • "rrule": {
    },
  • "group_id": 1,
  • "sequence_no": 0,
  • "timezone": "UTC",
  • "tentative": true,
  • "approval_state": {
    },
  • "aggregated_approval_state": {
    }
}

Delete booking

Delete a specific booking by its unique identifier.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the booking.

query Parameters
affects
string
Enum: "all" "following" "single"

Specify how the operation affects other occurrences of a repeat booking.

Request Body schema: application/json

The information to update in the existing booking

date
string <iso-date-string>

The date to delete

remove_for_all
boolean

Delete the date for all resources on the booking

Responses

Request samples

Content type
application/json
{
  • "date": "2020-12-31",
  • "remove_for_all": true
}

Response samples

Content type
application/json
{
  • "errors": [
    ]
}

Split booking

Split a specific booking on a given date.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the booking.

Request Body schema: application/json

The information for splitting a booking

date
required
string <iso-date-string>

The date to split the booking on. The second half of the split will begin on this date.

Responses

Request samples

Content type
application/json
{
  • "date": "2020-12-31"
}

Response samples

Content type
application/json
[
  • {
    }
]

List client bookings

Search bookings for a specific client.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the client.

query Parameters
start_date
string <iso-date-string>
Example: start_date=2020-01-01

Include only bookings starting on or after this date.

end_date
string <iso-date-string>
Example: end_date=2021-12-31

Include only bookings ending on or before this date.

limit
string^\d+$
Default: null
Example: limit=50

The maximum number of results to return.

offset
string^\d+$
Default: "0"
Example: offset=10

The number of results to skip over. Useful for pagination.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List project bookings

Search bookings for a specific project.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the project.

query Parameters
start_date
string <iso-date-string>
Example: start_date=2020-01-01

Include only bookings starting on or after this date.

end_date
string <iso-date-string>
Example: end_date=2021-12-31

Include only bookings ending on or before this date.

limit
string^\d+$
Default: null
Example: limit=50

The maximum number of results to return.

offset
string^\d+$
Default: "0"
Example: offset=10

The number of results to skip over. Useful for pagination.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List resource bookings

Search bookings for a specific resource.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the resource.

query Parameters
approval_states
Array of strings
Items Enum: "pending" "approved" "declined"
Example: approval_states=approved&approval_states=declined

Include only bookings having one of these states.

start_date
string <iso-date-string>
Example: start_date=2020-01-01

Include only bookings starting on or after this date.

end_date
string <iso-date-string>
Example: end_date=2021-12-31

Include only bookings ending on or before this date.

limit
string^\d+$
Default: null
Example: limit=50

The maximum number of results to return.

offset
string^\d+$
Default: "0"
Example: offset=10

The number of results to skip over. Useful for pagination.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Approve/Decline a booking

Approve or decline a booking for the given resources.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the booking.

Request Body schema: application/json

The resolution information to update for given resources

resolution
required
string
Enum: "approved" "declined"

Chosen resolution.

resource_ids
required
Array of integers non-empty [ items >= 1 ]

Entity ids for which to apply given resolution.

reason
string or null <= 65535 characters

Decline reason.

Responses

Request samples

Content type
application/json
{
  • "resolution": "approved",
  • "resource_ids": [
    ],
  • "reason": "string"
}

Response samples

Content type
application/json
{
  • "errors": [
    ]
}

Remind approvers

Remind approvers that booking is in pending approval

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the booking.

Request Body schema: application/json

Resources ids for which to remind their approvers

object

Remind approvers that booking is in pending status.

Responses

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{
  • "errors": [
    ]
}

Clients

Operations for creating, retrieving or modifying the clients and associated entities for an account.

List active clients

Returns an array of active clients.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
limit
string^\d+$
Default: "50"
Example: limit=50

The maximum number of results to return. Use limit=0 to remove the limit.

offset
string^\d+$
Default: "0"
Example: offset=10

The number of results to skip over. Useful for pagination.

includeArchived
string
Default: "0"
Enum: "0" "1"

Whether to include archived clients. Limit and offset parameters are ignored when includeArchived is set.

includeDeleted
string
Default: "0"
Enum: "0" "1"

Whether to include deleted clients. Limit and offset parameters are ignored when includeDeleted is set.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create client

Create a new client

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Request Body schema: application/json

The information for the new client

color
string or null^#?[a-fA-F0-9]{6}$

A color encoded in a hex triplet (6 hexadecimal numbers)

name
required
string <= 255 characters

The client name.

notes
string or null <= 65535 characters

Notes on the client.

archived
boolean
Default: false

If true, marks the client as archived.

Responses

Request samples

Content type
application/json
{
  • "color": "c0ffee",
  • "name": "string",
  • "notes": "string",
  • "archived": false
}

Response samples

Content type
application/json
{
  • "id": 1,
  • "archived": true,
  • "color": "#c0ffee",
  • "name": "string",
  • "notes": "string",
  • "creator_id": 1,
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z",
  • "last_updated_by": 1,
  • "deleted": true,
  • "deleted_at": "2020-12-31"
}

List archived clients

Returns an array of archived clients

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
limit
string^\d+$
Default: "50"
Example: limit=50

The maximum number of results to return. Use limit=0 to remove the limit.

offset
string^\d+$
Default: "0"
Example: offset=10

The number of results to skip over. Useful for pagination.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get client

Returns a specific client

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the client.

Responses

Response samples

Content type
application/json
{
  • "id": 1,
  • "archived": true,
  • "color": "#c0ffee",
  • "name": "string",
  • "notes": "string",
  • "creator_id": 1,
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z",
  • "last_updated_by": 1,
  • "deleted": true,
  • "deleted_at": "2020-12-31"
}

Update client

Update a client

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the client.

Request Body schema: application/json

The information to update in the existing client

color
string or null^#?[a-fA-F0-9]{6}$

A color encoded in a hex triplet (6 hexadecimal numbers)

name
string <= 255 characters

The client name.

notes
string or null <= 65535 characters

Notes on the client.

archived
boolean

Omit to make no change. If true, marks the client as archived. If false, marks the client as unarchived.

Responses

Request samples

Content type
application/json
{
  • "color": "c0ffee",
  • "name": "string",
  • "notes": "string",
  • "archived": true
}

Response samples

Content type
application/json
{
  • "id": 1,
  • "archived": true,
  • "color": "#c0ffee",
  • "name": "string",
  • "notes": "string",
  • "creator_id": 1,
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z",
  • "last_updated_by": 1,
  • "deleted": true,
  • "deleted_at": "2020-12-31"
}

Delete client

Delete a client

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the client.

Responses

Response samples

Content type
application/json
{
  • "errors": [
    ]
}

Custom Availability

Operations for setting exceptions to normal availability for a resource.

List custom availability

Get custom availability for all resources or a subset of resources.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
resource_ids[]
Array of strings
Example: resource_ids[]=42&resource_ids[]=50

Include custom availability only for these specified resources. Set this parameter multiple times to include custom availability for more than one resource.

start_date
string <iso-date-string>
Example: start_date=2020-12-31

The start of the date range we want to grab custom availability for. If not set it defaults to 1 year in the past.

end_date
string <iso-date-string>
Example: end_date=2020-12-31

The end of the date range we want to grab custom availability for. If not set it defaults to 1 year in the future.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Set custom availability

Set custom availability for a resource

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Request Body schema: application/json

An object containing the information needed to create the custom availability.

required
object
allow_waiting
boolean
Default: false

Whether we should move any bookings that no longer fit the resource due to the change to availability to the waiting list

delete_invalid_bookings
boolean
Default: false

Whether we should delete any bookings that no longer fit the resource due to the change to availability

Responses

Request samples

Content type
application/json
{
  • "custom_available_periods": {
    },
  • "allow_waiting": false,
  • "delete_invalid_bookings": false
}

Response samples

Content type
application/json
{
  • "errors": { },
  • "custom_available_periods": [
    ]
}

Reset custom availability

Resets the custom availability for a resource on the specified date range.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Request Body schema: application/json

The resource and date range that we want to reset to normal availability, along with the update strategy to use for any bookings that are no longer valid due to the change of availability.

resource_instance_id
required
integer >= 1

The unique identifier of the resource this custom availability period is for

dates
required
Array of strings <iso-date-string>

The dates that we want to remove custom availability for

allow_waiting
boolean
Default: false

Whether we should move any bookings that no longer fit the resource due to the change to availability to the waiting list

delete_invalid_bookings
boolean
Default: false

Whether we should delete any bookings that no longer fit the resource due to the change to availability

Responses

Request samples

Content type
application/json
{
  • "resource_instance_id": 1,
  • "dates": [
    ],
  • "allow_waiting": false,
  • "delete_invalid_bookings": false
}

Response samples

Content type
application/json
{
  • "clashes": [
    ],
  • "allowClashResolution": true
}

Custom Fields

Operations for creating, retrieving or modifying the custom fields and associated entities for an account.

List custom fields

Returns an array of custom fields.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create custom field

Creates a new custom field.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Request Body schema: application/json

The information for the new custom field.

label
required
string [ 1 .. 255 ] characters

The label shown in the UI. This must be unique.

required
boolean

If true, then this custom field is required during creation.

type
string
Default: "multi_select"
Enum: "single_select" "multi_select" "text"

The type of the custom field. Text fields can not be created when this field applies to resources.

entity_types
Array of strings[ items non-empty ]
Items Enum: "resource" "booking"

The type of entities which the custom field can be applied to.

resource_type_ids
Array of integers[ items >= 1 ]

An array of resource types associated with the custom field if applicable to resources. Set this to an empty array to remove the custom field from all resource types. If not set, this will default to the human resource type.

icon
string
Enum: "percent" "clipboard" "id"

The name of the icon to display next to the custom field.

custom_field_options
Array of strings non-empty [ items [ 1 .. 255 ] characters ]

A list of custom field options. This can be provided when the custom field type is single_select or multi_select.

Responses

Request samples

Content type
application/json
{
  • "label": "string",
  • "required": true,
  • "type": "single_select",
  • "entity_types": [
    ],
  • "resource_type_ids": [
    ],
  • "icon": "percent",
  • "custom_field_options": [
    ]
}

Response samples

Content type
application/json
{
  • "id": 1,
  • "label": "string",
  • "required": true,
  • "type": "single_select",
  • "entity_types": [
    ],
  • "resource_type_ids": [
    ],
  • "default": true,
  • "icon": "percent",
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z"
}

Get custom field

Returns a specific custom field.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the custom field.

Responses

Response samples

Content type
application/json
{
  • "id": 1,
  • "label": "string",
  • "required": true,
  • "type": "single_select",
  • "entity_types": [
    ],
  • "resource_type_ids": [
    ],
  • "default": true,
  • "icon": "percent",
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z"
}

Update custom field

Updates a specific custom field.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the custom field.

Request Body schema: application/json

The information to update on the custom field.

label
string [ 1 .. 255 ] characters

The label shown in the UI. This must be unique.

required
boolean

If true, then this custom field is required during creation.

entity_types
Array of strings[ items non-empty ]
Items Enum: "resource" "booking"

The type of entities which the custom field can be applied to.

resource_type_ids
Array of integers[ items >= 1 ]

An array of resource types associated with the custom field if applicable to resources. Set this to an empty array to remove the custom field from all resource types.

icon
string
Enum: "percent" "clipboard" "id"

The name of the icon to display next to the custom field.

Responses

Request samples

Content type
application/json
{
  • "label": "string",
  • "required": true,
  • "entity_types": [
    ],
  • "resource_type_ids": [
    ],
  • "icon": "percent"
}

Response samples

Content type
application/json
{
  • "id": 1,
  • "label": "string",
  • "required": true,
  • "type": "single_select",
  • "entity_types": [
    ],
  • "resource_type_ids": [
    ],
  • "default": true,
  • "icon": "percent",
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z"
}

Delete custom field

Delete a custom field.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the custom field.

Responses

Response samples

Content type
application/json
{
  • "errors": [
    ]
}

List custom field options

Returns an array of custom field options.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
custom_field_id
string^[1-9]\d*$
Example: custom_field_id=42

Only return Custom Field Options that are for the Custom Field with this ID.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create custom field option

Creates a new custom field option.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Request Body schema: application/json

The information for the new custom field option.

custom_field_id
required
integer >= 1

The unique identifier of the custom field that this option is for.

value
required
string [ 1 .. 255 ] characters

The value for this option.

Responses

Request samples

Content type
application/json
{
  • "custom_field_id": 1,
  • "value": "string"
}

Response samples

Content type
application/json
{
  • "id": 1,
  • "custom_field_id": 1,
  • "value": "string",
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z"
}

Get custom field option

Returns a specific custom field option.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the custom field option.

Responses

Response samples

Content type
application/json
{
  • "id": 1,
  • "custom_field_id": 1,
  • "value": "string",
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z"
}

Update custom field option

Updates a specific custom field option.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the custom field option.

Request Body schema: application/json

The information to update on the custom field option.

value
string [ 1 .. 255 ] characters

The value for this option.

Responses

Request samples

Content type
application/json
{
  • "value": "string"
}

Response samples

Content type
application/json
{
  • "id": 1,
  • "custom_field_id": 1,
  • "value": "string",
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z"
}

Delete custom field option

Delete a custom field option.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the custom field option.

Responses

Response samples

Content type
application/json
{
  • "errors": [
    ]
}

Downtimes

Operations for creating, retrieving or modifying the downtime events for an account.

List downtimes

Search for downtime events.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
resource_ids
Array of strings
Example: resource_ids=42

Include downtime events only for the specified resources.

booker_id
string^[1-9]\d*$
Example: booker_id=42

Include only downtime events having the specified booker id.

from
string <iso-date-string>
Example: from=2020-01-01

Include only downtime events starting on or after this date.

to
string <iso-date-string>
Example: to=2020-01-01

Include only downtime events ending on or before this date.

include_archived_resources
string
Default: "1"
Enum: "0" "1"
Example: include_archived_resources=0

If set to 1, downtimes with archived resources will be included. If set to 0, downtimes with archived resources will be excluded.

include_deleted_resources
string
Default: "1"
Enum: "0" "1"
Example: include_deleted_resources=0

If set to 1, downtimes with deleted resources will be included. If set to 0, downtimes with deleted resources will be excluded.

limit
string^\d+$
Default: null
Example: limit=50

The maximum number of results to return.

offset
string^\d+$
Default: "0"
Example: offset=10

The number of results to skip over. Useful for pagination.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create downtime

Create a new downtime event.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Request Body schema: application/json

The information for the new downtime event.

delete_invalid_bookings
boolean
Deprecated
Default: false

If true, any bookings that clash with the downtime will be deleted. This will be removed in future versions. Use the clash_resolution field instead.

block_by_clashes
boolean
Default: false

If true, the operation will fail and the server will respond 400 if any bookings clash with the downtime. If false, clashing bookings will move to the waiting list. Set delete_invalid_bookings: true to delete clashes.

from
required
string <iso-date-string>

The start date for the downtime event.

to
required
string <iso-date-string>

End date for the downtime event.

start_time
required
integer [ 0 .. 1440 ]

The start time of the downtime event represented by the number of minutes since midnight.

end_time
required
integer [ 0 .. 1440 ]

The end time of the downtime event represented by the number of minutes since midnight.

timezone
string or null

Specified timezone for the downtime event, or null for the assigned resources' local timezone.

downtime_type_id
integer or null >= 1

The unique identifier of the downtime type of this downtime event.

details
string <= 65535 characters
Default: null

Extra details about this downtime event.

booker_id
integer >= 1

The unique identifier of the user that this downtime event is booked by, defaults to the authenticated User.

creator_id
integer >= 1
Deprecated

Deprecated: use booker_id. The unique identifier of the user that this downtime event is booked by, defaults to the authenticated User.

resource_ids
required
Array of integers non-empty [ items >= 1 ]

Unique identifiers of the resources this downtime event is booked for.

allow_waiting
boolean
Deprecated
Default: true

If true, move any conflicting bookings to the waiting list. This is the default behaviour unless overridden by block_by_clashes or delete_invalid_bookings. This will be removed in future versions. Use the clash_resolution field instead.

clash_resolution
string
Enum: "add_to_waiting_list" "delete"

How to resolve the booking clash if present. The option add_to_waiting_list moves the clashing booking to the waiting list. The option delete deletes the clashing bookings.

Responses

Request samples

Content type
application/json
{
  • "delete_invalid_bookings": false,
  • "block_by_clashes": false,
  • "from": "2020-12-31",
  • "to": "2020-12-31",
  • "start_time": 540,
  • "end_time": 600,
  • "timezone": "UTC",
  • "downtime_type_id": 1,
  • "details": null,
  • "booker_id": 1,
  • "creator_id": 1,
  • "resource_ids": [
    ],
  • "allow_waiting": true,
  • "clash_resolution": "add_to_waiting_list"
}

Response samples

Content type
application/json
{
  • "id": 1,
  • "details": "string",
  • "from": "2020-12-31",
  • "to": "2020-12-31",
  • "start_time": 540,
  • "end_time": 600,
  • "timezone": "UTC",
  • "downtime_type_id": 1,
  • "booker_id": 1,
  • "creator_id": 1,
  • "resource_ids": [
    ],
  • "account_id": 1,
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z",
  • "last_updated_by": 1,
  • "leave": "string",
  • "state": "string",
  • "deleted": false
}

List downtime clashes

Gets a list of clashing booking durations for resources in a time range. This can be used to determine whether creating a downtime will result in changes to schedule bookings.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Request Body schema: application/json

The search criteria.

from
required
string <iso-date-string>

The start date for the downtime event.

to
required
string <iso-date-string>

End date for the downtime event.

start_time
required
integer [ 0 .. 1440 ]

The start time of the downtime event represented by the number of minutes since midnight.

end_time
required
integer [ 0 .. 1440 ]

The end time of the downtime event represented by the number of minutes since midnight.

resource_ids
required
Array of integers non-empty [ items >= 1 ]

Unique identifiers of the resources this downtime event is booked for.

timezone
string or null
Default: null

Specified timezone for the downtime event, or null for the assigned resources' local timezone.

Responses

Request samples

Content type
application/json
{
  • "from": "2020-12-31",
  • "to": "2020-12-31",
  • "start_time": 540,
  • "end_time": 600,
  • "resource_ids": [
    ],
  • "timezone": "UTC"
}

Response samples

Content type
application/json
[
  • {
    }
]

Get downtime

Get a downtime event by its unique identifier.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the downtime.

Responses

Response samples

Content type
application/json
{
  • "id": 1,
  • "details": "string",
  • "from": "2020-12-31",
  • "to": "2020-12-31",
  • "start_time": 540,
  • "end_time": 600,
  • "timezone": "UTC",
  • "downtime_type_id": 1,
  • "booker_id": 1,
  • "creator_id": 1,
  • "resource_ids": [
    ],
  • "account_id": 1,
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z",
  • "last_updated_by": 1,
  • "leave": "string",
  • "state": "string",
  • "deleted": false
}

Update downtime

Update a downtime event.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the downtime.

Request Body schema: application/json

The information to update in the existing downtime.

delete_invalid_bookings
boolean
Deprecated
Default: false

If true, any bookings that clash with the downtime will be deleted. This will be removed in future versions. Use the clash_resolution field instead.

block_by_clashes
boolean
Default: false

If true, the operation will fail and the server will respond 400 if any bookings clash with the downtime. If false, clashing bookings will move to the waiting list. Set delete_invalid_bookings: true to delete clashes.

from
string <iso-date-string>

The start date for the downtime event.

to
string <iso-date-string>

End date for the downtime event.

start_time
integer [ 0 .. 1440 ]

The start time of the downtime event represented by the number of minutes since midnight.

end_time
integer [ 0 .. 1440 ]

The end time of the downtime event represented by the number of minutes since midnight.

timezone
string or null

Specified timezone for the downtime event, or null for the assigned resources' local timezone.

downtime_type_id
integer or null >= 1

The unique identifier of the downtime type of this downtime event.

details
string <= 65535 characters

Extra details about this downtime event.

booker_id
integer >= 1

The unique identifier of the user that this downtime event is booked by.

resource_ids
Array of integers non-empty [ items >= 1 ]

Unique identifiers of the resources this downtime event is booked for.

allow_waiting
boolean
Deprecated
Default: true

If true, move any conflicting bookings to the waiting list. This is the default behaviour unless overridden by block_by_clashes or delete_invalid_bookings. This will be removed in future versions. Use the clash_resolution field instead.

clash_resolution
string
Enum: "add_to_waiting_list" "delete"

How to resolve the booking clash if present. The option add_to_waiting_list moves the clashing booking to the waiting list. The option delete deletes the clashing bookings.

Responses

Request samples

Content type
application/json
{
  • "delete_invalid_bookings": false,
  • "block_by_clashes": false,
  • "from": "2020-12-31",
  • "to": "2020-12-31",
  • "start_time": 540,
  • "end_time": 600,
  • "timezone": "UTC",
  • "downtime_type_id": 1,
  • "details": "string",
  • "booker_id": 1,
  • "resource_ids": [
    ],
  • "allow_waiting": true,
  • "clash_resolution": "add_to_waiting_list"
}

Response samples

Content type
application/json
{
  • "id": 1,
  • "details": "string",
  • "from": "2020-12-31",
  • "to": "2020-12-31",
  • "start_time": 540,
  • "end_time": 600,
  • "timezone": "UTC",
  • "downtime_type_id": 1,
  • "booker_id": 1,
  • "creator_id": 1,
  • "resource_ids": [
    ],
  • "account_id": 1,
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z",
  • "last_updated_by": 1,
  • "leave": "string",
  • "state": "string",
  • "deleted": false
}

Delete downtime

Delete a downtime event.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the downtime.

Responses

Response samples

Content type
application/json
{
  • "errors": [
    ]
}

Split downtime

Splits a downtime event (not a valid operation for Holiday/Vacation).

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the downtime.

Request Body schema: application/json

The date to split the downtime event

date
required
string <iso-date-string>

The date to split the downtime on. The split will occur at midnight at the start of this date.

resource_id
integer >= 1

An optional resource id to determine the date boundary to split on when timezones are involved

Responses

Request samples

Content type
application/json
{
  • "date": "2020-12-31",
  • "resource_id": 1
}

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

List downtime types

Retrieve the list of downtime event types.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Overtime

Operations for setting overtime on a resource

Set overtime

Set the overtime for a resource on a specified date

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Request Body schema: application/json

The information for the overtime

resource_id
required
integer >= 1

The unique identifier of the resource this overtime record is for

date
required
string <iso-date-string>

The date that this overtime is recorded for

duration
required
integer [ 1 .. 1440 ]

The duration of overtime

Responses

Request samples

Content type
application/json
{
  • "resource_id": 1,
  • "date": "2020-12-31",
  • "duration": 60
}

Response samples

Content type
application/json
{
  • "errors": [
    ]
}

Projects

Operations for creating, retrieving or modifying the projects and associated entities for an account.

List active projects

Returns an array of active projects.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
limit
string^\d+$
Default: "50"
Example: limit=50

The maximum number of results to return. Use limit=0 to remove the limit.

offset
string^\d+$
Default: "0"
Example: offset=10

The number of results to skip over. Useful for pagination.

includeArchived
string
Default: "0"
Enum: "0" "1"

Send includeArchived=1 to include archived projects. Limit and offset parameters are ignored when includeArchived is set.

includeDeleted
string
Default: "0"
Enum: "0" "1"

Send includeDeleted=1 to include deleted projects. Limit and offset parameters are ignored when includeDeleted is set.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create project

Create a new project.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Request Body schema: application/json

The information for the new project.

color
string or null^#?[a-fA-F0-9]{6}$

A color encoded in a hex triplet (6 hexadecimal numbers)

name
required
string <= 255 characters

The project name.

project_code
string <= 255 characters

The project code.

client_id
integer or null >= 1
comment: Returned by create but not by get

The unique identifier of the client.

notes
string <= 65535 characters

Notes on the project.

default_billable
boolean

If true then bookings for this project will default to billable. Otherwise bookings will default to non-billable.

archived
boolean
Default: false

If true, marks the project as archived.

Responses

Request samples

Content type
application/json
{
  • "color": "c0ffee",
  • "name": "string",
  • "project_code": "WX13",
  • "client_id": 1,
  • "notes": "string",
  • "default_billable": true,
  • "archived": false
}

Response samples

Content type
application/json
{}

List archived projects

Returns an array of archived projects.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
limit
string^\d+$
Default: "50"
Example: limit=50

The maximum number of results to return. Use limit=0 to remove the limit.

offset
string^\d+$
Default: "0"
Example: offset=10

The number of results to skip over. Useful for pagination.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get project

Returns a specific project.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the project.

Responses

Response samples

Content type
application/json
{}

Update project

Update a project.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the project.

Request Body schema: application/json

The information to update in the existing project

color
string or null^#?[a-fA-F0-9]{6}$

A color encoded in a hex triplet (6 hexadecimal numbers)

name
string <= 255 characters

The project name.

project_code
string <= 255 characters

The project code.

client_id
integer or null >= 1
comment: Returned by create but not by get

The unique identifier of the client.

notes
string <= 65535 characters

Notes on the project.

default_billable
boolean

If true then bookings for this project will default to billable. Otherwise bookings will default to non-billable.

archived
boolean

Omit to make no change. If true, marks the project as archived. If false, marks the project as unarchived.

Responses

Request samples

Content type
application/json
{
  • "color": "c0ffee",
  • "name": "string",
  • "project_code": "WX13",
  • "client_id": 1,
  • "notes": "string",
  • "default_billable": true,
  • "archived": true
}

Response samples

Content type
application/json
{}

Delete project

Delete a project.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the project.

Responses

Response samples

Content type
application/json
{
  • "errors": [
    ]
}

Reports – v1 (deprecated)

Operations for retrieving reporting information.

Get report of projects

Gets a report for all projects in the date range.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
start_date
required
string <iso-date-string>
Example: start_date=2020-12-31

The beginning of the date range to report on.

end_date
required
string <iso-date-string>
Example: end_date=2020-12-31

The end of the date range to report on.

Responses

Response samples

Content type
application/json
{}

Get report of a project

Gets a report for the specified project in the date range.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

required
EntityId (integer) or integer

The unique identifier of the entity we would like to report on, or 0 for a report on all bookings not associated to an entity.

query Parameters
start_date
required
string <iso-date-string>
Example: start_date=2020-12-31

The beginning of the date range to report on.

end_date
required
string <iso-date-string>
Example: end_date=2020-12-31

The end of the date range to report on.

Responses

Response samples

Content type
application/json
{}

Get report of clients

Gets a report for all clients in the date range.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
start_date
required
string <iso-date-string>
Example: start_date=2020-12-31

The beginning of the date range to report on.

end_date
required
string <iso-date-string>
Example: end_date=2020-12-31

The end of the date range to report on.

Responses

Response samples

Content type
application/json
{}

Get report of a client

Gets a report for the specified client in the date range.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

required
EntityId (integer) or integer

The unique identifier of the entity we would like to report on, or 0 for a report on all bookings not associated to an entity.

query Parameters
start_date
required
string <iso-date-string>
Example: start_date=2020-12-31

The beginning of the date range to report on.

end_date
required
string <iso-date-string>
Example: end_date=2020-12-31

The end of the date range to report on.

Responses

Response samples

Content type
application/json
{}

Get report of resources

Gets a report for all resources in the date range.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
start_date
required
string <iso-date-string>
Example: start_date=2020-12-31

The beginning of the date range to report on.

end_date
required
string <iso-date-string>
Example: end_date=2020-12-31

The end of the date range to report on.

Responses

Response samples

Content type
application/json
{
  • "availability": 24000,
  • "booked": 19200,
  • "resources": [
    ],
  • "unbooked": 30,
  • "utilization": 0.8,
  • "waiting_list": 30
}

Get report of a resource

Gets a report for a specific resource in the date range.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the resource.

query Parameters
start_date
required
string <iso-date-string>
Example: start_date=2020-12-31

The beginning of the date range to report on.

end_date
required
string <iso-date-string>
Example: end_date=2020-12-31

The end of the date range to report on.

Responses

Response samples

Content type
application/json
{
  • "availability": 24000,
  • "booked": 19200,
  • "clients": [
    ],
  • "custom_fields": {
    },
  • "downtime_types": [
    ],
  • "earliest_available_period": "string",
  • "id": 1,
  • "job_title": "General Manager",
  • "name": "John Doe",
  • "other_downtime": 0,
  • "other_downtime_days": 0,
  • "personal_vacation_downtime": 0,
  • "personal_vacation_downtime_days": 0,
  • "projects": [],
  • "public_holiday_downtime": 0,
  • "public_holiday_downtime_days": 0,
  • "resource_type": "string",
  • "sick_downtime": 0,
  • "sick_downtime_days": 0,
  • "total_vacation_downtime": 0,
  • "total_vacation_downtime_days": 0,
  • "unbooked": 0,
  • "utilization": 0.8,
  • "waiting_list": 0
}

Reports – v2

Operations for retrieving reporting information.

Get report of resources

Gets a report for all resources in the date range.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
start_date
required
string <iso-date-string>
Example: start_date=2020-12-31

The beginning of the date range to report on.

end_date
required
string <iso-date-string>
Example: end_date=2020-12-31

The end of the date range to report on.

Responses

Response samples

Content type
application/json
{
  • "approvals": {
    },
  • "availability": {
    },
  • "downtime": {
    },
  • "overtime": {
    },
  • "resources": [
    ],
  • "scheduled": {
    },
  • "unscheduled": {
    },
  • "tentative": {
    },
  • "utilization": {
    },
  • "waiting_list": {
    }
}

Get report of a resource

Gets a report for a single resource in the date range.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the resource.

query Parameters
start_date
required
string <iso-date-string>
Example: start_date=2020-12-31

The beginning of the date range to report on.

end_date
required
string <iso-date-string>
Example: end_date=2020-12-31

The end of the date range to report on.

Responses

Response samples

Content type
application/json
{
  • "id": 1,
  • "name": "John Doe",
  • "color": "#c0ffee",
  • "job_title": "General Manager",
  • "reported_date_range": {
    },
  • "resource_type": {
    },
  • "approvals": {
    },
  • "scheduled": {
    },
  • "waiting_list": {
    },
  • "tentative": {
    },
  • "availability": {
    },
  • "custom_fields": [
    ],
  • "downtime": {
    },
  • "overtime": {
    },
  • "unscheduled": {
    },
  • "utilization": {
    },
  • "clients": [
    ],
  • "clients_unassigned": {
    },
  • "downtime_types": [
    ],
  • "projects": [
    ],
  • "projects_unassigned": {
    }
}

Get report of clients

Gets a report for all clients in the date range.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
start_date
required
string <iso-date-string>
Example: start_date=2020-12-31

The beginning of the date range to report on.

end_date
required
string <iso-date-string>
Example: end_date=2020-12-31

The end of the date range to report on.

Responses

Response samples

Content type
application/json
{
  • "clients": [
    ],
  • "unassigned": {
    },
  • "approvals": {
    },
  • "scheduled": {
    },
  • "waiting_list": {
    },
  • "tentative": {
    }
}

Get report of a client

Gets a report for a single client in the date range.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the client.

query Parameters
start_date
required
string <iso-date-string>
Example: start_date=2020-12-31

The beginning of the date range to report on.

end_date
required
string <iso-date-string>
Example: end_date=2020-12-31

The end of the date range to report on.

Responses

Response samples

Content type
application/json
{
  • "color": "#c0ffee",
  • "id": 1,
  • "name": "string",
  • "approvals": {
    },
  • "scheduled": {
    },
  • "waiting_list": {
    },
  • "tentative": {
    },
  • "resources": [
    ]
}

Get report of bookings with no clients

Gets a report on bookings not assigned to a client in the date range.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
start_date
required
string <iso-date-string>
Example: start_date=2020-12-31

The beginning of the date range to report on.

end_date
required
string <iso-date-string>
Example: end_date=2020-12-31

The end of the date range to report on.

Responses

Response samples

Content type
application/json
{
  • "resources": [
    ],
  • "scheduled": {
    },
  • "waiting_list": {
    },
  • "tentative": {
    }
}

Get report of projects

Gets a report for all projects in the date range.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
start_date
required
string <iso-date-string>
Example: start_date=2020-12-31

The beginning of the date range to report on.

end_date
required
string <iso-date-string>
Example: end_date=2020-12-31

The end of the date range to report on.

Responses

Response samples

Content type
application/json
{
  • "projects": [
    ],
  • "unassigned": {
    },
  • "approvals": {
    },
  • "scheduled": {
    },
  • "waiting_list": {
    },
  • "tentative": {
    }
}

Get report of a project

Gets a report for a single project in the date range.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the project.

query Parameters
start_date
required
string <iso-date-string>
Example: start_date=2020-12-31

The beginning of the date range to report on.

end_date
required
string <iso-date-string>
Example: end_date=2020-12-31

The end of the date range to report on.

Responses

Response samples

Content type
application/json
{
  • "client": {
    },
  • "color": "#c0ffee",
  • "id": 1,
  • "name": "string",
  • "project_code": "WX13",
  • "approvals": {
    },
  • "scheduled": {
    },
  • "waiting_list": {
    },
  • "tentative": {
    },
  • "resources": [
    ]
}

Get report of bookings with no project

Gets a report on bookings not assigned to a project in the date range.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
start_date
required
string <iso-date-string>
Example: start_date=2020-12-31

The beginning of the date range to report on.

end_date
required
string <iso-date-string>
Example: end_date=2020-12-31

The end of the date range to report on.

Responses

Response samples

Content type
application/json
{
  • "resources": [
    ],
  • "scheduled": {
    },
  • "waiting_list": {
    },
  • "tentative": {
    }
}

Resources

Operations for creating, retrieving or modifying the resources and associated entities for an account

List active resources

Returns an array of active resources

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
limit
string^\d+$
Default: "50"
Example: limit=50

The maximum number of results to return. Use limit=0 to remove the limit.

offset
string^\d+$
Default: "0"
Example: offset=10

The number of results to skip over. Useful for pagination.

detail
string
Enum: "0" "1"

Whether to include extra information about the resource.

ids
Array of integers[ items >= 1 ]
Example: ids=1

Return only the resources specified in this array

show_availability
string
Default: "1"
Enum: "0" "1"

Whether to include custom available periods.

Responses

Response samples

Content type
application/json
Example
[ ]

Create resource

Create a new resource. The availability will be created with the default availability settings set within the app

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Request Body schema: application/json

The information for the new resource

color
string or null^#?[a-fA-F0-9]{6}$

A color encoded in a hex triplet (6 hexadecimal numbers)

name
string <= 255 characters

The name of this resource. For humans, use first and last name instead. Required for other types of resources

timezone
string

A timezone (based off of Ruby on Rails's ActiveSupport::TimeZone key mappings). See Timezones for a list of valid timezones.

job_title
string or null <= 255 characters

Job title of this Resource. Only applicable to Resources linked to User Accounts.

phone
string or null <= 255 characters

The phone number of this resource (human resources only).

bookable
boolean

Indicates whether this resource is bookable.

notes
string <= 65535 characters

Notes on the resource.

first_name
string <= 255 characters

The first name of a human resource

last_name
string <= 255 characters

The last name of a human resource

capacity
string or null^\d*$

The capacity of a 'Meeting room' resource.

registration_number
string or null <= 255 characters

The registration number of a 'Vehicle' resource.

custom_field_option_ids
Array of integers[ items >= 1 ]

The custom fields selected for the resource

invite
string or null
Enum: "true" "false"

If true and if the resource email is valid, send an invitation email to this resource

email
string <= 255 characters
resource_type_id
required
integer >= 1

The unique identifier of the resource type.

booking_approver_ids
Array of integers[ items >= 1 ]

List of user ids that can approve this resource bookings.

Responses

Request samples

Content type
application/json
{
  • "color": "c0ffee",
  • "name": "John Doe",
  • "timezone": "UTC",
  • "job_title": "General Manager",
  • "phone": "string",
  • "bookable": true,
  • "notes": "string",
  • "first_name": "string",
  • "last_name": "string",
  • "capacity": "42",
  • "registration_number": "string",
  • "custom_field_option_ids": [
    ],
  • "invite": "true",
  • "email": "email@resourceguruapp.com",
  • "resource_type_id": 1,
  • "booking_approver_ids": [
    ]
}

Response samples

Content type
application/json
{}

List archived resources

Returns an array of archived resources

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
limit
string^\d+$
Default: "50"
Example: limit=50

The maximum number of results to return. Use limit=0 to remove the limit.

offset
string^\d+$
Default: "0"
Example: offset=10

The number of results to skip over. Useful for pagination.

detail
string
Enum: "0" "1"

Whether to include extra information about the resource.

ids
Array of integers[ items >= 1 ]
Example: ids=1

Return only the resources specified in this array

show_availability
string
Default: "1"
Enum: "0" "1"

Whether to include custom available periods.

Responses

Response samples

Content type
application/json
Example
[ ]

Get resource

Returns details of a specific resource

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the resource.

Responses

Response samples

Content type
application/json
{}

Update resource

Update a resource

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the resource.

Request Body schema: application/json

The information to update in the existing resource

archived
boolean

If true, then this resource is archived.

color
string or null^#?[a-fA-F0-9]{6}$

A color encoded in a hex triplet (6 hexadecimal numbers)

name
string <= 255 characters

The name of this resource. For humans, use first and last name instead. Required for other types of resources

timezone
string

A timezone (based off of Ruby on Rails's ActiveSupport::TimeZone key mappings). See Timezones for a list of valid timezones.

job_title
string or null <= 255 characters

Job title of this Resource. Only applicable to Resources linked to User Accounts.

phone
string or null <= 255 characters

The phone number of this resource (human resources only).

bookable
boolean

Indicates whether this resource is bookable.

notes
string <= 65535 characters

Notes on the resource.

first_name
string <= 255 characters

The first name of a human resource

last_name
string <= 255 characters

The last name of a human resource

capacity
string or null^\d*$

The capacity of a 'Meeting room' resource.

registration_number
string or null <= 255 characters

The registration number of a 'Vehicle' resource.

custom_field_option_ids
Array of integers[ items >= 1 ]

The custom fields selected for the resource

booking_approver_ids
Array of integers[ items >= 1 ]

List of user ids that can approve this resource bookings.

replacement_approver_user_id
integer >= 1

ID of an active user that will be used for replacement. Mandatory if one of the affected entities is the sole approver of at least one resource

Responses

Request samples

Content type
application/json
{
  • "archived": true,
  • "color": "c0ffee",
  • "name": "John Doe",
  • "timezone": "UTC",
  • "job_title": "General Manager",
  • "phone": "string",
  • "bookable": true,
  • "notes": "string",
  • "first_name": "string",
  • "last_name": "string",
  • "capacity": "42",
  • "registration_number": "string",
  • "custom_field_option_ids": [
    ],
  • "booking_approver_ids": [
    ],
  • "replacement_approver_user_id": 1
}

Response samples

Content type
application/json
{}

Delete resource

Delete a resource. Any future bookings where the resource is the booker will be transferred to the authenticated user. And any future bookings where the resource has been booked as the resource will be deleted.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the resource.

Request Body schema: application/json

Optional request body

replacement_approver_user_id
integer >= 1

ID of an active user that will be used for replacement. Mandatory if one of the affected entities is the sole approver of at least one resource

Responses

Request samples

Content type
application/json
{
  • "replacement_approver_user_id": 1
}

Response samples

Content type
application/json
{
  • "errors": [
    ]
}

Update availability or timezone

Update availability or timezone

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the resource.

Request Body schema: application/json

The new availability information

date
required
string <iso-date-string>

The start date for the downtime event.

timezone
string
Default: null

A timezone (based off of Ruby on Rails's ActiveSupport::TimeZone key mappings). See Timezones for a list of valid timezones.

delete_invalid_bookings
boolean
Default: false

If true, any bookings that clash with the downtime will be deleted.

allow_waiting
boolean
Deprecated
Default: true

If true, move any conflicting bookings to the waiting list. This is the default behaviour unless overridden by block_by_clashes or delete_invalid_bookings.

Array of objects

Represents the periods at which the resource is available

Responses

Request samples

Content type
application/json
{
  • "date": "2020-12-31",
  • "timezone": "UTC",
  • "delete_invalid_bookings": false,
  • "allow_waiting": true,
  • "available_periods": [
    ]
}

Response samples

Content type
application/json
{
  • "clashes": [
    ],
  • "allowClashResolution": true
}

List resource types

Returns an array of resource types

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get resource type

Returns a specific resource type

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the resource type.

Responses

Response samples

Content type
application/json
{
  • "id": 1,
  • "human": true,
  • "name": "string",
  • "created_at": "2020-12-31T14:29:29.000Z",
  • "updated_at": "2020-12-31T14:29:29.000Z",
  • "custom_attributes": [
    ],
  • "custom_fields": [
    ]
}

Users

Operations for creating, retrieving or modifying users.

List active users

Returns all active users for this account.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
limit
string^\d+$
Default: "50"
Example: limit=50

The maximum number of results to return. Use limit=0 to remove the limit.

offset
string^\d+$
Default: "0"
Example: offset=10

The number of results to skip over. Useful for pagination.

Responses

Response samples

Content type
application/json
[]

List users

Returns information about all active and deleted users for the account.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Responses

Response samples

Content type
application/json
[]

Get my user summary

Returns a summary about the currently authenticated user.

Responses

Response samples

Content type
application/json
{}

Get my user details

Returns information about the currently authenticated user in the context of an account.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Responses

Response samples

Content type
application/json
{}

Get user

Returns information about the specified user.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the user.

Responses

Response samples

Content type
application/json
{}

Webhooks

Resource Guru supports integration with other services using outgoing webhooks. In a nutshell, webhooks provide a way for Resource Guru to send real-time information to other apps. For example, when a booking is made in Resource Guru, webhooks can be used to post information (payloads) about that booking to a payload (receiving) URL. Getting this information was always possible via our basic API, but webhooks proactively post the changes instead. This means that apps no longer need to keep polling the API to check what's changed - resulting in much greater efficiency.

Account owners and users with administrative privileges can create new webhooks either via the API endpoint or via settings in their Resource Guru account. Simply specify the name of the webhook, the payload URL which receives the payloads, and the types of events which should be sent to the payload URL. For added security, you can provide a secret string which will be combined with the payload's request body to create a HMAC SHA256 digest and added as a request header.

The supported event types are:

  • Bookings
  • Clients
  • Projects
  • Resources
  • Resource Types
  • Accounts
  • Time Off
  • Custom fields
  • Custom field options

As soon as changes are made within a relevant Resource Guru account, payloads are sent immediately for any of the events that have been subscribed to in the webhook. We will automatically try to deliver a payload 100 times before marking it as failed. More detail on payload statuses can be found in the payloads endpoint documentation. Payloads are dropped from Resource Guru's history after 30 days. Unsuccessful payloads will be lost after failing for 30 days.

Payloads are sent as JSON with the following headers:

Header Description
User-Agent The string ResourceGuru/Webhooks identifies Resource Guru as the sender.
Content-Type The string application/json identifies the content type of the payload.
X-ResourceGuru-Key The secret provided when creating the webhook. This is only sent if a webhook secret is set.
X-ResourceGuru-Signature A HMAC SHA256 digest of the request body, signed by the webhook secret. This is only sent if a webhook secret is set.

The signature is generated on our side using the OpenSSL library using the following code:

OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), webhook_secret, request_body)

Payload format

Payloads are sent as JSON.

Key Type Description
id integer Each payload has a unique incrementing ID
timestamp integer A UNIX epoch timestamp when the event occurred.
payload object Format varies based on the type of event. We use a stripped down version of whatever type the payload is representing, any additional information can be fetched via the API. The keys action and type are added.

The payload action will be one of:

  • create
  • update
  • delete

The payload type will be one of:

  • account
  • booking
  • client
  • project
  • resource
  • resource_type
  • downtime (Time Off)

An example payload when a new client is created:

{
  "id": 1,
  "timestamp": 1423472753,
  "payload": {
    "id": 1234,
    "archived": false,
    "color": null,
    "name": "A client",
    "notes": "Some notes",
    "created_at": "2015-02-04T16:40:23.000Z",
    "updated_at":"2015-02-09T09:05:53.581Z",
    "action": "create",
    "type": "client"
  }
}

List webhooks

Returns a list of webhooks configured for this account

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Responses

Response samples

Content type
application/json
[]

Create webhook

Create a new webhook

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Request Body schema: application/json

The information for the webhook

name
required
string [ 1 .. 255 ] characters

The name of this webhook for display purposes

payload_url
required
string [ 1 .. 255 ] characters

The url that we will send relevant events to

events
required
Array of strings
Items Enum: "bookings" "downtimes" "resources" "projects" "clients" "accounts" "resource_types"

The events that will be sent to this webhook

secret
required
string <= 255 characters

An optional secret used to create a SH256 HMAC which will be sent along with all webhook payloads for verification

send_secret_header
required
boolean

Whether we send the secret in a header to the payload URL along with our events

paused
required
boolean

Whether this webhook is paused, preventing delivery of events

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{}

Send test payload

Sends a test payload to the specified URL and responds with the status code of the request

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Request Body schema: application/json

The URL we want to test

payload_url
required
string <uri>

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "errors": [
    ]
}

Get webhook

Retrieves a single webhook

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the webhook.

Responses

Response samples

Content type
application/json
{}

Update webhook

Updates a webhook

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the webhook.

Request Body schema: application/json

The parameters we want to update

name
string [ 1 .. 255 ] characters

The name of this webhook for display purposes

payload_url
string [ 1 .. 255 ] characters

The url that we will send relevant events to

events
Array of strings
Items Enum: "bookings" "downtimes" "resources" "projects" "clients" "accounts" "resource_types"

The events that will be sent to this webhook

secret
string <= 255 characters

An optional secret used to create a SH256 HMAC which will be sent along with all webhook payloads for verification

send_secret_header
boolean

Whether we send the secret in a header to the payload URL along with our events

paused
boolean

Whether this webhook is paused, preventing delivery of events

retry_last
boolean
Default: false

Whether to attempt resending the last payload after updating

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{}

Delete webhook

Deletes a webhook

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the webhook.

Responses

Response samples

Content type
application/json
{
  • "errors": [
    ]
}

Test webhook

Tests a webhook and returns the status, or a 500 if there are problems connecting to the URL

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the webhook.

Responses

Response samples

Content type
application/json
"status: 200"

Get webhook payloads

Payloads are created for webhooks once any interaction with the application takes place. All payloads are created immediately once an action is performed for webhooks that are subscribed to that action.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the webhook.

query Parameters
offset
string^\d+$
Default: "0"
Example: offset=10

The number of results to skip over. Useful for pagination.

limit
string^\d+$
Default: null
Example: limit=50

The maximum number of results to return.

Responses

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

Re-send webhook payload

Will attempt to resend a previously sent payload to a webhook

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the webhook.

Request Body schema: application/json

Contains the unique identifier of the payload that we want to re-send

id
required
integer >= 1

A unique identifier for an entity.

Responses

Request samples

Content type
application/json
{
  • "id": 1
}

Response samples

Content type
application/json
{
  • "errors": [
    ]
}

Calendars

Operations for retrieving or modifying calendar subscriptions for an account.

List calendars

Lists all calendar subscriptions linked to your Resource Guru account

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

List external events

Lists external events that have been synchronised from calendar subscriptions

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

query Parameters
start_date
string <iso-date-string>
Example: start_date=2020-01-01

Include only external events starting on or after this date.

end_date
string <iso-date-string>
Example: end_date=2021-12-31

Include only external events ending on or before this date.

Responses

Response samples

Content type
application/json
[]

Get calendar

Returns a specific calendar by its unique identifier.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the calendar.

Responses

Response samples

Content type
application/json
{
  • "id": 1,
  • "calendar_account_name": "string",
  • "connection_status": "success",
  • "api": "google",
  • "incoming_calendars": [
    ],
  • "outgoing_calendar_state": "paused"
}

Update calendar

Update a specific calendar by its unique identifier.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the calendar.

Request Body schema: application/json

The information to update in the existing calendar.

required
Array of objects
Array
calendar_id
required
integer >= 1

The unique identifier of the calendar.

sync
required
boolean

Indicates whether this calendar should be synced or not.

Responses

Request samples

Content type
application/json
{
  • "incoming_calendar_subscriptions": [
    ]
}

Response samples

Content type
application/json
{
  • "id": 1,
  • "calendar_account_name": "string",
  • "connection_status": "success",
  • "api": "google",
  • "incoming_calendars": [
    ],
  • "outgoing_calendar_state": "paused"
}

Delete calendar

Disconnects and deletes a specific calendar by its unique identifier.

path Parameters
account
required
string non-empty
Example: example-corp

The Account URL ID for your account - can be seen in the URL bar when using the application in a browser.

id
required
integer >= 1
Example: 1

The unique identifier of the calendar.

Responses

Response samples

Content type
application/json
{
  • "errors": [
    ]
}