API Documentation
Resource Requests ¶
Resource Requests ¶
A resource request represents a request for resource allocation on a specific budget (service). It captures the need for a person to be assigned to work on a project for a given period.
Resource requests follow a status lifecycle: pending -> resolved, rejected, or canceled.
When creating a resource request, the booking method determines how time is specified:
-
Hours per day (booking_method_id: 1): set the
timeattribute (minutes per day) -
Percentage per day (booking_method_id: 2): set the
percentageattribute (50 or 100) -
Total time (booking_method_id: 3): set the
total_timeattribute (total minutes for the period)
Resolving a resource request creates one or more bookings atomically. If any booking fails validation, the entire resolve operation is rolled back.
Supported filter params
-
id (array)
-
service_id (array)
-
creator_id (array)
-
resolver_id (array)
-
created_at
-
status (array)
-
started_on
-
ended_on
-
title
-
deleted_at
-
resolved_at
-
query
-
time
-
time_to_close
-
job_title
-
subsidiary_id (array)
-
workplace_id (array)
-
team_id (array)
-
service_type_id (array)
-
tags (array)
Supported sort params
-
id
-
status
-
booking_method_id
-
time
-
total_time
-
percentage
-
created_at
-
resolved_at
-
started_on
-
ended_on
-
service
-
creator
-
resolver
GET /api/v2/resource_requests
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+jsonHeaders
Content-Type: application/vnd.api+json; charset=utf-8Body
{
"data": [
{
"id": "1",
"type": "resource_requests",
"attributes": {
"title": "Resource Request 1",
"started_on": "2026-02-28",
"ended_on": "2026-03-07",
"status": "pending",
"custom_fields": {},
"created_at": "2026-02-28T05:20:45.233+01:00",
"time": 480,
"total_time": null,
"percentage": null,
"rejected_reason": null,
"booking_method_id": 1,
"time_to_close": null,
"exchange_rate": "1.0",
"exchange_rate_normalized": "0.8",
"exchange_date": "2026-02-28",
"currency": "USD",
"currency_default": "USD",
"currency_normalized": "EUR",
"max_cost_per_hour": 0,
"max_cost_per_hour_default": 0,
"max_cost_per_hour_normalized": 0,
"fields": {},
"note": "Test resource request note",
"resolved_at": null,
"canceled_at": null
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2378"
}
},
"service": {
"meta": {
"included": false
}
},
"creator": {
"meta": {
"included": false
}
},
"resolver": {
"meta": {
"included": false
}
},
"custom_field_people": {
"meta": {
"included": false
}
},
"custom_field_attachments": {
"meta": {
"included": false
}
}
}
},
{
"id": "2",
"type": "resource_requests",
"attributes": {
"title": "Resource Request 2",
"started_on": "2026-02-28",
"ended_on": "2026-03-07",
"status": "pending",
"custom_fields": {},
"created_at": "2026-02-28T05:20:45.292+01:00",
"time": 480,
"total_time": null,
"percentage": null,
"rejected_reason": null,
"booking_method_id": 1,
"time_to_close": null,
"exchange_rate": "1.0",
"exchange_rate_normalized": "0.8",
"exchange_date": "2026-02-28",
"currency": "USD",
"currency_default": "USD",
"currency_normalized": "EUR",
"max_cost_per_hour": 0,
"max_cost_per_hour_default": 0,
"max_cost_per_hour_normalized": 0,
"fields": {},
"note": "Test resource request note",
"resolved_at": null,
"canceled_at": null
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2378"
}
},
"service": {
"meta": {
"included": false
}
},
"creator": {
"meta": {
"included": false
}
},
"resolver": {
"meta": {
"included": false
}
},
"custom_field_people": {
"meta": {
"included": false
}
},
"custom_field_attachments": {
"meta": {
"included": false
}
}
}
},
{
"id": "3",
"type": "resource_requests",
"attributes": {
"title": "Resource Request 3",
"started_on": "2026-02-28",
"ended_on": "2026-03-07",
"status": "pending",
"custom_fields": {},
"created_at": "2026-02-28T05:20:45.350+01:00",
"time": 480,
"total_time": null,
"percentage": null,
"rejected_reason": null,
"booking_method_id": 1,
"time_to_close": null,
"exchange_rate": "1.0",
"exchange_rate_normalized": "0.8",
"exchange_date": "2026-02-28",
"currency": "USD",
"currency_default": "USD",
"currency_normalized": "EUR",
"max_cost_per_hour": 0,
"max_cost_per_hour_default": 0,
"max_cost_per_hour_normalized": 0,
"fields": {},
"note": "Test resource request note",
"resolved_at": null,
"canceled_at": null
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2378"
}
},
"service": {
"meta": {
"included": false
}
},
"creator": {
"meta": {
"included": false
}
},
"resolver": {
"meta": {
"included": false
}
},
"custom_field_people": {
"meta": {
"included": false
}
},
"custom_field_attachments": {
"meta": {
"included": false
}
}
}
}
],
"links": {
"first": "http://api-test.productive.io/api/v2/resource_requests?page%5Bnumber%5D=1&page%5Bsize%5D=30",
"last": "http://api-test.productive.io/api/v2/resource_requests?page%5Bnumber%5D=1&page%5Bsize%5D=30"
},
"meta": {
"current_page": 1,
"total_pages": 1,
"total_count": 3,
"page_size": 30,
"max_page_size": 200
}
}Get resource requestsGET/api/v2/resource_requests
GET /api/v2/resource_requests/4
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+jsonHeaders
Content-Type: application/vnd.api+json; charset=utf-8Body
{
"data": {
"id": "4",
"type": "resource_requests",
"attributes": {
"title": "test",
"started_on": "2026-02-28",
"ended_on": "2026-03-07",
"status": "pending",
"custom_fields": {},
"created_at": "2026-02-28T05:20:45.509+01:00",
"time": 480,
"total_time": null,
"percentage": null,
"rejected_reason": null,
"booking_method_id": 1,
"time_to_close": null,
"exchange_rate": "1.0",
"exchange_rate_normalized": "0.8",
"exchange_date": "2026-02-28",
"currency": "USD",
"currency_default": "USD",
"currency_normalized": "EUR",
"max_cost_per_hour": 0,
"max_cost_per_hour_default": 0,
"max_cost_per_hour_normalized": 0,
"fields": {},
"note": "Test resource request note",
"resolved_at": null,
"canceled_at": null
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2379"
}
},
"service": {
"meta": {
"included": false
}
},
"creator": {
"meta": {
"included": false
}
},
"resolver": {
"meta": {
"included": false
}
},
"custom_field_people": {
"meta": {
"included": false
}
},
"custom_field_attachments": {
"meta": {
"included": false
}
}
}
},
"meta": {}
}Gets a resource requestGET/api/v2/resource_requests/{id}
- id
number(required) Example: 1resource request id
POST /api/v2/resource_requests
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+jsonBody
{
"data": {
"type": "resource_requests",
"attributes": {
"title": "test",
"started_on": "2026-02-28",
"ended_on": "2026-03-07",
"time": 480,
"note": "test",
"booking_method_id": 1,
"currency": "USD"
},
"relationships": {
"service": {
"data": {
"type": "services",
"id": "1361"
}
}
}
}
}Headers
Content-Type: application/vnd.api+json; charset=utf-8Body
{
"data": {
"id": "5",
"type": "resource_requests",
"attributes": {
"title": "test",
"started_on": "2026-02-28",
"ended_on": "2026-03-07",
"status": "pending",
"custom_fields": null,
"created_at": "2026-02-28T05:20:45.668+01:00",
"time": 480,
"total_time": null,
"percentage": null,
"rejected_reason": null,
"booking_method_id": 1,
"time_to_close": null,
"exchange_rate": "1.0",
"exchange_rate_normalized": "0.8",
"exchange_date": "2026-02-28",
"currency": "USD",
"currency_default": "USD",
"currency_normalized": "EUR",
"max_cost_per_hour": 0,
"max_cost_per_hour_default": 0,
"max_cost_per_hour_normalized": 0,
"fields": {},
"note": "test",
"resolved_at": null,
"canceled_at": null
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2381"
}
},
"service": {
"meta": {
"included": false
}
},
"creator": {
"meta": {
"included": false
}
},
"resolver": {
"meta": {
"included": false
}
},
"custom_field_people": {
"meta": {
"included": false
}
},
"custom_field_attachments": {
"meta": {
"included": false
}
}
}
},
"meta": {}
}POST /api/v2/resource_requests
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+jsonBody
{
"data": {
"type": "resource_requests",
"attributes": {
"title": null
}
}
}Headers
Content-Type: application/vnd.api+json; charset=utf-8Body
{
"errors": [
{
"status": "422",
"code": "invalid_attribute",
"title": "Invalid Attribute",
"detail": "can't be blank",
"meta": {},
"source": {
"pointer": "data/attributes/title"
}
},
{
"status": "422",
"code": "invalid_attribute",
"title": "Invalid Attribute",
"detail": "can't be blank",
"meta": {},
"source": {
"pointer": "data/attributes/currency"
}
},
{
"status": "422",
"code": "invalid_attribute",
"title": "Invalid Attribute",
"detail": "is not a valid currency",
"meta": {},
"source": {
"pointer": "data/attributes/currency"
}
},
{
"status": "422",
"code": "invalid_attribute",
"title": "Invalid Attribute",
"detail": "can't be blank",
"meta": {},
"source": {
"pointer": "data/attributes/started_on"
}
},
{
"status": "422",
"code": "invalid_attribute",
"title": "Invalid Attribute",
"detail": "is not a date",
"meta": {
"allow_nil": false
},
"source": {
"pointer": "data/attributes/started_on"
}
},
{
"status": "422",
"code": "invalid_attribute",
"title": "Invalid Attribute",
"detail": "can't be blank",
"meta": {},
"source": {
"pointer": "data/attributes/ended_on"
}
},
{
"status": "422",
"code": "invalid_attribute",
"title": "Invalid Attribute",
"detail": "is not a date",
"meta": {
"allow_nil": false,
"after_or_equal_to": "started_on"
},
"source": {
"pointer": "data/attributes/ended_on"
}
},
{
"status": "422",
"code": "invalid_attribute",
"title": "Invalid Attribute",
"detail": "can't be blank",
"meta": {},
"source": {
"pointer": "data/attributes/service"
}
},
{
"status": "422",
"code": "invalid_attribute",
"title": "Invalid Attribute",
"detail": "can't be blank",
"meta": {},
"source": {
"pointer": "data/attributes/booking_method_id"
}
},
{
"status": "422",
"code": "invalid_attribute",
"title": "Invalid Attribute",
"detail": "is not included in the list",
"meta": {
"value": null
},
"source": {
"pointer": "data/attributes/booking_method_id"
}
}
]
}POST /api/v2/resource_requests
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+jsonBody
{
"data": null
}Headers
Content-Type: application/vnd.api+json; charset=utf-8Body
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"meta": {},
"source": {}
}
]
}Create a resource requestPOST/api/v2/resource_requests
- service_id
number(required) Example: 1service (budget) id the resource is requested for
- started_on
date(required) Example: 2026-02-01start date of the requested resource allocation
- ended_on
date(required) Example: 2026-02-28end date of the requested resource allocation
- booking_method_id
number(required) Example: 11: hours per day, time attribute needs to be set; 2: percentage per day, percentage attribute needs to be set; 3: total time
- title
string(optional) Example: Senior+Developer+neededtitle/name of the resource request
- time
number(optional) Example: 480time in minutes per day, required with booking_method_id 1
- percentage
number(optional) Example: 100percentage of working hours (50 or 100), required with booking_method_id 2
- total_time: `4800` (number, optional) - total time in minutes for the entire period, required with booking_method_id 3
string(required)- note
string(optional) Example: Need+someone+with+React+experienceadditional notes for the resource request
- fields
object(optional) Example: %7Bjob_title%3A+%22Developer%22%2C+team_ids%3A+%5B1%2C+2%5D%7Dconfigurable fields: job_title, subsidiary_id, workplace_id, team_ids, service_type_ids, tags
- custom_fields
object(optional) Example: %7B%7Dcustom field values
- subscriber_ids
array(optional) Example: %5B1%2C+2%5Dperson ids to subscribe to notifications for this request
PATCH /api/v2/resource_requests/6
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+jsonBody
{
"data": {
"type": "resource_requests",
"id": "6",
"attributes": {
"title": "Updated Title",
"note": "Updated note"
}
}
}Headers
Content-Type: application/vnd.api+json; charset=utf-8Body
{
"data": {
"id": "6",
"type": "resource_requests",
"attributes": {
"title": "Updated Title",
"started_on": "2026-02-28",
"ended_on": "2026-03-07",
"status": "pending",
"custom_fields": null,
"created_at": "2026-02-28T05:20:45.907+01:00",
"time": 480,
"total_time": null,
"percentage": null,
"rejected_reason": null,
"booking_method_id": 1,
"time_to_close": null,
"exchange_rate": "1.0",
"exchange_rate_normalized": "0.8",
"exchange_date": "2026-02-28",
"currency": "USD",
"currency_default": "USD",
"currency_normalized": "EUR",
"max_cost_per_hour": 0,
"max_cost_per_hour_default": 0,
"max_cost_per_hour_normalized": 0,
"fields": {},
"note": "Updated note",
"resolved_at": null,
"canceled_at": null
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2384"
}
},
"service": {
"meta": {
"included": false
}
},
"creator": {
"meta": {
"included": false
}
},
"resolver": {
"meta": {
"included": false
}
},
"custom_field_people": {
"meta": {
"included": false
}
},
"custom_field_attachments": {
"meta": {
"included": false
}
}
}
},
"meta": {}
}PATCH /api/v2/resource_requests/7
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+jsonBody
{
"data": {
"type": "resource_requests",
"id": "7",
"attributes": {
"title": null
}
}
}Headers
Content-Type: application/vnd.api+json; charset=utf-8Body
{
"errors": [
{
"status": "422",
"code": "invalid_attribute",
"title": "Invalid Attribute",
"detail": "can't be blank",
"meta": {},
"source": {
"pointer": "data/attributes/title"
}
}
]
}Update a resource requestPATCH/api/v2/resource_requests/{id}
- id
number(required) Example: 1resource request id
DELETE /api/v2/resource_requests/8
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+jsonDeletes a resource requestDELETE/api/v2/resource_requests/{id}
- id
number(required) Example: 1resource request id
PATCH /api/v2/resource_requests/9/cancel
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+jsonBody
{
"data": {
"type": "resource_requests",
"id": "9"
}
}Headers
Content-Type: application/vnd.api+json; charset=utf-8Body
{
"data": {
"id": "9",
"type": "resource_requests",
"attributes": {
"title": "Resource Request 6",
"started_on": "2026-02-28",
"ended_on": "2026-03-07",
"status": "canceled",
"custom_fields": {},
"created_at": "2026-02-28T05:20:46.509+01:00",
"time": 480,
"total_time": null,
"percentage": null,
"rejected_reason": null,
"booking_method_id": 1,
"time_to_close": null,
"exchange_rate": "1.0",
"exchange_rate_normalized": "0.8",
"exchange_date": "2026-02-28",
"currency": "USD",
"currency_default": "USD",
"currency_normalized": "EUR",
"max_cost_per_hour": 0,
"max_cost_per_hour_default": 0,
"max_cost_per_hour_normalized": 0,
"fields": {},
"note": "Test resource request note",
"resolved_at": null,
"canceled_at": "2026-02-28T05:20:46.522+01:00"
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2389"
}
},
"service": {
"meta": {
"included": false
}
},
"creator": {
"meta": {
"included": false
}
},
"resolver": {
"meta": {
"included": false
}
},
"custom_field_people": {
"meta": {
"included": false
}
},
"custom_field_attachments": {
"meta": {
"included": false
}
}
}
},
"meta": {}
}Cancel a resource requestPATCH/api/v2/resource_requests/{id}/cancel
- id
number(required) Example: 1resource request id
PATCH /api/v2/resource_requests/10/reject
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+jsonBody
{
"data": {
"type": "resource_requests",
"id": "10",
"attributes": {
"rejected_reason": "test"
}
}
}Headers
Content-Type: application/vnd.api+json; charset=utf-8Body
{
"data": {
"id": "10",
"type": "resource_requests",
"attributes": {
"title": "Resource Request 7",
"started_on": "2026-02-28",
"ended_on": "2026-03-07",
"status": "rejected",
"custom_fields": {},
"created_at": "2026-02-28T05:20:46.742+01:00",
"time": 480,
"total_time": null,
"percentage": null,
"rejected_reason": "test",
"booking_method_id": 1,
"time_to_close": 0,
"exchange_rate": "1.0",
"exchange_rate_normalized": "0.8",
"exchange_date": "2026-02-28",
"currency": "USD",
"currency_default": "USD",
"currency_normalized": "EUR",
"max_cost_per_hour": 0,
"max_cost_per_hour_default": 0,
"max_cost_per_hour_normalized": 0,
"fields": {},
"note": "Test resource request note",
"resolved_at": "2026-02-28T05:20:46.754+01:00",
"canceled_at": null
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2391"
}
},
"service": {
"meta": {
"included": false
}
},
"creator": {
"meta": {
"included": false
}
},
"resolver": {
"meta": {
"included": false
}
},
"custom_field_people": {
"meta": {
"included": false
}
},
"custom_field_attachments": {
"meta": {
"included": false
}
}
}
},
"meta": {}
}Reject a resource requestPATCH/api/v2/resource_requests/{id}/reject
- id
number(required) Example: 1resource request id
- rejected_reason
string(optional) Example: No+available+resources+for+the+requested+periodreason for rejecting the request
POST /api/v2/resource_requests/11/resolve
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+jsonBody
{
"data": {
"type": "resource_requests",
"id": "11",
"attributes": {
"bookings": [
{
"type": "bookings",
"attributes": {
"started_on": "2026-02-28",
"ended_on": "2026-03-01",
"time": 480
},
"relationships": {
"person": {
"data": {
"type": "people",
"id": "8958"
}
},
"service": {
"data": {
"type": "services",
"id": "1367"
}
}
}
}
]
}
}
}Headers
Content-Type: application/vnd.api+json; charset=utf-8Body
{
"data": {
"id": "11",
"type": "resource_requests",
"attributes": {
"title": "Resource Request 8",
"started_on": "2026-02-28",
"ended_on": "2026-03-07",
"status": "resolved",
"custom_fields": {},
"created_at": "2026-02-28T05:20:46.953+01:00",
"time": 480,
"total_time": null,
"percentage": null,
"rejected_reason": null,
"booking_method_id": 1,
"time_to_close": 0,
"exchange_rate": "1.0",
"exchange_rate_normalized": "0.8",
"exchange_date": "2026-02-28",
"currency": "USD",
"currency_default": "USD",
"currency_normalized": "EUR",
"max_cost_per_hour": 0,
"max_cost_per_hour_default": 0,
"max_cost_per_hour_normalized": 0,
"fields": {},
"note": "Test resource request note",
"resolved_at": "2026-02-28T05:20:46.966+01:00",
"canceled_at": null
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2393"
}
},
"service": {
"meta": {
"included": false
}
},
"creator": {
"meta": {
"included": false
}
},
"resolver": {
"meta": {
"included": false
}
},
"custom_field_people": {
"meta": {
"included": false
}
},
"custom_field_attachments": {
"meta": {
"included": false
}
}
}
},
"meta": {}
}POST /api/v2/resource_requests/13/resolve
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+jsonBody
{
"data": {
"type": "resource_requests",
"id": "13"
}
}Headers
Content-Type: application/vnd.api+json; charset=utf-8Body
{
"errors": [
{
"status": "422",
"code": "invalid_attribute",
"title": "Invalid Attribute",
"detail": "can't be blank",
"meta": {},
"source": {
"pointer": "data/attributes/bookings"
}
},
{
"status": "422",
"code": "invalid_attribute",
"title": "Invalid Attribute",
"detail": "must be an array",
"meta": {},
"source": {
"pointer": "data/attributes/bookings"
}
}
]
}POST /api/v2/resource_requests/14/resolve
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+jsonBody
{
"data": {
"type": "resource_requests",
"id": "14",
"attributes": {
"bookings": [
{
"type": "bookings",
"attributes": {
"started_on": null,
"ended_on": null
},
"relationships": {
"person": {
"data": null
},
"service": {
"data": null
}
}
}
]
}
}
}Headers
Content-Type: application/vnd.api+json; charset=utf-8Body
{
"errors": [
{
"status": "422",
"code": "invalid_attribute",
"title": "Invalid Attribute",
"detail": "Booking 0: person_id can't be blank; Booking 0: started_on can't be blank; Booking 0: started_on is not a date; Booking 0: ended_on can't be blank; Booking 0: ended_on is not a date; Booking 0: base service and event can't be blank simultaneously",
"meta": {},
"source": {
"pointer": "data/attributes/bookings"
}
}
]
}Resolve a resource request by creating bookingsPOST/api/v2/resource_requests/{id}/resolve
- id
number(required) Example: 1resource request id
- bookings
array(required) Example: %5B%7Bperson_id%3A+1%2C+started_on%3A+%222026-02-01%22%2C+ended_on%3A+%222026-02-28%22%2C+time%3A+480%2C+booking_method_id%3A+1%2C+service_id%3A+1%7D%5Darray of booking objects to create when resolving the request
Generated by aglio on 28 Feb 2026