Fabulous CRM public API

Server-to-server access to contacts, companies, deals, activities, lists and properties.

Version 1.0 · generated from docs/openapi.yaml.

Every request carries an API key created in Paramètres → Clés d'API:

Authorization: Bearer wap_<keyId>_<secret>

A key sees and writes every record of the organisation (scopes limit resources, not perimeter; the roles matrix does not apply). A write scope implies the read scope of the same resource. No CORS headers are sent: keys must never live in a browser.

Collections paginate with limit (default 50, max 100) and cursor; a page may be shorter than limit (soft-deleted rows are filtered out), so iterate until nextCursor is null. Deletes are soft. Consent fields and computed values are read-only. POST requests may carry an Idempotency-Key header: for 24 hours the same key with the same body replays the stored response (Idempotent-Replayed: true), the same key with a different body is refused with 422.

Rate limits per key: 600 requests and 300 writes per minute; per IP: 10 failed authentications per minute. Overruns answer 429 with Retry-After in seconds.

Servers:

Meta

GET /me

Describe the calling key

Name, scopes and expiry of the key — the "is my key OK" probe.

Scopes: any valid key.

StatusDescriptionBody
200

The key.

Me
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

Contacts

Leads. Email is the matching key of POST /contacts/upsert.

GET /contacts

List contacts

Scopes: contacts:read

ParameterInTypeRequiredDescription
limitqueryinteger (min 1, max 100, default 50)no

Page size, 1 to 100.

cursorquerystringno

The nextCursor of the previous page.

emailquerystringno

Exact match on the normalized (lowercased) email.

StatusDescriptionBody
200

A page of contacts, newest first.

ContactPage
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

POST /contacts

Create a contact

Strict create: a live contact with the same email answers 409 duplicate_email with the existing id in details.existingId. Use POST /contacts/upsert to merge instead.

Scopes: contacts:write

ParameterInTypeRequiredDescription
Idempotency-Keyheaderstring (min length 1, max length 255)no

Unique per API key, 1 to 255 characters. For 24 hours a retry with the same key and body replays the stored response instead of writing again.

Request body (required): ContactCreate

StatusDescriptionBody
201

The created contact.

Headers: Idempotent-Replayed

Contact
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
409

State conflict: duplicate_email (with details.existingId), company_registration_exists, company_vat_exists, company_domain_exists, lifecycle_regression_blocked, deal_transition_forbidden, stage_tag_required, idempotency_in_progress.

Error
422

The Idempotency-Key was already used with a different request (idempotency_key_reused).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

POST /contacts/upsert

Create or merge a contact by email

firstName, lastName and email are required, as for POST /contacts. A live contact with that email is merged with the CSV-import rules: only the provided fields overwrite, customProperties merge key by key, a soft-deleted match is revived, and lifecycleStage is ignored on an existing contact. When several contacts share the email, the oldest live one wins. Without a match the contact is created like POST /contacts.

Scopes: contacts:write

ParameterInTypeRequiredDescription
Idempotency-Keyheaderstring (min length 1, max length 255)no

Unique per API key, 1 to 255 characters. For 24 hours a retry with the same key and body replays the stored response instead of writing again.

Request body (required): ContactCreate

StatusDescriptionBody
200

An existing contact was merged.

Headers: Idempotent-Replayed

ContactUpsertResult
201

A contact was created.

Headers: Idempotent-Replayed

ContactUpsertResult
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
422

The Idempotency-Key was already used with a different request (idempotency_key_reused).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

GET /contacts/{id}

Get a contact

Scopes: contacts:read

ParameterInTypeRequiredDescription
idpathstringyes

The record id (id of the DTO).

StatusDescriptionBody
200

The contact.

Contact
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
404

Unknown route, malformed id, or no live record with this id (not_found).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

PATCH /contacts/{id}

Update a contact

