openapi: 3.0.4
info:
title: Bench AccountActivities ProjectRoles API
description: "
Versioning
\n\n The API is currently at version 1.0. All API endpoints (other than\n authentication) require you to specify the API version as part of the path.\n
\n\nURL Paths
\n\n Authentication requests should be made to /auth/signin,\n as documented below. All other API requests should be made to\n sub-paths of /rp/api/1.0/....\n
\n\nAuthentication
\n\n API requests are authenticated using an OAuth Bearer token.\n You can get a token by authenticating your user by sending a\n POST request to /auth/signin, with \"username and \"password\"\n parameters form-encoded in the body of the request.\n\n POST /auth/signin HTTP/1.1\n Content-Type: application/x-www-form-urlencoded\n\n username=user@example.com&password=some-secret-password\n
\n\n The response will be a JSON object including both\n \"access_token\" and \"refresh_token\" property.\n All other requests against the Bench API should include an\n authorization header: Authorization: Bearer xxxYYYzzz,\n where xxxYYYzzz is the value of \"access_token\" in the response.\n
\n For example:\n\n $ curl https://bench.gobridgit.com/auth/signin -H 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'username=someone@example.com' --data-urlencode 'password=[...snip...]'\n {\n \"access_token\": \"...snip...\",\n \"token_type\": \"Bearer\",\n \"refresh_token\": \"...snip...\"\n \"expiry\": \"2020-01-01T00:00:00.413440849Z\"\n }\n\n
\n\n\n The refresh token can be used to generate new session by request with /auth/token endpoint:\n\n POST /auth/token HTTP/1.1\n Content-Type: application/x-www-form-urlencoded\n\n grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA\n
\n\n Note that once the refresh token is used, the previous access and refresh token is no longer valid.\n
\n For example:\n\n $ curl https://bench.gobridgit.com/auth/token -H 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'grant_type=refresh_token' --data-urlencode 'refresh_token=[...snip...]'\n {\n \"access_token\": \"...snip...\",\n \"token_type\": \"Bearer\",\n \"refresh_token\": \"...snip...\"\n \"expiry\": \"2020-01-01T00:00:00.413440849Z\"\n }\n
\n\nPagination
\n\n Several of the API endpoints are paginated. These are denoted by\n including the offset (zero-based offset) and limit query\n parameters. For example, to request the 10 items,\n set the offset=0 to limit=10.\n
\n NOTE: the result set contains items with index of 0-9\n
\n To request the next 10 items (starting at index 10),\n set the offset=10 to limit=10\n
\n\n Responses to paginated API endpoints return a JSON array of objects.\n If there are results beyond the page you have requested, the server\n will set a query-has-more: true header in the response.\n
\n\nRequest Encoding
\n\n GET and DELETE requests should have parameters encoded as URL query\n parameters. Boolean values should be encoded as true and\n false, not as 1 and 0.\n
\n\nErrors
\n\n Errors are returned for some response codes such as 400 Bad Request in the\n following format:\n\n {\n \"errors\": [\n {\n \"errorType\": \"ValidationError\",\n \"description\": \"The value of Name must be a string with a minimum length of 1 and a maximum length of 8 and not whitespace.\",\n \"field\": \"Name\",\n \"values\": [\n null\n ]\n }\n ],\n \"title\": \"One or more validation errors occurred.\",\n \"status\": 400,\n \"instance\": \"api/v1/accounts/0/persons\",\n \"requestUid\": \"123e4567-e89b-12d3-a456-426614174000\"\n }\n
\n"
version: '1.0'
servers:
- url: https://bench.gobridgit.com
description: Bridgit Bench production
security:
- {}
tags:
- name: ProjectRoles
paths:
/rp/api/v1/accounts/{accountId}/projects/{projectId}/roles:
get:
tags:
- ProjectRoles
summary: Gets all roles in the given account's project.
description: '
Permissions
Role: Read
Finance: Read'
operationId: ProjectRoles_Query
parameters:
- name: accountId
in: path
description: The Account ID
required: true
schema:
type: integer
format: int32
- name: projectId
in: path
description: The project ID the role belongs to
required: true
schema:
type: integer
format: int64
- name: relativeDate
in: query
description: Optional paramater used to calculate date based properties. If not provided, it is set to today's date in UTC.
schema:
type: string
format: date-time
example: '2021-01-01'
example: '2021-01-01'
- name: roleState
in: query
description: '(Optional) Filters the result by the state of the role dates: Current, Upcoming, Past, or All'
schema:
enum:
- Past
- Current
- Upcoming
- All
type: string
default: All
- name: type
in: query
description: (Optional)Salaried role type to filter results by (Defaults to Operations)
schema:
enum:
- Operations
- Preconstruction
- All
type: string
default: Operations
responses:
'200':
description: Success
content:
text/plain:
schema:
type: array
items:
$ref: '#/components/schemas/RoleResponse'
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/RoleResponse'
text/json:
schema:
type: array
items:
$ref: '#/components/schemas/RoleResponse'
'400':
description: Bad Request
'401':
description: Unauthorized
'403':
description: Forbidden
post:
tags:
- ProjectRoles
summary: Add role for the given account's project.
description: '
Permissions
Role: Write
Finance: Read'
operationId: ProjectRoles_Add
parameters:
- name: accountId
in: path
description: The Account ID
required: true
schema:
type: integer
format: int32
- name: projectId
in: path
description: The project ID the role belongs to
required: true
schema:
type: integer
format: int64
requestBody:
description: The request information for the role creation
content:
application/json-patch+json:
schema:
$ref: '#/components/schemas/BaseRoleRequest'
application/json:
schema:
$ref: '#/components/schemas/BaseRoleRequest'
text/json:
schema:
$ref: '#/components/schemas/BaseRoleRequest'
application/*+json:
schema:
$ref: '#/components/schemas/BaseRoleRequest'
required: true
responses:
'201':
description: Success
content:
text/plain:
schema:
$ref: '#/components/schemas/RoleResponse'
application/json:
schema:
$ref: '#/components/schemas/RoleResponse'
text/json:
schema:
$ref: '#/components/schemas/RoleResponse'
'400':
description: Bad Request
'401':
description: Unauthorized
'403':
description: Forbidden
'422':
description: Unprocessable Entity - Validation failures
/rp/api/v1/accounts/{accountId}/projects/{projectId}/roles/bulk:
post:
tags:
- ProjectRoles
summary: Bulk add roles for the given account's project.
description: '
Permissions
Role: Write
Finance: Read'
operationId: ProjectRoles_BulkAdd
parameters:
- name: accountId
in: path
description: The Account ID
required: true
schema:
type: integer
format: int32
- name: projectId
in: path
description: The project ID the role belongs to
required: true
schema:
type: integer
format: int64
requestBody:
description: The request information for the role creation
content:
application/json-patch+json:
schema:
minItems: 1
type: array
items:
$ref: '#/components/schemas/BaseRoleRequest'
application/json:
schema:
minItems: 1
type: array
items:
$ref: '#/components/schemas/BaseRoleRequest'
text/json:
schema:
minItems: 1
type: array
items:
$ref: '#/components/schemas/BaseRoleRequest'
application/*+json:
schema:
minItems: 1
type: array
items:
$ref: '#/components/schemas/BaseRoleRequest'
required: true
responses:
'200':
description: Success
content:
text/plain:
schema:
type: array
items:
$ref: '#/components/schemas/RoleResponse'
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/RoleResponse'
text/json:
schema:
type: array
items:
$ref: '#/components/schemas/RoleResponse'
'400':
description: Bad Request
'401':
description: Unauthorized
'403':
description: Forbidden
'422':
description: Unprocessable Entity - Validation failures
delete:
tags:
- ProjectRoles
summary: Remove role by IDs in the given account's project.
description: '
Permissions
Role: Write'
operationId: ProjectRoles_BulkRemove
parameters:
- name: accountId
in: path
description: The Account ID
required: true
schema:
type: integer
format: int32
- name: projectId
in: path
description: The project ID that the role belongs to
required: true
schema:
type: integer
format: int64
requestBody:
description: The role IDs for removal
content:
application/json-patch+json:
schema:
minItems: 1
type: array
items:
type: integer
format: int64
application/json:
schema:
minItems: 1
type: array
items:
type: integer
format: int64
text/json:
schema:
minItems: 1
type: array
items:
type: integer
format: int64
application/*+json:
schema:
minItems: 1
type: array
items:
type: integer
format: int64
required: true
responses:
'204':
description: No Content - Success
'400':
description: Bad Request
'401':
description: Unauthorized
'403':
description: Forbidden
/rp/api/v1/accounts/{accountId}/projects/{projectId}/roles/{id}:
get:
tags:
- ProjectRoles
summary: Get role by ID in the given account's project.
description: '
Permissions
Role: Read
Finance: Read'
operationId: ProjectRoles_Get
parameters:
- name: accountId
in: path
description: The Account ID
required: true
schema:
type: integer
format: int32
- name: projectId
in: path
description: The project ID that the role belongs to
required: true
schema:
type: integer
format: int64
- name: id
in: path
description: The role ID
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
text/plain:
schema:
$ref: '#/components/schemas/RoleResponse'
application/json:
schema:
$ref: '#/components/schemas/RoleResponse'
text/json:
schema:
$ref: '#/components/schemas/RoleResponse'
'400':
description: Bad Request
'401':
description: Unauthorized
'403':
description: Forbidden
put:
tags:
- ProjectRoles
summary: 'Update role by ID in the given account''s project.
The task ID is required when updating a task role.
The task ID cannot be updated.'
description: '
Permissions
Role: Write
Finance: Read'
operationId: ProjectRoles_Update
parameters:
- name: accountId
in: path
description: The Account ID
required: true
schema:
type: integer
format: int32
- name: projectId
in: path
description: The project ID that the role belongs to
required: true
schema:
type: integer
format: int64
- name: id
in: path
description: The role ID
required: true
schema:
type: integer
format: int64
requestBody:
description: The request information for the role update
content:
application/json-patch+json:
schema:
$ref: '#/components/schemas/RoleUpdateRequest'
application/json:
schema:
$ref: '#/components/schemas/RoleUpdateRequest'
text/json:
schema:
$ref: '#/components/schemas/RoleUpdateRequest'
application/*+json:
schema:
$ref: '#/components/schemas/RoleUpdateRequest'
required: true
responses:
'200':
description: Success
content:
text/plain:
schema:
$ref: '#/components/schemas/RoleResponse'
application/json:
schema:
$ref: '#/components/schemas/RoleResponse'
text/json:
schema:
$ref: '#/components/schemas/RoleResponse'
'400':
description: Bad Request
'401':
description: Unauthorized
'403':
description: Forbidden
'422':
description: Unprocessable Entity - Validation failures
delete:
tags:
- ProjectRoles
summary: Remove role by ID in the given account's project.
description: '
Permissions
Role: Write'
operationId: ProjectRoles_Remove
parameters:
- name: accountId
in: path
description: The Account ID
required: true
schema:
type: integer
format: int32
- name: projectId
in: path
description: The project ID that the role belongs to
required: true
schema:
type: integer
format: int64
- name: id
in: path
description: The role ID
required: true
schema:
type: integer
format: int64
responses:
'204':
description: No Content - Success
'400':
description: Bad Request
'401':
description: Unauthorized
'403':
description: Forbidden
/rp/api/v1/accounts/{accountId}/projects/{projectId}/roles/{id}/externalId:
put:
tags:
- ProjectRoles
summary: Updates a role to set an external ID that can be referenced by external systems.
operationId: ProjectRoles_SetExternalId
parameters:
- name: accountId
in: path
description: The Account ID
required: true
schema:
type: integer
format: int32
- name: projectId
in: path
description: The Project ID
required: true
schema:
type: integer
format: int64
- name: id
in: path
description: The Role ID
required: true
schema:
type: integer
format: int64
requestBody:
description: Details for the external Id
content:
application/json-patch+json:
schema:
$ref: '#/components/schemas/ExternalIdRequest'
application/json:
schema:
$ref: '#/components/schemas/ExternalIdRequest'
text/json:
schema:
$ref: '#/components/schemas/ExternalIdRequest'
application/*+json:
schema:
$ref: '#/components/schemas/ExternalIdRequest'
required: true
responses:
'204':
description: No Content
'400':
description: Bad Request
'401':
description: Unauthorized
'403':
description: Forbidden
components:
schemas:
RoleRequirement:
type: object
properties:
startDate:
type: string
format: date-time
example: '2019-01-01'
endDate:
type: string
format: date-time
example: '2020-12-31'
allocatedPercent:
maximum: 100
minimum: 0
type: integer
format: int32
example: 100
additionalProperties: false
ExternalIdRequest:
type: object
properties:
externalId:
type: string
nullable: true
additionalProperties: false
RoleCrewTradeResponse:
type: object
properties:
id:
type: integer
description: Trade id (`crewtrade.id`).
format: int64
example: 1
name:
type: string
description: Trade display name.
nullable: true
example: Electrician
colour:
type: string
description: Trade colour as a hex string; one of ResourcePlanning.Common.Validation.CrewTradeColourAttribute.AllowedHexValues.
nullable: true
example: '#D6F0F5'
additionalProperties: false
description: 'Trade summary embedded on ResourcePlanning.Contracts.RoleCrewResponse.Trade. Slim projection of
ResourcePlanning.Contracts.CrewTradeResponse (omits `inUse` and `createdOn`).'
RoleResponse:
type: object
properties:
id:
type: integer
format: int64
example: 123
taskId:
type: string
format: uuid
nullable: true
example: 00000000-0000-0000-0000-000000000000
nameId:
type: integer
format: int64
example: 1
name:
type: string
nullable: true
example: Project Engineer
roleCost:
type: number
format: double
nullable: true
example: 123.45
startDate:
type: string
format: date-time
example: '2019-01-01'
endDate:
type: string
format: date-time
example: '2020-12-31'
type:
enum:
- Salaried
- Hourly
- All
type: string
example: Salaried
skillSet:
type: array
items:
type: integer
format: int64
nullable: true
example: '[1,2,3]]'
isFilled:
type: boolean
example: false
billable:
type: boolean
example: false
allocations:
type: array
items:
$ref: '#/components/schemas/RoleRequirement'
nullable: true
unfilledRanges:
type: array
items:
$ref: '#/components/schemas/RoleUnfilled'
nullable: true
note:
type: string
nullable: true
categoryId:
type: integer
format: int64
nullable: true
notification:
$ref: '#/components/schemas/RoleNotificationData'
isCommunicated:
type: boolean
readOnly: true
relatedTitles:
type: array
items:
type: string
nullable: true
externalId:
type: string
nullable: true
createdBy:
type: integer
format: int32
createdOn:
type: string
format: date-time
hire:
$ref: '#/components/schemas/RoleHire'
roleTags:
type: array
items:
$ref: '#/components/schemas/ProjectRoleTagEntity'
nullable: true
assignmentBreakdownBy:
enum:
- Custom
- Phases
- Monthly
- Weekly
type: string
nullable: true
assignedPersonId:
type: integer
format: int64
nullable: true
assignedPersonName:
type: string
nullable: true
crew:
$ref: '#/components/schemas/RoleCrewResponse'
additionalProperties: false
RoleNotificationData:
type: object
properties:
notifiedOn:
type: string
format: date-time
recipientIds:
type: array
items:
type: integer
format: int64
nullable: true
additionalProperties: false
RoleCrewResponse:
type: object
properties:
id:
type: integer
description: Crew id (`crew.id`).
format: int64
example: 42
name:
type: string
description: Crew display name.
nullable: true
example: Concrete crew A
memberCount:
type: integer
description: 'Number of people on the crew roster (`crewmember`) for the linked crew. This is the
crew''s roster size — not the number of people allocated to this specific role.'
format: int32
example: 5
trade:
$ref: '#/components/schemas/RoleCrewTradeResponse'
additionalProperties: false
description: 'Crew summary embedded on a ResourcePlanning.Contracts.RoleResponse when the role is tagged with a crew
(`projectrole.crew_id` not null). Loaded from the related `crew` row; cached and
serialized via MessagePack for role payloads.'
BaseRoleRequest:
type: object
properties:
name:
type: string
nullable: true
example: Project Engineer
taskId:
type: string
format: uuid
nullable: true
example: a2c09162-dbd8-4079-947d-fbc412061de5
startDate:
type: string
format: date-time
example: '2019-01-01'
endDate:
type: string
format: date-time
example: '2020-12-31'
skillSet:
type: array
items:
type: integer
format: int64
nullable: true
example:
- 1
- 2
- 3
note:
maxLength: 250
minLength: 0
type: string
nullable: true
example: Some note
categoryId:
type: integer
format: int64
nullable: true
example: 123
billable:
type: boolean
example: false
allocations:
type: array
items:
$ref: '#/components/schemas/RoleRequirement'
nullable: true
roleTagIds:
type: array
items:
type: integer
format: int64
nullable: true
assignmentBreakdownBy:
enum:
- Custom
- Phases
- Monthly
- Weekly
type: string
nullable: true
additionalProperties: false
RoleHire:
type: object
properties:
isHireRequired:
type: boolean
hireDescription:
type: string
nullable: true
previousIsHireRequired:
type: boolean
hireStatus:
enum:
- Hire
- Hired
type: string
nullable: true
previousHireStatus:
enum:
- Hire
- Hired
type: string
nullable: true
taggedByUserId:
type: integer
format: int32
nullable: true
taggedAt:
type: string
format: date-time
nullable: true
hiredAt:
type: string
format: date-time
nullable: true
additionalProperties: false
ProjectRoleTagEntity:
type: object
properties:
id:
type: integer
format: int64
collectionId:
type: integer
format: int64
name:
type: string
nullable: true
collectionName:
type: string
nullable: true
collectionColor:
type: string
nullable: true
additionalProperties: false
description: Represents a role tag with its collection metadata
RoleUpdateRequest:
type: object
properties:
id:
type: integer
format: int64
removeSetup:
type: boolean
expandAllocations:
type: boolean
shiftDates:
type: boolean
crewId:
type: integer
format: int64
nullable: true
startTime:
type: string
format: date-span
nullable: true
endTime:
type: string
format: date-span
nullable: true
workDays:
type: array
items:
enum:
- 0
- 1
- 2
- 3
- 4
- 5
- 6
type: integer
format: int32
nullable: true
name:
type: string
nullable: true
example: Project Engineer
taskId:
type: string
format: uuid
nullable: true
example: a2c09162-dbd8-4079-947d-fbc412061de5
startDate:
type: string
format: date-time
example: '2019-01-01'
endDate:
type: string
format: date-time
example: '2020-12-31'
skillSet:
type: array
items:
type: integer
format: int64
nullable: true
example:
- 1
- 2
- 3
note:
maxLength: 250
minLength: 0
type: string
nullable: true
example: Some note
categoryId:
type: integer
format: int64
nullable: true
example: 123
billable:
type: boolean
example: false
allocations:
type: array
items:
$ref: '#/components/schemas/RoleRequirement'
nullable: true
roleTagIds:
type: array
items:
type: integer
format: int64
nullable: true
assignmentBreakdownBy:
enum:
- Custom
- Phases
- Monthly
- Weekly
type: string
nullable: true
additionalProperties: false
RoleUnfilled:
type: object
properties:
startDate:
type: string
format: date-time
example: '2019-01-01'
endDate:
type: string
format: date-time
example: '2020-12-31'
additionalProperties: false
securitySchemes:
Bearer:
type: http
description: Standard Authorization header using the Bearer scheme
scheme: bearer
bearerFormat: JWT