For the complete documentation index, see llms.txt. This page is also available as Markdown.

Projetly - Make API

Projetly's API for Make Integration

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 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 tokenAuthorization: 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-SignatureHMAC-SHA256(key = CLIENT_SECRET, message = "<CLIENT_ID>:<X-OAuth-Timestamp>"), hex-encoded.

  3. Azure Functions keyx-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

1

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.

2

Exchange the authorization code

Send POST /oauth/token with the code. The response returns access_token + refresh_token.

3

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.

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 model for the body shape.

Endpoints

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).

Authentication endpoints

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

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

Auth: Credentials Required.

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

Bad request — missing/invalid query params (client_id, redirect_uri, signature).

401

Unauthorized — invalid signature or unknown client_id.

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

Auth: Credentials Required.

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

Tokens issued — returns access_token and refresh_token.

400

Bad request — missing/invalid code, grant_type, or redirect_uri.

401

Unauthorized — invalid client credentials or expired authorization code.

POST /auth_refresh/ — Refresh an access token

Auth: Credentials Required.

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

Note the new refresh token returns under refresh (not refresh_token).

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

Bad request — missing/invalid token or grant_type.

401

Unauthorized — refresh token invalid or revoked.

Connection

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

GET /make/test — Verify the integration is active

Auth: Required.

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

Unauthorized — invalid/missing token or signature.

500

Internal server error.

Companies

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

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

Auth: Required.

Default returns a paginated company list. Modes:

  • company_id=<id> → a single 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

Company list, a single company, options metadata, or field config depending on mode.

400

Bad request — invalid query parameters.

401

Unauthorized — invalid/missing token or signature.

500

Internal server error.

POST /make/company — Create a company

Auth: Required.

Body: 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

Validation error, or a company with the same name/domain already exists.

401

Unauthorized — invalid/missing token or signature.

500

Internal server error.

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

Auth: Required.

Body: 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

Missing company_id or validation error in the request body.

401

Unauthorized — invalid/missing token or signature.

404

No company exists with the given company_id.

500

Internal server error.

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

Auth: Required.

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

Body: FieldConfigUpdateRequest.

Path param
Type
Required
Description

module

string

yes

Resource to update. Must be company or contact.

Responses

Status
Body
Description

200

Field config updated.

400

Invalid module — expected company or contact.

401

Unauthorized — invalid/missing token or signature.

500

Internal server error.

Contacts

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

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

Auth: Required.

Default returns a paginated contact list. Modes:

  • contact_id=<id> → a single 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

Contact list, a single contact, options metadata, or field config depending on mode.

400

Bad request — invalid query parameters.

401

Unauthorized — invalid/missing token or signature.

500

Internal server error.

POST /make/contact — Create a contact

Auth: Required.

Body: 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

Validation error, or a contact with the same email already exists.

401

Unauthorized — invalid/missing token or signature.

500

Internal server error.

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

Auth: Required.

Body: 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

Missing contact_id or validation error in the request body.

401

Unauthorized — invalid/missing token or signature.

404

No contact exists with the given contact_id.

500

Internal server error.

Templates

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

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

Auth: Required.

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

Paginated template list, or a single template when org_temp_id is provided.

400

Bad request — invalid query parameters.

401

Unauthorized — invalid/missing token or signature.

404

No template exists with the given org_temp_id.

500

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.

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

Paginated project/deal list.

400

Bad request — invalid query parameters.

401

Unauthorized — invalid/missing token or signature.

500

Internal server error.

POST /make/project — Create a project or deal

Auth: Required.

Body: CreateProjectRequest.

Responses

Status
Body
Description

200

Project/deal created — returns the new ids and status.

201

Project/deal created — returns the new ids and status.

400

Validation error — missing required project / account fields.

401

Unauthorized — invalid/missing token or signature.

500

Creation failed — internal server error.

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

Auth: Required.

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 payload returned by get_project_milestones.

  • options=true → returns only the payload's 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

Full milestone payload, project options, or milestone records depending on mode.

400

Missing project_id or invalid query parameters.

401

Unauthorized — invalid/missing token or signature.

404

No project exists with the given project_id.

500

Internal server error.

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

Auth: Required.

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

Deal creation options metadata.

401

Unauthorized — invalid/missing token or signature.

500

Internal server error.

Users

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

GET /make/users — List organization users

Auth: Required.

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

Organization users, optionally filtered by email.

401

Unauthorized — invalid/missing token or signature.

500

Internal server error.

Tasks

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

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

Auth: Required.

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

Flattened task list.

400

Missing project_id.

401

Unauthorized — invalid/missing token or signature.

500

Internal server error.

POST /make/task — Create a task

Auth: Required.

Body: 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

Validation error — missing title or project_id.

401

Unauthorized — invalid/missing token or signature.

500

Internal server error.

Integration Management

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

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

Auth: Required.

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

Unauthorized — invalid/missing token or signature.

404

Make integration not found.

500

Internal server error.

Webhooks

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

POST /webhook/subscribe — Subscribe to event webhooks

Auth: Required.

Body: 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

Missing target_url/events.

401

Invalid signature/token.

403

Disallowed event scope.

404

No matching app info.

500

Internal server error.

DELETE /webhook/unsubscribe — Unsubscribe from event webhooks

Auth: Required.

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

Missing subscriptionId or signature headers.

401

Invalid signature/token.

404

Subscription not found.

500

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 | string

Headquarters location.

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 | 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 objects — page of companies.

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

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

no

Headquarters location.

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 | null

Owning user reference.

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

Contact location.

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 objects — page of contacts.

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

no

Mailing/location 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

Owning user reference.

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.

stage

Current stage / 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

Current status.

{ "status_name": "In Progress" }

project_users

list

List of internal users assigned to the project.

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.

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 objects — page of projects/deals.

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 objects — project milestones.

options

object

Optional project options object returned by the upstream API.

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

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

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 objects — tasks in this milestone.

see 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 objects.

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.

DealOptionsResponse

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

Field
Type
Description
Example

templates

list

Available deal template options.

status

list

Available deal status options.

users

list

Available user/customer owner options.

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

Internal project owner. Use a user id from GET /make/users.

customer_project_owner

Customer-side project owner. Use a contact id from GET /make/contact (list).

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 objects — template milestones/stages.

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

Internal account owner. Use a user id from GET /make/users.

customer

Primary customer contact. Use a contact id from GET /make/contact (list).

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

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 objects flattened across milestones.

see 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

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 objects — assignees. Use user ids from GET /make/users.

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 objects — template milestones/stages.

TemplateListResponse

Field
Type
Description
Example

results

list

List of Template objects — page of templates.

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.

field_view_config

list

Field visibility and ordering configuration.

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).

Last updated