Partial: only the provided fields change, null clears an optional field. customProperties merges key by key (null removes a key). Changing the email to one another live contact holds answers 409 duplicate_email; a blocked lifecycle regression answers 409 lifecycle_regression_blocked.

Scopes: contacts:write

ParameterInTypeRequiredDescription
idpathstringyes

The record id (id of the DTO).

Request body (required): ContactPatch

StatusDescriptionBody
200

The updated contact.

Contact
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
404

Unknown route, malformed id, or no live record with this id (not_found).

Error
409

State conflict: duplicate_email (with details.existingId), company_registration_exists, company_vat_exists, company_domain_exists, lifecycle_regression_blocked, deal_transition_forbidden, stage_tag_required, idempotency_in_progress.

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

DELETE /contacts/{id}

Delete a contact (soft)

Scopes: contacts:write

ParameterInTypeRequiredDescription
idpathstringyes

The record id (id of the DTO).

StatusDescriptionBody
204

Deleted.

401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
404

Unknown route, malformed id, or no live record with this id (not_found).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

Companies

GET /companies

List companies

Scopes: companies:read

ParameterInTypeRequiredDescription
limitqueryinteger (min 1, max 100, default 50)no

Page size, 1 to 100.

cursorquerystringno

The nextCursor of the previous page.

domainquerystringno

Exact match on the normalized domain (lowercase, no protocol or www).

StatusDescriptionBody
200

A page of companies, newest first.

CompanyPage
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

POST /companies

Create a company

Registration number, VAT number and domain are normalized by the company's country and must be unique among live companies (409 company_registration_exists, company_vat_exists, company_domain_exists).

Scopes: companies:write

ParameterInTypeRequiredDescription
Idempotency-Keyheaderstring (min length 1, max length 255)no

Unique per API key, 1 to 255 characters. For 24 hours a retry with the same key and body replays the stored response instead of writing again.

Request body (required): CompanyCreate

StatusDescriptionBody
201

The created company.

Headers: Idempotent-Replayed

Company
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
409

State conflict: duplicate_email (with details.existingId), company_registration_exists, company_vat_exists, company_domain_exists, lifecycle_regression_blocked, deal_transition_forbidden, stage_tag_required, idempotency_in_progress.

Error
422

The Idempotency-Key was already used with a different request (idempotency_key_reused).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

GET /companies/{id}

Get a company

Scopes: companies:read

ParameterInTypeRequiredDescription
idpathstringyes

The record id (id of the DTO).

StatusDescriptionBody
200

The company.

Company
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
404

Unknown route, malformed id, or no live record with this id (not_found).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

PATCH /companies/{id}

Update a company

Partial; null clears an optional field; customProperties merges key by key.

Scopes: companies:write

ParameterInTypeRequiredDescription
idpathstringyes

The record id (id of the DTO).

Request body (required): CompanyPatch

StatusDescriptionBody
200

The updated company.

Company
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
404

Unknown route, malformed id, or no live record with this id (not_found).

Error
409

State conflict: duplicate_email (with details.existingId), company_registration_exists, company_vat_exists, company_domain_exists, lifecycle_regression_blocked, deal_transition_forbidden, stage_tag_required, idempotency_in_progress.

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

DELETE /companies/{id}

Delete a company (soft)

Its contacts stay and are detached from the company in the background.

Scopes: companies:write

ParameterInTypeRequiredDescription
idpathstringyes

The record id (id of the DTO).

StatusDescriptionBody
204

Deleted.

401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
404

Unknown route, malformed id, or no live record with this id (not_found).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

Deals

Stage moves go through the pipeline's transition graph.

GET /deals

List deals

Scopes: deals:read

ParameterInTypeRequiredDescription
limitqueryinteger (min 1, max 100, default 50)no

Page size, 1 to 100.

cursorquerystringno

The nextCursor of the previous page.

leadIdquerystringno

Only the deals of this contact.

StatusDescriptionBody
200

A page of deals, newest first.

