Menu

API reference · Projects

Project types

projects · types · 5 operations

GET/v1/projects/types

List project types

projects.types.list

ReadIdempotentSince 2026-11-01

Lists the organization's project types in their display order. A type configures the projects created from it: its statuses (each with a name and a category: open, in_progress, paused, done or cancelled; a project's status is one of them), its default phases, its custom field definitions (fields: name, slug, type, options) and its initial status. Archived types are left out unless include_archived is true. The list is empty if the organization never opened Projects: projects.projects.create without type_id creates the two built-in types. Requires view access to Projects.

Scope
projects:read
Permission
View the module
MCP tool
projects_types_listOn the full surface; on the compact one, mb_execute_operation with id: "projects.types.list".

Declared cost: up to 701 reads and 0 writes per call (they count against the daily quota).

Parameters

limitintegerqueryoptional

How many items this page brings at most (see the maximum and the default in the schema).

Default: 50

cursorstringqueryoptional

The next_cursor of the previous page, exactly as it came (only for the same list and filters); without it, the first page.

include_archivedbooleanqueryoptional

Also the archived types (default false).

Default: false

Response

dataarray<object>
has_moreboolean
next_cursorstring

Errors

Example

curl "https://api.mb-suite.com/v1/projects/types" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl "https://api.mb-suite.com/v1/projects/types" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/projects/types/{type_id}

Get one project type

projects.types.get

ReadIdempotentSince 2026-11-01

Returns one project type: name, description, color, icon, statuses (id, name, category, color), default phases, custom field definitions (fields: the slugs that the custom_fields of its projects use, with their type and options), initial status, whether it is the default type and whether it is archived. Not found if the id does not exist in this organization. Requires view access to Projects.

Scope
projects:read
Permission
View the module
MCP tool
projects_types_getOn the full surface; on the compact one, mb_execute_operation with id: "projects.types.get".

Declared cost: up to 2 reads and 0 writes per call (they count against the daily quota).

Parameters

type_idstringpathrequired

The type's id (from projects.types.list).

Response

idstring
namestring
statusesarray<object>
fieldsarray<object>
descriptionstring | null
colorstring
iconstring
phasesarray<object>
default_status_idstring
is_defaultboolean
is_archivedboolean
ordernumber
created_by_idstring

Who created it (a user id).

created_by_namestring | null

Display name of created_by_id (list and get; null if it is not a person of the organization).

created_atnumber
updated_atnumber

Errors

Example

curl "https://api.mb-suite.com/v1/projects/types/{type_id}" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl "https://api.mb-suite.com/v1/projects/types/{type_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/projects/types

Create a project type

projects.types.create

WriteSince 2026-11-01

Creates a project type: name, statuses (at least one, each with a name and a category: open, in_progress, paused, done or cancelled; ids are generated unless given), default phases, custom field definitions (fields; a slug comes from the name unless given), color, icon (an SVG path of a Material Design icon) and the initial status (default_status_id: the id of one of the given statuses; default the first). is_default makes it the type preselected for new projects and unmarks the previous one (the first type of an organization always is). Projects created later copy its statuses, phases and fields. Owners and admins only, as on the screen. Returns type_id and the type.

Scope
projects:write
Permission
Edit in the module · Only owner, admin
MCP tool
projects_types_createOn the full surface; on the compact one, mb_execute_operation with id: "projects.types.create".

Declared cost: up to 52 reads and 51 writes per call (they count against the daily quota).

Parameters

namestringbodyrequired

The type's name (up to 120 characters).

statusesarray<object>bodyrequired

Its statuses, in order (1 to 30).

descriptionstringbodyoptional

What projects of this type are.

colorstringbodyoptional

A hex color like #3b82f6.

iconstringbodyoptional

An SVG path of a Material Design icon (24×24), as the screen's type editor saves it.

phasesarray<object>bodyoptional

Its phases, in order: each new project copies them.

fieldsarray<object>bodyoptional

Its custom fields: each new project copies them as its item fields.

default_status_idstringbodyoptional

The id of one of statuses (give that status an id) that new projects start in; default: the first.

is_defaultbooleanbodyoptional

Make it the organization's default type (the previous default stops being one).

Response

type_idstring
typeobject

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/projects/types" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "name": "NAME",
  "statuses": []
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/projects/types" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "name": "NAME",
  "statuses": []
}'
PATCH/v1/projects/types/{type_id}

Update a project type

projects.types.update

WriteSince 2026-11-01

Updates a project type: name, description (null clears), color, icon, statuses, phases, fields, initial status, is_default (only true: it becomes the default and the previous one stops being it) and is_archived (an archived type is not offered for new projects; its projects keep working). statuses, phases and fields replace the whole list: send every entry and keep the id of the ones that stay. Removing a status that projects use moves them to the type's initial status; changing a status between an open and a closed category updates their is_closed (up to 480 projects per call). A field keeps its slug. Projects already created keep their own item statuses and item fields. Owners and admins only. Returns the updated type.

Scope
projects:write
Permission
Edit in the module · Only owner, admin
MCP tool
projects_types_updateOn the full surface; on the compact one, mb_execute_operation with id: "projects.types.update".

Declared cost: up to 520 reads and 500 writes per call (they count against the daily quota).

Parameters

type_idstringpathrequired

The type's id (from projects.types.list).

updatesobjectbodyrequired

The fields to change (at least one).

Response

typeobject

Errors

Example

curl -X PATCH "https://api.mb-suite.com/v1/projects/types/{type_id}" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "updates": {}
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X PATCH "https://api.mb-suite.com/v1/projects/types/{type_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "updates": {}
}'
DELETE/v1/projects/types/{type_id}

Delete a project type

projects.types.delete

IrreversibleSince 2026-11-01

Deletes a project type that no project uses; if some project still has it, it fails with project_type_in_use, which says how many and which (move those projects to another type or delete them first). To stop offering a type without deleting it, archive it. The dry run runs the same check (it fails the same way) and warns about the projects of this type that are in the trash: restored later, they come back with the organization's default type. The type goes to the 30-day trash and comes back as a non-default type when restored. Owners and admins only; outside the screen it requires a dry run and a confirm_token, except a REST DELETE with a key that can delete.

With an API key, this DELETE runs directly: the record stays 30 days in the trash and the response carries its trash_item_id. With an OAuth token, and through the MCP, it needs dry_run → confirm_token.

Scope
projects:write and “Allow deletions” (projects:delete in OAuth)
Permission
Edit in the module · Only owner, admin
MCP tool
projects_types_deleteOn the full surface; on the compact one, mb_execute_operation with id: "projects.types.delete".

Declared cost: up to 2 reads and 2 writes per call (they count against the daily quota).

Parameters

type_idstringpathrequired

The type's id (from projects.types.list).

Response

oktrue
trash_item_idstring

The trash item this deletion left: the item_id of platform.trash.restore (POST /trash/{item_id}/restore). Missing if nothing went to the trash.

trash_item_idsarray<string>

Only when the deletion left more than one copy: all of them, the first being trash_item_id.

trash_expires_atnumber

When the copy leaves the trash for good (epoch ms): 30 days after the deletion.

Errors

Example

curl -X DELETE "https://api.mb-suite.com/v1/projects/types/{type_id}" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X DELETE "https://api.mb-suite.com/v1/projects/types/{type_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"