Skip to content

Master Projects API

A master project groups related projects under one umbrella with a shared client, budget, and timeline. The Master Projects API covers creating and managing master projects, reading their project hierarchy and budget rollup, linking and unlinking sub-projects, and managing dependencies between projects.

Authentication: every endpoint requires an API key. See API Keys & Authentication.

Requests run inside the organisation your key belongs to, and responses use the standard { "success": true, ... } envelope. Endpoints that create or change data need project creation or project update access in your organisation; read endpoints are open to any organisation member.

Master project status is one of draft, active, on_hold, completed, archived.

List the master projects in your organisation, with pagination.

Any organisation member can call this.

Query parameters

NameTypeRequiredDescription
statusstringNoFilter by status. See the valid values above.
clientOrganizationIdUUIDNoOnly master projects for this client.
limitintegerNoPage size, 1 to 100. Defaults to 50.
offsetintegerNoNumber of records to skip. Defaults to 0.

Example request

Terminal window
curl 'https://api.runnit.io/api/v1/master-projects?status=active' \
-H 'Authorization: Bearer rnk_your_key'

Response

{
"success": true,
"masterProjects": [
{
"id": "a2c40f11-...",
"organizationId": "8c2d41b7-...",
"clientOrganizationId": "b91c77e4-...",
"name": "Brand Refresh Programme",
"description": "All workstreams for the 2026 brand refresh.",
"status": "active",
"overallBudget": 400000,
"budgetCurrency": "AUD",
"startDate": "2026-07-01T00:00:00.000Z",
"targetCompletionDate": "2026-12-18T00:00:00.000Z",
"ownerId": "d3a6f0c1-...",
"tags": [],
"metadata": {},
"clientName": "Northwind",
"ownerName": "Alex Chen",
"projectCount": 4,
"totalAllocated": 310000,
"createdAt": "2026-06-12T00:00:00.000Z",
"updatedAt": "2026-07-01T00:00:00.000Z"
}
],
"pagination": { "total": 6, "limit": 50, "offset": 0, "hasMore": false }
}

clientOrganizationId, description, overallBudget, the date fields, clientName, and ownerName can be null or absent. projectCount and totalAllocated roll up the linked sub-projects.

Errors

  • 400 if no active organisation can be resolved for your account, or a query parameter is invalid.

Create a master project. You become the owner unless you nominate someone else.

Requires project creation access in your organisation.

Request body

NameTypeRequiredDescription
namestringYesMaster project name. Must not be empty.
descriptionstringNoLonger description.
clientOrganizationIdUUIDNoClient the programme is for.
overallBudgetnumberNoTotal budget across all sub-projects.
budgetCurrencystringNoCurrency code.
startDateISO 8601 dateNoPlanned start.
targetCompletionDateISO 8601 dateNoTarget delivery date.
ownerIdUUIDNoOwner. Defaults to you.
tagsarray of stringsNoTag list.
metadataobjectNoFree-form metadata.

Example request

Terminal window
curl -X POST https://api.runnit.io/api/v1/master-projects \
-H 'Authorization: Bearer rnk_your_key' \
-H 'Content-Type: application/json' \
-d '{
"name": "Brand Refresh Programme",
"clientOrganizationId": "<client-uuid>",
"overallBudget": 400000,
"budgetCurrency": "AUD"
}'

Response

Returns 201 with the created master project:

{ "success": true, "masterProject": { "id": "a2c40f11-...", "name": "Brand Refresh Programme", "status": "draft" } }

Errors

  • 400 if name is missing or empty, or a field fails validation.
  • 400 if no active organisation can be resolved for your account.

Get a master project by ID, including its client name, owner name, project count, and total allocated budget.

Any organisation member can call this.

Path parameters

NameTypeRequiredDescription
idUUIDYesMaster project ID.

Example request

Terminal window
curl https://api.runnit.io/api/v1/master-projects/<master-project-id> \
-H 'Authorization: Bearer rnk_your_key'

Response

{ "success": true, "masterProject": { "id": "a2c40f11-...", "name": "Brand Refresh Programme", "projectCount": 4, "totalAllocated": 310000 } }

The object has the same shape as in the list response.

Errors

  • 400 if id is not a UUID.
  • 404 if the master project does not exist.

Update a master project. Send only the fields you want to change.

Requires project update access in your organisation.

Path parameters

NameTypeRequiredDescription
idUUIDYesMaster project ID.

Request body (all optional)

NameTypeRequiredDescription
namestringNoNew name. Must not be empty.
descriptionstringNoDescription text.
statusstringNoOne of draft, active, on_hold, completed, archived.
clientOrganizationIdUUIDNoClient to link.
overallBudgetnumberNoTotal budget.
budgetCurrencystringNoCurrency code.
startDateISO 8601 dateNoPlanned start.
targetCompletionDateISO 8601 dateNoTarget delivery date.
actualCompletionDateISO 8601 dateNoActual completion date.
ownerIdUUIDNoNew owner.
tagsarray of stringsNoReplaces the tag list.
metadataobjectNoReplaces the metadata object.