DealPage
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

POST /deals

Create a deal

Without pipelineId the default pipeline is used; without stageKey its first open stage. A stage with required tags needs stageTags (409 stage_tag_required).

Scopes: deals:write

ParameterInTypeRequiredDescription
Idempotency-Keyheaderstring (min length 1, max length 255)no

Unique per API key, 1 to 255 characters. For 24 hours a retry with the same key and body replays the stored response instead of writing again.

Request body (required): DealCreate

StatusDescriptionBody
201

The created deal.

Headers: Idempotent-Replayed

Deal
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
409

State conflict: duplicate_email (with details.existingId), company_registration_exists, company_vat_exists, company_domain_exists, lifecycle_regression_blocked, deal_transition_forbidden, stage_tag_required, idempotency_in_progress.

Error
422

The Idempotency-Key was already used with a different request (idempotency_key_reused).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

GET /deals/{id}

Get a deal

Scopes: deals:read

ParameterInTypeRequiredDescription
idpathstringyes

The record id (id of the DTO).

StatusDescriptionBody
200

The deal.

Deal
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
404

Unknown route, malformed id, or no live record with this id (not_found).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

PATCH /deals/{id}

Update a deal, optionally moving its stage

Field edits apply first, then the stage move when stageKey is given: the move must be an arrow of the pipeline's transition graph (409 deal_transition_forbidden), 400 unknown_stage otherwise. status, closedAt and pipelineId are read-only; a won stage promotes the linked contact to customer as in the UI.

Scopes: deals:write

ParameterInTypeRequiredDescription
idpathstringyes

The record id (id of the DTO).

Request body (required): DealPatch

StatusDescriptionBody
200

The updated deal.

Deal
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
404

Unknown route, malformed id, or no live record with this id (not_found).

Error
409

State conflict: duplicate_email (with details.existingId), company_registration_exists, company_vat_exists, company_domain_exists, lifecycle_regression_blocked, deal_transition_forbidden, stage_tag_required, idempotency_in_progress.

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

DELETE /deals/{id}

Delete a deal (soft)

Scopes: deals:write

ParameterInTypeRequiredDescription
idpathstringyes

The record id (id of the DTO).

StatusDescriptionBody
204

Deleted.

401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
404

Unknown route, malformed id, or no live record with this id (not_found).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

Activities

GET /activities

List activities

Scopes: activities:read

ParameterInTypeRequiredDescription
limitqueryinteger (min 1, max 100, default 50)no

Page size, 1 to 100.

cursorquerystringno

The nextCursor of the previous page.

leadIdquerystringno

Only the activities of this contact.

StatusDescriptionBody
200

A page of activities, newest first.

ActivityPage
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

POST /activities

Create an activity

A done activity (a logged call, a note) gets completedAt stamped now.

Scopes: activities:write

ParameterInTypeRequiredDescription
Idempotency-Keyheaderstring (min length 1, max length 255)no

Unique per API key, 1 to 255 characters. For 24 hours a retry with the same key and body replays the stored response instead of writing again.

Request body (required): ActivityCreate

StatusDescriptionBody
201

The created activity.

Headers: Idempotent-Replayed

Activity
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
422

The Idempotency-Key was already used with a different request (idempotency_key_reused).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

GET /activities/{id}

Get an activity

Scopes: activities:read

ParameterInTypeRequiredDescription
idpathstringyes

The record id (id of the DTO).

StatusDescriptionBody
200

The activity.

Activity
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
404

Unknown route, malformed id, or no live record with this id (not_found).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

PATCH /activities/{id}

Update an activity

Partial; null clears an optional field. status: done stamps completedAt, status: open clears it, cancelled leaves it.

Scopes: activities:write

ParameterInTypeRequiredDescription
idpathstringyes

The record id (id of the DTO).

Request body (required): ActivityPatch

StatusDescriptionBody
200

The updated activity.

Activity
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
404

