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\n

URL 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\n

Authentication

\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\n

Pagination

\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\n

Request 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\n

Errors

\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