PROJECT MANAGEMENT · TASKS
Bookings, projects, resources, and time entries on that team’s schedule.
Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.
Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.
Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.
Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.
hubplanner_delete_billingrate_by_idWRITEDelete Billing Rate via DELETE /billingRate/{id}
hubplanner_delete_bookingWRITEDelete Bookings Bulk via DELETE /booking. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send. The request body is a JSON ARRAY, not an object. Bulk delete. It names its targets by query (`ids`, `resourceId`, `projectId`) or by a JSON array of ids in the body, and removes EVERY match in one call.
hubplanner_delete_booking_by_idWRITEDelete Booking via DELETE /booking/{id}
hubplanner_delete_calendar_by_idWRITEDelete Public Holiday Calendar via DELETE /calendar/{id}
hubplanner_delete_categories_by_idWRITEDelete Booking Category via DELETE /categories/{id}
hubplanner_delete_category_groups_by_idWRITEDelete Category Group via DELETE /category-groups/{id}
hubplanner_delete_client_by_idWRITEDelete Client via DELETE /client/{id}
hubplanner_delete_costcategories_by_idWRITEDelete Project Cost Category via DELETE /costCategories/{id}
hubplanner_delete_customavailabilityoverride_by_idWRITEDelete Custom Availability Override via DELETE /customAvailabilityOverride/{id}
hubplanner_delete_event_by_idWRITEDelete Event via DELETE /event/{id}
hubplanner_delete_holiday_by_idWRITEDelete Holiday via DELETE /holiday/{id}
hubplanner_delete_milestone_by_idWRITEDelete Milestone via DELETE /milestone/{id}
hubplanner_delete_projectWRITEDelete Projects Bulk via DELETE /project. The request body is a JSON ARRAY, not an object. Bulk delete. It names its targets by query (`ids`, `resourceId`, `projectId`) or by a JSON array of ids in the body, and removes EVERY match in one call.
hubplanner_delete_project_by_idWRITEDelete Project via DELETE /project/{id}
hubplanner_delete_project_by_id_tag_by_tagidWRITERemove Project Tag via DELETE /project/{id}/tag/{tagId}
hubplanner_delete_project_customfield_template_by_idWRITEDelete Project Custom Field Template via DELETE /project/customField/template/{id}
hubplanner_delete_project_tag_by_idWRITEDelete Project Tag via DELETE /project-tag/{id}
hubplanner_delete_projectgroup_by_idWRITEDelete Project Group via DELETE /projectgroup/{id}
hubplanner_delete_resourceWRITEDelete Resources Bulk via DELETE /resource. The request body is a JSON ARRAY, not an object. Bulk delete. It names its targets by query (`ids`, `resourceId`, `projectId`) or by a JSON array of ids in the body, and removes EVERY match in one call.
hubplanner_delete_resource_by_idWRITEDelete Resource via DELETE /resource/{id}
hubplanner_delete_resource_by_id_tag_by_tagidWRITERemove Resource Tag via DELETE /resource/{id}/tag/{tagId}
hubplanner_delete_resource_customfield_template_by_idWRITEDelete Resource Custom Field Template via DELETE /resource/customField/template/{id}
hubplanner_delete_resource_tag_by_idWRITEDelete Resource Tag via DELETE /resource-tag/{id}
hubplanner_delete_subscription_by_subscription_idWRITEDelete Webhook Subscription via DELETE /subscription/{subscription_id}
hubplanner_delete_timeentryWRITEDelete Time Entries Bulk via DELETE /timeentry. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send. The request body is a JSON ARRAY, not an object. Bulk delete. It names its targets by query (`ids`, `resourceId`, `projectId`) or by a JSON array of ids in the body, and removes EVERY match in one call.
hubplanner_delete_timeentry_by_idWRITEDelete Time Entry via DELETE /timeentry/{id}
hubplanner_delete_unassigned_work_by_idWRITEDelete Unassigned Work via DELETE /unassigned-work/{id}
hubplanner_delete_vacation_by_idWRITEDelete Vacation via DELETE /vacation/{id}
hubplanner_get_billingrateREADGet All Billing Rates via GET /billingRate
hubplanner_get_billingrate_by_idREADGet Billing Rate via GET /billingRate/{id}
hubplanner_get_bookingREADGet All Bookings via GET /booking. This endpoint is one of the two whose `limit` defaults to 20 rather than unlimited, so an omitted `limit` silently truncates the result.
hubplanner_get_booking_by_idREADGet Booking via GET /booking/{id}
hubplanner_get_calendarREADGet All Public Holiday Calendars via GET /calendar
hubplanner_get_calendar_by_idREADGet Public Holiday Calendar via GET /calendar/{id}
hubplanner_get_categoriesREADGet All Booking Categories via GET /categories
hubplanner_get_categories_by_idREADGet Booking Category via GET /categories/{id}
hubplanner_get_category_groupsREADGet All Category Groups via GET /category-groups
hubplanner_get_category_groups_by_idREADGet Category Group via GET /category-groups/{id}
hubplanner_get_clientREADGet All Clients via GET /client
hubplanner_get_client_by_idREADGet Client via GET /client/{id}
hubplanner_get_costcategoriesREADGet All Project Cost Categories via GET /costCategories
hubplanner_get_costcategories_by_idREADGet Project Cost Category via GET /costCategories/{id}
hubplanner_get_customavailabilityoverride_by_idREADGet Custom Availability Override via GET /customAvailabilityOverride/{id}
hubplanner_get_customavailabilityoverride_findbyresourceid_by_resourceidREADGet Custom Availability Overrides By Resource via GET /customAvailabilityOverride/findByResourceId/{resourceId}
hubplanner_get_eventREADGet All Events via GET /event
hubplanner_get_event_by_idREADGet Event via GET /event/{id}
hubplanner_get_holidayREADGet All Holidays via GET /holiday
hubplanner_get_holiday_by_idREADGet Holiday via GET /holiday/{id}
hubplanner_get_milestone_by_idREADGet Milestone via GET /milestone/{id}
hubplanner_get_projectREADGet All Projects via GET /project
hubplanner_get_project_by_idREADGet Project via GET /project/{id}
hubplanner_get_project_by_id_clientREADGet Project Clients via GET /project/{id}/client
hubplanner_get_project_by_id_tagREADGet Project Tags via GET /project/{id}/tag
hubplanner_get_project_customfield_templateREADGet Project Custom Field Templates via GET /project/customField/template
hubplanner_get_project_customfield_template_by_idREADGet Project Custom Field Template via GET /project/customField/template/{id}
hubplanner_get_project_managerREADGet All Project Managers via GET /project-manager
hubplanner_get_project_tagREADGet All Project Tags via GET /project-tag
hubplanner_get_projectgroupREADGet All Project Groups via GET /projectgroup
hubplanner_get_projectgroup_by_idREADGet Project Group via GET /projectgroup/{id}
hubplanner_get_resourceREADGet All Resources via GET /resource
hubplanner_get_resource_by_idREADGet Resource via GET /resource/{id}
hubplanner_get_resource_by_id_tagREADGet Resource Tags via GET /resource/{id}/tag
hubplanner_get_resource_customfield_templateREADGet Resource Custom Field Templates via GET /resource/customField/template
hubplanner_get_resource_customfield_template_by_idREADGet Resource Custom Field Template via GET /resource/customField/template/{id}
hubplanner_get_resource_tagREADGet All Resource Tags via GET /resource-tag
hubplanner_get_resourcegroupREADGet All Resource Groups via GET /resourcegroup
hubplanner_get_subscriptionREADGet All Webhook Subscriptions via GET /subscription
hubplanner_get_timeentryREADGet All Time Entries via GET /timeentry. This endpoint is one of the two whose `limit` defaults to 20 rather than unlimited, so an omitted `limit` silently truncates the result.
hubplanner_get_timeentry_by_idREADGet Time Entry via GET /timeentry/{id}
hubplanner_get_unassigned_workREADGet All Unassigned Work via GET /unassigned-work
hubplanner_get_unassigned_work_by_idREADGet Unassigned Work via GET /unassigned-work/{id}
hubplanner_get_vacationREADGet All Vacations via GET /vacation
hubplanner_get_vacation_by_idREADGet Vacation via GET /vacation/{id}
hubplanner_patch_booking_by_idWRITEPatch Booking via PATCH /booking/{id}. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_patch_projectWRITEUpdate Projects via PATCH /project. The request body is a JSON ARRAY, not an object.
hubplanner_patch_project_by_id_tagWRITEAdd Project Tags via PATCH /project/{id}/tag
hubplanner_patch_resourceWRITEUpdate Resources via PATCH /resource. The request body is a JSON ARRAY, not an object.
hubplanner_patch_resource_by_id_tagWRITEAdd Resource Tags via PATCH /resource/{id}/tag
hubplanner_patch_vacation_by_idWRITEPatch Vacation via PATCH /vacation/{id}. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_post_billingrateWRITECreate Billing Rate via POST /billingRate
hubplanner_post_billingrate_searchREADSearch Billing Rates via POST /billingRate/search. The request body is a MongoDB-style query document, not a flat filter: {"_id": {"$in": ["5c3...", "5c4..."]}} selects by id and {"start": {"$lt": "2014-07-15"}} by comparison.
hubplanner_post_bookingWRITECreate Booking via POST /booking. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_post_booking_searchREADSearch Bookings via POST /booking/search. The request body is a MongoDB-style query document, not a flat filter: {"_id": {"$in": ["5c3...", "5c4..."]}} selects by id and {"start": {"$lt": "2014-07-15"}} by comparison. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send. This endpoint is one of the two whose `limit` defaults to 20 rather than unlimited, so an omitted `limit` silently truncates the result.
hubplanner_post_calendarWRITECreate Public Holiday Calendar via POST /calendar
hubplanner_post_categoriesWRITECreate Booking Category via POST /categories
hubplanner_post_categories_searchREADSearch Booking Categories via POST /categories/search. The request body is a MongoDB-style query document, not a flat filter: {"_id": {"$in": ["5c3...", "5c4..."]}} selects by id and {"start": {"$lt": "2014-07-15"}} by comparison.
hubplanner_post_category_groupsWRITECreate Category Group via POST /category-groups
hubplanner_post_category_groups_searchREADSearch Category Groups via POST /category-groups/search. The request body is a MongoDB-style query document, not a flat filter: {"_id": {"$in": ["5c3...", "5c4..."]}} selects by id and {"start": {"$lt": "2014-07-15"}} by comparison.
hubplanner_post_clientWRITECreate Client via POST /client
hubplanner_post_client_searchREADSearch Clients via POST /client/search. The request body is a MongoDB-style query document, not a flat filter: {"_id": {"$in": ["5c3...", "5c4..."]}} selects by id and {"start": {"$lt": "2014-07-15"}} by comparison.
hubplanner_post_costcategoriesWRITECreate Project Cost Category via POST /costCategories
hubplanner_post_costcategories_searchREADSearch Project Cost Categories via POST /costCategories/search. The request body is a MongoDB-style query document, not a flat filter: {"_id": {"$in": ["5c3...", "5c4..."]}} selects by id and {"start": {"$lt": "2014-07-15"}} by comparison.
hubplanner_post_customavailabilityoverrideWRITECreate Custom Availability Override via POST /customAvailabilityOverride. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_post_eventWRITECreate Event via POST /event. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_post_event_searchREADSearch Events via POST /event/search. The request body is a MongoDB-style query document, not a flat filter: {"_id": {"$in": ["5c3...", "5c4..."]}} selects by id and {"start": {"$lt": "2014-07-15"}} by comparison. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_post_holidayWRITECreate Holiday via POST /holiday. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_post_holiday_searchREADSearch Holidays via POST /holiday/search. The request body is a MongoDB-style query document, not a flat filter: {"_id": {"$in": ["5c3...", "5c4..."]}} selects by id and {"start": {"$lt": "2014-07-15"}} by comparison. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_post_milestoneWRITECreate Milestone via POST /milestone. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_post_milestone_searchREADSearch Milestones via POST /milestone/search. The request body is a MongoDB-style query document, not a flat filter: {"_id": {"$in": ["5c3...", "5c4..."]}} selects by id and {"start": {"$lt": "2014-07-15"}} by comparison. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_post_projectWRITECreate Project via POST /project
hubplanner_post_project_addresourcestoproject_by_projectidWRITEAdd Resources To Project via POST /project/addResourcesToProject/{projectId}
hubplanner_post_project_by_projectid_clientWRITEAdd Clients To Project via POST /project/{projectId}/client
hubplanner_post_project_client_by_clientidWRITERemove Client From Projects via POST /project/client/{clientId}
hubplanner_post_project_customfield_templateWRITECreate Project Custom Field Template via POST /project/customField/template
hubplanner_post_project_customfield_template_by_id_addchoicesWRITEAdd Project Custom Field Choices via POST /project/customField/template/{id}/addChoices. The request body is a JSON ARRAY, not an object.
hubplanner_post_project_customfield_template_searchREADSearch Project Custom Field Templates via POST /project/customField/template/search. The request body is a MongoDB-style query document, not a flat filter: {"_id": {"$in": ["5c3...", "5c4..."]}} selects by id and {"start": {"$lt": "2014-07-15"}} by comparison.
hubplanner_post_project_removeresourcefromprojects_by_resourceidWRITERemove Resource From Projects via POST /project/removeResourceFromProjects/{resourceId}
hubplanner_post_project_searchREADSearch Projects via POST /project/search. The request body is a MongoDB-style query document, not a flat filter: {"_id": {"$in": ["5c3...", "5c4..."]}} selects by id and {"start": {"$lt": "2014-07-15"}} by comparison.
hubplanner_post_project_tagWRITECreate Project Tag via POST /project-tag
hubplanner_post_projectgroupWRITECreate Project Group via POST /projectgroup
hubplanner_post_projectgroup_addprojectstogroup_by_groupidWRITEAdd Projects To Group via POST /projectgroup/addProjectsToGroup/{groupId}
hubplanner_post_projectgroup_removeprojectfromgroups_by_projectidWRITERemove Project From Groups via POST /projectgroup/removeProjectFromGroups/{projectId}
hubplanner_post_resourceWRITECreate Resource via POST /resource
hubplanner_post_resource_customfield_templateWRITECreate Resource Custom Field Template via POST /resource/customField/template
hubplanner_post_resource_customfield_template_by_id_addchoicesWRITEAdd Resource Custom Field Choices via POST /resource/customField/template/{id}/addChoices. The request body is a JSON ARRAY, not an object.
hubplanner_post_resource_customfield_template_searchREADSearch Resource Custom Field Templates via POST /resource/customField/template/search. The request body is a MongoDB-style query document, not a flat filter: {"_id": {"$in": ["5c3...", "5c4..."]}} selects by id and {"start": {"$lt": "2014-07-15"}} by comparison.
hubplanner_post_resource_searchREADSearch Resources via POST /resource/search. The request body is a MongoDB-style query document, not a flat filter: {"_id": {"$in": ["5c3...", "5c4..."]}} selects by id and {"start": {"$lt": "2014-07-15"}} by comparison.
hubplanner_post_resource_tagWRITECreate Resource Tag via POST /resource-tag
hubplanner_post_resourcegroup_addresourcestogroup_by_groupidWRITEAdd Resources To Group via POST /resourcegroup/addResourcesToGroup/{groupId}
hubplanner_post_resourcegroup_removeresourcefromgroups_by_resourceidWRITERemove Resource From Groups via POST /resourcegroup/removeResourceFromGroups/{resourceId}
hubplanner_post_subscriptionWRITECreate Webhook Subscription via POST /subscription
hubplanner_post_timeentryWRITECreate Time Entry via POST /timeentry. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_post_timeentry_searchREADSearch Time Entries via POST /timeentry/search. The request body is a MongoDB-style query document, not a flat filter: {"_id": {"$in": ["5c3...", "5c4..."]}} selects by id and {"start": {"$lt": "2014-07-15"}} by comparison. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send. This endpoint is one of the two whose `limit` defaults to 20 rather than unlimited, so an omitted `limit` silently truncates the result.
hubplanner_post_unassigned_workWRITECreate Unassigned Work via POST /unassigned-work. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_post_vacationWRITECreate Vacation via POST /vacation. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_post_vacation_searchREADSearch Vacations via POST /vacation/search. The request body is a MongoDB-style query document, not a flat filter: {"_id": {"$in": ["5c3...", "5c4..."]}} selects by id and {"start": {"$lt": "2014-07-15"}} by comparison. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_put_billingrate_by_idWRITEUpdate Billing Rate via PUT /billingRate/{id}
hubplanner_put_booking_by_idWRITEUpdate Booking via PUT /booking/{id}. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send. A PUT REPLACES the booking: send the entire booking object, not a delta. Use PATCH /booking/{id} for a property-level update.
hubplanner_put_calendar_by_idWRITEUpdate Public Holiday Calendar via PUT /calendar/{id}
hubplanner_put_categories_by_idWRITEUpdate Booking Category via PUT /categories/{id}
hubplanner_put_category_groups_by_idWRITEUpdate Category Group via PUT /category-groups/{id}
hubplanner_put_client_by_idWRITEUpdate Client via PUT /client/{id}
hubplanner_put_costcategories_by_idWRITEUpdate Project Cost Category via PUT /costCategories/{id}
hubplanner_put_customavailabilityoverride_by_idWRITEUpdate Custom Availability Override via PUT /customAvailabilityOverride/{id}. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_put_event_by_idWRITEUpdate Event via PUT /event/{id}. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_put_holiday_by_idWRITEUpdate Holiday via PUT /holiday/{id}. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_put_milestone_by_idWRITEUpdate Milestone via PUT /milestone/{id}. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_put_project_by_idWRITEUpdate Project via PUT /project/{id}
hubplanner_put_project_by_projectid_project_managersWRITESet Project Managers via PUT /project/{projectId}/project-managers. The request body is a JSON ARRAY, not an object.
hubplanner_put_project_customfield_template_by_idWRITEUpdate Project Custom Field Template via PUT /project/customField/template/{id}
hubplanner_put_project_tag_by_idWRITEUpdate Project Tag via PUT /project-tag/{id}
hubplanner_put_projectgroup_by_idWRITEUpdate Project Group via PUT /projectgroup/{id}
hubplanner_put_resource_by_idWRITEUpdate Resource via PUT /resource/{id}
hubplanner_put_resource_customfield_template_by_idWRITEUpdate Resource Custom Field Template via PUT /resource/customField/template/{id}
hubplanner_put_resource_tag_by_idWRITEUpdate Resource Tag via PUT /resource-tag/{id}
hubplanner_put_resourcegroup_addapprovertogroups_by_resourceidWRITEAdd Approver To Resource Groups via PUT /resourcegroup/addApproverToGroups/{resourceId}
hubplanner_put_resourcegroup_by_idWRITEUpdate Resource Group via PUT /resourcegroup/{id}
hubplanner_put_resourcegroup_removeapproverfromgroups_by_resourceidWRITERemove Approver From Resource Groups via PUT /resourcegroup/removeApproverFromGroups/{resourceId}
hubplanner_put_timeentry_by_idWRITEUpdate Time Entry via PUT /timeentry/{id}. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_put_unassigned_work_by_idWRITEUpdate Unassigned Work via PUT /unassigned-work/{id}. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
hubplanner_put_vacation_by_idWRITEUpdate Vacation via PUT /vacation/{id}. Dates in the request body are NAIVE LOCAL strings, not ISO-8601: "2014-11-03" for an all-day entry and "2017-08-21 10:00" alongside "allDay": false. Responses come back ISO-8601; do not normalise the values you send.
Put Hub Planner behind one governed endpoint.
Same permissions, same audit trail, whatever else you connect next.