{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"25afbf89-9124-49cb-a08d-9ca52ec0f4da","name":"Hub Planner API","description":"[Hub Planner](https://hubplanner.com) is a cloud-based Resource Management platform that was founded with the mission of enabling companies of all sizes to schedule their teams effectively. Our goal is simple: make it easy for project managers to schedule their team and for team members to understand what they should work on and report time against.\n\nHub Planners APIs belong to the **Representational State Transfer (REST)** category. They allow you to perform 'RESTful' operations such as reading, modifying, adding or deleting data programmatically from your Hub Planner account.\n\nThe easiest way to get started with the API is grab your API Key from your settings page and use a program like [Postman](https://www.getpostman.com/) to verify the calls you would like to make.\n\n# Overview\n\n1. You need a valid API Key to send requests to the API endpoints. You can get your key from settings -> API. (You must be logged in as the owner)\n2. The API has an access rate limit applied to it.\n3. The Hub Planner API will only respond to secured communication done over HTTPS. HTTP requests will be sent a 301 redirect to corresponding HTTPS resources.\n4. Response to every request is sent in JSON format. In case the API request results in an error, it is represented by an \"error\": {} key in the JSON response.\n5. The request method (verb) determines the nature of action you intend to perform. A request made using the GET method implies that you want to fetch something from Hub Planner, and POST implies you want to save something new to Hub Planner.\n6. The API calls will respond with appropriate HTTP status codes for all requests. A 200 OK indicates all went well, while 4XX or 5XX response codes indicate an error from the requesting client or our API servers respectively.\n7. Individual resources in your Hub Planner Account are accessible using their unique id's (_id).\n    \n\n# Authentication\n\nThe documentation will use this variables which are unique to your account and can be referenced here.\n\n| Key | Value |\n| --- | --- |\n| {{API_URL}} | [https://api.hubplanner.com/v1](https://api.hubplanner.com/v1) |\n| {{API_KEY}} | API Key you get from your Hub Planner account page and used in the Authorization header. |\n\nYou must supply an `Authorization` header with the token for all requests with the value being the {{API_KEY}}. In the header set the `Content-Type` to `application/json`.\n\n# API Calls\n\nHub Planners APIs are plain JSON over HTTP and use the following HTTP verbs:\n\n| Command | Purpose |\n| --- | --- |\n| POST | Create an object. |\n| GET | Fetch one or more objects. |\n| PUT | Update an object. |\n| DELETE | Remove an object. |\n| PATCH | Update a property in the object. |\n\n# Rate Limit\n\nFor security reasons we have a daily limit of 6000 API calls and burst limits of 50 per 5 seconds on every account. Please be careful to avoid these limits as otherwise you will get an error response from the API.\n\n**Note:**\n\n1. Please follow the best practices to stay under the rate limit.\n2. If you need more than the default limit, please [contact us](https://mailto:hello@hubplanner.com).\n3. Even invalid requests will count towards the rate limit.\n    \n\n# Pagination\n\nMost of the endpoints can be paginated using url parameters `limit` and `page`. For Bookings and Time Entries passing no limit returns 20 results by default which can then be paginated, while other end points for Project and Resources will return all results.\n\nThe max limit you can set is `1000`.\n\nIf you pass a limit of `0` or a limit of > `1000`, you will get a Bad Request `400` response from the server.\n\nThe example call to make use of pagination looks like this:\n\n`GET /project?page=0&limit=20`\n\nWhich will paginate endpoint with 20 results per page. Pages start numbering with `0`. If you want to get all results you should loop through pages until you reach page with less than requested amount of elements(in this example less than 20).\n\nThe endpoints that can be paginated in most areas are `GET /areaName` and `POST /areaName/search`.\n\n# Sorting\n\nMost of the endpoints can be sorted ascending or descending based on some of the properties. Documentation for each area you have access to lists sortable fields in the property table. Results can be sorted for `GET /areaName` and `POST /areaName/search` requests.\n\nTo sort the data add `sort` parameter to the url, followed by field you want to sort by. Prefix the property with minus sign(`-`) to sort in descending order. For example:\n\n`GET /projectGroup?sort=-name`\n\nWill sort the project groups in descending order based on their names.\n\nYou can chain multiple sort arguments to create more advanced sort results. For example:\n\n`GET /projectGroup?sort=-groupType&sort=name`\n\nWill first sort project groups by their group types in descending order, then sort each group type alphabetically by name. Sample response(with unnecessary properties ommited):\n\n```\n[\n   {\n      \"name\":\"Eric's Projects\",\n      \"groupType\":\"USER\",\n   },\n   {\n      \"name\":\"Greg's Projects\",\n      \"groupType\":\"USER\",\n   },\n   {\n      \"name\":\"Rudolf's Projects\",\n      \"groupType\":\"USER\",\n   },\n   {\n      \"name\":\"Active Projects\",\n      \"groupType\":\"SYSTEM\",\n   },\n   {\n      \"name\":\"Archived Projects\",\n      \"groupType\":\"SYSTEM\",\n   },\n   {\n      \"name\":\"Events\",\n      \"groupType\":\"SYSTEM\",\n   },\n   {\n      \"name\":\"Floating projects\",\n      \"groupType\":\"SYSTEM\",\n   },\n   {\n      \"name\":\"Pending projects\",\n      \"groupType\":\"SYSTEM\",\n   },\n   {\n      \"name\":\"Planned projects\",\n      \"groupType\":\"SYSTEM\",\n   }\n]\n\n ```\n\nIt's suggested that you use sort argument along with pagination.\n\n# Best Practices\n\n- Whenever possible, please queue API calls at your end. This ensures that you can buffer calls on your end to avoid hitting the rate limit and retry API calls when you hit the rate limit after the retry-after time.\n- Cache non-volatile data on your end whenever it is feasible. For e.g. the mapping between resource name and ID is extremely unlikely to change. Hence, by caching it on the client side, you will be able to avoid API calls.\n- As soon as you recognise that a rate limit increase will be required in the future, contact us. This will make it possible for us to ensure that we are prepared to increase the limit as and when as it is needed.\n- Avoid making API calls directly from a mobile app, rather send the request to your servers and make the API calls from there. This ensures that in the event of an API endpoint being modified, you will be able to make and deploy the change to your server rather than updating your app and forcing your users to the latest version.\n- When retrieving a list of objects, avoid making calls referencing page numbers over 500 (deep pagination). These are performance intensive calls and you may suffer from extremely long response times.","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"2584556","team":246030,"collectionId":"25afbf89-9124-49cb-a08d-9ca52ec0f4da","publishedId":"TVt2e4mM","public":true,"publicUrl":"https://api-docs.hubplanner.com","privateUrl":"https://go.postman.co/documentation/2584556-25afbf89-9124-49cb-a08d-9ca52ec0f4da","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"EF5B25"},"documentationLayout":"classic-single-column","customisation":null,"version":"8.11.6","publishDate":"2021-01-04T11:12:50.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{},"logos":{}},"statusCode":200},"environments":[],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/cfc9a508f5d3f756ca218a72396a77a3378c58769264f22d86e2509290dbb6a8","favicon":"https://hubplanner.com/favicon.ico"},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"}],"canonicalUrl":"https://api-docs.hubplanner.com/view/metadata/TVt2e4mM"}