openapi: 3.0.4
info:
title: Bench AccountActivities Projects API
description: "<h2>Versioning</h2>\n<p>\n The API is currently at version <code>1.0</code>. All API endpoints (other than\n authentication) require you to specify the API version as part of the path.\n</p>\n\n<h2>URL Paths</h2>\n<p>\n Authentication requests should be made to <code>/auth/signin</code>,\n as documented below. All other API requests should be made to\n sub-paths of <code>/rp/api/1.0/...</code>.\n</p>\n\n<h2>Authentication</h2>\n<p>\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 <code>/auth/signin</code>, 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</p>\n<p>\n The response will be a JSON object including both\n <b>\"access_token\"</b> and <b>\"refresh_token\"</b> property.\n All other requests against the Bench API should include an\n authorization header: <code>Authorization: Bearer xxxYYYzzz</code>,\n where <b>xxxYYYzzz</b> is the value of <b>\"access_token\"</b> in the response.\n <br><br>\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</p>\n\n<p>\n The refresh token can be used to generate new session by request with <code>/auth/token</code> 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</p>\n<p>\n Note that once the refresh token is used, the previous access and refresh token is no longer valid.\n <br><br>\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</p>\n\n<h2>Pagination</h2>\n<p>\n Several of the API endpoints are paginated. These are denoted by\n including the <code>offset</code> (zero-based offset) and <code>limit</code> query\n parameters. For example, to request the <code>10</code> items,\n set the <code>offset=0</code> to <code>limit=10</code>.\n <br>\n NOTE: the result set contains items with index of 0-9\n <br>\n To request the next 10 items (starting at index 10),\n set the <code>offset=10</code> to <code>limit=10</code>\n</p>\n<p>\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 <code>query-has-more: true</code> header in the response.\n</p>\n\n<h2>Request Encoding</h2>\n<p>\n <code>GET</code> and <code>DELETE</code> requests should have parameters encoded as URL query\n parameters. Boolean values should be encoded as <code>true</code> and\n <code>false</code>, not as <code>1</code> and <code>0</code>.\n</p>\n\n<h2>Errors</h2>\n<p>\n Errors are returned for some response codes such as <code>400 Bad Request</code> 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</p>\n"
version: '1.0'
servers:
- url: https://bench.gobridgit.com
description: Bridgit Bench production
security:
- {}
tags:
- name: Projects
paths:
/rp/api/v1/accounts/{accountId}/Projects:
get:
tags:
- Projects
summary: Gets all projects in the given account
description: '<strong>NOTE:</strong> If there are more projects in the account than were returned, there will be a "query-has-more" header that will be set to true.<br/><strong>Permissions</strong><br/>Project: Read<br/>Role: Read<br/>HourlyRole: Read'
operationId: Projects_Query
parameters:
- name: accountId
in: path
description: The Account ID
required: true
schema:
type: integer
format: int32
- 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: offset
in: query
description: Offset for pagination
schema:
maximum: 2147483647
minimum: 0
type: integer
format: int32
default: 0
- name: limit
in: query
description: Maximum number of results in this page
schema:
maximum: 2147483647
minimum: 1
type: integer
format: int32
default: 1000
- name: name
in: query
description: 'Name filter that affects whether or not to return projects back with/without the name contains partial match (Default: Empty)'
schema:
type: string
- name: issues
in: query
description: 'State filter that affects whether or not to return projects back with/without or any issues (Default: All)'
schema:
enum:
- 0
- 1
- 2
type: integer
format: int32
default: 2
- name: ids
in: query
description: Optional comma delimited list of project IDs to filter the result on
schema:
type: array
items:
type: integer
format: int64
- name: projectState
in: query
description: Optional comma delimited list for filtering results by project state.
schema:
enum:
- Canceled
- Upcoming
- Active
- Complete
- Pursuit
- Lost
- All
type: string
default: All
- name: includeProjectNumber
in: query
description: 'Whether to include the Project Number field in the response (Default: false)'
schema:
type: boolean
default: false
responses:
'200':
description: Success
content:
text/plain:
schema:
type: array
items:
$ref: '#/components/schemas/ProjectResponse'
example:
- id: 8673
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
state: Active
winPercent: null
unfilledRoles: 3
totalRoles: 16
unfilledHourlyRoles: 4
totalHourlyRoles: 7
totalTasks: 9
unfilledTaskRoles: 0
totalTaskRoles: 0
issuesCount: 5
lastModifiedOn: '2019-01-01T00:00:00'
type: Awarded
currentPhases:
- name: Precon
phases: []
groupings: null
description: Project Description
truncatedDescription: Project Desc
externalId: null
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/ProjectResponse'
example:
- id: 8673
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
state: Active
winPercent: null
unfilledRoles: 3
totalRoles: 16
unfilledHourlyRoles: 4
totalHourlyRoles: 7
totalTasks: 9
unfilledTaskRoles: 0
totalTaskRoles: 0
issuesCount: 5
lastModifiedOn: '2019-01-01T00:00:00'
type: Awarded
currentPhases:
- name: Precon
phases: []
groupings: null
description: Project Description
truncatedDescription: Project Desc
externalId: null
text/json:
schema:
type: array
items:
$ref: '#/components/schemas/ProjectResponse'
example:
- id: 8673
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
state: Active
winPercent: null
unfilledRoles: 3
totalRoles: 16
unfilledHourlyRoles: 4
totalHourlyRoles: 7
totalTasks: 9
unfilledTaskRoles: 0
totalTaskRoles: 0
issuesCount: 5
lastModifiedOn: '2019-01-01T00:00:00'
type: Awarded
currentPhases:
- name: Precon
phases: []
groupings: null
description: Project Description
truncatedDescription: Project Desc
externalId: null
'400':
description: Bad Request
'401':
description: Unauthorized
'403':
description: Forbidden
post:
tags:
- Projects
summary: Add a project to the given account
description: 'If you add a project with a type of Awarded, it will be created with a state based on the date.
If you add a project with a type of Opportunity, it will be created with a state of Pursuit.
The <strong>"winPercent"</strong> is associated with an Opportunity, you can create an Opportunity with a winPercent but not for an Awarded project.
<strong>NOTE:</strong> Opportunities do not count towards allocation statistics so, any roles and allocations set on the project will not cause conflicts, issues, over-allocations etc.<br/><strong>Permissions</strong><br/>Project: Write<br/>Private: Read<br/>Finance: Read'
operationId: Projects_Post
parameters:
- name: accountId
in: path
description: The Account ID
required: true
schema:
type: integer
format: int32
requestBody:
description: Details for the project object and any associated custom field values.
content:
application/json-patch+json:
schema:
$ref: '#/components/schemas/NewProjectRequest'
example:
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
type: Awarded
fields:
- fieldId: 1394
values:
- '5195555555'
groupings: null
description: Project Description
phases: null
application/json:
schema:
$ref: '#/components/schemas/NewProjectRequest'
example:
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
type: Awarded
fields:
- fieldId: 1394
values:
- '5195555555'
groupings: null
description: Project Description
phases: null
text/json:
schema:
$ref: '#/components/schemas/NewProjectRequest'
example:
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
type: Awarded
fields:
- fieldId: 1394
values:
- '5195555555'
groupings: null
description: Project Description
phases: null
application/*+json:
schema:
$ref: '#/components/schemas/NewProjectRequest'
example:
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
type: Awarded
fields:
- fieldId: 1394
values:
- '5195555555'
groupings: null
description: Project Description
phases: null
required: true
responses:
'200':
description: Success
content:
text/plain:
schema:
$ref: '#/components/schemas/ProjectResponse'
example:
id: 8673
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
state: Active
winPercent: null
unfilledRoles: 3
totalRoles: 16
unfilledHourlyRoles: 4
totalHourlyRoles: 7
totalTasks: 9
unfilledTaskRoles: 0
totalTaskRoles: 0
issuesCount: 5
lastModifiedOn: '2019-01-01T00:00:00'
type: Awarded
currentPhases:
- name: Precon
phases: []
groupings: null
description: Project Description
truncatedDescription: Project Desc
externalId: null
application/json:
schema:
$ref: '#/components/schemas/ProjectResponse'
example:
id: 8673
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
state: Active
winPercent: null
unfilledRoles: 3
totalRoles: 16
unfilledHourlyRoles: 4
totalHourlyRoles: 7
totalTasks: 9
unfilledTaskRoles: 0
totalTaskRoles: 0
issuesCount: 5
lastModifiedOn: '2019-01-01T00:00:00'
type: Awarded
currentPhases:
- name: Precon
phases: []
groupings: null
description: Project Description
truncatedDescription: Project Desc
externalId: null
text/json:
schema:
$ref: '#/components/schemas/ProjectResponse'
example:
id: 8673
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
state: Active
winPercent: null
unfilledRoles: 3
totalRoles: 16
unfilledHourlyRoles: 4
totalHourlyRoles: 7
totalTasks: 9
unfilledTaskRoles: 0
totalTaskRoles: 0
issuesCount: 5
lastModifiedOn: '2019-01-01T00:00:00'
type: Awarded
currentPhases:
- name: Precon
phases: []
groupings: null
description: Project Description
truncatedDescription: Project Desc
externalId: null
'400':
description: "Bad Request - Request has missing or invalid values\n\n Example when trying to add a project with an invalid colour value:\n<code>{<br/> \"errors\": [<br/> {<br/> \"errorType\": \"ValidationError\",<br/> \"description\": \"colour must be a six-digit hexadecimal number with a '#' in front of it. Ex: #00FF00\",<br/> \"errorCode\": null,<br/> \"field\": \"Colour\",<br/> \"innerException\": null,<br/> \"hResult\": -2146233088<br/> }<br/> ],<br/> \"title\": \"One or more validation errors occurred.\",<br/> \"status\": 400,<br/> \"instance\": \"/api/v1/accounts/2/projects\",<br/> \"requestUid\": \"82a530a1-36b1-4a8a-8bd9-9833de5b0cbd\"<br/>}</code>"
'401':
description: Unauthorized
'403':
description: Forbidden - User doesn't have permissions on this resource, or the project couldn't be found.
'409':
description: "Conflict - A project already exists in the account with the same name.\n\n Example when trying to add a project that has the same name as an existing one:\n<code>{<br/> \"errors\": [<br/> {<br/> \"errorType\": \"Duplicate\",<br/> \"description\": \"A project in the account already exists with the requested name.\",<br/> \"errorCode\": null,<br/> \"innerException\": null,<br/> \"hResult\": -2146233088<br/> }<br/> ],<br/> \"title\": \"One or more validation errors occurred.\",<br/> \"status\": 409,<br/> \"instance\": \"/api/v1/accounts/2/projects\",<br/> \"requestUid\": \"8ba8f060-858b-46d9-b3cc-fa1c391ebc66\"<br/>}</code>"
/rp/api/v1/accounts/{accountId}/Projects/_filter:
post:
tags:
- Projects
summary: Gets all projects in the given account filter by project ids.
description: '<strong>NOTE:</strong> If there are more projects in the account than were returned, there will be a "query-has-more" header that will be set to true.<br/><strong>Permissions</strong><br/>Project: Read<br/>Role: Read<br/>HourlyRole: Read'
operationId: Projects_QueryFilter
parameters:
- name: accountId
in: path
description: The Account ID
required: true
schema:
type: integer
format: int32
requestBody:
description: Filter object including projectIds, projectState, name, issues, relativeDate, offset and limit
content:
application/json-patch+json:
schema:
$ref: '#/components/schemas/ProjectFilterPredicatesFilter'
application/json:
schema:
$ref: '#/components/schemas/ProjectFilterPredicatesFilter'
text/json:
schema:
$ref: '#/components/schemas/ProjectFilterPredicatesFilter'
application/*+json:
schema:
$ref: '#/components/schemas/ProjectFilterPredicatesFilter'
required: true
responses:
'200':
description: 'Success: List of projects in the account'
content:
text/plain:
schema:
type: array
items:
$ref: '#/components/schemas/ProjectResponse'
example:
- id: 8673
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
state: Active
winPercent: null
unfilledRoles: 3
totalRoles: 16
unfilledHourlyRoles: 4
totalHourlyRoles: 7
totalTasks: 9
unfilledTaskRoles: 0
totalTaskRoles: 0
issuesCount: 5
lastModifiedOn: '2019-01-01T00:00:00'
type: Awarded
currentPhases:
- name: Precon
phases: []
groupings: null
description: Project Description
truncatedDescription: Project Desc
externalId: null
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/ProjectResponse'
example:
- id: 8673
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
state: Active
winPercent: null
unfilledRoles: 3
totalRoles: 16
unfilledHourlyRoles: 4
totalHourlyRoles: 7
totalTasks: 9
unfilledTaskRoles: 0
totalTaskRoles: 0
issuesCount: 5
lastModifiedOn: '2019-01-01T00:00:00'
type: Awarded
currentPhases:
- name: Precon
phases: []
groupings: null
description: Project Description
truncatedDescription: Project Desc
externalId: null
text/json:
schema:
type: array
items:
$ref: '#/components/schemas/ProjectResponse'
example:
- id: 8673
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
state: Active
winPercent: null
unfilledRoles: 3
totalRoles: 16
unfilledHourlyRoles: 4
totalHourlyRoles: 7
totalTasks: 9
unfilledTaskRoles: 0
totalTaskRoles: 0
issuesCount: 5
lastModifiedOn: '2019-01-01T00:00:00'
type: Awarded
currentPhases:
- name: Precon
phases: []
groupings: null
description: Project Description
truncatedDescription: Project Desc
externalId: null
'400':
description: Bad Request
'401':
description: Unauthorized
'403':
description: Forbidden
/rp/api/v1/accounts/{accountId}/Projects/{id}/externalId:
put:
tags:
- Projects
summary: Updates a project to set and externalId that can be referenced by external systems.
operationId: Projects_PutExternalId
parameters:
- name: accountId
in: path
description: The Account ID
required: true
schema:
type: integer
format: int32
- name: id
in: path
description: The Project ID
required: true
schema:
type: integer
format: int64
requestBody:
description: Details for the project object
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
/rp/api/v1/accounts/{accountId}/Projects/{id}:
get:
tags:
- Projects
summary: Gets details for the given project
description: '<br/><strong>Permissions</strong><br/>Project: Read<br/>Role: Read<br/>HourlyRole: Read'
operationId: Projects_Get
parameters:
- name: accountId
in: path
description: The Account ID
required: true
schema:
type: integer
format: int32
- name: id
in: path
description: The Project ID
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'
responses:
'200':
description: Success
content:
text/plain:
schema:
$ref: '#/components/schemas/ProjectResponse'
example:
id: 8673
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
state: Active
winPercent: null
unfilledRoles: 3
totalRoles: 16
unfilledHourlyRoles: 4
totalHourlyRoles: 7
totalTasks: 9
unfilledTaskRoles: 0
totalTaskRoles: 0
issuesCount: 5
lastModifiedOn: '2019-01-01T00:00:00'
type: Awarded
currentPhases:
- name: Precon
phases: []
groupings: null
description: Project Description
truncatedDescription: Project Desc
externalId: null
application/json:
schema:
$ref: '#/components/schemas/ProjectResponse'
example:
id: 8673
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
state: Active
winPercent: null
unfilledRoles: 3
totalRoles: 16
unfilledHourlyRoles: 4
totalHourlyRoles: 7
totalTasks: 9
unfilledTaskRoles: 0
totalTaskRoles: 0
issuesCount: 5
lastModifiedOn: '2019-01-01T00:00:00'
type: Awarded
currentPhases:
- name: Precon
phases: []
groupings: null
description: Project Description
truncatedDescription: Project Desc
externalId: null
text/json:
schema:
$ref: '#/components/schemas/ProjectResponse'
example:
id: 8673
name: Ahrens Lofts
colour: '#00FF00'
startDate: '2019-01-01'
endDate: '2020-12-31'
startTime: 08:00:00
endTime: '17:00:00'
workDays:
- 1
- 2
- 3
- 4
- 5
state: Active
winPercent: null
unfilledRoles: 3
totalRoles: 16
unfilledHourlyRoles: 4
totalHourlyRoles: 7
totalTasks: 9
unfilledTaskRoles: 0
totalTaskRoles: 0
issuesCount: 5
lastModifiedOn: '2019-01-01T00:00:00'
type: Awarded
currentPhases:
- name: Precon
phases: []
groupings: null
description: Project Description
truncatedDescription: Project Desc
externalId: null
'400':
description: Bad Request
'401':
description: Unauthorized
'403':
description: Forbidden
patch:
tags:
- Projects
summary: 'Update a project in the given account. Each of the fields in the request body is optional - only fields that are present in the request will be updated.
When changing the start or end dates for a project, you can customize how the start and end dates for roles and phases will change in response. See the Model below for details.
Note that roles or phases whose start and end dates change such that the start date is after the
# --- truncated at 32 KB (55 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/bridgit/refs/heads/main/openapi/bridgit-projects-api-openapi.yml