> For the complete documentation index, see [llms.txt](https://docs.projetly.ai/home/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.projetly.ai/home/apis/projetly-make-api.md).

# Projetly - Make API

**Projetly** is an AI-powered platform that helps teams streamline customer onboarding, manage projects, automate workflows, and collaborate with customers in digital sales rooms. It keeps companies, contacts, deals, projects, and tasks organized across the whole customer lifecycle, from first touch through closed deal to delivery.

The **Projetly Make integration** connects Projetly to Make, so teams can automate work without writing code,  for example, create a contact when a form is submitted, start a project when a deal is won, or notify a channel when a task changes. The integration talks to Projetly over the REST API described in this document: it reads and writes companies, contacts, projects/deals, tasks, users, and templates, and manages webhook subscriptions so Make scenarios can trigger on Projetly events.

## Base URLs

| Surface                                                                          | Base URL                             |
| -------------------------------------------------------------------------------- | ------------------------------------ |
| **Marketplace API** — data, templates, users, tasks, webhooks                    | `https://market.api.projetly.io/api` |
| **Identity / OAuth host** — `/oauth/authorize`, `/oauth/token`, `/auth_refresh/` | `https://api.projetly.io/api`        |

All endpoint paths below are relative to one of these two bases (each endpoint notes which). A trailing slash is accepted — `/make/company` and `/make/company/` are equivalent.

## Getting App credentials

The `client_id` and `client_secret` are issued by Projetly — they are not self-service. To request them, email **<admin@projetly.ai>** with your app details:

* **App name** — the name of your integration.
* **Description** — what the integration does.
* **Permissions (scopes)** — the [OAuth2 scopes](#oauth2-scopes) your app needs (e.g. `company.read`, `deal.write`).
* **Endpoints** — the API paths you intend to call (e.g. `/make/company`, `/make/project`, `/webhook/subscribe`).

Projetly replies with your `client_id`, `client_secret`, and an Azure Functions key. Pass the function key either as the `x-functions-key` header or as a `code` query parameter (`?code=<function-key>`) — both are accepted.

## Authentication

Obtaining an access token uses the **OAuth2 authorization-code** flow. After that, **every** data / template / user / task / webhook request must carry three things:

1. **Bearer token** — `Authorization: Bearer <access_token>` (a JWT).
2. **HMAC request signature** — two headers proving the request came from the registered integration:
   * `X-OAuth-Timestamp` — current Unix time in seconds.
   * `X-OAuth-Signature` — `HMAC-SHA256(key = CLIENT_SECRET, message = "<CLIENT_ID>:<X-OAuth-Timestamp>")`, hex-encoded.
3. **Azure Functions key** — `x-functions-key: <function-host-key>`.

The OAuth endpoints themselves (`/oauth/authorize`, `/oauth/token`, `/auth_refresh/`) do **not** require the three headers above — they authenticate with the client credentials carried in the request.

### Token flow at a glance

{% stepper %}
{% step %}

## Authorize the user

Redirect the user to `GET /oauth/authorize` (signed URL). The user approves access, then Projetly redirects back to `redirect_uri` with `code` + `state`.
{% endstep %}

{% step %}

## Exchange the authorization code

Send `POST /oauth/token` with the `code`. The response returns `access_token` + `refresh_token`.
{% endstep %}

{% step %}

## Refresh the access token

When the access token expires, send `POST /auth_refresh/` with the refresh token. The response returns a new `access_token` and a new refresh token under `refresh`.
{% endstep %}
{% endstepper %}

### Security schemes

| Scheme           | Type                        | Where  | Name / detail                                                                        |
| ---------------- | --------------------------- | ------ | ------------------------------------------------------------------------------------ |
| `oauth2`         | OAuth2 (authorization code) | —      | authorize: `…/oauth/authorize/`, token: `…/oauth/token/`, refresh: `…/auth_refresh/` |
| `bearerAuth`     | HTTP bearer (JWT)           | header | `Authorization: Bearer <token>`                                                      |
| `oauthTimestamp` | API key                     | header | `X-OAuth-Timestamp`                                                                  |
| `oauthSignature` | API key                     | header | `X-OAuth-Signature` (HMAC-SHA256, see above)                                         |
| `functionsKey`   | API key                     | header | `x-functions-key`                                                                    |

### OAuth2 scopes

| Scope                              | Grants                         |
| ---------------------------------- | ------------------------------ |
| `deal.read` / `deal.write`         | Read / create-update deals     |
| `project.read` / `project.write`   | Read / create-update projects  |
| `company.read` / `company.write`   | Read / create-update companies |
| `contact.read` / `contact.write`   | Read / create-update contacts  |
| `template.read` / `template.write` | Read / write templates         |
| `user.read` / `user.write`         | Read / write users             |

## Conventions

* **Timestamps** are ISO-8601 UTC, e.g. `2026-06-05T07:46:23.312Z`.
* **List endpoints** wrap results in a `results` array and may return a `next_cursor` for cursor pagination, or accept `page` / `items_per_page` for offset pagination.
* **Extra fields:** object schemas are open (`additionalProperties: true`). The documented properties are the ones the integration relies on; responses may carry additional fields.
* **Mode-switching endpoints:** several GET endpoints change what they return based on a query parameter (e.g. `options`, `field_config`, `company_id`, `contact_id`, `milestone`). These modes are documented per endpoint.

## Common query parameters

| Name             | Type    | Default | Description                                                                                                                                                   |
| ---------------- | ------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `limit`          | integer | —       | Maximum number of records to return.                                                                                                                          |
| `sort`           | string  | —       | Sort field; prefix with `-` for descending (e.g. `-creation_time`).                                                                                           |
| `filter`         | string  | —       | JSON-encoded filter condition array.                                                                                                                          |
| `next_cursor`    | string  | —       | Cursor token from a previous list response.                                                                                                                   |
| `options`        | string  | —       | When set on supported endpoints, returns metadata option sets instead of records.                                                                             |
| `field_config`   | string  | —       | When truthy, returns the resource field configuration.                                                                                                        |
| `page`           | integer | —       | 1-indexed page number (offset pagination).                                                                                                                    |
| `items_per_page` | integer | —       | Records per page (offset pagination).                                                                                                                         |
| `due_filter`     | string  | —       | Relative due-date range: `show_all`, `today`, `tomorrow`, `yesterday`, `current_week`, `next_week`, `last_week`, `current_month`, `next_month`, `last_month`. |

## Common error responses

All endpoints share the error envelope `{ "status": "error", "message": "…" }` or `{ "error": "…" }` and these status codes:

| Code | Meaning                                                            |
| ---- | ------------------------------------------------------------------ |
| 400  | Bad Request — invalid or missing data.                             |
| 401  | Unauthorized — invalid/missing credentials or signature.           |
| 403  | Forbidden — caller lacks permission (e.g. disallowed event scope). |
| 404  | Not Found — resource does not exist.                               |
| 409  | Conflict — resource already exists.                                |
| 429  | Too Many Requests — an API rate limit was hit.                     |
| 500  | Internal Server Error.                                             |

See the [`Error`](#error) model for the body shape.

## Endpoints

{% hint style="info" %}
**Auth column legend:** “Required” = Bearer + `X-OAuth-Timestamp` + `X-OAuth-Signature` + `x-functions-key`. “Credentials Required” = no headers; the credentials travel in the request (OAuth endpoints only).
{% endhint %}

### Authentication endpoints

Base: `https://api.projetly.io/api`

#### `GET /oauth/authorize` — Begin the authorization-code flow

**Auth:** [Credentials Required](#authentication).

Redirects the user to Projetly to grant access; on approval Projetly redirects back to `redirect_uri` with `code` and `state`.

| Query param     | Type            | Required | Description                                                                           |
| --------------- | --------------- | -------- | ------------------------------------------------------------------------------------- |
| `client_id`     | string          | yes      | OAuth app client ID.                                                                  |
| `response_type` | string (`code`) | yes      | Must be `code`.                                                                       |
| `redirect_uri`  | string (uri)    | yes      | URL Projetly redirects back to.                                                       |
| `state`         | string          | yes      | Opaque value echoed back to prevent CSRF.                                             |
| `timestamp`     | string          | yes      | Unix time (seconds) used in the signature.                                            |
| `signature`     | string          | yes      | `HMAC-SHA256(key = CLIENT_SECRET, message = "<client_id>:<timestamp>")`, hex-encoded. |

**Responses**

| Status | Body              | Description                                                                            |
| ------ | ----------------- | -------------------------------------------------------------------------------------- |
| 302    | —                 | Redirect to `redirect_uri` with `code` and `state` query params.                       |
| 400    | [`Error`](#error) | Bad request — missing/invalid query params (`client_id`, `redirect_uri`, `signature`). |
| 401    | [`Error`](#error) | Unauthorized — invalid signature or unknown `client_id`.                               |

#### `POST /oauth/token` — Exchange an authorization code for tokens

**Auth:** [Credentials Required](#authentication).

**Content-Type:** `application/x-www-form-urlencoded`.

| Body field     | Type                          | Required | Description                                     |
| -------------- | ----------------------------- | -------- | ----------------------------------------------- |
| `code`         | string                        | yes      | Authorization code from the authorize redirect. |
| `client_id`    | string                        | yes      | OAuth app client ID.                            |
| `grant_type`   | string (`authorization_code`) | yes      | Must be `authorization_code`.                   |
| `redirect_uri` | string (uri)                  | yes      | Same redirect URI used in authorize.            |

**Responses**

| Status | Body                              | Description                                                              |
| ------ | --------------------------------- | ------------------------------------------------------------------------ |
| 200    | [`TokenResponse`](#tokenresponse) | Tokens issued — returns `access_token` and `refresh_token`.              |
| 400    | [`Error`](#error)                 | Bad request — missing/invalid `code`, `grant_type`, or `redirect_uri`.   |
| 401    | [`Error`](#error)                 | Unauthorized — invalid client credentials or expired authorization code. |

#### `POST /auth_refresh/` — Refresh an access token

**Auth:** [Credentials Required](#authentication).

**Content-Type:** `application/x-www-form-urlencoded`.

{% hint style="info" %}
Note the new refresh token returns under **`refresh`** (not `refresh_token`).
{% endhint %}

| Body field   | Type                     | Required | Description                |
| ------------ | ------------------------ | -------- | -------------------------- |
| `token`      | string                   | yes      | The current refresh token. |
| `grant_type` | string (`refresh_token`) | yes      | Must be `refresh_token`.   |

**Responses**

| Status | Body                                            | Description                                                  |
| ------ | ----------------------------------------------- | ------------------------------------------------------------ |
| 200    | `{ "access_token": string, "refresh": string }` | New `access_token` plus a new refresh token under `refresh`. |
| 400    | [`Error`](#error)                               | Bad request — missing/invalid `token` or `grant_type`.       |
| 401    | [`Error`](#error)                               | Unauthorized — refresh token invalid or revoked.             |

### Connection

Base: `https://market.api.projetly.io/api`

#### `GET /make/test` — Verify the integration is active

**Auth:** [Required](#authentication).

Returns the linked organisation name and Make app id; used as the connection test/label.

**Responses**

| Status | Body                                                                        | Description                                                           |
| ------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| 200    | `{ "status": "success", "organisation": "Acme Inc", "id": "app_id_value" }` | Integration active — returns the linked organisation name and app id. |
| 401    | [`Error`](#error)                                                           | Unauthorized — invalid/missing token or signature.                    |
| 500    | [`Error`](#error)                                                           | Internal server error.                                                |

### Companies

Base: `https://market.api.projetly.io/api`

#### `GET /make/company` — List companies, fetch one, or options / field config

**Auth:** [Required](#authentication).

Default returns a paginated company list. Modes:

* `company_id=<id>` → a single [`Company`](#company).
* `options=options` → metadata option sets (types, segments, industries, revenue/employee ranges) instead of company records.
* `field_config=<truthy>` → the company field configuration.

| Query param                              | Type   | Required | Description                                    |
| ---------------------------------------- | ------ | -------- | ---------------------------------------------- |
| `limit`, `sort`, `filter`, `next_cursor` | —      | no       | See common params.                             |
| `company_id`                             | string | no       | When set, returns the single matching company. |
| `options`, `field_config`                | string | no       | Mode switches.                                 |

**Responses**

| Status | Body                                                                                                                                                             | Description                                                                          |
| ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
| 200    | [`CompanyListResponse`](#companylistresponse) \| [`Company`](#company) \| [`OptionsResponse`](#optionsresponse) \| [`FieldConfigResponse`](#fieldconfigresponse) | Company list, a single company, options metadata, or field config depending on mode. |
| 400    | [`Error`](#error)                                                                                                                                                | Bad request — invalid query parameters.                                              |
| 401    | [`Error`](#error)                                                                                                                                                | Unauthorized — invalid/missing token or signature.                                   |
| 500    | [`Error`](#error)                                                                                                                                                | Internal server error.                                                               |

#### `POST /make/company` — Create a company

**Auth:** [Required](#authentication).

**Body:** [`CreateCompanyRequest`](#createcompanyrequest).

**Responses**

| Status | Body                                | Description                                                              |
| ------ | ----------------------------------- | ------------------------------------------------------------------------ |
| 200    | `{ "data": [`Company`](#company) }` | Company created — returns the new record under `data`.                   |
| 201    | `{ "data": [`Company`](#company) }` | Company created — returns the new record under `data`.                   |
| 400    | [`Error`](#error)                   | Validation error, or a company with the same name/domain already exists. |
| 401    | [`Error`](#error)                   | Unauthorized — invalid/missing token or signature.                       |
| 500    | [`Error`](#error)                   | Internal server error.                                                   |

#### `PUT /make/company/{company_id}` — Update a company

**Auth:** [Required](#authentication).

**Body:** [`CreateCompanyRequest`](#createcompanyrequest).

| Path param   | Type   | Required | Description                                                                                                                  |
| ------------ | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `company_id` | string | yes      | Company to update. Get the id from `GET /make/company` (list) or from the `POST /make/company` response (`data.company_id`). |

**Responses**

| Status | Body                                | Description                                                    |
| ------ | ----------------------------------- | -------------------------------------------------------------- |
| 200    | `{ "data": [`Company`](#company) }` | Company updated; returns the full updated record under `data`. |
| 400    | [`Error`](#error)                   | Missing `company_id` or validation error in the request body.  |
| 401    | [`Error`](#error)                   | Unauthorized — invalid/missing token or signature.             |
| 404    | [`Error`](#error)                   | No company exists with the given `company_id`.                 |
| 500    | [`Error`](#error)                   | Internal server error.                                         |

#### `PUT /make/{module}/field-config` — Update field configuration

**Auth:** [Required](#authentication).

Adds field definitions to the existing company or contact field configuration. Incoming definitions are merged with the existing definitions.

**Body:** [`FieldConfigUpdateRequest`](#fieldconfigupdaterequest).

| Path param | Type   | Required | Description                                         |
| ---------- | ------ | -------- | --------------------------------------------------- |
| `module`   | string | yes      | Resource to update. Must be `company` or `contact`. |

**Responses**

| Status | Body                                          | Description                                        |
| ------ | --------------------------------------------- | -------------------------------------------------- |
| 200    | [`FieldConfigResponse`](#fieldconfigresponse) | Field config updated.                              |
| 400    | [`Error`](#error)                             | Invalid module — expected `company` or `contact`.  |
| 401    | [`Error`](#error)                             | Unauthorized — invalid/missing token or signature. |
| 500    | [`Error`](#error)                             | Internal server error.                             |

### Contacts

Base: `https://market.api.projetly.io/api`

#### `GET /make/contact` — List contacts, fetch one, or options / field config

**Auth:** [Required](#authentication).

Default returns a paginated contact list. Modes:

* `contact_id=<id>` → a single [`Contact`](#contact).
* `options=options` → contact metadata option sets.
* `field_config=<truthy>` → the contact field configuration.

| Query param                              | Type   | Required | Description                                                                                                                                              |
| ---------------------------------------- | ------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `limit`, `sort`, `filter`, `next_cursor` | —      | no       | See common params.                                                                                                                                       |
| `contact_id`                             | string | no       | When set, returns the single matching contact. Get the id from `GET /make/contact` (list) or from the `POST /make/contact` response (`data.contact_id`). |
| `options`, `field_config`                | string | no       | Mode switches.                                                                                                                                           |

**Responses**

| Status | Body                                                                                                                                                             | Description                                                                          |
| ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
| 200    | [`ContactListResponse`](#contactlistresponse) \| [`Contact`](#contact) \| [`OptionsResponse`](#optionsresponse) \| [`FieldConfigResponse`](#fieldconfigresponse) | Contact list, a single contact, options metadata, or field config depending on mode. |
| 400    | [`Error`](#error)                                                                                                                                                | Bad request — invalid query parameters.                                              |
| 401    | [`Error`](#error)                                                                                                                                                | Unauthorized — invalid/missing token or signature.                                   |
| 500    | [`Error`](#error)                                                                                                                                                | Internal server error.                                                               |

#### `POST /make/contact` — Create a contact

**Auth:** [Required](#authentication).

**Body:** [`CreateContactRequest`](#createcontactrequest).

**Responses**

| Status | Body                                | Description                                                        |
| ------ | ----------------------------------- | ------------------------------------------------------------------ |
| 200    | `{ "data": [`Contact`](#contact) }` | Contact created — returns the new record under `data`.             |
| 201    | `{ "data": [`Contact`](#contact) }` | Contact created — returns the new record under `data`.             |
| 400    | [`Error`](#error)                   | Validation error, or a contact with the same email already exists. |
| 401    | [`Error`](#error)                   | Unauthorized — invalid/missing token or signature.                 |
| 500    | [`Error`](#error)                   | Internal server error.                                             |

#### `PUT /make/contact/{contact_id}` — Update a contact

**Auth:** [Required](#authentication).

**Body:** [`CreateContactRequest`](#createcontactrequest).

| Path param   | Type   | Required | Description                                                                                                                  |
| ------------ | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `contact_id` | string | yes      | Contact to update. Get the id from `GET /make/contact` (list) or from the `POST /make/contact` response (`data.contact_id`). |

**Responses**

| Status | Body                                | Description                                                    |
| ------ | ----------------------------------- | -------------------------------------------------------------- |
| 200    | `{ "data": [`Contact`](#contact) }` | Contact updated; returns the full updated record under `data`. |
| 400    | [`Error`](#error)                   | Missing `contact_id` or validation error in the request body.  |
| 401    | [`Error`](#error)                   | Unauthorized — invalid/missing token or signature.             |
| 404    | [`Error`](#error)                   | No contact exists with the given `contact_id`.                 |
| 500    | [`Error`](#error)                   | Internal server error.                                         |

### Templates

Base: `https://market.api.projetly.io/api`

#### `GET /make/templates` — List templates or fetch a specific template

**Auth:** [Required](#authentication).

Lists pipeline / deal-stage / project templates. When `org_temp_id` is provided, returns that single template.

| Query param         | Type    | Required | Description                                                        |
| ------------------- | ------- | -------- | ------------------------------------------------------------------ |
| `module`            | string  | no       | Template module, e.g. `templates`.                                 |
| `template_type`     | string  | no       | Category: `pipelines`, `deal_stages`, `project`.                   |
| `sub_template_type` | integer | no       | Sub-type filter (e.g. `4`, `5`, `6`).                              |
| `page`              | integer | no       | Offset page (1-indexed). Omitted when `org_temp_id` is provided.   |
| `items_per_page`    | integer | no       | Records per page. Defaults to `60` when `org_temp_id` is provided. |
| `org_temp_id`       | string  | no       | Fetch a specific template by id.                                   |

**Responses**

| Status | Body                                                                       | Description                                                                   |
| ------ | -------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| 200    | [`TemplateListResponse`](#templatelistresponse) \| [`Template`](#template) | Paginated template list, or a single template when `org_temp_id` is provided. |
| 400    | [`Error`](#error)                                                          | Bad request — invalid query parameters.                                       |
| 401    | [`Error`](#error)                                                          | Unauthorized — invalid/missing token or signature.                            |
| 404    | [`Error`](#error)                                                          | No template exists with the given `org_temp_id`.                              |
| 500    | [`Error`](#error)                                                          | Internal server error.                                                        |

### Projects & Deals

Base: `https://market.api.projetly.io/api`. Projects and deals are the same resource, distinguished by `module` / `project_type`.

#### `GET /make/project` — List projects or deals

**Auth:** [Required](#authentication).

Returns the paginated upstream `project/info/` response envelope: `count`, `next`, `previous`, `results`, and `max_page_limit`.

* Projects: `module=projects`, `project_type=project`.
* Deals: `module=deal_plan`, `project_type=deal`.

| Query param                    | Type    | Required | Description                                   |
| ------------------------------ | ------- | -------- | --------------------------------------------- |
| `page`, `items_per_page`       | integer | no       | Offset pagination.                            |
| `project_type`                 | string  | no       | `project` or `deal`.                          |
| `module`                       | string  | no       | `projects` or `deal_plan`.                    |
| `org_temp_id`                  | string  | no       | Template id filter passed to the project API. |
| `sort`, `filter`, `due_filter` | —       | no       | See common params.                            |

**Responses**

| Status | Body                                          | Description                                        |
| ------ | --------------------------------------------- | -------------------------------------------------- |
| 200    | [`ProjectListResponse`](#projectlistresponse) | Paginated project/deal list.                       |
| 400    | [`Error`](#error)                             | Bad request — invalid query parameters.            |
| 401    | [`Error`](#error)                             | Unauthorized — invalid/missing token or signature. |
| 500    | [`Error`](#error)                             | Internal server error.                             |

#### `POST /make/project` — Create a project or deal

**Auth:** [Required](#authentication).

**Body:** [`CreateProjectRequest`](#createprojectrequest).

**Responses**

| Status | Body                                              | Description                                                       |
| ------ | ------------------------------------------------- | ----------------------------------------------------------------- |
| 200    | [`CreateProjectResponse`](#createprojectresponse) | Project/deal created — returns the new ids and status.            |
| 201    | [`CreateProjectResponse`](#createprojectresponse) | Project/deal created — returns the new ids and status.            |
| 400    | [`Error`](#error)                                 | Validation error — missing required `project` / `account` fields. |
| 401    | [`Error`](#error)                                 | Unauthorized — invalid/missing token or signature.                |
| 500    | [`Error`](#error)                                 | Creation failed — internal server error.                          |

#### `GET /make/project/{project_id}` — Project milestones payload, options, or milestones

**Auth:** [Required](#authentication).

Fetches a project's milestone payload from the Projetly API via the upstream `project/info/milestones/` API. The Make handler always fetches the full milestone payload first, then returns one of three response shapes:

* Default → the full [`ProjectInfo`](#projectinfo) payload returned by `get_project_milestones`.
* `options=true` → returns only the payload's [`ProjectOptionsResponse`](#projectoptionsresponse) object.
* `milestone=true` or `milestones=true` → returns only the payload's milestones under `{ "results": [...] }`.

| Param        | In    | Type    | Required | Description                                                                                                          |
| ------------ | ----- | ------- | -------- | -------------------------------------------------------------------------------------------------------------------- |
| `project_id` | path  | string  | yes      | Target project. Get the id from `GET /make/project` (list) or from the `POST /make/project` response (`project_id`). |
| `due_filter` | query | string  | no       | Relative due-date range. Defaults to `show_all`.                                                                     |
| `options`    | query | boolean | no       | `true` → return the upstream `options` object.                                                                       |
| `milestone`  | query | boolean | no       | `true` → return milestone records under `results`.                                                                   |
| `milestones` | query | boolean | no       | Alias for `milestone=true`.                                                                                          |

**Responses**

| Status | Body                                                                                                                                                      | Description                                                                      |
| ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| 200    | [`ProjectInfo`](#projectinfo) \| [`ProjectOptionsResponse`](#projectoptionsresponse) \| [`ProjectMilestonesListResponse`](#projectmilestoneslistresponse) | Full milestone payload, project options, or milestone records depending on mode. |
| 400    | [`Error`](#error)                                                                                                                                         | Missing `project_id` or invalid query parameters.                                |
| 401    | [`Error`](#error)                                                                                                                                         | Unauthorized — invalid/missing token or signature.                               |
| 404    | [`Error`](#error)                                                                                                                                         | No project exists with the given `project_id`.                                   |
| 500    | [`Error`](#error)                                                                                                                                         | Internal server error.                                                           |

#### `GET /make/deal/options` — Fetch deal creation options

**Auth:** [Required](#authentication).

Returns metadata used to create deals, such as available pipelines, deal stages, and field choices. The exact response shape is an open object returned by the upstream project API.

**Responses**

| Status | Body                                          | Description                                        |
| ------ | --------------------------------------------- | -------------------------------------------------- |
| 200    | [`DealOptionsResponse`](#dealoptionsresponse) | Deal creation options metadata.                    |
| 401    | [`Error`](#error)                             | Unauthorized — invalid/missing token or signature. |
| 500    | [`Error`](#error)                             | Internal server error.                             |

### Users

Base: `https://market.api.projetly.io/api`

#### `GET /make/users` — List organization users

**Auth:** [Required](#authentication).

Returns organization users. When `email` is provided, the response is filtered to users whose email exactly matches the provided value.

| Query param | Type   | Required | Description                       |
| ----------- | ------ | -------- | --------------------------------- |
| `email`     | string | no       | Exact email address to filter by. |

**Responses**

| Status | Body                     | Description                                        |
| ------ | ------------------------ | -------------------------------------------------- |
| 200    | Array of [`User`](#user) | Organization users, optionally filtered by email.  |
| 401    | [`Error`](#error)        | Unauthorized — invalid/missing token or signature. |
| 500    | [`Error`](#error)        | Internal server error.                             |

### Tasks

Base: `https://market.api.projetly.io/api`

#### `GET /make/tasks` — List a project's tasks

**Auth:** [Required](#authentication).

Fetches a project's milestones and flattens every milestone's `tasks` into a single `results` array.

| Query param      | Type    | Required | Description                                                                                                         |
| ---------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------- |
| `project_id`     | string  | yes      | Project whose tasks to fetch. Get the id from `GET /make/project` (list) or from the `POST /make/project` response. |
| `due_filter`     | string  | no       | Relative due-date range. Defaults to `show_all`.                                                                    |
| `filter`         | string  | no       | JSON-encoded filter.                                                                                                |
| `items_per_page` | integer | no       | Records per page. Defaults to `10`.                                                                                 |
| `page`           | integer | no       | 1-indexed page number.                                                                                              |

**Responses**

| Status | Body                                    | Description                                        |
| ------ | --------------------------------------- | -------------------------------------------------- |
| 200    | [`TaskListResponse`](#tasklistresponse) | Flattened task list.                               |
| 400    | [`Error`](#error)                       | Missing `project_id`.                              |
| 401    | [`Error`](#error)                       | Unauthorized — invalid/missing token or signature. |
| 500    | [`Error`](#error)                       | Internal server error.                             |

#### `POST /make/task` — Create a task

**Auth:** [Required](#authentication).

**Body:** [`CreateTaskRequest`](#createtaskrequest).

**Responses**

| Status | Body                          | Description                                         |
| ------ | ----------------------------- | --------------------------------------------------- |
| 200    | `{ "task": [`Task`](#task) }` | Task created — returns the new task.                |
| 201    | `{ "task": [`Task`](#task) }` | Task created — returns the new task.                |
| 400    | [`Error`](#error)             | Validation error — missing `title` or `project_id`. |
| 401    | [`Error`](#error)             | Unauthorized — invalid/missing token or signature.  |
| 500    | [`Error`](#error)             | Internal server error.                              |

### Integration Management

Base: `https://market.api.projetly.io/api`

#### `DELETE /make/invalidate` — Revoke and remove the Make integration

**Auth:** [Required](#authentication).

Permanently removes the stored Make integration record for the organisation and deletes webhook dispatches associated with the integration app id.

**Responses**

| Status | Body                                                     | Description                                        |
| ------ | -------------------------------------------------------- | -------------------------------------------------- |
| 200    | `{ "message": "Make integration removed successfully" }` | Integration removed.                               |
| 401    | [`Error`](#error)                                        | Unauthorized — invalid/missing token or signature. |
| 404    | [`Error`](#error)                                        | Make integration not found.                        |
| 500    | [`Error`](#error)                                        | Internal server error.                             |

### Webhooks

Base: `https://market.api.projetly.io/api`. REST-hook subscription management.

#### `POST /webhook/subscribe` — Subscribe to event webhooks

**Auth:** [Required](#authentication).

**Body:** [`WebhookSubscribeRequest`](#webhooksubscriberequest). `events` is a string containing a list literal, e.g. `"['company_created']"`. For task events, `project_id` scopes delivery to one project.

**Responses**

| Status | Body                                                             | Description                                        |
| ------ | ---------------------------------------------------------------- | -------------------------------------------------- |
| 200    | `{ "id": string, "message": "Webhook subscription successful" }` | Subscription created; `id` is used to unsubscribe. |
| 400    | [`Error`](#error)                                                | Missing `target_url`/`events`.                     |
| 401    | [`Error`](#error)                                                | Invalid signature/token.                           |
| 403    | [`Error`](#error)                                                | Disallowed event scope.                            |
| 404    | [`Error`](#error)                                                | No matching app info.                              |
| 500    | [`Error`](#error)                                                | Internal server error.                             |

#### `DELETE /webhook/unsubscribe` — Unsubscribe from event webhooks

**Auth:** [Required](#authentication).

| Body field       | Type   | Required | Description                       |
| ---------------- | ------ | -------- | --------------------------------- |
| `subscriptionId` | string | yes      | The `id` returned from subscribe. |

**Responses**

| Status | Body                                                 | Description                                    |
| ------ | ---------------------------------------------------- | ---------------------------------------------- |
| 200    | `{ "message": "Webhook unsubscription successful" }` | Subscription removed.                          |
| 400    | [`Error`](#error)                                    | Missing `subscriptionId` or signature headers. |
| 401    | [`Error`](#error)                                    | Invalid signature/token.                       |
| 404    | [`Error`](#error)                                    | Subscription not found.                        |
| 500    | [`Error`](#error)                                    | Internal server error.                         |

## Data models

All objects are open (may contain extra fields). Types use JSON conventions (`string`, `integer`, `number`, `boolean`, `array`, `object`, `null`).

### Error

Standard error envelope.

| Field     | Type   | Description                       | Example                |
| --------- | ------ | --------------------------------- | ---------------------- |
| `status`  | string | `"error"` on handled errors.      | `error`                |
| `message` | string | Human-readable error message.     | `Invalid request body` |
| `error`   | string | Present on auth/signature errors. | `Invalid signature`    |

### TokenResponse

| Field           | Type    | Description                               | Example          |
| --------------- | ------- | ----------------------------------------- | ---------------- |
| `access_token`  | string  | OAuth access token (JWT).                 | `eyJhbGci7892xx` |
| `refresh_token` | string  | OAuth refresh token used to renew access. | `def5027892xx`   |
| `token_type`    | string  | Token scheme; always `Bearer`.            | `Bearer`         |
| `expires_in`    | integer | Access-token lifetime in seconds.         | `3600`           |

### Address

| Field      | Type   | Description                | Example            |
| ---------- | ------ | -------------------------- | ------------------ |
| `country`  | string | Country name.              | `United States`    |
| `state`    | string | State / province / region. | `New York`         |
| `city`     | string | City or town.              | `New York`         |
| `address`  | string | Street address line.       | `350 Fifth Avenue` |
| `zip_code` | string | Postal / ZIP code.         | `10118`            |

### OwnerRef

Reference to a user (owner).

| Field           | Type           | Description              | Example              |
| --------------- | -------------- | ------------------------ | -------------------- |
| `user_id`       | string         | Owning user's id.        | `7892xxxxxxxxxxxx`   |
| `full_name`     | string         | Owning user's full name. | `Sample First Last`  |
| `email`         | string         | Owning user's email.     | `sample@mail.com`    |
| `role`          | string         | User role.               | `admin, member`      |
| `profile_image` | string \| null | Profile image URL.       | `https://sample.com` |

### StatusRef

| Field         | Type              | Description                                | Example                    |
| ------------- | ----------------- | ------------------------------------------ | -------------------------- |
| `id`          | string \| integer | Status id.                                 | `1`                        |
| `status_id`   | string \| integer | Status id when returned under `status_id`. | `1`                        |
| `status_key`  | string            | Machine key for the status.                | `in_progress, not_started` |
| `status_name` | string            | Human-readable status label.               | `In Progress, Not Started` |
| `color`       | string            | Status color.                              | `#50C878`                  |
| `icon`        | string            | Status icon class.                         | `fa-solid fa-circle-check` |

### Company

| Field                     | Type                                      | Description                                        | Example                                              |
| ------------------------- | ----------------------------------------- | -------------------------------------------------- | ---------------------------------------------------- |
| `id`                      | string                                    | Internal record id.                                | `7892xxxxxxxxxxxx`                                   |
| `company_id`              | string                                    | Company id.                                        | `7892xxxxxxxxxxxx`                                   |
| `display_id`              | string                                    | Human-readable display id.                         | `COMPANY_0302`                                       |
| `company_name`            | string                                    | Company name.                                      | `Sample Company`                                     |
| `domain`                  | string                                    | Website / domain.                                  | `https://sample.com`                                 |
| `linkedin_url`            | string                                    | LinkedIn company URL.                              | `https://linkedin.com/company/sample`                |
| `twitter_url`             | string                                    | Twitter/X profile URL.                             | `https://sample.com`                                 |
| `hq_location`             | [`Address`](#address) \| string           | Headquarters location.                             | see [Address](#address)                              |
| `hq_country`              | string                                    | Headquarters country.                              | `United States`                                      |
| `industry`                | string                                    | Vertical / industry.                               | `Education, SaaS`                                    |
| `employee_range`          | string                                    | Employee-count range key.                          | `11-50, 51-200`                                      |
| `estimated_arr`           | string                                    | ARR range key.                                     | `5_10m, 50m+`                                        |
| `employees`               | integer \| null                           | Number of linked contacts.                         | `0`                                                  |
| `description`             | string                                    | Free-text company description.                     | `Sample description`                                 |
| `logo_url`                | string \| null                            | Company logo URL.                                  | `https://sample.com`                                 |
| `company_owner`           | [`OwnerRef`](#ownerref) \| string \| null | Owner record or user id.                           | `7892xxxxxxxxxxxx`                                   |
| `company_type`            | string                                    | Company classification.                            | `prospect, customer`                                 |
| `lead_status`             | string                                    | Lead status key.                                   | `new, contacted`                                     |
| `lead_status_pipeline_id` | string                                    | Pipeline the lead status belongs to.               | `7892xxxxxxxxxxxx`                                   |
| `operating_regions`       | list                                      | List of strings — regions the company operates in. | `["Africa", "Europe"]`                               |
| `customer_segment`        | string                                    | Customer segment.                                  | `mid_market, enterprise`                             |
| `icp_fit`                 | string                                    | Ideal-customer-profile fit.                        | `excellent, good`                                    |
| `connection_strength`     | string                                    | Strength of the relationship.                      | `very_strong, weak`                                  |
| `connection_source`       | string                                    | How the connection originated.                     | `founder, referral`                                  |
| `vendor_being_replaced`   | string \| null                            | Incumbent vendor being replaced.                   | `Acme CRM`                                           |
| `replacement_urgency`     | string \| null                            | Urgency of replacing the vendor.                   | `low, high`                                          |
| `category`                | string                                    | Company category.                                  | `marketing, sales`                                   |
| `record_source`           | string                                    | Where the record came from.                        | `ui, integration`                                    |
| `partner_type`            | string \| null                            | Partner type.                                      | `implementation_partner`                             |
| `parent_company`          | object \| null                            | Parent company reference.                          | `{ "company_id": "7892xxxx" }`                       |
| `investors`               | list                                      | Investor references.                               | `[]`                                                 |
| `partners`                | list                                      | Partner company references.                        | `[]`                                                 |
| `subsidiaries`            | list                                      | Subsidiary company references.                     | `[]`                                                 |
| `locations`               | list                                      | Additional company locations.                      | `[]`                                                 |
| `contacts_count`          | integer                                   | Number of linked contacts.                         | `0`                                                  |
| `is_draft`                | boolean                                   | Save as a draft instead of finalized.              | `false`                                              |
| `custom_fields`           | object                                    | Arbitrary custom field key/values.                 | `{ "tier": "gold" }`                                 |
| `external_map`            | object \| null                            | External-system mapping.                           | `{ "project_id": "7892xxxx", "project_flag": true }` |
| `associated_deal_project` | object `{ deals, projects }`              | Associated deals and projects in list responses.   | `{ "deals": [], "projects": [] }`                    |
| `created_by`              | string                                    | User id that created the record.                   | `7892xxxxxxxxxxxx`                                   |
| `last_updated_by`         | string                                    | User id of the last editor.                        | `7892xxxxxxxxxxxx`                                   |
| `creation_time`           | string (date-time)                        | When the record was created.                       | `2026-06-05T07:46:23.312Z`                           |
| `last_update_time`        | string (date-time)                        | When the record was last updated.                  | `2026-06-05T07:46:23.312Z`                           |

### CompanyListResponse

| Field             | Type           | Description                                                | Example                 |
| ----------------- | -------------- | ---------------------------------------------------------- | ----------------------- |
| `count`           | integer        | Number of records in the current response.                 | `20`                    |
| `results`         | list           | List of [`Company`](#company) objects — page of companies. | see [Company](#company) |
| `has_next`        | boolean        | Whether another page is available.                         | `true`                  |
| `has_previous`    | boolean        | Whether a previous page is available.                      | `false`                 |
| `next_cursor`     | string \| null | Cursor for the next page, or null when exhausted.          | `eyJjdXxxxxx...`        |
| `previous_cursor` | string \| null | Cursor for the previous page when returned.                | `eyJwcmV2...`           |

### CreateCompanyRequest

Required: `company_name`.

| Field                     | Type                      | Required | Description                                                                            | Example                               |
| ------------------------- | ------------------------- | -------- | -------------------------------------------------------------------------------------- | ------------------------------------- |
| `company_name`            | string                    | yes      | Company name.                                                                          | `Sample Company`                      |
| `domain`                  | string                    | no       | Website / domain.                                                                      | `https://sample.com`                  |
| `linkedin_url`            | string                    | no       | LinkedIn company URL.                                                                  | `https://linkedin.com/company/sample` |
| `twitter_url`             | string                    | no       | Twitter/X profile URL.                                                                 | `https://sample.com`                  |
| `description`             | string                    | no       | Free-text company description.                                                         | `Sample description`                  |
| `lead_status`             | [`StatusRef`](#statusref) | no       | Lead status.                                                                           | `{ "status_key": "new" }`             |
| `lead_status_pipeline_id` | string                    | no       | Pipeline the lead status belongs to. Obtain from your Projetly pipeline configuration. | `7892xxxxxxxxxxxx`                    |
| `parent_company`          | string                    | no       | Parent company name.                                                                   | `Sample Parent`                       |
| `parent_company_id`       | string                    | no       | Parent company id to link under. Get from `GET /make/company` (list).                  | `7892xxxxxxxxxxxx`                    |
| `operating_regions`       | list                      | no       | List of strings — regions the company operates in.                                     | `["Africa", "Europe"]`                |
| `category`                | string                    | no       | Company category.                                                                      | `marketing, sales`                    |
| `industry`                | string                    | no       | Vertical / industry.                                                                   | `Education, SaaS`                     |
| `company_owner`           | string                    | no       | User id of the owner. Get from `GET /make/users`.                                      | `7892xxxxxxxxxxxx`                    |
| `customer_segment`        | string                    | no       | Customer segment.                                                                      | `mid_market, enterprise`              |
| `icp_fit`                 | string                    | no       | Ideal-customer-profile fit.                                                            | `excellent, good`                     |
| `company_type`            | string                    | no       | Company classification.                                                                | `prospect, customer`                  |
| `connection_source`       | string                    | no       | How the connection originated.                                                         | `founder, referral`                   |
| `vendor_being_replaced`   | string                    | no       | Incumbent vendor being replaced.                                                       | `Acme CRM`                            |
| `estimated_arr`           | string                    | no       | Range key resolved from a numeric ARR.                                                 | `5_10m, 50m+`                         |
| `employee_range`          | string                    | no       | Range key resolved from a numeric employee count.                                      | `11-50, 51-200`                       |
| `hq_location`             | [`Address`](#address)     | no       | Headquarters location.                                                                 | see [Address](#address)               |
| `record_source`           | string                    | no       | Where the record came from.                                                            | `integration`                         |
| `is_draft`                | boolean                   | no       | Save as a draft instead of finalized.                                                  | `false`                               |
| `custom_fields`           | object                    | no       | Arbitrary custom field key/values.                                                     | `{ "tier": "gold" }`                  |

### Contact

| Field                             | Type                            | Description                                                        | Example                                                            |
| --------------------------------- | ------------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------ |
| `id`                              | string                          | Internal record id.                                                | `7892xxxxxxxxxxxx`                                                 |
| `contact_id`                      | string                          | Contact id.                                                        | `7892xxxxxxxxxxxx`                                                 |
| `display_id`                      | string                          | Human-readable display id.                                         | `CONTACT_0007`                                                     |
| `full_name`                       | string                          | Full display name.                                                 | `Sample First Last`                                                |
| `first_name`                      | string                          | Given name.                                                        | `Sample First`                                                     |
| `last_name`                       | string                          | Family name.                                                       | `Sample Last`                                                      |
| `primary_email`                   | string                          | Primary work email.                                                | `sample@mail.com`                                                  |
| `secondary_emails`                | list                            | List of strings — additional email addresses.                      | `["sample@mail.com"]`                                              |
| `primary_phone`                   | string                          | Primary phone number.                                              | `+1 1234567xxx`                                                    |
| `phone`                           | object `{ primary }`            | Phone object with a `primary` number.                              | `{ "primary": "+1 1234567xxx" }`                                   |
| `phones`                          | list                            | List of objects — additional phone entries.                        | `[{ "primary": "+1 1234567xxx" }]`                                 |
| `company`                         | list                            | List of objects `{ company_id, company_name }` — linked companies. | `[{ "company_id": "7892xxxx", "company_name": "Sample Company" }]` |
| `company_ids`                     | list                            | List of strings — linked company ids.                              | `["7892xxxxxxxxxxxx"]`                                             |
| `contact_owner`                   | [`OwnerRef`](#ownerref) \| null | Owning user reference.                                             | see [OwnerRef](#ownerref)                                          |
| `lead_source`                     | string                          | Where the contact originated.                                      | `integration`                                                      |
| `lead_status`                     | string                          | Lead status key.                                                   | `new, contacted`                                                   |
| `lead_status_pipeline_id`         | string                          | Pipeline the lead status belongs to.                               | `7892xxxxxxxxxxxx`                                                 |
| `contact_stage`                   | string                          | Stage in the contact lifecycle.                                    | `lead, qualified`                                                  |
| `job_title`                       | string                          | Role/title at the company.                                         | `VP, CEO, Manager`                                                 |
| `department`                      | string                          | Department the contact belongs to.                                 | `Engineering, Sales`                                               |
| `location`                        | [`Address`](#address)           | Contact location.                                                  | see [Address](#address)                                            |
| `timezone`                        | string                          | IANA timezone.                                                     | `Asia/Calcutta`                                                    |
| `language`                        | string                          | Preferred language (ISO code).                                     | `en`                                                               |
| `person_category`                 | object `{ key, name }`          | Contact category.                                                  | `{ "key": "prospect", "name": "Prospect" }`                        |
| `preferred_communication_channel` | string                          | Preferred communication channel.                                   | `email, phone`                                                     |
| `seniority_level`                 | string                          | Seniority level.                                                   | `ic, manager, exec`                                                |
| `buying_role`                     | string                          | Role in the buying process.                                        | `decision maker, influencer`                                       |
| `signoff_authority`               | string                          | Whether the contact can sign off.                                  | `yes, no`                                                          |
| `do_not_contact`                  | string                          | Do-not-contact flag.                                               | `yes, no`                                                          |
| `influence_level`                 | number                          | Influence score.                                                   | `0`                                                                |
| `interest_level`                  | number                          | Interest score.                                                    | `0`                                                                |
| `whatsapp_number`                 | string                          | WhatsApp contact number.                                           | `+1 1234567xxx`                                                    |
| `campaign`                        | string                          | Source marketing campaign.                                         | `Spring Outreach`                                                  |
| `internal_notes`                  | string                          | Free-text internal notes.                                          | `Met at conference`                                                |
| `linkedin_url`                    | string                          | LinkedIn profile URL.                                              | `https://linkedin.com/in/sample`                                   |
| `twitter_url`                     | string                          | Twitter/X profile URL.                                             | `https://sample.com`                                               |
| `created_by`                      | string                          | User id that created the record.                                   | `7892xxxxxxxxxxxx`                                                 |
| `creation_time`                   | string (date-time)              | When the record was created.                                       | `2026-06-05T05:18:01.443Z`                                         |
| `last_update_time`                | string (date-time)              | When the record was last updated.                                  | `2026-06-05T05:18:01.443Z`                                         |

### ContactListResponse

| Field             | Type           | Description                                               | Example                 |
| ----------------- | -------------- | --------------------------------------------------------- | ----------------------- |
| `count`           | integer        | Number of records in the current response.                | `20`                    |
| `results`         | list           | List of [`Contact`](#contact) objects — page of contacts. | see [Contact](#contact) |
| `has_next`        | boolean        | Whether another page is available.                        | `true`                  |
| `has_previous`    | boolean        | Whether a previous page is available.                     | `false`                 |
| `next_cursor`     | string \| null | Cursor for the next page, or null when exhausted.         | `eyJjdXxxxxx...`        |
| `previous_cursor` | string \| null | Cursor for the previous page when returned.               | `eyJwcmV2...`           |

### CreateContactRequest

Required: `primary_email`, `first_name`.

| Field                     | Type                  | Required | Description                                                                            | Example                          |
| ------------------------- | --------------------- | -------- | -------------------------------------------------------------------------------------- | -------------------------------- |
| `primary_email`           | string                | yes      | Primary work email; unique per contact.                                                | `sample@mail.com`                |
| `first_name`              | string                | yes      | Contact's given name.                                                                  | `Sample First`                   |
| `last_name`               | string                | no       | Contact's family name.                                                                 | `Sample Last`                    |
| `full_name`               | string                | no       | Display name; derived from first/last if omitted.                                      | `Sample First Last`              |
| `primary_phone`           | string                | no       | Primary phone number.                                                                  | `+1 1234567xxx`                  |
| `job_title`               | string                | no       | Role/title at the company.                                                             | `VP, CEO, Manager`               |
| `linkedin_url`            | string                | no       | LinkedIn profile URL.                                                                  | `https://linkedin.com/in/sample` |
| `twitter_url`             | string                | no       | Twitter/X profile URL.                                                                 | `https://sample.com`             |
| `whatsapp_number`         | string                | no       | WhatsApp contact number.                                                               | `+1 1234567xxx`                  |
| `secondary_emails`        | list                  | no       | List of strings — additional email addresses.                                          | `["sample@mail.com"]`            |
| `phones`                  | list                  | no       | List of strings — additional phone numbers.                                            | `["+1 1234567xxx"]`              |
| `phone`                   | object `{ primary }`  | no       | Phone object with a `primary` number.                                                  | `{ "primary": "+1 1234567xxx" }` |
| `company_ids`             | list                  | no       | List of strings — linked company ids. Get ids from `GET /make/company` (list).         | `["7892xxxxxxxxxxxx"]`           |
| `location`                | [`Address`](#address) | no       | Mailing/location address.                                                              | see [Address](#address)          |
| `department`              | string                | no       | Department the contact belongs to.                                                     | `Engineering, Sales`             |
| `lead_status`             | string                | no       | Lead status key.                                                                       | `new, contacted`                 |
| `lead_status_pipeline_id` | string                | no       | Pipeline the lead status belongs to. Obtain from your Projetly pipeline configuration. | `7892xxxxxxxxxxxx`               |
| `contact_owner`           | string                | no       | User id of the owner. Get from `GET /make/users`.                                      | `7892xxxxxxxxxxxx`               |
| `language`                | string                | no       | Preferred language (ISO code).                                                         | `en`                             |
| `campaign`                | string                | no       | Source marketing campaign.                                                             | `Spring Outreach`                |
| `internal_notes`          | string                | no       | Free-text internal notes.                                                              | `Met at conference`              |
| `buying_role`             | string                | no       | Role in the buying process.                                                            | `decision maker, influencer`     |
| `person_category`         | string                | no       | Contact category.                                                                      | `prospect, customer`             |
| `communication_channel`   | string                | no       | Preferred communication channel.                                                       | `email, phone`                   |
| `lead_source`             | string                | no       | Where the contact originated.                                                          | `integration`                    |
| `is_draft`                | boolean               | no       | Save as a draft instead of finalized.                                                  | `false`                          |
| `custom_fields`           | object                | no       | Arbitrary custom field key/values.                                                     | `{ "tier": "gold" }`             |

### ProjectOrDeal

| Field                    | Type                                          | Description                                                           | Example                                                                                 |
| ------------------------ | --------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
| `project_id`             | string                                        | Project / deal id.                                                    | `7892xxxxxxxxxxxx`                                                                      |
| `project_name`           | string                                        | Project / deal name.                                                  | `Sample Project`                                                                        |
| `description`            | string                                        | Free-text description.                                                | `Sample description`                                                                    |
| `start_date`             | string (date-time)                            | Start date.                                                           | `2026-03-17T18:30:00Z`                                                                  |
| `due_date`               | string (date-time)                            | Due date.                                                             | `2026-06-24T18:30:00Z`                                                                  |
| `project_score`          | number                                        | Health / score value.                                                 | `75`                                                                                    |
| `tasks_count`            | integer                                       | Number of tasks.                                                      | `12`                                                                                    |
| `milestones_count`       | integer                                       | Number of milestones.                                                 | `7`                                                                                     |
| `phase`                  | object                                        | Current phase metadata.                                               | `{}`                                                                                    |
| `tags`                   | list                                          | Project tags.                                                         | `[]`                                                                                    |
| `project_manager`        | object                                        | Project manager metadata.                                             | `{}`                                                                                    |
| `is_arr`                 | boolean                                       | Whether revenue is recurring (ARR).                                   | `false`                                                                                 |
| `revenue`                | string                                        | Formatted revenue.                                                    | `25000`                                                                                 |
| `show_forecasted_date`   | boolean                                       | Whether a forecasted date is shown.                                   | `false`                                                                                 |
| `forecasted_date`        | string (date-time) \| null                    | Forecasted completion date.                                           | `2026-06-24T18:30:00Z`                                                                  |
| `project_fee`            | number \| null                                | One-time project fee.                                                 | `0`                                                                                     |
| `expected_deal_value`    | number \| null                                | Expected deal value.                                                  | `0`                                                                                     |
| `project_owner`          | [`OwnerRef`](#ownerref)                       | Owning user reference.                                                | see [OwnerRef](#ownerref)                                                               |
| `health_score`           | number                                        | Health score value.                                                   | `75`                                                                                    |
| `account_img`            | string                                        | Linked account image path or URL.                                     | `assets/images/companies/img-1.png`                                                     |
| `account_name`           | string                                        | Linked account / company name.                                        | `Sample Company`                                                                        |
| `insights`               | object                                        | Project insight metadata.                                             | `{ "key": "on_time", "text": "On Time" }`                                               |
| `all_milestones`         | list                                          | Full list of milestone summaries.                                     | see [Milestone](#milestone)                                                             |
| `stage`                  | [`Milestone`](#milestone)                     | Current stage / milestone.                                            | see [Milestone](#milestone)                                                             |
| `progress`               | object                                        | Task progress counters by status.                                     | `{ "completed": 13, "total_tasks": 669 }`                                               |
| `template_id`            | string                                        | Template the project was created from.                                | `7892xxxxxxxxxxxx`                                                                      |
| `region`                 | string                                        | Region.                                                               | `North America, EMEA`                                                                   |
| `project_type`           | string                                        | Distinguishes a project from a deal.                                  | `project, deal`                                                                         |
| `project_type_str`       | string                                        | Display label key for the project type.                               | `UI.pr_onboarding`                                                                      |
| `status`                 | [`StatusRef`](#statusref)                     | Current status.                                                       | `{ "status_name": "In Progress" }`                                                      |
| `project_users`          | list                                          | List of internal users assigned to the project.                       | see [ProjectMember](#projectmember)                                                     |
| `project_customers`      | list                                          | List of objects `{ full_name, email, role }` — customer participants. | `[{ "full_name": "Sample First Last", "email": "sample@mail.com", "role": "sponsor" }]` |
| `account_id`             | string                                        | Linked account / company id.                                          | `7892xxxxxxxxxxxx`                                                                      |
| `five_milestones`        | list                                          | First five milestone summaries.                                       | see [Milestone](#milestone)                                                             |
| `customer_project_owner` | object `{ name, full_name, email }`           | Customer-side project owner.                                          | `{ "name": "Sample", "full_name": "Sample First Last", "email": "sample@mail.com" }`    |
| `external_map`           | object `{ project_id, project_flag }` \| null | External-system mapping.                                              | `{ "project_id": "7892xxxx", "project_flag": true }`                                    |
| `follow_up_project_data` | object \| null                                | Follow-up project metadata.                                           | `null`                                                                                  |
| `formatted_revenue`      | string                                        | Formatted revenue display value.                                      | `$ 0`                                                                                   |
| `revenue_amount`         | number                                        | Numeric revenue amount.                                               | `0`                                                                                     |
| `pipeline_id`            | string \| null                                | Linked pipeline id.                                                   | `7892xxxxxxxxxxxx`                                                                      |
| `current_milestone_id`   | string \| null                                | Current milestone id.                                                 | `7892xxxxxxxxxxxx`                                                                      |
| `position`               | integer                                       | Project position/order.                                               | `1`                                                                                     |
| `visible_to_all`         | boolean                                       | Whether visible to all org members.                                   | `true`                                                                                  |
| `status_position`        | integer                                       | Status position/order.                                                | `0`                                                                                     |
| `formatted_deal_value`   | string                                        | Formatted deal value display value.                                   | `$ 0`                                                                                   |
| `custom_fields`          | list \| object                                | Custom field values.                                                  | `{ "tier": "gold" }`                                                                    |

### ProjectListResponse

| Field            | Type                 | Description                                                                 | Example                                               |
| ---------------- | -------------------- | --------------------------------------------------------------------------- | ----------------------------------------------------- |
| `count`          | integer              | Total number of matching records.                                           | `62`                                                  |
| `next`           | string (uri) \| null | URL for the next page, or null when exhausted.                              | `https://api.projetly.io/api/project/info/?offset=10` |
| `previous`       | string (uri) \| null | URL for the previous page, or null when unavailable.                        | `null`                                                |
| `results`        | list                 | List of [`ProjectOrDeal`](#projectordeal) objects — page of projects/deals. | see [ProjectOrDeal](#projectordeal)                   |
| `max_page_limit` | integer              | Maximum page limit returned by the API.                                     | `0`                                                   |

### ProjectInfo

Single project/milestone payload. The Make handler returns the open payload from the upstream project-milestones API unless `options` or `milestone(s)` mode is selected.

| Field              | Type           | Description                                                     | Example                                               |
| ------------------ | -------------- | --------------------------------------------------------------- | ----------------------------------------------------- |
| `project_id`       | string         | Project id.                                                     | `7892xxxxxxxxxxxx`                                    |
| `project_name`     | string         | Project name.                                                   | `Sample Project`                                      |
| `template_id`      | string         | Template the project was created from.                          | `7892xxxxxxxxxxxx`                                    |
| `total_tasks`      | integer        | Total number of tasks in the project info payload.              | `40`                                                  |
| `completed_tasks`  | integer        | Number of completed tasks.                                      | `0`                                                   |
| `inprogress_tasks` | integer        | Number of in-progress tasks.                                    | `1`                                                   |
| `open_tasks`       | integer        | Number of open tasks.                                           | `39`                                                  |
| `on_hold_tasks`    | integer        | Number of on-hold tasks.                                        | `0`                                                   |
| `milestones`       | list           | List of [`Milestone`](#milestone) objects — project milestones. | see [Milestone](#milestone)                           |
| `options`          | object         | Optional project options object returned by the upstream API.   | see [ProjectOptionsResponse](#projectoptionsresponse) |
| `custom_fields`    | list \| object | Custom field values.                                            | `{ "tier": "gold" }`                                  |
| `status_map`       | object         | Mapping from normalized status groups to status keys.           | `{ "not_started": ["todo", "not_started"] }`          |
| `my_tasks`         | list           | Tasks assigned to the current user.                             | see [Task](#task)                                     |
| `activities`       | list           | Project activity records.                                       | `[]`                                                  |
| `next_cursor_id`   | string \| null | Cursor id for the next page of nested data.                     | `eyJjdXxxxxx...`                                      |
| `has_next_page`    | boolean        | Whether another page of nested data is available.               | `false`                                               |

### Milestone

| Field                   | Type                      | Description                                                | Example                                   |
| ----------------------- | ------------------------- | ---------------------------------------------------------- | ----------------------------------------- |
| `milestone_id`          | string                    | Milestone id.                                              | `7892xxxxxxxxxxxx`                        |
| `name`                  | string                    | Milestone name.                                            | `Kickoff`                                 |
| `flag`                  | integer                   | Milestone flag value.                                      | `0`                                       |
| `status`                | [`StatusRef`](#statusref) | Milestone status.                                          | `{ "status_name": "In Progress" }`        |
| `color`                 | string                    | Milestone color.                                           | `#ADD8E6`                                 |
| `intelligence_category` | string                    | Intelligence category for the milestone.                   | `risk, on_track`                          |
| `insight`               | object                    | Milestone insight metadata.                                | `{ "key": "on_time", "name": "On Time" }` |
| `start_date`            | string (date)             | Milestone start date.                                      | `2026-03-18`                              |
| `end_date`              | string (date)             | Milestone end date.                                        | `2026-03-18`                              |
| `is_project_due`        | boolean                   | Whether the project is due for this milestone.             | `false`                                   |
| `tasks`                 | list                      | List of [`Task`](#task) objects — tasks in this milestone. | see [Task](#task)                         |
| `total_tasks`           | integer                   | Number of tasks in the milestone.                          | `2`                                       |
| `completed_tasks`       | integer                   | Number of completed tasks in the milestone.                | `0`                                       |
| `inprogress_tasks`      | integer                   | Number of in-progress tasks.                               | `1`                                       |
| `on_hold_tasks`         | integer                   | Number of on-hold tasks.                                   | `0`                                       |
| `open_tasks`            | integer                   | Number of open tasks in the milestone.                     | `2`                                       |
| `milestone_start_date`  | string (date-time)        | Milestone start datetime.                                  | `2026-03-18T00:00:00`                     |
| `milestone_due_date`    | string (date-time)        | Milestone due datetime.                                    | `2026-03-18T00:00:00`                     |

### ProjectMilestonesListResponse

Returned by `GET /make/project/{project_id}?milestone=true` or `?milestones=true`.

| Field     | Type | Description                                | Example                     |
| --------- | ---- | ------------------------------------------ | --------------------------- |
| `results` | list | List of [`Milestone`](#milestone) objects. | see [Milestone](#milestone) |

### ProjectOptionsResponse

Project-specific options returned by `GET /make/project/{project_id}?options=true`. The Make handler returns the `options` object from the upstream `get_project_milestones` payload.

| Field    | Type | Description                            | Example                     |
| -------- | ---- | -------------------------------------- | --------------------------- |
| `status` | list | Available project task/status options. | see [StatusRef](#statusref) |

### DealOptionsResponse

Deal creation option sets returned by `GET /make/deal/options`.

| Field              | Type   | Description                            | Example                                       |
| ------------------ | ------ | -------------------------------------- | --------------------------------------------- |
| `templates`        | list   | Available deal template options.       | see [DealTemplateOption](#dealtemplateoption) |
| `status`           | list   | Available deal status options.         | see [DealStatusOption](#dealstatusoption)     |
| `users`            | list   | Available user/customer owner options. | see [DealUserOption](#dealuseroption)         |
| `default_pipeline` | string | Default pipeline template id.          | `7892xxxxxxxxxxxx`                            |

### DealTemplateOption

| Field           | Type   | Description             | Example               |
| --------------- | ------ | ----------------------- | --------------------- |
| `org_temp_id`   | string | Org-scoped template id. | `7892xxxxxxxxxxxx`    |
| `template_name` | string | Template name.          | `Onboarding Template` |

### DealStatusOption

| Field         | Type    | Description                  | Example                    |
| ------------- | ------- | ---------------------------- | -------------------------- |
| `id`          | integer | Status option id.            | `1`                        |
| `status_key`  | string  | Machine key for the status.  | `in_progress, not_started` |
| `status_name` | string  | Human-readable status label. | `In Progress, Not Started` |
| `color`       | string  | Status color.                | `#50C878`                  |
| `icon`        | string  | Status icon class.           | `fa-solid fa-circle-check` |

### DealUserOption

| Field            | Type                       | Description                                                      | Example                    |
| ---------------- | -------------------------- | ---------------------------------------------------------------- | -------------------------- |
| `user_id`        | string                     | User id.                                                         | `7892xxxxxxxxxxxx`         |
| `profile_id`     | string                     | User profile id.                                                 | `7892xxxxxxxxxxxx`         |
| `contact_id`     | string \| null             | Linked contact id when the option represents a contact/customer. | `7892xxxxxxxxxxxx`         |
| `name`           | string \| null             | Short name.                                                      | `Sample`                   |
| `full_name`      | string                     | Full name.                                                       | `Sample First Last`        |
| `email`          | string \| null             | Email address.                                                   | `sample@mail.com`          |
| `phone_number`   | string \| null             | Phone number.                                                    | `+1 1234567xxx`            |
| `role`           | string \| null             | User or customer role.                                           | `admin, member`            |
| `profile_image`  | string \| null             | Profile image URL.                                               | `https://sample.com`       |
| `team_id`        | string                     | Customer team id.                                                | `7892xxxxxxxxxxxx`         |
| `is_contact`     | boolean                    | Whether this option references a contact.                        | `true`                     |
| `is_customer`    | boolean                    | Whether this option is a customer.                               | `false`                    |
| `is_partner`     | boolean                    | Whether this option is a partner.                                | `false`                    |
| `is_invite_sent` | boolean                    | Whether an invitation was sent.                                  | `false`                    |
| `invite_sent_at` | string (date-time) \| null | When the invitation was sent.                                    | `2026-06-05T07:46:23.312Z` |

### CreateProjectRequest

Required: `project`, `account`.

| Field        | Type   | Description                                                                                                                                                 | Example              |
| ------------ | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
| `account_id` | string | Existing account id, or empty string to create a new account. Reuse an id from `GET /make/project` or a prior `POST /make/project` response (`account_id`). | `7892xxxxxxxxxxxx`   |
| `project`    | object | Project details (see below).                                                                                                                                | see `project` object |
| `account`    | object | Account / company details (see below).                                                                                                                      | see `account` object |

#### `project` object

| Field                     | Type                              | Description                                                                    | Example                                         |
| ------------------------- | --------------------------------- | ------------------------------------------------------------------------------ | ----------------------------------------------- |
| `project_name`            | string                            | Project name.                                                                  | `Sample Project`                                |
| `start_date`              | string                            | Start date.                                                                    | `2026-03-17T18:30:00Z`                          |
| `due_date`                | string                            | Due date.                                                                      | `2026-06-24T18:30:00Z`                          |
| `project_type`            | string                            | Type of project.                                                               | `onboarding, service_delivery, sales_deal_room` |
| `project_fee`             | number                            | One-time project fee.                                                          | `0`                                             |
| `revenue`                 | number                            | Revenue amount.                                                                | `25000`                                         |
| `show_forecasted_date`    | boolean                           | Whether a forecasted date is shown.                                            | `false`                                         |
| `is_arr`                  | boolean                           | Whether revenue is recurring (ARR).                                            | `false`                                         |
| `project_template`        | object                            | Template to base the project on. Use a template id from `GET /make/templates`. | `{ "template_id": "7892xxxx" }`                 |
| `billing_model`           | string                            | Billing model for the project/deal.                                            | `fixed_cost`                                    |
| `billing_frequency`       | string                            | Billing frequency.                                                             | `hourly`                                        |
| `hourly_rate`             | number \| string                  | Hourly billing rate.                                                           | `150`                                           |
| `monthly_rate`            | number \| string                  | Monthly billing rate.                                                          | `25000`                                         |
| `expected_onboarding_fee` | number \| string                  | Expected onboarding fee.                                                       | `5000`                                          |
| `expected_deal_value`     | number                            | Expected deal value.                                                           | `25000`                                         |
| `project_duration`        | number \| string                  | Project duration value.                                                        | `6`                                             |
| `duration_type`           | string                            | Unit for `project_duration`.                                                   | `months`                                        |
| `project_owner`           | [`ProjectMember`](#projectmember) | Internal project owner. Use a user id from `GET /make/users`.                  | see [ProjectMember](#projectmember)             |
| `customer_project_owner`  | [`CustomerRef`](#customerref)     | Customer-side project owner. Use a contact id from `GET /make/contact` (list). | see [CustomerRef](#customerref)                 |
| `pipeline_id`             | string                            | Pipeline id for deal-room projects.                                            | `7892xxxxxxxxxxxx`                              |
| `deal_resources`          | object \| null                    | Deal resource metadata.                                                        | `null`                                          |
| `contract_duration`       | string \| null                    | Contract duration.                                                             | `12 months`                                     |
| `target_milestone_id`     | string                            | Target milestone or pipeline id.                                               | `7892xxxxxxxxxxxx`                              |
| `invite_type`             | string                            | When/whether to invite the customer.                                           | `invite_later, invite_now`                      |

#### `project_template` object

| Field                  | Type    | Description                                                             | Example                     |
| ---------------------- | ------- | ----------------------------------------------------------------------- | --------------------------- |
| `template_id`          | string  | Template id.                                                            | `7892xxxxxxxxxxxx`          |
| `org_temp_id`          | string  | Org-scoped template id.                                                 | `7892xxxxxxxxxxxx`          |
| `template_name`        | string  | Template name.                                                          | `Onboarding Template`       |
| `template_desc`        | string  | Template description.                                                   | `Template description`      |
| `options`              | object  | Template option sets.                                                   | `{ "status": [] }`          |
| `milestone`            | list    | List of [`Milestone`](#milestone) objects — template milestones/stages. | see [Milestone](#milestone) |
| `sub_template_type`    | integer | Template subtype.                                                       | `4`                         |
| `is_from_scratch`      | boolean | Whether the template starts from scratch.                               | `false`                     |
| `save_as_org_template` | boolean | Whether to save the submitted template as an org template.              | `false`                     |

#### `account` object

| Field              | Type                              | Description                                                                           | Example                             |
| ------------------ | --------------------------------- | ------------------------------------------------------------------------------------- | ----------------------------------- |
| `company_id`       | string                            | Existing company id to link, or empty to create. Get from `GET /make/company` (list). | `7892xxxxxxxxxxxx`                  |
| `company_logo_url` | string                            | Company logo URL.                                                                     | `https://sample.com`                |
| `account_name`     | string                            | Account / company name.                                                               | `Sample Company`                    |
| `description`      | string                            | Account description.                                                                  | `Sample description`                |
| `region`           | string                            | Region.                                                                               | `North America, EMEA`               |
| `vertical`         | string                            | Industry vertical.                                                                    | `Education, SaaS`                   |
| `segment`          | string                            | Customer segment.                                                                     | `mid_market, enterprise`            |
| `website_url`      | string                            | Company website.                                                                      | `https://sample.com`                |
| `logo`             | list                              | Logo upload/list payload.                                                             | `[]`                                |
| `account_owner`    | [`ProjectMember`](#projectmember) | Internal account owner. Use a user id from `GET /make/users`.                         | see [ProjectMember](#projectmember) |
| `customer`         | [`CustomerRef`](#customerref)     | Primary customer contact. Use a contact id from `GET /make/contact` (list).           | see [CustomerRef](#customerref)     |
| `invite_type`      | string                            | When/whether to invite the customer.                                                  | `invite_later, invite_now`          |

### CreateProjectResponse

| Field        | Type   | Description                         | Example            |
| ------------ | ------ | ----------------------------------- | ------------------ |
| `status`     | string | Outcome status.                     | `success`          |
| `project_id` | string | Id of the created project.          | `7892xxxxxxxxxxxx` |
| `account_id` | string | Id of the created / linked account. | `7892xxxxxxxxxxxx` |
| `name`       | string | Created project name.               | `Sample Project`   |
| `message`    | string | Human-readable result message.      | `Project created`  |

### ProjectMember

| Field           | Type                                 | Description                              | Example                    |
| --------------- | ------------------------------------ | ---------------------------------------- | -------------------------- |
| `user_id`       | string \| null                       | User id.                                 | `7892xxxxxxxxxxxx`         |
| `profile_id`    | string \| null                       | User profile id.                         | `7892xxxxxxxxxxxx`         |
| `full_name`     | string \| null                       | Full name.                               | `Sample First Last`        |
| `profile_image` | string \| null                       | Profile image URL.                       | `https://sample.com`       |
| `email`         | string \| null                       | Email address.                           | `sample@mail.com`          |
| `role`          | string \| null                       | Role on the project.                     | `owner, member`            |
| `phone_number`  | string \| null                       | Phone number.                            | `+1 1234567xxx`            |
| `is_customer`   | boolean                              | Whether the member is a customer.        | `false`                    |
| `is_partner`    | boolean                              | Whether the member is a partner.         | `false`                    |
| `is_owner`      | boolean                              | Whether the member is the project owner. | `true`                     |
| `joining_date`  | string (date-time) \| string \| null | When the member joined.                  | `2026-06-05T07:46:23.312Z` |
| `added_date`    | string (date-time) \| string \| null | When the member was added.               | `2026-06-05T07:46:23.312Z` |

### CustomerRef

| Field            | Type                       | Description                                  | Example                    |
| ---------------- | -------------------------- | -------------------------------------------- | -------------------------- |
| `contact_id`     | string \| null             | Linked contact id.                           | `7892xxxxxxxxxxxx`         |
| `user_id`        | string \| null             | Linked user id.                              | `7892xxxxxxxxxxxx`         |
| `profile_id`     | string \| null             | Linked user profile id.                      | `7892xxxxxxxxxxxx`         |
| `name`           | string \| null             | Short name.                                  | `Sample`                   |
| `full_name`      | string \| null             | Full name.                                   | `Sample First Last`        |
| `email`          | string \| null             | Email address.                               | `sample@mail.com`          |
| `phone_number`   | string \| null             | Phone number.                                | `+1 1234567xxx`            |
| `role`           | string \| null             | Role on the project.                         | `owner, member`            |
| `profile_image`  | string \| null             | Profile image URL.                           | `https://sample.com`       |
| `team_id`        | string                     | Customer team id.                            | `7892xxxxxxxxxxxx`         |
| `is_contact`     | boolean                    | Whether this references an existing contact. | `true`                     |
| `is_customer`    | boolean                    | Whether this reference is a customer.        | `true`                     |
| `is_invite_sent` | boolean                    | Whether an invitation was sent.              | `false`                    |
| `invite_sent_at` | string (date-time) \| null | When the invitation was sent.                | `2026-06-05T07:46:23.312Z` |

### Task

| Field              | Type                            | Description                                                                         | Example                                                                                                                                   |
| ------------------ | ------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `item_id`          | string                          | Task id.                                                                            | `7892xxxxxxxxxxxx`                                                                                                                        |
| `display_id`       | string                          | Human-readable display id.                                                          | `TASK_0042`                                                                                                                               |
| `title`            | string                          | Task title.                                                                         | `Sample Task`                                                                                                                             |
| `description`      | string \| null                  | Task description.                                                                   | `Sample description`                                                                                                                      |
| `due_date`         | string                          | Due date / datetime.                                                                | `2026-05-29`                                                                                                                              |
| `tags`             | list                            | List of objects `{ tag_id, tag_name }` — task tags.                                 | `[{ "tag_id": "7892xxxx", "tag_name": "urgent" }]`                                                                                        |
| `checklist_items`  | list                            | List of objects `{ item, is_checked }` — checklist entries.                         | `[{ "item": "Send brief", "is_checked": false }]`                                                                                         |
| `is_completed`     | boolean                         | Whether the task is completed.                                                      | `false`                                                                                                                                   |
| `is_private`       | boolean                         | Whether the task is private.                                                        | `false`                                                                                                                                   |
| `is_starred`       | boolean                         | Whether the task is starred.                                                        | `false`                                                                                                                                   |
| `is_predefined`    | boolean                         | Whether the task came from a template.                                              | `false`                                                                                                                                   |
| `is_blocked`       | boolean                         | Whether the task is blocked.                                                        | `false`                                                                                                                                   |
| `status`           | [`StatusRef`](#statusref)       | Task status.                                                                        | `{ "status_name": "Not Started" }`                                                                                                        |
| `project_id`       | string                          | Parent project id.                                                                  | `7892xxxxxxxxxxxx`                                                                                                                        |
| `project_name`     | string                          | Parent project name.                                                                | `Sample Project`                                                                                                                          |
| `milestone_id`     | string                          | Parent milestone id.                                                                | `7892xxxxxxxxxxxx`                                                                                                                        |
| `milestone`        | object `{ name, milestone_id }` | Parent milestone reference.                                                         | `{ "name": "Kickoff", "milestone_id": "7892xxxx" }`                                                                                       |
| `users`            | list                            | List of objects `{ user_id, full_name, email, role, added_date }` — assigned users. | `[{ "user_id": "7892xxxx", "full_name": "Sample First Last", "email": "sample@mail.com", "role": "member", "added_date": "2026-05-29" }]` |
| `creation_time`    | string (date-time)              | When the task was created.                                                          | `2026-06-05T07:46:23.312Z`                                                                                                                |
| `last_update_time` | string (date-time)              | When the task was last updated.                                                     | `2026-06-05T07:46:23.312Z`                                                                                                                |

### TaskListResponse

Returned by `GET /make/tasks`.

| Field     | Type | Description                                                  | Example           |
| --------- | ---- | ------------------------------------------------------------ | ----------------- |
| `results` | list | List of [`Task`](#task) objects flattened across milestones. | see [Task](#task) |

### CreateTaskRequest

Required: `title`, `project_id`.

| Field             | Type                      | Required | Description                                                                                                             | Example                                           |
| ----------------- | ------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- |
| `title`           | string                    | yes      | Task title.                                                                                                             | `Sample Task`                                     |
| `project_id`      | string                    | yes      | Project to create the task in. Get from `GET /make/project` (list) or the `POST /make/project` response.                | `7892xxxxxxxxxxxx`                                |
| `description`     | string                    | no       | Task description.                                                                                                       | `Sample description`                              |
| `milestone_id`    | string                    | no       | Milestone to place the task under. Get from `GET /make/project/{project_id}?milestone=true` (`results[].milestone_id`). | `7892xxxxxxxxxxxx`                                |
| `due_date`        | string                    | no       | Due date (`YYYY-MM-DD`).                                                                                                | `2026-05-29`                                      |
| `status`          | [`StatusRef`](#statusref) | no       | Task status.                                                                                                            | `{ "status_key": "not_started" }`                 |
| `item_type`       | integer                   | no       | Numeric item type.                                                                                                      | `1`                                               |
| `item_type_key`   | string                    | no       | Item type key.                                                                                                          | `task`                                            |
| `users`           | list                      | no       | List of [`ProjectMember`](#projectmember) objects — assignees. Use user ids from `GET /make/users`.                     | see [ProjectMember](#projectmember)               |
| `checklist_items` | list                      | no       | List of objects `{ item, is_checked }` — checklist entries.                                                             | `[{ "item": "Send brief", "is_checked": false }]` |
| `tags`            | list                      | no       | List of objects `{ tag_name, is_new }` — tags to attach.                                                                | `[{ "tag_name": "urgent", "is_new": true }]`      |

### User

| Field          | Type    | Description                           | Example             |
| -------------- | ------- | ------------------------------------- | ------------------- |
| `id`           | string  | Internal user id (mirrors `user_id`). | `7892xxxxxxxxxxxx`  |
| `user_id`      | string  | User id.                              | `7892xxxxxxxxxxxx`  |
| `full_name`    | string  | User's full name.                     | `Sample First Last` |
| `email`        | string  | User's email.                         | `sample@mail.com`   |
| `role`         | string  | User's role.                          | `admin, member`     |
| `phone_number` | string  | User's phone number.                  | `+1 1234567xxx`     |
| `is_customer`  | boolean | Whether the user is a customer.       | `false`             |
| `is_partner`   | boolean | Whether the user is a partner.        | `false`             |

### Template

| Field           | Type   | Description                                                             | Example                     |
| --------------- | ------ | ----------------------------------------------------------------------- | --------------------------- |
| `id`            | string | Template id.                                                            | `7892xxxxxxxxxxxx`          |
| `org_temp_id`   | string | Org-scoped template id.                                                 | `7892xxxxxxxxxxxx`          |
| `template_name` | string | Template name.                                                          | `Onboarding Template`       |
| `milestone`     | list   | List of [`Milestone`](#milestone) objects — template milestones/stages. | see [Milestone](#milestone) |

### TemplateListResponse

| Field     | Type | Description                                                  | Example                   |
| --------- | ---- | ------------------------------------------------------------ | ------------------------- |
| `results` | list | List of [`Template`](#template) objects — page of templates. | see [Template](#template) |

### OptionsResponse

Single-element array carrying metadata option sets. The exact keys depend on the resource (e.g. `company_types`, `company_revenues`, `contact_person_categories`, `contact_buying_roles`). Shape: `[ { … } ]`.

### FieldConfigResponse

Resource field-configuration metadata.

| Field               | Type               | Description                                  | Example                                 |
| ------------------- | ------------------ | -------------------------------------------- | --------------------------------------- |
| `status`            | string             | Outcome status.                              | `success`                               |
| `field_definitions` | list               | Custom field definitions.                    | see [FieldDefinition](#fielddefinition) |
| `field_view_config` | list               | Field visibility and ordering configuration. | see [FieldViewConfig](#fieldviewconfig) |
| `last_updated_by`   | string             | User id that last updated the field config.  | `7483762708060311553`                   |
| `last_update_time`  | string (date-time) | When the field config was last updated.      | `2026-07-20T08:17:27.519000`            |

### FieldDefinition

| Field         | Type           | Description                                      | Example                  |
| ------------- | -------------- | ------------------------------------------------ | ------------------------ |
| `id`          | string         | Field definition id.                             | `cf_7484884165670735873` |
| `type`        | string         | Field input type.                                | `text`                   |
| `label`       | string         | Human-readable field label.                      | `Degree`                 |
| `placeholder` | string \| null | Placeholder text.                                | `Enter value`            |
| `value`       | any \| null    | Default or current field value.                  | `null`                   |
| `isEditing`   | boolean        | Whether the field is currently in editing state. | `false`                  |
| `isValid`     | boolean        | Whether the field definition is valid.           | `true`                   |
| `icon`        | string         | Icon class for the field type.                   | `fa-light fa-font-case`  |

### FieldViewConfig

| Field     | Type    | Description                   | Example       |
| --------- | ------- | ----------------------------- | ------------- |
| `key`     | string  | Field key or custom field id. | `lead_status` |
| `visible` | boolean | Whether the field is visible. | `true`        |
| `order`   | integer | Display order.                | `0`           |

### FieldConfigUpdateRequest

| Field               | Type           | Required | Description                                                                   | Example                                |
| ------------------- | -------------- | -------- | ----------------------------------------------------------------------------- | -------------------------------------- |
| `field_definitions` | list \| string | yes      | New field definitions to add. String values are parsed as JSON when possible. | `[{ "name": "tier", "type": "text" }]` |

### WebhookSubscribeRequest

Required: `target_url`, `events`, `app_name`.

| Field        | Type         | Required | Description                                                                                                                         | Example                              |
| ------------ | ------------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |
| `target_url` | string (uri) | yes      | URL events are delivered to.                                                                                                        | `https://sample.com/hooks/abc`       |
| `events`     | string       | yes      | List literal of event names.                                                                                                        | `"['task_created', 'task_updated']"` |
| `app_name`   | string       | yes      | Source app name.                                                                                                                    | `make`                               |
| `project_id` | string       | no       | Required for task events; scopes delivery to one project. Get from `GET /make/project` (list) or the `POST /make/project` response. | `7892xxxxxxxxxxxx`                   |

#### Webhook event names

`company_created`, `company_updated`, `contact_created`, `contact_updated`, `deal_created`, `deal_updated`, `project_created`, `project_updated`, `task_created`, `task_updated` (task events additionally accept `task_assigned`, `task_status_changed`, `task_completed`).
