{"id":44998338,"url":"https://github.com/makeplans/makeplans-api","last_synced_at":"2026-02-18T22:02:51.814Z","repository":{"id":6081938,"uuid":"7308497","full_name":"makeplans/makeplans-api","owner":"makeplans","description":"API documentation for MakePlans","archived":false,"fork":false,"pushed_at":"2025-10-16T18:52:49.000Z","size":504,"stargazers_count":17,"open_issues_count":1,"forks_count":8,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-02-07T21:40:32.270Z","etag":null,"topics":["api-documentation","booking","bookingsystem","event-system","sms-reminders"],"latest_commit_sha":null,"homepage":"https://developer.makeplans.com","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/makeplans.png","metadata":{"files":{"readme":"readme.md","changelog":"changelog.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2012-12-24T15:00:46.000Z","updated_at":"2026-01-14T14:54:53.000Z","dependencies_parsed_at":"2023-12-25T16:33:42.832Z","dependency_job_id":"ae699b9a-18e7-44ac-86b3-23b2871f461d","html_url":"https://github.com/makeplans/makeplans-api","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/makeplans/makeplans-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makeplans%2Fmakeplans-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makeplans%2Fmakeplans-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makeplans%2Fmakeplans-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makeplans%2Fmakeplans-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/makeplans","download_url":"https://codeload.github.com/makeplans/makeplans-api/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makeplans%2Fmakeplans-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29596333,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-18T20:59:56.587Z","status":"ssl_error","status_checked_at":"2026-02-18T20:58:41.434Z","response_time":162,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-documentation","booking","bookingsystem","event-system","sms-reminders"],"created_at":"2026-02-18T22:02:51.647Z","updated_at":"2026-02-18T22:02:51.799Z","avatar_url":"https://github.com/makeplans.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Documentation\n\nThis is the API documentation for Makeplans. Makeplans is an online booking application with support for appointments, classes and events. For more information about the application and its features see [makeplans.com](https://makeplans.com). All features in Makeplans are available via the API.\n\nGeneral Information:\n* [Get started](#get-started)\n* [Base API URL](#base-api-url)\n* [Versioning](#versioning)\n* [Data formats](#data-formats)\n* [Date handling](#date-handling)\n* [Custom data](#custom-data)\n* [Authentication](#authentication)\n* [Identification](#identification)\n* [Rate limiting](#rate-limiting)\n* [Errors](#errors)\n* [Pagination](#pagination)\n* [Examples](#example-request-and-response)\n* [Synchronisation](#synchronisation)\n* [API libraries](#api-libraries)\n* [Webhooks](#webhooks)\n\nAPI Endpoints:\n* [Slots](#slots)\n* [Bookings](#bookings)\n* [People](#people)\n* [Services](#services)\n* [Events](#events)\n* [Resources](#resources)\n* [Resource exception dates](#resource-exception-dates)\n* [Providers](#providers)\n* [Categories](#categories)\n* [Coupons](#coupons)\n* [Webhooks](#webhooks-endpoint)\n* [Users](#users)\n* [Account](#account)\n\n## Get started\n\n1) Read this documentation.\n\n2) [Sign up for a trial account in our test environment](https://app.test.makeplans.net/client/new)\n\n3) Go to Setup -\u003e Integrations -\u003e API. Enable the API and get the API-key.\n\n4) Profit.\n\nWhen your integration is ready to be released you can sign up for a [real account](https://app.makeplans.com/client/new).\n\nLimitations of the test environment:\n* SMS reminders are not triggered.\n* Very low SMS quota.\n* Requests may run slower.\n* Bugs may occur during roll out of new features to be tested.\n* Lower uptime.\n* All financial transactions such as Stripe are performed in their respective test/sandbox environment. Other integrations are performed against real production accounts unless the integration offers a test environment.\n\n## Public and private API\n\nIf you are planning to integrate directly from your application to Makeplans or need to modify information in Makeplans then you must use the private API. This API requires authentication with an API-key and should not be done publicly (on a website).\n\nThe public API is available for simple read-only operations. This is useful if you want to present information from Makeplans on your website using JavaScript. Because these operations are done on a public website you can not authenticate using your API-key. With the public API you can fetch a list of services, available timeslots and initialize the booking process.\n\nAll requests are done over HTTPS. Each object in Makeplans has its own [endpoints](#api-endpoints).\n\n### Base API URL\n\n#### Private API\n\nThe base URL is `https://youraccount.makeplans.com/api/` for production apps and `https://youraccount.test.makeplans.net/api/` for test apps.\n\n##### Versioning\n\nThe current version of the API is version 1. The versioning scheme is as follows: `/api/v{version_number}/`. All paths in the rest of the document uses `/api/v1/` as base path.\n\nSee the [API changelog](changelog.md) for improvements and changes.\n\n#### Public API\n\nThe base URL is your account booking site such as `https://youraccount.makeplans.com/`. There is no versioning. Only the latest version of the API is available.\n\nOnly read-only operations such as list and show are available with the public API. If you need to modify any data please use the private API.\n\n## Data formats\n\nThe API supports JSON for input and output. In addition you can specify input using form data.\n\nThe format of the output data is provided as is and the reference is this document.\n\nAll data is UTF-8.\n\nAll examples and object attributes in this documentation are JSON. They are lowercase and use underscore as separator.\n\n### Output\n\nTo specify JSON as output use HTTP-header `Accept: application/json`. Output can also be defined by using extension in the path: `/resources.json` but it is recommended to use `/resources` and specify output format in the HTTP-header. Multiple items are returned as an array.\n\n### Input\n\nTo specify JSON as input use HTTP-header `Content-Type: application/json`. The body must be JSON-formatted and include the object with required attributes.\n\nTo use normal form data specify HTTP-header `application/x-www-form-urlencoded`. Form values should be sent like this: `resource[title]=Unicorn`. To specify array values use: `selected_resources[]=1337\u0026selected_resources[]=555`. The same applies when doing a GET request with URL parameters.\n\n## Date handling\n\nAll dates are specified in the ISO 8601 format. Time zone is included in the output and specified by the account. It is not necessary to specify time zone in the input as the account time zone will be used as default. The output will give a full ISO 8601 date format with time zone: `YYYY-MM-DDThh:mm:ssTZD`. For input we recommend that you do not specify time zone unless needed and omit seconds: `YYYY-MM-DD hh:mm`.\n\n## Custom data\n\nCustom data is stored as key/value. All values are stored as strings but we do convert boolean values and values from keys ending in `_at` to datetime at output. Custom data can be added to booking, person, service, resource and event. If you are using our standard booking site and would like to store custom data to a new booking please see [the custom forms documentation](https://github.com/makeplans/makeplans-custom-forms) for details on how to customise the booking form.\n\n*Warning*: Custom data is stored as one attribute. **All** keys and values must be present when updating. If a booking has stored `custom_data` as `makeplans_is=awesome` and you want to add `signup=now` then you need to include both `makeplans_is` and `signup` with their values.\n\n## Authentication\n\nOnly the private API requires authentication. If you intend to use the API on a website please use the [public API](#public-and-private-api) which does not require authentication.\n\nUse your account API-Key to authenticate with the Makeplans API. First enable the API on the account and you will find the API-Key in the account settings.\n\nSend the API-Key as a Bearer token using the HTTP Authorization header.\n\nExample: `Authorization: Bearer APIKEY`\n\nDeprecated: For Basic Auth use the API-Key as username and empty password.\n\nIf your application is installable by end-users you should use oAuth. However we do not yet support oAuth so please contact us if this is something you require.\n\n## Identification\n\nYou must include a User-Agent HTTP-header with the name of your application or your website so we can get in touch in case you're doing something wrong (so we may warn you before you're blocked) or something awesome (so we may congratulate you). Example: `User-Agent: YourAppName` or `User-Agent: example.org`.\n\n## Rate limiting\n\nWe do various forms of rate limiting. See details for [HTTP status code 429](#too-many-requests).\n\n## Errors\n\n4xx HTTP status codes means you made a mistake and you need to adjust your request.\n\n### 400 - Bad Request\n\nAPI usage error. This means you did something wrong and there should be a message in the body that explains it. Error message is related to specified resource. Fix it and try again.\n\nExample response:\n\n```json\n{\n  \"title\": [\n  \"is a required field. Cannot be empty\"\n  ]\n}\n```\n\n### 401 - Unauthorized\n\nAuthentication error. Response body will give explanation if there is authorisation issue or if the API is not enabled.\n\n### 402 - Payment Required\n\nPlease pay your bill.\n\n### 403 - Forbidden\n\nAuthorization error. If you are authenticated but lack permissions.\n\n### 404 - Not Found\n\nObviously incorrect paths (`/cats`) returns 404. However, even though cool URIs should not change, previously available objects, lets say `/resources/666`, might have been deleted and thus return a 404 when requested. In most cases deleted resources will be returned and have a booking state or a flag that indicate that the resource is inactive or deleted.\n\n### 429 - Too Many Requests\n\nYou can perform up to 80 requests per 20 second period from the same IP address. If you exceed this limit, you'll get a 429 Too Many Requests response for subsequent requests. Check the `Retry-After` HTTP-header to see how many seconds to wait before retrying the request.\n\n### 5xx - Server error\n\nSystem errors (aka we screwed up) returns 5xx HTTP status codes without any detailed information. We log all system errors, but please contact us if you get this response.\n\n```json\n{\n  \"error\": \"system error\"\n}\n```\n\n## Pagination\n\nMaximum 50 items are returned per response for all endpoints except `bookings` which returns 750. Specify page with parameter `page`. Pagination is used for: bookings, events, people and resource exception dates. All other objects return all available items. Please note that currently there is no way to specify exact part of the dataset. Thus an item might appear in both page 2 and 3 if the complete dataset for the query has changed.\n\n[RFC 8288](https://datatracker.ietf.org/doc/html/rfc8288) is used for pagination linking. You will find URLs for first, prev, next and last pages in the `Link` HTTP Header. In addition metadata is added in the following HTTP Headers: `Current-Page`, `Page-Items`, `Total-Count`, `Total-Pages`.\n\n## Example request and response\n\n```shell\ncurl -u APIKEY: \\\n-H 'User-Agent: YourAppName' \\\n-H 'Accept: application/json' \\\nhttps://youraccount.test.makeplans.net/api/v1/services\n```\n\nTo create something you have to make a POST:\n\n```shell\ncurl -u APIKEY: \\\n-H 'User-Agent: YourAppName' \\\n-H 'Accept: application/json' \\\n-d 'service[title]=My new service!\u0026service[interval]=40' \\\n-X POST \\\nhttps://youraccount.test.makeplans.net/api/v1/services\n```\n\n[More examples.](examples.md)\n\n## Synchronisation\n\nSynchronising data is hard. Please ensure you test before releasing to production. First pick either Makeplans or the other system as a master. If the other system is chosen as a master then we recommend enabling the 'confirmation by administrator' setting for bookings. The synchronisation should then retrieve unprocessed bookings and process them (confirm/decline). This will ensure you can handle any changes occurred in the other system since the last synchronisation with Makeplans. New unprocessed bookings must be processed often (every 1-5 minutes) to ensure confirmations are sent out quickly to the end-user after requesting a new reservation.\n\n**NEVER** delete any data in Makeplans to make it easier to adapt to the other system. Makeplans is a customer facing booking application. End-users (stored as people) can change and cancel bookings, thus any modifications or destruction of core data should not occur. Bookings are stored with a history (log) and there is a link between a person and bookings. Makeplans make use of this data and all this data must be kept to ensure the booking process in Makeplans works as expected for the end-user.\n\nExpect all booking and person data to be changed at any time. All changes for an object will result in a updated attribute `updated_at`.\n\nWe recommend storing a timestamp retrieved from the more recently updated item from `updated_at`. When the synchronisation is performed again this timestamp can be used to fetch any changes on the `updated_at` attribute for the object you want to retrieve (e.g. the parameter `since` for bookings).\n\n## API libraries\n\nMakeplans does not officially support API libraries but they might be useful for you. Please note that these projects are **not** made by Makeplans but made publicly available by other developers who have used the Makeplans API. Any questions should be made directly to the responsible developers. If you find any errors or areas of improvement please make a pull request to improve the project.\n\n* [NodeJS by Mable](https://github.com/mableteam/makeplans).\n* [CakePHP by Pollenizer](https://github.com/Pollenizer/CakePHP-Makeplans-Plugin).\n* [Go by drewwells](https://github.com/drewwells/makeplans).\n\nA big thanks to everyone who has contributed to these libraries!\n\n## Webhooks\n\nA webhook is simply a user-defined callback in the form of an HTTP POST which is invoked when something happens.\nSo for example whenever a new booking is created in Makeplans we can send a POST request to the URL you specify. The response will include data about the modified object.\n\n### Payload\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eevent\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eType of event\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eidempotency_id\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eUnique id for this webhook\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003egenerated_at\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eWhen the event was initialized\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eperformed_by\u003c/td\u003e\u003ctd\u003eObject\u003c/td\u003e\u003ctd\u003eInfo of the user who performed the event\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003edata\u003c/td\u003e\u003ctd\u003eObject\u003c/td\u003e\u003ctd\u003eRelated object for event type\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Data payload\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eobject\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eType of object\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eid\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eId of the object\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e*object_type*\u003c/td\u003e\u003ctd\u003eObject\u003c/td\u003e\u003ctd\u003ePayload of the object\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n#### Deprecated attributes\n\nThe attributes in the data payload, 'object', 'id', and '*object_type*', is also included in the root payload due to legacy reasons. Please use the `data` attribute. The legacy attributes will be removed in the future.\n\n### Supported events\n\n* booking.cancelled\n* booking.confirmed\n* booking.created\n* booking.declined\n* booking.deleted\n* booking.modified\n* booking.verified\n* event.created\n* event.deleted\n* event.modified\n* message.processed\n* person.created\n* person.deleted\n* person.modified\n\n### Wildcard usage\n\nYou can use wildcard to trigger all or grouped events: `*` or `booking.*`\n\n### Security\n\n#### Verify payload signature\n\nWe include a `X-MakePlans-Signature` header in the webhook request. Use this to verify the request body to ensure the request is from Makeplans and signed with your account secret. The header includes details about the signature and the signature itself. We use HMAC SHA-256 to compute this signature.\n\nExample: `X-MakePlans-Signature:sha256=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd`.\n\n#### Authentication\n\nYou can add HTTP Basic Auth credentials or a parameter secret to the webhook URL.\n\n### Retries\n\nWe will retry after any 4xx or 5xx http status response. Maximum retries are 5. The timeout is set to 10 seconds.\n\n## API Endpoints\n\n## Slots\n\nSlots are not physical objects in Makeplans. It is a virtual representation of available times based on attributes from resources and services as well as various settings. So if a resource is open 8am to 4pm and selected service has interval of 60 minutes, slots will return an array of all time intervals (8am-9am, 9am-10am etc.) and indicate which resources are available.\n\nSlots are meant for listing available times on the Makeplans booking page. You can however make bookings at any time and with any length - as long as the resource is available off course.\n\n### Attributes\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003etimestamp\u003c/td\u003e\u003ctd\u003eDateTime\u003c/td\u003e\u003ctd\u003eStart\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003etimestamp_end\u003c/td\u003e\u003ctd\u003eDateTime\u003c/td\u003e\u003ctd\u003eEnd\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eformatted_timestamp\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eLocalised human readable format\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eformatted_timestamp_end\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eLocalised human readable format\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003efree\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eFree capacity\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eavailable_resources\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eIds of resources with availability\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003emaximum_capacity\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eThe maximum capacity of the available resources\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Listing\n\n`GET /services/{service_id}/slots` will return slots for specified service.\n\nResponse\n\n```json\n[\n  {\n    \"slot\": {\n      \"timestamp\": \"2013-03-08T10:00:00+00:00\",\n      \"timestamp_end\": \"2013-03-08T10:15:00+00:00\",\n      \"formatted_timestamp\": \"Friday, March  8, 2013, 10:00 AM\",\n      \"formatted_timestamp_end\": \"Friday, March  8, 2013, 10:15 AM\",\n      \"free\": 1,\n      \"available_resources\": [\n        1,2\n      ],\n      \"maximum_capacity\": 2\n    }\n  }\n]\n```\n\n#### Query Parameters\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003efrom\u003c/td\u003e\u003ctd\u003eDate\u003c/td\u003e\u003ctd\u003eDefault: today\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eto\u003c/td\u003e\u003ctd\u003eDate\u003c/td\u003e\u003ctd\u003eDefault: today\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eselected_resources\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eDefault: all active providers.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Next available date\n\n`GET /services/{service_id}/next_available_date` will return the next available date within 30 days with a free slot.\n\nResponse\n\n```json\n[\n  {\n    \"available_date\": \"2016-02-20\"\n  }\n]\n```\n\n#### Query Parameters\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003efrom\u003c/td\u003e\u003ctd\u003eDate\u003c/td\u003e\u003ctd\u003eDefault: today.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eselected_resources\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eDefault: all active providers.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Available dates\n\n`GET /services/{service_id}/available_dates` will return the available dates for the rest of the current month.\n\nResponse\n\n```json\n[\n  {\n    \"available_date\": {\n      \"date\": \"2021-04-01\"\n    }\n  },\n  {\n    \"available_date\": {\n      \"date\": \"2021-04-04\"\n    }\n  }\n]\n```\n\n#### Query Parameters\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003efrom\u003c/td\u003e\u003ctd\u003eDate\u003c/td\u003e\u003ctd\u003eDefault: today.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eto\u003c/td\u003e\u003ctd\u003eDate\u003c/td\u003e\u003ctd\u003eDefault: rest of the month.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eselected_resources\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eDefault: all active providers.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n## Bookings\n\n### Attributes\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eid\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecreated_at\u003c/td\u003e\u003ctd\u003eDateTime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eupdated_at\u003c/td\u003e\u003ctd\u003eDateTime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eservice_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eevent_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eresource_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eperson_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ebooked_from\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ebooked_to\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eexpires_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003etitle\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003enotes\u003c/td\u003e\u003ctd\u003eText\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ereminder_at\u003c/td\u003e\u003ctd\u003eDateTime\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ereminded_at\u003c/td\u003e\u003ctd\u003eDateTime\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003epaid_at\u003c/td\u003e\u003ctd\u003eDateTime\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eexternal_id\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003egoogle_order_number\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecustom_data\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003estate\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eAutomatically set. See states\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eactive\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecount\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eDefault: 1\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecollection_id\u003c/td\u003e\u003ctd\u003eUUID\u003c/td\u003e\u003ctd\u003eAutomatically set for recurring bookings.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003estatus\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eDefault: null. See statuses.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eperson_attributes\u003c/td\u003e\u003ctd\u003eObject\u003c/td\u003e\u003ctd\u003eSee person. Only for input.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eperson\u003c/td\u003e\u003ctd\u003eObject\u003c/td\u003e\u003ctd\u003eSee person. Only for output.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eresource\u003c/td\u003e\u003ctd\u003eObject\u003c/td\u003e\u003ctd\u003eSee resource. Only for output.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eservice\u003c/td\u003e\u003ctd\u003eObject\u003c/td\u003e\u003ctd\u003eSee service. Only for output.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eevent\u003c/td\u003e\u003ctd\u003eObject\u003c/td\u003e\u003ctd\u003eSee event. Only for output.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ebooking_type\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eValues: appointment or attendance. See service.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecoupon_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### States\n\n* awaiting_verification\n* verification_expired\n* awaiting_payment\n* awaiting_confirmation\n* confirmed\n* declined\n* cancelled\n* deleted\n\n### Statuses\n\n* checked_in\n* in_progress\n* completed\n* no_show\n\n#### Normal state flow\n\nThe normal booking flow when a customer initiates a new booking starts with `awaiting_verification`. If verification is required Makeplans sends out email or SMS for the customer to verify. When successfully verified the state is updated to `confirmed` or `awaiting_confirmation` if reservations requires confirmation by administrator. For confirmation it is then updated to `confirmed` as normally if confirmed, and to `declined` if it is not confirmed.\n\nBookings that have been confirmed and then cancelled, either by customer or administrator, are set to `cancelled`.\n\nBookings that are deleted are set to `deleted`.\n\n### Active bookings\n\nBookings with states `awaiting_verification`, `awaiting_payment`, `awaiting_confirmation` or `confirmed` are considered to be active. Bookings with state `awaiting_verification` will be updated with state `verification_expired` after the current time passes `expires_at`. However updating states rely on automatic tasks so you must use the `active` attribute to check whether a booking is active or not. Only active bookings will be returned unless you specify: a booking by id, a specific state such as bookings that are awaiting confirmation, to return all bookings for a resource or dates, or for a person.\n\n### Listing\n\nSee query parameters for filtering the output beyond the default outputs.\n\n`GET /bookings` will return all active bookings.\n\n`GET /bookings/recent` will return all active bookings ordered based on updated_at.\n\n`GET /bookings/upcoming` will return all active bookings from and including `{date}`.\n\n`GET /bookings/unconfirmed` will return only unconfirmed bookings.\n\n`GET /bookings/all` will return all bookings of all states (including `declined`, `cancelled`, `deleted`, and `verification_expired`). This is a useful output for syncronisation when you need to keep a track of deleted bookings.\n\n`GET /bookings/visible` will return all active bookings as well as those declined or cancelled. This is the preferred output if you want to provide a list of all bookings for visual presentation.\n\nResponse\n\n```json\n[\n  {\n    \"booking\": {\n      \"booked_from\": \"2012-09-29T07:00:00+02:00\",\n      \"booked_to\": \"2012-09-29T08:00:00+02:00\",\n      \"created_at\": \"2012-09-20T15:34:16+02:00\",\n      \"custom_data\": null,\n      \"count\": 1,\n      \"expires_at\": null,\n      \"external_id\": null,\n      \"id\": 1,\n      \"notes\": \"Very handsome customer\",\n      \"person_id\": 1,\n      \"resource_id\": 1,\n      \"service_id\": 1,\n      \"state\": \"confirmed\",\n      \"status\": null,\n      \"updated_at\": \"2012-09-20T15:34:16+02:00\"\n    }\n  }\n]\n```\n\n#### Query Parameters\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eservice_id\u003c/td\u003e\u003ctd\u003eInteger or array of integers\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eevent_id\u003c/td\u003e\u003ctd\u003eInteger or array of integers\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eresource_id\u003c/td\u003e\u003ctd\u003eInteger or array of integers\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eperson_id\u003c/td\u003e\u003ctd\u003eInteger or array of integers\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eexternal_id\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003estart\u003c/td\u003e\u003ctd\u003eDateTime\u003c/td\u003e\u003ctd\u003ebooked_from after param\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eend\u003c/td\u003e\u003ctd\u003eDateTime\u003c/td\u003e\u003ctd\u003ebooked_to before param\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esince\u003c/td\u003e\u003ctd\u003eDateTime\u003c/td\u003e\u003ctd\u003eupdated_at after param\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecollection_id\u003c/td\u003e\u003ctd\u003eUUID\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003estate\u003c/td\u003e\u003ctd\u003eString or array of strings\u003c/td\u003e\u003ctd\u003eSee states\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003estatus\u003c/td\u003e\u003ctd\u003eString or array of strings\u003c/td\u003e\u003ctd\u003eSee statuses\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\nYou can return bookings of multiple resources/services/events/people with an array.\n\n#### Other Parameters\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eextended\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eExtend output with full data from related objects.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Get booking\n\n`GET /bookings/{booking_id}` will get booking with id `{booking_id}`.\n\nYou can also find a booking with `external_id`:\n\n`GET /bookings/find_by/external_id/{external_id}` will get booking with external_id `{external_id}`.\n\n### Add new booking\n\n`POST /bookings` will create a new booking.\n\nBookings without `person_id` are shown as busy in the calendar.\n\n#### Non-returning booking parameters\n\nThese parameters are part of booking: `booking[public_booking]`.\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003epublic_booking\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eRestrict to normal public booking rules such as within opening hours, not able to book in the past or past specified allowed date in the future. Recommended for all customer facing booking applications (e.g. integration on website). Not recommended when synchronising with other calendar programs. Default: false.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n#### Additional parameters\n\nThese parameters are part not of `booking[]`: `confirm`.\n\nOutgoing messages requires person_id and service_id.\n\nDefault action for outgoing messages is according to the settings for booking verification. If email verification is enabled then all `*_email` messages will be triggered by default to the customer. To override please see parameters for each action below. For admin notification messages the default is based on the account settings. SMS reminders is based on account settings and uses a default value for the time unless specified.\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003econfirm\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eIf set to false then the 'initiate verification' event is executed. If verification is required the state will be set to `awaiting_verification`. If no verification is required then the state will be set to `awaiting_confirmation` or `confirmed`.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eignore_capacity\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eWill force save the booking even though other bookings exists within the same time on the specified resource_id (double booking). Not applicable when `public_booking` is set to false (no double bookings allowed). Default: false.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eadd_reminder_sms\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eAutomatically adds `reminder_at` based on setting from account attribute `sms_reminder_time`. Default: at 12PM the day before the appointment.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eadd_messages\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eAutomatically generate messages based on message templates. (NOTE: Beta functionality available by invitation.)\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003everification_send_email\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out verification email. Only applicable when `confirm` is set to false.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003everification_send_sms\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out verification SMS. Only applicable when `confirm` is set to false.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003econfirmation_send_email\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out confirmation email.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003econfirmation_send_sms\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out confirmation SMS.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003enotification_send_email\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out notification email to admin.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003enotification_send_sms\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out notification SMS to admin.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eextended\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eExtend output with full data from related objects.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n#### Add new booking with new person\n\nTo add a new person along with a booking you must populate `person_attributes` with [person](#people) attributes. Values will be matched to an existing person based on national id number, phone number or email (in that order).\n\n### Add recurring bookings\n\n`POST /bookings/recurring` will create recurring bookings based on a pattern.\n\nThe recurrence format follows the [iCalendar specification](https://tools.ietf.org/html/rfc5545). The attributes for recurrence are: `RRULE`, `RDATE`, `EXDATE`. For an introduction and examples of these parameters see [this section from the iCalendar specification](http://www.kanzaki.com/docs/ical/rrule.html).\n\nIn the iCalendar specification the recurrence is based on values in `DTSTART` and `DTEND`. This is set by `booked_from` and `booked_to` from `booking`.\n\nAll recurring bookings will except for `booked_from` and `booked_to` have the same attributes based on the specified parameters in `booking`.\n\nAll bookings created by the recurring pattern gets the same UUID in `collection_id`. As the collection name implies, and as is possible with the iCalendar specification, this is not necessarily only for recurrence (i.e. 9am-10am each Friday until December 1st) but also for multiple specific times (as can be specified with `RDATE`).\n\nOnly the `collection_id` is returned. No bookings are created at the time of request as they will be processed by the server in the background due to the volume of bookings that it is possible to create at one time. A successful response with a `collection_id` does in no way indicate that any bookings will be created. The first booking as defined in `booking` is however validated. If it is not valid errors details are returned in the same way as creating a single booking. In such a case recurring rules are not applied and you must adjust the request until validation is successful.\n\n#### Parameters for recurrence\n\nThe parameters for recurrence are not set in `booking` but in `recurring`.\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003errule\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRepeating pattern. Example: `FREQ=DAILY;UNTIL=19971224T000000Z`.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003erdate\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eList of recurring dates. Example: `VALUE=DATE:19970101,19970120,19970217,19970421`.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eexdate\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eList of dates that should be excluded from the recurring rule. Example: `VALUE=DATE:19970102`.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\nYou should always specify COUNT or UNTIL with RRULE. The max number of occurrences is 731, regardless if a limit is set or not.\n\n#### List occurrences\n\n`GET /bookings/recurring/{collection_id}` will return all occurrences for a collection.\n\n#### Delete all occurrences\n\n`DELETE /bookings/recurring/{collection_id}` will delete *all* occurrences for a collection.\n\n### Change booking state\n\n#### Verify a booking\n\n`PUT /bookings/{booking_id}/verify` will verify a booking. The verification code is not checked. Use this when you handle verification in your application.\n\n#### Verify a booking with verification code\n\n`PUT /bookings/{booking_id}/verify_code` will verify a booking using `{verification_code}`. Use this when Makeplans is used to send out verification email or SMS.\n\n##### Additional parameters\n\nSee [information about additional parameters](#additional-parameters).\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003econfirmation_send_email\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out confirmation email.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003econfirmation_send_sms\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out confirmation SMS.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003enotification_send_email\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out notification email to admin. Default: based on account setting.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003enotification_send_sms\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out notification SMS to admin.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003everification_code\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eVerification code send using SMS or email. Only applicable for the `verify_code` action.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n#### Confirm a booking\n\n`PUT /bookings/{booking_id}/confirm` will confirm a booking.\n\n##### Additional parameters\n\nSee [information about additional parameters](#additional-parameters).\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003econfirmation_send_email\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out confirmation email.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003econfirmation_send_sms\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out confirmation SMS.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003enotification_send_email\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out notification email to admin.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003enotification_send_sms\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out notification SMS to admin.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n#### Decline a booking\n\n`PUT /bookings/{booking_id}/decline` will decline a booking.\n\n##### Additional parameters\n\nSee [information about additional parameters](#additional-parameters).\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003edecline_send_email\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out decline email.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003edecline_send_sms\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out decline SMS.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n#### Cancel a booking\n\n`PUT /bookings/{booking_id}/cancel` will cancel a booking.\n\n##### Additional parameters\n\nSee [information about additional parameters](#additional-parameters).\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecancellation_send_email\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out cancellation email.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecancellation_send_sms\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out cancellation SMS.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Update booking\n\n`PUT /bookings/{booking_id}` will update a booking.\n\n#### Additional parameters\n\nSee [information about additional parameters](#additional-parameters).\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eignore_capacity\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSet to true to allow a double booking.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eadd_reminder_sms\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eAutomatically adds `reminder_at`.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003emodification_send_email\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out modification email.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003emodification_send_sms\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out modification SMS.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eextended\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eExtend output with full data from related objects.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Delete booking\n\n`DELETE /bookings/{booking_id}` will delete existing booking with id `{booking_id}`.\n\nDeleting a booking will set it to state=deleted and active=false. It will not be visible in listing, only when requesting `GET /bookings/all` or by requesting the booking directly `GET /bookings/{booking_id}`.\n\nDo not use this method if the booking is rescheduled or cancelled.\n\n#### Additional parameters\n\nSee [information about additional parameters](#additional-parameters).\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecancellation_send_email\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out cancellation email.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecancellation_send_sms\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eSend out cancellation SMS.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Update booking status\n\n`PUT /bookings/{booking_id}/status` will update the booking status.\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003estatus\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eBooking status.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\nThis parameter is specified in the same way as [additional parameters](#additional-parameters).\n\n## People\n\nThe primary key for a person is `id`. However the following fields are unique: `email`, `phonenumber`, `national_id_no` and `provider`+`uid`. There are no specific requirements for input but a person needs to have either name, email, national id number or phone number.\n\nIt is possible to give a person ability to book on behalf of other people. This is linked through the `parent_id` attribute.\n\n### Attributes\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eid\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecreated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eupdated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ename\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNot required.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eemail\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNot required.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ephone_number\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNot required. Phone number as stored. Also available as phonenumber (deprecated).\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ephone_number_formatted\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eOnly returnable. E.164 formatted phone number with plus sign, international code, and no spaces or parentheses.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eexternal_id\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecustom_data\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eNot required. Key/value. Stored as strings.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003edate_of_birth\u003c/td\u003e\u003ctd\u003eDate\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003enational_id_no\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNot required.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003estreet\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNot required.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecity\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNot required.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003epostal_code\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNot required.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003estate\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNot required.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecountry_code\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNot required. ISO 3166-1 alpha-2.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003enotes\u003c/td\u003e\u003ctd\u003eText\u003c/td\u003e\u003ctd\u003eNot required.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eparent_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eId of parent.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Listing\n\n`GET /people` will return all active people.\n\n`GET /people/all` will return all people including those who are deactivated.\n\nResponse\n\n```json\n[\n  {\n    \"person\": {\n      \"created_at\": \"2012-09-20T15:34:16+02:00\",\n      \"custom_data\": null,\n      \"date_of_birth\": null,\n      \"email\": \"robot@booking.makeplans.com\",\n      \"external_id\": null,\n      \"id\": 1,\n      \"name\": \"Espen Antonsen\",\n      \"national_id_no\": null,\n      \"notes\": null,\n      \"phonenumber\": \"\",\n      \"updated_at\": \"2012-09-20T15:34:16+02:00\",\n      \"phone_number_formatted\": null\n    }\n  }\n]\n```\n\n#### Query Parameters\n\nYou can search multiple columns at once, for example `email` and `phone_number`, or you can use the shorthand `search` to search email, phone number, national id no or name.\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esearch\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eemail\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ephone_number\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eexternal_id\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ename\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003edate_of_birth\u003c/td\u003e\u003ctd\u003eDate\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003enational_id_no\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esince\u003c/td\u003e\u003ctd\u003eDateTime\u003c/td\u003e\u003ctd\u003eupdated_at after param\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Get person\n\n`GET /people/{person_id}` will get a person with id `{person_id}`.\n\n### Add new person\n\n`POST /people` will create a new person.\n\n### Update person\n\n`PUT /people/{person_id}` will update existing person with id `{person_id}`.\n\n### Delete person\n\n`DELETE /people/{person_id}` will delete existing person with id `{person_id}`.\n\n### Undelete person\n\n`PUT /people/{person_id}/undelete` will undelete existing person with id `{person_id}`.\n\n### Merge person with another person\n\n`POST /people/{person_id}/merge?merge_person_id={merge_person_id}` will merge existing person with id `{person_id}` and `{merge_person_id}`. All bookings for `{merge_person_id}` will be transferred to `{person_id}`. `{merge_person_id}` will be deleted. You can also specify attributes to update with `{person}` just like when creating/updating a person.\n\n### Person verification with a perishable token\n\nThe purpose of this feature is to verify a new or existing person in Makeplans on your website such as \"login to see your bookings\". The verification can be done either using email or SMS. When successful you will have verified either an email or a phone number. Thus you can either create a new person or retrieve an existing person knowing that the person has been verified.\n\nPlease note that this token is perishable, meaning that it will be removed from and unavailable for verification after 10 minutes.\n\n#### Send perishable token\n\n`POST /people/perishable_token/send` will send a SMS with a five digit code (the token) or an email with a link which includes the token in the URL. Specify either `person[email]` or `person[phone_number]`.\n\n*Sending via email is not yet implemented. Only SMS token is possible.*\n\n#### Verify perishable token\n\n`POST /people/perishable_token/verify`. This will return a person if authentication is successful. If the email or phone_number is already registered to a person then that person will be returned. If no person exists with the specified email/phone_number then a empty person object will be returned. You then have to make another call to create the person. If the token and the identifier do not match an error is returned.\n\nSpecify the token as `perishable_token` and the identifier in `person[email]` or `person[phone_number]`.\n\n### List bookings for person\n\n`GET /people/{person_id}/bookings` will retrieve all bookings for person with id `{person_id}`. You can also use other listings as described in the [bookings listing](#listing-1) such as `GET /people/{person_id}/bookings/visible` to include cancelled bookings.\n\n### List children for person\n\n`GET /people/{person_id}/children` will retrieve all children for person with id `{person_id}`.\n\n## Services\n\nThere are two types of services:\n\n* Appointment\n* Attendance\n\nAppointments can be booked within fixed opening hours as specified on the Resource and with exceptions specified in ResourceExceptionDate.\n\nAttendance at an event is also a booking but the individual booking datetime or resource cannot be modified. Attendance is linked to an event which occurs at a specific time. One service can be linked to one or multiple events.\n\n### Attributes\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eid\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecreated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eupdated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003etitle\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003edescription\u003c/td\u003e\u003ctd\u003eText\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eactive\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ebooking_capacity\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eday_booking_specify_time\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eNot required (default false)\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ehas_day_booking\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eNot required (default false)\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003einterval\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eNot required (default 60)\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003emax_slots\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eNot required (default 1)\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eprice\u003c/td\u003e\u003ctd\u003eDecimal\u003c/td\u003e\u003ctd\u003eNot required.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esame_day\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eNot required (default false)\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003etemplate\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eComponent template (calendar view)\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003einterval_rounding\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eOverrides account default (see info on account object)\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ebooking_type\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired. Values: appointment (default) or attendance\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecustom_data\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ebooking_form\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003eCustom booking form\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003email_verification\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003email_confirmation\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esms_verification\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esms_confirmation\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esms_reminder\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n#### Deprecated attributes\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ebooking_type_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003e1: appointment. 2: attendance.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Listing\n\n`GET /services/` will return all services.\n\nResponse\n\n```json\n[\n  {\n    \"service\": {\n      \"active\": true,\n      \"booking_capacity\": 1,\n      \"booking_type_id\": 1,\n      \"description\": \"The best service\",\n      \"created_at\": \"2012-09-20T15:34:16+02:00\",\n      \"custom_data\": null,\n      \"day_booking_specify_time\": false,\n      \"has_day_booking\": false,\n      \"id\": 1,\n      \"interval\": 20,\n      \"max_slots\": null,\n      \"price\": \"115.0\",\n      \"same_day\": false,\n      \"template\": null,\n      \"title\": \"Chiropractor\",\n      \"updated_at\": \"2012-09-20T15:34:16+02:00\"\n    }\n  }\n]\n```\n\n### Get service\n\n`GET /services/{service_id}` will get a service with id `{service_id}`.\n\n### Add new service\n\n`POST /services` will create a new service.\n\n### Update service\n\n`PUT /services/{service_id}` will update existing service with id `{service_id}`.\n\n### Delete service\n\n`DELETE /services/{service_id}` will delete existing service with id `{service_id}`. Deleting a service will set it to active=false and will not be returned in any listings.\n\n## Events\n\nUnlike appointments made through a normal service events starts and ends at a specific time. An event is connected to a resource and a service. It could be either a one-off event (e.q. a concert) or something that occurs multiple times (e.q. spinning class). Event bookings have a strong relation to the event. That means that it is not possible to modify details such as `{booked_from}`, `{booked_to}`, `{resource_id}` and `{service_id}` for the `{booking}`. To make such changes it must be done to the event. All bookings connected to the event will then automatically me modified.\n\nWhile events are connected to a resource bookings or capacity of an event are not restricted by the opening hours or availability of a resource.\n\n### Attributes\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eid\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecreated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eupdated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eresource_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eservice_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003epublished\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eDefault: true\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecapacity\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003estarts_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eends_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecustom_data\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eNot required\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003edescription\u003c/td\u003e\u003ctd\u003eText\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Listing\n\n`GET /events/` will return all events.\n\nResponse\n\n```json\n[\n  {\n    \"event\": {\n      \"capacity\": 10,\n      \"created_at\": \"2012-09-20T15:34:16+02:00\",\n      \"custom_data\": null,\n      \"description\": null,\n      \"ends_at\": \"2015-08-10T11:30:00+02:00\",\n      \"id\": 1,\n      \"resource_id\": 1,\n      \"published\": true,\n      \"starts_at\": \"2015-08-10T10:00:00+02:00\",\n      \"service_id\": 1,\n      \"title\": \"Super fun event\",\n      \"updated_at\": \"2012-09-20T15:34:16+02:00\"\n    }\n  }\n]\n```\n\n#### Query Parameters\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eservice_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eresource_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003estart\u003c/td\u003e\u003ctd\u003eDateTime\u003c/td\u003e\u003ctd\u003estarts_at after param\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eend\u003c/td\u003e\u003ctd\u003eDateTime\u003c/td\u003e\u003ctd\u003eends_at before param\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esince\u003c/td\u003e\u003ctd\u003eDateTime\u003c/td\u003e\u003ctd\u003eupdated_at after param\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Get event\n\n`GET /events/{event_id}` will get an event with id `{event_id}`.\n\n### Add new event\n\n`POST /events` will create a new event.\n\n### Add recurring/multiple events\n\n`POST /events/recurring` will create a multiple events.\n\nThe recurrence format follows the [iCalendar specification](https://tools.ietf.org/html/rfc5545). The attributes for recurrence are: `RRULE`, `RDATE`, `EXDATE`. For an introduction and examples of these parameters see [this section from the iCalendar specification](http://www.kanzaki.com/docs/ical/rrule.html).\n\nIn the iCalendar specification the recurrence is based on values in `DTSTART` and `DTEND`. This is set by `starts_at` and `ends_at` from `event`.\n\nAll recurring events will except for `starts_at` and `ends_at` have the same attributes based on the specified parameters in `event`.\n\nAll events created by the recurring pattern gets the same UUID in `collection_id`. As the collection name implies, and as is possible with the iCalendar specification, this is not necessarily only for recurrence (i.e. 9am-10am each Friday until December 1st) but also for multiple specific times (as can be specified with `RDATE`).\n\nOnly the `collection_id` is returned. No events are created at the time of request as they will be processed by the server in the background due to the volume of events that it is possible to create at one time. A successful response with a `collection_id` does in no way indicate that any events will be created. The first event as defined in `event` is however validated. If it is not valid errors details are returned in the same way as creating a single event. In such a case recurring rules are not applied and you must adjust the request until validation is successful.\n\n#### Parameters for recurrence\n\nThe parameters for recurrence are not set in `event` but in `recurrence`.\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003errule\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRepeating pattern. Example: `FREQ=DAILY;UNTIL=19971224T000000Z`.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003erdate\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eList of recurring dates. Example: `VALUE=DATE:19970101,19970120,19970217,19970421`.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eexdate\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eList of dates that should be excluded from the recurring rule. Example: `VALUE=DATE:19970102`.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\nYou should always specify COUNT or UNTIL with RRULE. The max number of occurrences is 731, regardless if a limit is set or not.\n\n#### List occurrences\n\n`GET /events/recurring/{collection_id}` will return all occurrences for a collection.\n\n### Update event\n\n`PUT /events/{event_id}` will update existing service with id `{event_id}`.\n\n### Delete event\n\n`DELETE /events/{event_id}` will delete existing event with id `{event_id}`. Deleting a event will set it to active=false and will not be returned in any listings.\n\n### List bookings\n\n`GET /events/{event_id}/bookings` will return all bookings for event with id `{event_id}`.\n\n## Resources\n\n### Attributes\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eid\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecreated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eupdated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003etitle\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eactive\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopening_hours_mon\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eDefault opening hours for Monday.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopening_hours_tue\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eDefault opening hours for Tuesday.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopening_hours_wed\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eDefault opening hours for Wednesday.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopening_hours_thu\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eDefault opening hours for Thursday.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopening_hours_fri\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eDefault opening hours for Friday.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopening_hours_sat\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eDefault opening hours for Saturday.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopening_hours_sun\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eDefault opening hours for Sunday.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n#### Default opening hours\n\nValues for the opening hours attributes is of type time in the array. Values are in the form of two's. This results in adding breaks within a day. To define opening hours from 8AM to 4PM with lunch at 12PM to 12.30PM the following array will be the result: `['08:00', '12:00', '12:30', '16:00']`. Having opening hours without a lunch break will yield this result: `['08:00', '16:00']`. To define a weekday as closed the value should be `null`.\n\n#### Deprecated Attributes\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopen_0\u003c/td\u003e\u003ctd\u003eTime\u003c/td\u003e\u003ctd\u003eOpening time for Monday\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopen_1\u003c/td\u003e\u003ctd\u003eTime\u003c/td\u003e\u003ctd\u003eOpening time for Tuesday\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopen_2\u003c/td\u003e\u003ctd\u003eTime\u003c/td\u003e\u003ctd\u003eOpening time for Wednesday\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopen_3\u003c/td\u003e\u003ctd\u003eTime\u003c/td\u003e\u003ctd\u003eOpening time for Thursday\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopen_4\u003c/td\u003e\u003ctd\u003eTime\u003c/td\u003e\u003ctd\u003eOpening time for Friday\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopen_5\u003c/td\u003e\u003ctd\u003eTime\u003c/td\u003e\u003ctd\u003eOpening time for Saturday\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopen_6\u003c/td\u003e\u003ctd\u003eTime\u003c/td\u003e\u003ctd\u003eOpening time for Sunday\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eclose_0\u003c/td\u003e\u003ctd\u003eTime\u003c/td\u003e\u003ctd\u003eClosing time for Monday\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eclose_1\u003c/td\u003e\u003ctd\u003eTime\u003c/td\u003e\u003ctd\u003eClosing time for Tuesday\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eclose_2\u003c/td\u003e\u003ctd\u003eTime\u003c/td\u003e\u003ctd\u003eClosing time for Wednesday\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eclose_3\u003c/td\u003e\u003ctd\u003eTime\u003c/td\u003e\u003ctd\u003eClosing time for Thursday\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eclose_4\u003c/td\u003e\u003ctd\u003eTime\u003c/td\u003e\u003ctd\u003eClosing time for Friday\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eclose_5\u003c/td\u003e\u003ctd\u003eTime\u003c/td\u003e\u003ctd\u003eClosing time for Saturday\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eclose_6\u003c/td\u003e\u003ctd\u003eTime\u003c/td\u003e\u003ctd\u003eClosing time for Sunday\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\nThese deprecated attributes define opening hours without breaks. Given `opening_hours_tue` with a break defined as this: `['08:00', '12:00', '12:30', '16:00']` it would yield `open_1` to be `08:00` and `close_1'` to be `16:00`. These attributes are deprecated and will be removed in a future API version.\n\n### Listing\n\n`GET /resources/` will return all resources.\n\nResponse\n\n```json\n[\n  {\n    \"resource\": {\n      \"capacity\": 1,\n      \"created_at\": \"2012-09-20T15:34:16+02:00\",\n      \"id\": 1,\n      \"opening_hours_mon\": [\"08:00\", \"16:00\"],\n      \"opening_hours_tue\": [\"08:00\", \"11:00\", \"13:00\", \"17:30\"],\n      \"opening_hours_wed\": [\"08:00\", \"16:00\"],\n      \"opening_hours_thu\": [\"08:00\", \"12:00\", \"14:00\", \"20:00\"],\n      \"opening_hours_fri\": [\"08:00\", \"12:00\", \"12:30\", \"17:30\"],\n      \"opening_hours_sat\": null,\n      \"opening_hours_sun\": null,\n      \"title\": \"Mr. Spine Twister\",\n      \"updated_at\": \"2012-09-20T15:34:16+02:00\"\n    }\n  }\n]\n```\n\n### Get resource\n\n`GET /resources/{resource_id}` will get a resource with id `{resource_id}`.\n\n### Add new resource\n\n`POST /resources` will create a new resource.\n\n### Update resource\n\n`PUT /resources/{resource_id}` will update existing resource with id `{resource_id}`.\n\n### Delete resource\n\n`DELETE /resources/{resource_id}` will delete existing resource with id `{resource_id}`. Deleting a resource will set it to active=false and will not be returned in any listings.\n\n### Get opening hours for specific dates\n\nOpening hours for specific dates is based on the standard opening hours that are specified on the resource but can be overridden with entries in [resource exception dates](#resource-exception-dates).\n\n#### Listing\n\n`GET /resources/{resource_id}/opening_hours` will get opening hours on specific dates for resource with id `{resource_id}`.\n\nResponse\n\n```json\n[\n  {\n    \"resource_opening_hours\": {\n      \"date\": \"2015-12-03\",\n      \"opening_hours\": [\"10:00\", \"12:00\"]\n    }\n  },\n  {\n    \"resource_opening_hours\": {\n      \"date\": \"2015-12-04\",\n      \"opening_hours\": null\n    }\n  }\n]\n```\n\n#### Query Parameters\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003efrom\u003c/td\u003e\u003ctd\u003eDate\u003c/td\u003e\u003ctd\u003eDefault: today\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eto\u003c/td\u003e\u003ctd\u003eDate\u003c/td\u003e\u003ctd\u003eDefault: today\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n## Resource exception dates\n\nOpening hours for a resource is what is used to generate available slots for a service.\nIt is based on the default opening hours on the resource unless anything else is specified by a resource exception date.\nSo ignore the poorly naming of the feature and treat it as opening hours on dates.\nIf a resource should be closed for a week then you would add resource exception dates.\nIf a resource should have opening hours 08:00 to 14:00 on January 5th 2016 instead of the default opening hours for that weekday which could be 09:00 to 15:00, then add it as a resource exception date.\nSee [resource opening hours](#default-opening-hours) for how to specify.\n\nA `null` value will fallback to the default availability for the resource. An empty array means the resource is closed on the specified exception date.\n\nException dates are related to a resource: `GET /resources/{resource_id}/exception_dates`.\n\n### Attributes\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecreated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eupdated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eresource_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eRequired (specified in URL)\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eexception_date\u003c/td\u003e\u003ctd\u003eDate\u003c/td\u003e\u003ctd\u003eRequired (specified in URL)\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopening_hours\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eSame format as resource opening hours\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eservice_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Listing\n\n`GET /resources/{resource_id}/exception_dates` will return all exception dates for resource with id `{resource_id}`.\n\nResponse\n\n```json\n[\n  {\n    \"resource_exception_date\": {\n      \"created_at\": \"2012-09-20T15:34:16+02:00\",\n      \"resource_id\": 1,\n      \"exception_date\": \"2014-01-08\",\n      \"opening_hours\": [\"08:00\", \"12:00\", \"12:30\", \"17:30\"],\n      \"updated_at\": \"2012-09-20T15:34:16+02:00\"\n    }\n  }\n]\n```\n\n#### Query Parameters\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003efrom\u003c/td\u003e\u003ctd\u003eDate\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eto\u003c/td\u003e\u003ctd\u003eDate\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Get exception date\n\n`GET /resources/{resource_id}/exception_dates/{exception_date}` will get the exception date `{exception_date}` for resource `{resource_id}`. If no existing entry is found a 404 HTTP status code is returned. In that case standard opening hours apply.\n\n### Add new or update exception date\n\n`POST /resources/{resource_id}/exception_dates/{exception_date}` will create a new or update an existing exception date `{exception_date}` for resource `{resource_id}`. You can also use `PUT`, both methods works the same way regardless if it is a new entry or an update to an existing one.\n\n### Add new or update multiple exception dates\n\n`POST /resources/{resource_id}/exception_dates/` will create new or update existing exception dates for resource `{resource_id}`. You can also use `PUT`, both methods works the same way regardless if it is a new entry or an update to an existing one.\n\nTo delete an existing exception date set `{_destroy}` to be true.\n\n```json\n{\n  \"resource_exception_dates\": [\n    {\n      \"exception_date\": \"2015-10-22\",\n      \"opening_hours\": [\n      \"12:00\",\n      \"14:30\"\n      ]\n    },\n    {\n      \"exception_date\": \"2015-10-25\",\n      \"opening_hours\": [\n      \"08:30\",\n      \"12:30\",\n      \"15:00\",\n      \"18:30\"\n      ]\n    },\n    {\n      \"exception_date\": \"2015-10-26\",\n      \"opening_hours\": [\n      \"10:30\",\n      \"15:00\"\n      ]\n    },\n    {\n      \"exception_date\": \"2015-10-27\",\n      \"opening_hours\": null\n    },\n    {\n      \"exception_date\": \"2015-10-28\",\n      \"_destroy\": true\n    }\n  ]\n}\n```\n\n### Delete exception date\n\n`DELETE /resources/{resource_id}/exception_dates/{exception_date}` will delete existing exception date `{exception_date}` for resource `{resource_id}`.\n\n## Providers\n\nResources provides services. This link is called a provider.\n\n### Attributes\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eid\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecreated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eupdated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eactive\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eresource_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eservice_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopening_hours_mon\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eOpening hours for Monday. Fallback to resource availability.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopening_hours_tue\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eOpening hours for Tuesday. Fallback to resource availability.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopening_hours_wed\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eOpening hours for Wednesday. Fallback to resource availability.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopening_hours_thu\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eOpening hours for Thursday. Fallback to resource availability.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopening_hours_fri\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eOpening hours for Friday. Fallback to resource availability.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopening_hours_sat\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eOpening hours for Saturday. Fallback to resource availability.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eopening_hours_sun\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eOpening hours for Sunday. Fallback to resource availability.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\nOpening hours for a provider works in the same way as availability is defined on [resource exception date](#resource-exception-date).\n\n### Listing\n\n`GET /providers/` will return all providers.\n\nResponse\n\n```json\n[\n  {\n    \"provider\": {\n      \"created_at\": \"2012-09-20T15:34:16+02:00\",\n      \"id\": 1,\n      \"resource_id\": 1,\n      \"service_id\": 1,\n      \"updated_at\": \"2012-09-20T15:34:16+02:00\"\n    }\n  }\n]\n```\n\n### Get provider\n\n`GET /providers/{provider_id}` will get a provider with id `{provider_id}`.\n\n### Add new provider\n\n`POST /providers` will create a new provider.\n\n### Delete provider\n\n`DELETE /providers/{provider_id}` will delete existing provider with id `{provider_id}`.\n\n## Categories\n\nServices can be listed in a category. Categories can be presented like a tree. Root categories are defined with empty `{parent_id}`.\n\n### Attributes\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eid\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecreated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eupdated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003etitle\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eparent_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecustom_data\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eNot required.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Listing\n\n`GET /categories/` will return all categories.\n\nResponse\n\n```json\n[\n  {\n    \"category\": {\n      \"created_at\": \"2012-09-20T15:34:16+02:00\",\n      \"custom_data\": null,\n      \"id\": 1,\n      \"parent_id\": null,\n      \"title\": \"My first little category\",\n      \"updated_at\": \"2012-09-20T15:34:16+02:00\"\n    }\n  }\n]\n```\n\n### Get category\n\n`GET /categories/{category_id}` will get a category with id `{category_id}`.\n\n### Add new category\n\n`POST /categories` will create a new category. To add connected services specify array of `{service_id}` in parameter `{service_id_list}`.\n\n### Update category\n\n`PUT /categories/{category_id}` will update existing category with id `{category_id}`. To add connected services specify array of `{service_id}` in parameter `{service_id_list}`.\n\n### Delete category\n\n`DELETE /categories/{category_id}` will delete existing category with id `{category_id}`.\n\n### List services\n\n`GET /categories/{category_id}/services` will return all services for category with id `{category_id}`.\n\nFor any additional usage of a service please use the main [service endpoint](#services).\n\n## Coupons\n\n### Attributes\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eid\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecreated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eupdated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003etitle\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecode\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003evalue_type\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eValues: percentage or amount.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003evalue\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003evalid_from\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003evalid_until\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eactive\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eapplies_to\u003c/td\u003e\u003ctd\u003eObject\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eallowed_booking_start_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eallowed_booking_end_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003emin_order_amount\u003c/td\u003e\u003ctd\u003eDecimal\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003emax_order_amount\u003c/td\u003e\u003ctd\u003eDecimal\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eavailability\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eWill decrease when used\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003emin_count\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003emax_count\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecustom_data\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003eNot required.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Listing\n\n`GET /coupons/` will return all coupons.\n\nResponse\n\n```json\n[\n  {\n    \"coupon\": {\n      \"id\": 1,\n      \"code\": \"SUPERWEEKND\",\n      \"value_type\": \"percentage\",\n      \"value\": 50,\n      \"title\": \"Super weekend - 50% off for first 100 customers\",\n      \"valid_from\": \"2024-09-11T09:30:00+02:00\",\n      \"valid_until\": null,\n      \"active\": true,\n      \"applies_to\": {},\n      \"allowed_booking_start_at\": \"2024-08-16T00:00:00+02:00\",\n      \"allowed_booking_end_at\": \"2024-08-18T00:00:00+02:00\",\n      \"min_order_amount\": \"50.0\",\n      \"max_order_amount\": \"500.0\",\n      \"availability\": 100,\n      \"min_count\": null,\n      \"max_count\": null,\n      \"custom_data\": null,\n      \"created_at\": \"2024-08-15T16:04:09+02:00\",\n      \"updated_at\": \"2024-09-04T02:00:20+02:00\"\n    }\n  }\n]\n```\n\n### Get coupon\n\n`GET /coupons/{coupon_id}` will get a coupon with id `{coupon_id}`.\n\n### Add new coupon\n\n`POST /coupons` will create a new coupon.\n\n### Update coupon\n\n`PUT /coupons/{coupon_id}` will update existing coupon with id `{coupon_id}`.\n\n### Delete coupon\n\n`DELETE /coupons/{coupon_id}` will delete existing coupon with id `{coupon_id}`.\n\n## Webhooks Endpoint\n\n### Attributes\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eid\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecreated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eupdated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003etarget_url\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eevent\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eactive\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\nSee webhook overview for a [list of events](#supported-events), wildcard usage to trigger from multiple events, and how to handle webhook events from Makeplans.\n\n### Listing\n\n`GET /web_hooks/` will return all webhooks.\n\nResponse\n\n```json\n[\n  {\n    \"web_hook\": {\n      \"id\": 1,\n      \"target_url\": \"https://example.com/newcustomer/yeah\",\n      \"event\": \"person.created\",\n      \"active\": true,\n      \"created_at\": \"2012-09-20T15:34:16+02:00\",\n      \"updated_at\": \"2012-09-20T15:34:16+02:00\"\n    }\n  }\n]\n```\n\n### Get webhook\n\n`GET /web_hook/{web_hook_id}` will get a webhook with id `{web_hook_id}`.\n\n### Add new webhook\n\n`POST /web_hook` will create a new webhook.\n\n### Update webhook\n\n`PUT /web_hook/{web_hook_id}` will update existing webhook with id `{web_hook_id}`.\n\n### Delete webhook\n\n`DELETE /web_hook/{web_hook_id}` will delete existing webhook with id `{web_hook_id}`.\n\n## Account\n\nInformation and settings for your account.\n\n### Attributes\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eid\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecreated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eupdated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esubdomain\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eemail\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ename\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003egoogle_analytics\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecss_url\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003etime_zone\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003everification_method\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eaddress\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecountry_code\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired. ISO 3166-1 alpha-2.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003egoogle_merchant_id\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003egoogle_merchant_key\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003elogo\u003c/td\u003e\u003ctd\u003eFile\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003etemplate\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eservice_template\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003elocale\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired. Supported locales: 'en', 'sv' and 'nb'. Default: 'en'.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecurrency\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eISO4217 currency code\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eemail_notification\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003email_notification_recipient\u003c/td\u003e\u003ctd\u003eEmail\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esms_notification\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ephone_number\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003econfirm_manually\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esettings\u003c/td\u003e\u003ctd\u003eArray\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003epublic_access\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003einterval_rounding\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eDefault setting for all services for rounding to next available time. '15' will round 10:07 to become 10:15 as next available slot time.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eslot_generation_type\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eDefault: 2. 1=fixed. 2=next available.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003efuture_bookable_period\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNatural language date/time relative to current time.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003efirst_bookable_period\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNatural language date/time relative to current time.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003epayment_provider\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003efooter\u003c/td\u003e\u003ctd\u003eText\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003everification_methods\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ereminder_sms\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eclosed_for_holidays\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003enew_user_text\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003eAbove booking form.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003enew_booking_text\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003eBooking confirmation page.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ebooking_form\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003eCustom booking form.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eperson_form\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003eFor custom data in administration system.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eresource_form\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003eFor custom data in administration system.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eservice_form\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003eFor custom data in administration system.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eevent_form\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003eFor custom data in administration system.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eappointment_form\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003eFor custom data in administration system.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecategory_form\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003eFor custom data in administration system.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esms_verification\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esms_confirmation\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esms_modification\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esms_cancellation\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003esms_reminder\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003email_verification\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003email_confirmation\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003email_modification\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003email_cancellation\u003c/td\u003e\u003ctd\u003eLiquid-Text\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003email_verification_subject\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003email_confirmation_subject\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003email_modification_subject\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003email_cancellation_subject\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eallow_cancellation\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecancellation_period\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eNatural language date/time relative to start of booking.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n#### Additional parameters\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eremove_logo\u003c/td\u003e\u003ctd\u003eBoolean\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Get account\n\n`GET /client` will get the account.\n\n### Update account\n\n`PUT /client` will update the account.\n\n### Holidays\n\nWho doesn't like a holiday?\n\n#### Listing\n\n`GET /client/holidays` will get holidays for account country.\n\nResponse\n\n```json\n[\n  {\n    \"holiday\": {\n      \"date\": \"2016-01-01\",\n      \"name\": \"New Year's Day\"\n    }\n  },\n  {\n    \"holiday\": {\n      \"date\": \"2016-05-01\",\n      \"name\": \"International Workers' Day\"\n    }\n  }\n]\n```\n\n##### Query Parameters\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003efrom\u003c/td\u003e\u003ctd\u003eDate\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eto\u003c/td\u003e\u003ctd\u003eDate\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### Users\n\nUsers who can login into the account.\n\n#### Attributes for user role on the account\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eid\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecreated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eupdated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003euser_id\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003erole\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eadmin, manager or staff\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003euser\u003c/td\u003e\u003ctd\u003eObject\u003c/td\u003e\u003ctd\u003eSee attributes for a user\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n#### Attributes for user\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eType\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eid\u003c/td\u003e\u003ctd\u003eInteger\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ecreated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eupdated_at\u003c/td\u003e\u003ctd\u003eDatetime\u003c/td\u003e\u003ctd\u003eAutomatically set\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ename\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eemail\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eRequired\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003ephone_number\u003c/td\u003e\u003ctd\u003eString\u003c/td\u003e\u003ctd\u003eAlso available as phonenumber (deprecated).\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n#### Listing\n\n`GET /client/users` will list all users with access to the account.\n\nResponse\n\n```json\n[\n  {\n    \"client_user_link\": {\n      \"id\": 1337,\n      \"created_at\": \"2016-11-07T07:26:32+01:00\",\n      \"updated_at\": \"2016-11-07T07:27:42+01:00\",\n      \"role\": \"admin\",\n      \"user_id\": 1,\n      \"user\": {\n          \"id\": 1,\n          \"email\": \"maestro@example.org\",\n          \"phone_number\": \"180\",\n          \"name\": \"Espen Antonsen\",\n          \"created_at\": \"2016-11-07T07:26:32+01:00\",\n          \"updated_at\": \"2016-11-07T07:27:42+01:00\"\n      }\n    }\n  }\n]\n```\n\n### Get user\n\n`GET /client/users/{user_link_id}` will get a user with id `{user_link_id}`.\n\n#### Add new user\n\n`GET /client/users` will create a new user. An email is sent to the user so the user can specify their password.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmakeplans%2Fmakeplans-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmakeplans%2Fmakeplans-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmakeplans%2Fmakeplans-api/lists"}