Unknown route, malformed id, or no live record with this id (not_found).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

DELETE /activities/{id}

Delete an activity (soft)

Scopes: activities:write

ParameterInTypeRequiredDescription
idpathstringyes

The record id (id of the DTO).

StatusDescriptionBody
204

Deleted.

401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
404

Unknown route, malformed id, or no live record with this id (not_found).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

Lists

GET /lists

List the contact lists

Scopes: lists:read

ParameterInTypeRequiredDescription
limitqueryinteger (min 1, max 100, default 50)no

Page size, 1 to 100.

cursorquerystringno

The nextCursor of the previous page.

StatusDescriptionBody
200

A page of lists.

ListPage
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

GET /lists/{id}/members

List the members of a list

Members are full contacts, hence the contacts:read scope on top of lists:read.

Scopes: lists:read, contacts:read

ParameterInTypeRequiredDescription
idpathstringyes

The record id (id of the DTO).

limitqueryinteger (min 1, max 100, default 50)no

Page size, 1 to 100.

cursorquerystringno

The nextCursor of the previous page.

StatusDescriptionBody
200

A page of contacts.

ContactPage
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
404

Unknown route, malformed id, or no live record with this id (not_found).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

Properties

Custom property definitions; their ids key customProperties.

GET /properties

List the custom property definitions of an entity type

Scopes: properties:read

ParameterInTypeRequiredDescription
entityTypequeryPropertyEntityTypeyes
limitqueryinteger (min 1, max 100, default 50)no

Page size, 1 to 100.

cursorquerystringno

The nextCursor of the previous page.

StatusDescriptionBody
200

A page of definitions.

PropertyDefinitionPage
400

Invalid request. code is invalid_json, invalid_body, field_required (with details.field), invalid_fields (with details.path), read_only_field, unknown_property, invalid_limit, invalid_cursor, invalid_idempotency_key, or a backend validation code such as invalid_owner, invalid_address, unknown_lifecycle_stage, unknown_stage, invalid_deal.

Error
401

Missing, malformed, unknown, revoked or expired key — always the same body.

Error
403

The key lacks a required scope (missing_scope).

Error
429

A per-key or per-IP budget is exhausted (rate_limited).

Headers: Retry-After

Error

Schemas

Error

PropertyTypeRequiredDescription
errorobjectyes
error.codestringyes

Stable machine code.

error.messagestringyes
error.detailsanyno

Code-specific data (path, existingId, reason…).

Me

PropertyTypeRequiredDescription
namestringyes
keyIdstringyes

The public identifier of the key (8 hex characters).

scopesarray of Scopeyes
expiresAtnumber | nullyes

Unix milliseconds, or null when the key never expires.

Scope

Type: "contacts:read" | "contacts:write" | "companies:read" | "companies:write" | "deals:read" | "deals:write" | "activities:read" | "activities:write" | "lists:read" | "forms:read" | "properties:read"

Timestamp

Unix milliseconds.

Type: number

Address

Country-driven postal address; validated against the country's format.

PropertyTypeRequiredDescription
countrystringyes

ISO 3166-1 alpha-2, uppercase.

streetNumberstringyes
streetstringyes
line2stringno
postalCodestringyes
citystringyes
regionstringno
placeIdstringno
coordinatesobjectno
coordinates.latnumberyes
coordinates.lngnumberyes

PropertyValue

A custom property value; the shape depends on the definition's type.

Type: string | number | boolean | array of string

CustomProperties

Values keyed by property definition id (see GET /properties).

Type: map of PropertyValue

CustomPropertiesPatch

Merged key by key into the stored values; null removes a key.

Type: map of PropertyValue | null

IdList

Type: array of string

ConsentChannel

Type: "email" | "sms" | "telephone_canvassing" | "postal"

ConsentSource

Type: "crm" | "public_link" | "import" | "sms_stop"

Contact