Example request

Terminal window
curl -X PATCH https://api.runnit.io/api/v1/master-projects/<master-project-id> \
-H 'Authorization: Bearer rnk_your_key' \
-H 'Content-Type: application/json' \
-d '{ "status": "active", "overallBudget": 450000 }'

Response

{ "success": true, "masterProject": { "id": "a2c40f11-...", "status": "active", "overallBudget": 450000 } }

Errors

  • 400 if a field fails validation.
  • 404 if the master project does not exist.

Delete a master project. This removes the grouping only; the linked projects themselves are not deleted.

Requires project update access in your organisation.

Path parameters

NameTypeRequiredDescription
idUUIDYesMaster project ID.

Example request

Terminal window
curl -X DELETE https://api.runnit.io/api/v1/master-projects/<master-project-id> \
-H 'Authorization: Bearer rnk_your_key'

Response

{ "success": true }

Errors

  • 400 if id is not a UUID.
  • 404 if the master project does not exist.

Get the full project tree under a master project: top-level sub-projects and their nested child projects, ordered by depth then name.

Any organisation member can call this.

Path parameters

NameTypeRequiredDescription
idUUIDYesMaster project ID.

Example request

Terminal window
curl https://api.runnit.io/api/v1/master-projects/<master-project-id>/hierarchy \
-H 'Authorization: Bearer rnk_your_key'

Response

{
"success": true,
"projects": [
{
"id": "1f0e9a52-...",
"name": "Winter Launch",
"status": "active",
"stage": "planning",
"budget": 75000,
"budgetCurrency": "AUD",
"parentProjectId": null,
"depth": 0,
"startDate": "2026-07-01T00:00:00.000Z",
"targetCompletionDate": "2026-08-31T00:00:00.000Z",
"jobNumber": "RB-2026-014",
"color": "matcha"
}
]
}

The list is flat: rebuild the tree using parentProjectId and depth. Top-level sub-projects have no parent. budget, color, and the date fields can be null or absent.

Errors

  • 400 if id is not a UUID.
  • 404 if the master project does not exist.

Get the budget rollup for a master project: the overall budget, how much has been allocated to sub-projects, how much has been spent, and a per-project breakdown.

Any organisation member can call this.

Path parameters

NameTypeRequiredDescription
idUUIDYesMaster project ID.

Example request

Terminal window
curl https://api.runnit.io/api/v1/master-projects/<master-project-id>/budget \
-H 'Authorization: Bearer rnk_your_key'

Response

{
"success": true,
"budgetSummary": {
"masterProjectId": "a2c40f11-...",
"overallBudget": 400000,
"budgetCurrency": "AUD",
"totalAllocated": 310000,
"totalSpent": 122400,
"remaining": 90000,
"projectCount": 4,
"projectBreakdown": [
{
"projectId": "1f0e9a52-...",
"projectName": "Winter Launch",
"budget": 75000,
"spent": 31200,
"depth": 0,
"parentProjectId": null
}
]
}
}

overallBudget and remaining can be absent when the master project has no overall budget set. A breakdown entry’s budget can also be absent.

Errors

  • 400 if id is not a UUID.
  • 404 if the master project does not exist.

GET /api/v1/master-projects/:id/dependencies

Section titled “GET /api/v1/master-projects/:id/dependencies”

List the dependencies between projects inside a master project.

Any organisation member can call this.

Path parameters

NameTypeRequiredDescription
idUUIDYesMaster project ID.

Example request

Terminal window
curl https://api.runnit.io/api/v1/master-projects/<master-project-id>/dependencies \
-H 'Authorization: Bearer rnk_your_key'

Response

{
"success": true,
"dependencies": [
{
"id": "5c8b02de-...",
"projectId": "63f1aa20-...",
"dependsOnProjectId": "1f0e9a52-...",
"dependencyType": "finish_to_start",
"isBlocking": true
}
]
}

Errors

  • 400 if id is not a UUID.

POST /api/v1/master-projects/:id/dependencies

Section titled “POST /api/v1/master-projects/:id/dependencies”

Add a dependency between two projects.

Requires project update access in your organisation.

Path parameters

NameTypeRequiredDescription
idUUIDYesMaster project ID.

Request body

NameTypeRequiredDescription
projectIdUUIDYesThe project that depends on another.
dependsOnProjectIdUUIDYesThe project it depends on.
dependencyTypestringNofinish_to_start, finish_to_finish, or start_to_start.
isBlockingbooleanNoWhether the dependency blocks the dependent project.

Example request

Terminal window
curl -X POST https://api.runnit.io/api/v1/master-projects/<master-project-id>/dependencies \
-H 'Authorization: Bearer rnk_your_key' \
-H 'Content-Type: application/json' \
-d '{
"projectId": "<dependent-project-uuid>",
"dependsOnProjectId": "<prerequisite-project-uuid>",
"dependencyType": "finish_to_start",
"isBlocking": true
}'

Response

Returns 201 with the created dependency:

{ "success": true, "dependency": { "id": "5c8b02de-...", "dependencyType": "finish_to_start", "isBlocking": true } }

Errors

  • 400 if either project ID is not a UUID or the dependency type is invalid.
  • 400 if the dependency would create a circular reference.
  • 404 if either project does not exist.
  • 409 if the dependency already exists.

DELETE /api/v1/master-projects/:id/dependencies/:dependencyId

Section titled “DELETE /api/v1/master-projects/:id/dependencies/:dependencyId”

Remove a project dependency.

Requires project update access in your organisation.

Path parameters

NameTypeRequiredDescription
idUUIDYesMaster project ID.
dependencyIdUUIDYesDependency ID.

Example request

Terminal window
curl -X DELETE https://api.runnit.io/api/v1/master-projects/<master-project-id>/dependencies/<dependency-id> \
-H 'Authorization: Bearer rnk_your_key'

Response

{ "success": true }

Errors

  • 400 if either ID is not a UUID.

POST /api/v1/master-projects/:id/projects/link

Section titled “POST /api/v1/master-projects/:id/projects/link”

Link an existing project to a master project as a sub-project.

Requires project update access in your organisation.

Path parameters

NameTypeRequiredDescription
idUUIDYesMaster project ID.

Request body

NameTypeRequiredDescription
projectIdUUIDYesThe project to link. Must belong to the same organisation and must not already belong to another master project.

Example request

Terminal window
curl -X POST https://api.runnit.io/api/v1/master-projects/<master-project-id>/projects/link \
-H 'Authorization: Bearer rnk_your_key' \
-H 'Content-Type: application/json' \
-d '{ "projectId": "<project-uuid>" }'

Response

{ "success": true, "project": { "id": "1f0e9a52-...", "masterProjectId": "a2c40f11-..." } }

Errors

  • 400 if the project belongs to a different organisation.
  • 404 if the master project or project does not exist.
  • 409 if the project is already linked to another master project.

Create a new draft project and link it to the master project in one step. The new project inherits the master project’s client and currency when you do not supply them.

Requires project creation access in your organisation.

Path parameters

NameTypeRequiredDescription
idUUIDYesMaster project ID.

Request body

NameTypeRequiredDescription
namestringYesProject name. Must not be empty.
descriptionstringNoLonger description.
clientOrganizationIdUUID or nullNoClient override. Defaults to the master project’s client. Null creates an internal project.
budgetnumber or nullNoProject budget.
budgetCurrencystringNoCurrency code. Defaults to the master project’s currency, then AUD.
startDateISO 8601 date or nullNoPlanned start.
targetCompletionDateISO 8601 date or nullNoTarget delivery date.
jobNumberstringNo1 to 100 characters. Runnit generates one if omitted.
colorstringNoProject colour key: guava, mandarin, matcha, acai, coffee, or their -dark variants.

Example request

Terminal window
curl -X POST https://api.runnit.io/api/v1/master-projects/<master-project-id>/projects \
-H 'Authorization: Bearer rnk_your_key' \
-H 'Content-Type: application/json' \
-d '{
"name": "Social Cutdowns",
"description": "Create platform variants.",
"budget": 12000,
"startDate": "2026-07-20",
"targetCompletionDate": "2026-08-05"
}'

Response

Returns 201 with the created project:

{ "success": true, "project": { "id": "63f1aa20-...", "name": "Social Cutdowns", "status": "draft", "masterProjectId": "a2c40f11-..." } }

Errors

  • 400 if name is missing or empty, or a field fails validation.
  • 404 if the master project does not exist.

DELETE /api/v1/master-projects/:id/projects/:projectId

Section titled “DELETE /api/v1/master-projects/:id/projects/:projectId”

Unlink a project from a master project. The project itself is not deleted; it just stops being a sub-project.

Requires project update access in your organisation.

Path parameters

NameTypeRequiredDescription
idUUIDYesMaster project ID.
projectIdUUIDYesProject to unlink. Must currently be linked to this master project.

Example request

Terminal window
curl -X DELETE https://api.runnit.io/api/v1/master-projects/<master-project-id>/projects/<project-id> \
-H 'Authorization: Bearer rnk_your_key'

Response

{ "success": true, "project": { "id": "1f0e9a52-...", "masterProjectId": null } }

Errors

  • 400 if the project is not linked to this master project.
  • 404 if the project does not exist.

Manage the sub-projects themselves through the Projects API.