PropertyTypeRequiredDescription
idstringyes
createdAtTimestampyes
updatedAtTimestampyes
firstNamestringyes
lastNamestringyes
emailstring | nullyes

Normalized (lowercased).

phonestring | nullyes
addressAddress | nullyes
commentstring | nullyes
companyIdstring | nullyes
ownerIdsIdListyes
isRedFlaggedbooleanyes
lifecycleStagestring | nullyes

A stage key of the lifecycle settings.

leadScorenumber | nullyes
marketingConsentarray of ConsentChannelyes
consentSourceConsentSource | nullyes
consentUpdatedAtnumber | nullyes
lastActivityAtnumber | nullyes
emailOpenCountintegeryes
emailClickCountintegeryes
formSubmissionCountintegeryes
customPropertiesCustomPropertiesyes

CompanyHint

Matches an existing company by registration number, VAT number or domain (else the email's domain); creates one when nothing matches and name is given.

PropertyTypeRequiredDescription
namestringno
countrystringno
registrationNumberstringno
vatNumberstringno
domainstringno

ContactCreate

PropertyTypeRequiredDescription
firstNamestringyes
lastNamestringyes
emailstringyes

Stored lower-cased. Blank identity fields are refused (field_required).

phonestringno
addressAddressno
commentstringno
ownerIdsIdListno
isRedFlaggedbooleanno
lifecycleStagestringno

A stage key; the default stage when absent.

companyIdstringno
companyCompanyHintno
customPropertiesCustomPropertiesno

ContactPatch

PropertyTypeRequiredDescription
firstNamestringno
lastNamestringno
emailstringno

Identity fields (firstName, lastName, email) can change but never be cleared.

phonestring | nullno
addressAddress | nullno
commentstring | nullno
ownerIdsIdListno
isRedFlaggedbooleanno
lifecycleStagestringno
companyIdstring | nullno

An explicit pick; null detaches.

customPropertiesCustomPropertiesPatchno

ContactPage

PropertyTypeRequiredDescription
dataarray of Contactyes
nextCursorstring | nullyes

ContactUpsertResult

PropertyTypeRequiredDescription
createdbooleanyes
dataContactyes

Company

PropertyTypeRequiredDescription
idstringyes
createdAtTimestampyes
updatedAtTimestampyes
namestringyes
countrystringyes

ISO 3166-1 alpha-2, uppercase.

registrationNumberstring | nullyes

Normalized by the country's scheme (digits only for a SIRET).

vatNumberstring | nullyes
domainstring | nullyes

Lowercase, no protocol or www.

websitestring | nullyes
sectorstring | nullyes
headcountnumber | nullyes
addressAddress | nullyes
ownerIdsIdListyes
customPropertiesCustomPropertiesyes

CompanyCreate

PropertyTypeRequiredDescription
namestringyes
countrystringno

ISO 3166-1 alpha-2; the instance default when absent.

registrationNumberstringno
vatNumberstringno
domainstringno
websitestringno
sectorstringno
headcountnumberno
addressAddressno
ownerIdsIdListno
customPropertiesCustomPropertiesno

CompanyPatch

PropertyTypeRequiredDescription
namestringno
countrystringno
registrationNumberstring | nullno
vatNumberstring | nullno
domainstring | nullno
websitestring | nullno
sectorstring | nullno
headcountnumber | nullno
addressAddress | nullno
ownerIdsIdListno
customPropertiesCustomPropertiesPatchno

CompanyPage

PropertyTypeRequiredDescription
dataarray of Companyyes
nextCursorstring | nullyes

DealStatus

Type: "open" | "won" | "lost"

Deal

PropertyTypeRequiredDescription
idstringyes
createdAtTimestampyes
updatedAtTimestampyes
titlestringyes
amountnumber | nullyes
currencystringyes

ISO 4217, uppercase.

pipelineIdstringyes
stageKeystringyes
statusDealStatusyes
expectedCloseDatestring | nullyes

YYYY-MM-DD.

closedAtnumber | nullyes
leadIdstring | nullyes
ownerIdsIdListyes
sourceCampaignIdstring | nullyes
customPropertiesCustomPropertiesyes

DealCreate

PropertyTypeRequiredDescription
titlestringyes
amountnumber (min 0)no
currencystringno

ISO 4217; EUR when absent.

pipelineIdstringno
stageKeystringno
stageTagsarray of stringno
stageCommentstringno
expectedCloseDatestringno

YYYY-MM-DD.

ownerIdsIdListno
leadIdstringno
sourceCampaignIdstringno
customPropertiesCustomPropertiesno

DealPatch

PropertyTypeRequiredDescription
titlestringno
amountnumber | nullno
currencystringno
stageKeystringno

Moves the deal through the pipeline's transition graph.

stageTagsarray of stringno

Tags of the target stage; only with stageKey.

stageCommentstringno

Only with stageKey.

expectedCloseDatestring | nullno
ownerIdsIdListno
leadIdstring | nullno
sourceCampaignIdstring | nullno
customPropertiesCustomPropertiesPatchno

DealPage

PropertyTypeRequiredDescription
dataarray of Dealyes
nextCursorstring | nullyes

ActivityType

Type: "call" | "meeting" | "task" | "email" | "note"

ActivityStatus

Type: "open" | "done" | "cancelled"

Activity

PropertyTypeRequiredDescription
idstringyes
createdAtTimestampyes
updatedAtTimestampyes
typeActivityTypeyes
titlestringyes
descriptionstring | nullyes
statusActivityStatusyes
dueAtnumber | nullyes
completedAtnumber | nullyes
outcomestring | nullyes
ownerIdstring | nullyes
teamIdstring | nullyes
leadIdstring | nullyes
companyIdstring | nullyes
dealIdstring | nullyes
customPropertiesCustomPropertiesyes

ActivityCreate

PropertyTypeRequiredDescription
typeActivityTypeyes
titlestringyes
descriptionstringno
dueAtTimestampno
status"open" | "done"no
ownerIdstringno

A live employee.

teamIdstringno
leadIdstringno
companyIdstringno
dealIdstringno
outcomestringno
customPropertiesCustomPropertiesno

ActivityPatch

PropertyTypeRequiredDescription
typeActivityTypeno
titlestringno
descriptionstring | nullno
dueAtnumber | nullno
statusActivityStatusno
ownerIdstring | nullno
teamIdstring | nullno
leadIdstring | nullno
companyIdstring | nullno
dealIdstring | nullno
outcomestring | nullno
customPropertiesCustomPropertiesPatchno

ActivityPage

PropertyTypeRequiredDescription
dataarray of Activityyes
nextCursorstring | nullyes

List

PropertyTypeRequiredDescription
idstringyes
createdAtTimestampyes
updatedAtTimestampyes
namestringyes
kind"static" | "dynamic"yes

ListPage

PropertyTypeRequiredDescription
dataarray of Listyes
nextCursorstring | nullyes

PropertyEntityType

Type: "lead" | "company" | "deal" | "activity"

PropertyType

Type: "text" | "number" | "email" | "select" | "radio" | "checkbox" | "date" | "boolean" | "rpps"

PropertyDefinition

PropertyTypeRequiredDescription
idstringyes

The key of this property in customProperties.

entityTypePropertyEntityTypeyes
labelstringyes
typePropertyTypeyes
optionsarray of object | nullyes

The choices of select / radio / checkbox properties; value is the stored key.

validationobject | nullyes
validation.minnumberno
validation.maxnumberno
validation.minLengthintegerno
validation.maxLengthintegerno
validation.patternstringno
computedbooleanyes

Engine-maintained value, read-only through the API.

PropertyDefinitionPage

PropertyTypeRequiredDescription
dataarray of PropertyDefinitionyes
nextCursorstring | nullyes