Intellayer Public API
What this is. The API lets other software read and change your records with an API key you create on Settings > API and webhooks. The key decides what that software may see and do. If someone else builds the connection for you, make a key there and give it to them; the rest of this page is for them.
Getting started
Read and write your organisation's records from your own systems. Every request carries an API key made on Settings > API and webhooks.
Every address on this page starts with https://api.intellayer.app/api/public/v1. The full description for tools (Postman, n8n, Make, Zapier) is the OpenAPI document: /api/public/v1/openapi.json.
- Make a key on Settings > API and webhooks, choosing the role it acts with. Copy it: it is shown once.
- Check it works by asking who it is:
curl -H "Authorization: Bearer $API_KEY" https://api.intellayer.app/api/public/v1/me
If your organisation takes access tokens only, get a token first (Access tokens). - Read records, a page at a time:
GET /api/public/v1/leads?page=1&pageSize=50.
To hear about changes as they happen instead of asking again and again, see the Webhooks guide.
Signing in
A key acts as the person who made it, limited to the role chosen for it: it sees and changes only what that role allows, and stops working when it is revoked or expires, or when its creator loses access.
Every key has a client ID, its 12-character public id (the part after ascpk_), shown under each key on Settings > API and webhooks and in the dialog when the key is made. Unless it was made with No secret it also has a secret: the whole key, shown once. An integration signs in in one of three ways:
- The key on every call. The simplest: send the key with each request. Refused while access tokens only is on.
- An access token from the key. Send the client ID and the key to the token endpoint, get a token that works for one hour, and send the token with each request instead of the key.
- An access token from a key pair. The integration keeps a private key that never leaves it and proves who it is with that instead of a secret, then uses the same hour-long token.
Whichever way, every check of the key (revoked, expired, suspended, allowed addresses, role) runs on every call.
The key on every call
Authorization: Bearer ascpk_xxxxxxxxxxxx_…
or X-Api-Key: ascpk_…, for tools that cannot set Authorization.
Access tokens
Instead of sending the key with every call, an integration can trade it for an access token that lasts an hour, so the key itself crosses the network once an hour at most. POST /api/public/v1/oauth/token, form-encoded, with grant_type=client_credentials (OAuth 2.0 client credentials) and the key as the client: client_secret_basic (Authorization: Basic base64(client_id:client_secret)) or client_secret_post (client_id and client_secret in the form). The client_id is the key's client ID (shown under each key on Settings > API and webhooks, and in the dialog when the key is made); the client_secret is the whole key.
curl -s -X POST https://api.intellayer.app/api/public/v1/oauth/token \
-u "$CLIENT_ID:$API_KEY" -d grant_type=client_credentials
{ "access_token": "eyJ…", "token_type": "Bearer", "expires_in": 3600 }Send it as Authorization: Bearer <access_token>. Every check of the key runs on every call made with the token: revoke, suspend or limit the key and its tokens stop or are limited at once. Ask for a new token shortly before expires_in runs out; an expired one gets 401 with errors.apiKeys.tokenInvalid.
Node.js:
const res = await fetch(`${apiHost}/api/public/v1/oauth/token`, {
method: 'POST',
headers: { Authorization: 'Basic ' + Buffer.from(`${clientId}:${apiKey}`).toString('base64') },
body: new URLSearchParams({ grant_type: 'client_credentials' }),
});
const { access_token, expires_in } = await res.json();
const leads = await fetch(`${apiHost}/api/public/v1/leads`, { headers: { Authorization: `Bearer ${access_token}` } });Errors follow RFC 6749: 400 with unsupported_grant_type or invalid_request (no grant, or more than one way of authenticating), 401 with invalid_client for an unknown client or a wrong secret, and 401 invalid_client with the key's own error in error_description (for example errors.apiKeys.revoked or errors.apiKeys.ipNotAllowed). The endpoint takes 30 requests a minute per address; failed attempts count towards the key's unusual-use alerts.
Key pair sign-in
A key can hold the integration's public key instead of, or as well as, a secret (private_key_jwt). The integration then proves itself at the token endpoint with a short assertion signed by its private key (RFC 7523), and the private key never leaves it. Register the public key when making the key, or later from its Public key action: PEM (BEGIN PUBLIC KEY or BEGIN RSA PUBLIC KEY) or a JWK; RSA of at least 2048 bits, or EC P-256 or P-384. Tick No secret and the key has no secret at all: it works only through the token endpoint. Registering or replacing a public key asks for your second factor and is emailed to the Owners.
# EC P-256 (ES256) openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out client.key # or RSA (RS256) openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out client.key # the public half, to paste into the settings page openssl pkey -in client.key -pubout -out client.pub
The assertion is a JWT signed with RS256, ES256 or ES384 (anything else, none and HS256 included, is refused) with these claims: iss and sub the client_id; aud the token endpoint's full URL, https://api.intellayer.app/api/public/v1/oauth/token; exp at most 5 minutes ahead; jti unique (each assertion is accepted once); iat optional. Clocks may differ by up to 60 seconds. Send it as client_assertion with client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer.
Node.js (no libraries):
const { createPrivateKey, sign, randomUUID } = require('crypto');
const key = createPrivateKey(fs.readFileSync('client.key'));
const b64 = o => Buffer.from(JSON.stringify(o)).toString('base64url');
const now = Math.floor(Date.now() / 1000);
const head = b64({ alg: 'ES256', typ: 'JWT' });
const body = b64({ iss: clientId, sub: clientId, aud: tokenUrl, iat: now, exp: now + 120, jti: randomUUID() });
const sig = sign('sha256', Buffer.from(`${head}.${body}`), { key, dsaEncoding: 'ieee-p1363' }).toString('base64url');
const res = await fetch(tokenUrl, { method: 'POST', body: new URLSearchParams({
grant_type: 'client_credentials',
client_assertion_type: 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer',
client_assertion: `${head}.${body}.${sig}`,
}) });C# (System.IdentityModel.Tokens.Jwt):
using var ec = ECDsa.Create();
ec.ImportFromPem(File.ReadAllText("client.key"));
var now = DateTime.UtcNow;
var assertion = new JwtSecurityTokenHandler().WriteToken(new JwtSecurityToken(
issuer: clientId, audience: tokenUrl,
claims: [new Claim("sub", clientId), new Claim("jti", Guid.NewGuid().ToString())],
notBefore: now, expires: now.AddMinutes(2),
signingCredentials: new SigningCredentials(new ECDsaSecurityKey(ec), SecurityAlgorithms.EcdsaSha256)));
var response = await http.PostAsync(tokenUrl, new FormUrlEncodedContent(new Dictionary<string, string>
{
["grant_type"] = "client_credentials",
["client_assertion_type"] = "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
["client_assertion"] = assertion,
}));Access tokens only
An Owner can switch the organisation to Access tokens only on Settings > API and webhooks. From then on a key sent with any call other than the token endpoint gets 401 with errors.apiKeys.tokensOnly: only access tokens and key pair sign-in work. Move every integration to tokens before it is turned on.
Key safety and expiry
Format. ascpk_, a 12-character public id, _ and a 49-character secret whose last six characters are a checksum, so a secret scanner can recognise a leaked key without false alarms: \bascpk_[a-km-np-z2-9]{12}_[0-9A-Za-z]{49}\b. Older keys start ak_ and keep working until they expire or are given a new secret.
Expiry. Every key expires: 90 days after it is made unless another date is chosen, a year at most. Its creator and the organisation's Owners are emailed 14 and 3 days before. An expired key gets 401 with errors.apiKeys.expired.
New secret. A key can be given a new secret on the settings page; it keeps its id, role and allowed addresses. The previous secret keeps working for 24 hours, so you can switch without downtime. A second new secret within those 24 hours ends the oldest at once.
Allowed addresses. A key can be limited to IPv4 and IPv6 addresses and ranges (CIDR). A call from anywhere else gets 403 with errors.apiKeys.ipNotAllowed, even with the right key.
Unusual use. The organisation's Owners are emailed when a key is used from a new address or country, its volume jumps, or it keeps being refused. If they have turned on automatic suspension, a key used from a new country or refused again and again with its right secret gets 401 with errors.apiKeys.suspended until an Owner resumes it.
Personal data
A key reads personal data only when it is allowed to (Can read personal data on the settings page; turning it on asks for your second factor and is emailed to the Owners). Keys made before this setting existed keep reading it; new keys do not unless it is ticked. GET /me shows it as canReadPersonalData.
Without it the personal fields are still in every answer, set to null, and the answer carries "redacted": true next to data. The fields: leads and customers: firstName, lastName, email, phone, address, city, district, postalCode, notes; companies: email, phone, notes, taxId, address, city, postalCode (a sole trader's are their own); invoices: billingName, billingVatNumber; proposals: customerName; tasks: description. Writes work as before, though the record returned is redacted too. Finding records by email, and setting a customer's email (a duplicate is refused), get 403 with errors.apiKeys.personalDataRequired, since the answer would say whether that person is on file. Full webhook payloads of a subscription made through such a key are redacted the same way, carry "redacted": true, and their changes name the fields without their values.
Responses and limits
Every response is { "success", "data", "error", "meta" }. Lists take page (from 1) and pageSize (up to 100); meta carries totalCount. Errors carry a stable error.code. Under each endpoint below, Response names the object inside data.
Your organisation has a number of requests per minute, set by its plan and shared by all its keys. A key can also be given a lower limit of its own. Past either you get 429 with Retry-After in seconds; GET /me shows the key's limit.
Endpoints
Companies
/api/public/v1/companiesList companies
Returns a page of the companies the key can see, newest first. Pages start at 1; pageSize runs up to 100 (25 by default), and meta.totalCount holds the total. Filter by updatedSince. Needs View on companies. Record scope applies as in the app: the key sees only what its role's scope (own, team, team tree or all) allows.
| Parameter | In | Type | |
|---|---|---|---|
page | query | integer, string (int32) | |
pageSize | query | integer, string (int32) | |
updatedSince | query | string (date-time) |
- Response
- 200 OK: a page of
PublicCompany - Errors
- 401 Unauthorized, 403 Forbidden (
ApiResponse); 429 Too Many Requests
/api/public/v1/companiesCreate a company
Creates a company. Only name is required. Answers 201 with the new company. Needs Create on companies.
- Request body
PublicCompanyWrite, JSON- Response
- 201 Created:
PublicCompany - Errors
- 400 Bad Request, 401 Unauthorized, 403 Forbidden (
ApiResponse); 429 Too Many Requests
/api/public/v1/companies/{id}Get a company
Returns one company. Needs View on companies. One the key cannot see answers 404, the same as one that does not exist.
| Parameter | In | Type | |
|---|---|---|---|
id * | path | string (uuid) |
- Response
- 200 OK:
PublicCompany - Errors
- 401 Unauthorized, 403 Forbidden, 404 Not Found (
ApiResponse); 429 Too Many Requests
/api/public/v1/companies/{id}Replace a company's details
Replaces the company's details with the ones sent: a field left blank is cleared, so send every field you want to keep. Only name is required. ownerUserId left out keeps the owner; each legal identity field (tradingName, legalForm, registrationNumber, taxId, industry, employeeBand) left out stays as it is, and an empty string clears it. Needs Update on companies. One the key cannot see answers 404, the same as one that does not exist.
| Parameter | In | Type | |
|---|---|---|---|
id * | path | string (uuid) |
- Request body
PublicCompanyWrite, JSON- Response
- 200 OK:
PublicCompany - Errors
- 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found (
ApiResponse); 429 Too Many Requests
Customers
/api/public/v1/customersList customers
Returns a page of the customers the key can see, newest first. Pages start at 1; pageSize runs up to 100 (25 by default), and meta.totalCount holds the total. Archived customers are left out unless includeArchived=true. Filter by updatedSince or email (exact, any case); filtering by email needs a key that may read personal data (403 otherwise). Needs View on customers. Record scope applies as in the app: the key sees only what its role's scope (own, team, team tree or all) allows.
| Parameter | In | Type | |
|---|---|---|---|
page | query | integer, string (int32) | |
pageSize | query | integer, string (int32) | |
updatedSince | query | string (date-time) | |
includeArchived | query | boolean | |
email | query | string |
- Response
- 200 OK: a page of
PublicCustomer - Errors
- 401 Unauthorized, 403 Forbidden (
ApiResponse); 429 Too Many Requests
/api/public/v1/customersCreate a customer
Creates a customer as a contact, without a portal login, owned by the key's creator. firstName and lastName are required, and a business customer needs a companyId the key can see (404 otherwise). Setting email needs a key that may read personal data (403 otherwise), since refusing a duplicate would say whether that person is on file. Answers 201 with the new customer. Needs Create on customers.
- Request body
PublicCustomerCreate, JSON- Response
- 201 Created:
PublicCustomer - Errors
- 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found (
ApiResponse); 429 Too Many Requests
/api/public/v1/customers/{id}Get a customer
Returns one customer, archived or not. Needs View on customers. One the key cannot see answers 404, the same as one that does not exist.
| Parameter | In | Type | |
|---|---|---|---|
id * | path | string (uuid) |
- Response
- 200 OK:
PublicCustomer - Errors
- 401 Unauthorized, 403 Forbidden, 404 Not Found (
ApiResponse); 429 Too Many Requests
/api/public/v1/customers/{id}Update a customer
Changes only the fields sent and leaves the rest. Changing email never changes the address a customer signs in to the portal with, and setting it needs a key that may read personal data (403 otherwise). Needs Update on customers. One the key cannot see answers 404, the same as one that does not exist.
| Parameter | In | Type | |
|---|---|---|---|
id * | path | string (uuid) |
- Request body
PublicCustomerUpdate, JSON- Response
- 200 OK:
PublicCustomer - Errors
- 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found (
ApiResponse); 429 Too Many Requests
Invoices
/api/public/v1/invoicesList invoices
Returns a page of the invoices the organisation issued, newest first, visible as their customer is. Pages start at 1; pageSize runs up to 100 (25 by default), and meta.totalCount holds the total. Filter by updatedSince or status (draft, sent, paid, partially_paid, overdue or cancelled). Read-only. Needs View on invoices.
| Parameter | In | Type | |
|---|---|---|---|
page | query | integer, string (int32) | |
pageSize | query | integer, string (int32) | |
updatedSince | query | string (date-time) | |
status | query | string |
- Response
- 200 OK: a page of
PublicInvoice - Errors
- 401 Unauthorized, 403 Forbidden (
ApiResponse); 429 Too Many Requests
/api/public/v1/invoices/{id}Get an invoice
Returns one invoice. Needs View on invoices. One the key cannot see answers 404, the same as one that does not exist.
| Parameter | In | Type | |
|---|---|---|---|
id * | path | string (uuid) |
- Response
- 200 OK:
PublicInvoice - Errors
- 401 Unauthorized, 403 Forbidden, 404 Not Found (
ApiResponse); 429 Too Many Requests
Leads
/api/public/v1/leadsList leads
Returns a page of the leads the key can see, newest first. Pages start at 1; pageSize runs up to 100 (25 by default), and meta.totalCount holds the total. Filter by updatedSince (changed at or after a UTC instant), status (New, Contacted, SiteVisitScheduled, ProposalSent, Negotiation, Won or Lost; 400 otherwise) or email (exact, any case). Filtering by email needs a key that may read personal data (403 otherwise), since the answer would say whether that person is on file. Needs View on leads. Record scope applies as in the app: the key sees only what its role's scope (own, team, team tree or all) allows.
| Parameter | In | Type | |
|---|---|---|---|
page | query | integer, string (int32) | |
pageSize | query | integer, string (int32) | |
updatedSince | query | string (date-time) | |
status | query | string | |
email | query | string |
- Response
- 200 OK: a page of
PublicLead - Errors
- 400 Bad Request, 401 Unauthorized, 403 Forbidden (
ApiResponse); 429 Too Many Requests
/api/public/v1/leadsCreate a lead
Creates a lead owned by the key's creator, in the organisation's first pipeline stage unless stageId names another; source defaults to "api". firstName and lastName are required, and a business lead needs a companyId the key can see (404 otherwise). Answers 201 with the new lead, or 409 errors.installer.recordLimitReached when the plan's limit for leads and customers is reached. Needs Create on leads.
- Request body
PublicLeadCreate, JSON- Response
- 201 Created:
PublicLead - Errors
- 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 409 Conflict (
ApiResponse); 429 Too Many Requests
/api/public/v1/leads/{id}Get a lead
Returns one lead. Needs View on leads. One the key cannot see answers 404, the same as one that does not exist.
| Parameter | In | Type | |
|---|---|---|---|
id * | path | string (uuid) |
- Response
- 200 OK:
PublicLead - Errors
- 401 Unauthorized, 403 Forbidden, 404 Not Found (
ApiResponse); 429 Too Many Requests
/api/public/v1/leads/{id}Update a lead
Changes only the fields sent and leaves the rest. A status change is logged on the lead; an unknown status answers 400. companyId must be a company the key can see, and the empty GUID unlinks it. Needs Update on leads. One the key cannot see answers 404, the same as one that does not exist.
| Parameter | In | Type | |
|---|---|---|---|
id * | path | string (uuid) |
- Request body
PublicLeadUpdate, JSON- Response
- 200 OK:
PublicLead - Errors
- 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found (
ApiResponse); 429 Too Many Requests
Me
/api/public/v1/meWho am I
Returns the calling key (its name, role, expiry, rate limit, and whether it may read personal data), its organisation, and what it may do: for each feature, the scope of each action (none, own, team, team_tree or all). Every key may call it; automation tools use it to test a connection.
- Response
- 200 OK:
PublicMeDto - Errors
- 401 Unauthorized, 403 Forbidden (
ApiResponse); 429 Too Many Requests
OAuth
/api/public/v1/oauth/tokenGet an access token
Exchanges the key for an access token that works for one hour (OAuth 2.0 client credentials). Send grant_type=client_credentials form-encoded, proving the key one way: the client ID and the whole key as HTTP Basic credentials (client_secret_basic) or as client_id and client_secret in the form (client_secret_post), or a client_assertion signed with the key's private key (private_key_jwt). Needs no Authorization: Bearer. Errors follow RFC 6749: error and error_description. 30 requests a minute per address.
- Request body
PublicTokenRequest, form-encoded- Response
- 200 OK:
PublicTokenResponse - Errors
- 400 Bad Request, 401 Unauthorized (
PublicTokenError); 429 Too Many Requests
Pipeline stages
/api/public/v1/pipeline-stagesList pipeline stages
Returns all the organisation's pipeline stages in their order, not paged: the ids to put in a lead's stageId. Needs View on leads.
- Response
- 200 OK: a list of
PublicPipelineStage - Errors
- 401 Unauthorized, 403 Forbidden (
ApiResponse); 429 Too Many Requests
Proposals
/api/public/v1/proposalsList proposals
Returns a page of proposals (quotes), newest first, visible as their customer or lead is. Pages start at 1; pageSize runs up to 100 (25 by default), and meta.totalCount holds the total. Filter by updatedSince or status (Draft, Sent, Viewed, Accepted, Rejected or Expired; 400 otherwise). Read-only. Needs View on proposals.
| Parameter | In | Type | |
|---|---|---|---|
page | query | integer, string (int32) | |
pageSize | query | integer, string (int32) | |
updatedSince | query | string (date-time) | |
status | query | string |
- Response
- 200 OK: a page of
PublicProposal - Errors
- 400 Bad Request, 401 Unauthorized, 403 Forbidden (
ApiResponse); 429 Too Many Requests
/api/public/v1/proposals/{id}Get a proposal
Returns one proposal. Needs View on proposals. One the key cannot see answers 404, the same as one that does not exist.
| Parameter | In | Type | |
|---|---|---|---|
id * | path | string (uuid) |
- Response
- 200 OK:
PublicProposal - Errors
- 401 Unauthorized, 403 Forbidden, 404 Not Found (
ApiResponse); 429 Too Many Requests
Tasks
/api/public/v1/tasksList tasks
Returns a page of the tasks the key can see, newest first. Pages start at 1; pageSize runs up to 100 (25 by default), and meta.totalCount holds the total. A repeating task appears once, as its series. Filter by updatedSince or status (exact match). Needs View on tasks. Record scope applies as in the app: the key sees only what its role's scope (own, team, team tree or all) allows.
| Parameter | In | Type | |
|---|---|---|---|
page | query | integer, string (int32) | |
pageSize | query | integer, string (int32) | |
updatedSince | query | string (date-time) | |
status | query | string |
- Response
- 200 OK: a page of
PublicTask - Errors
- 401 Unauthorized, 403 Forbidden (
ApiResponse); 429 Too Many Requests
/api/public/v1/tasksCreate a task
Creates a one-off task. title is required; priority defaults to medium and the assignee to the key's creator. A linked customerId or leadId must be one the key can see (404 otherwise). Answers 201 with the new task. Needs Create on tasks.
- Request body
PublicTaskCreate, JSON- Response
- 201 Created:
PublicTask - Errors
- 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found (
ApiResponse); 429 Too Many Requests
/api/public/v1/tasks/{id}Get a task
Returns one task. Needs View on tasks. One the key cannot see answers 404, the same as one that does not exist.
| Parameter | In | Type | |
|---|---|---|---|
id * | path | string (uuid) |
- Response
- 200 OK:
PublicTask - Errors
- 401 Unauthorized, 403 Forbidden, 404 Not Found (
ApiResponse); 429 Too Many Requests
Webhooks
/api/public/v1/webhooksList the key's subscriptions
The webhook subscriptions this key made, newest first, with whether each is switched on, its verification status and its payload mode. Not paged. A key never sees subscriptions made in the app or by another key.
- Response
- 200 OK: a list of
PublicWebhookSubscription - Errors
- 401 Unauthorized, 403 Forbidden (
ApiResponse); 429 Too Many Requests
/api/public/v1/webhooksSubscribe a URL to events
Subscribes an https URL on the public internet to events and answers 201 with the signing secret, shown only this once. Nothing is delivered until the URL answers the verification challenge, sent within seconds, and every Owner is emailed the destination. The key's role must be able to read each event's records (403 otherwise). payloadMode is thin (the default) or full. 400 for an unknown event, an address that is not allowed or a bad header; 409 when the organisation already has as many subscriptions as it may.
- Request body
PublicWebhookSubscribe, JSON- Response
- 201 Created:
PublicWebhookCreated - Errors
- 400 Bad Request, 401 Unauthorized, 403 Forbidden, 409 Conflict (
ApiResponse); 429 Too Many Requests
/api/public/v1/webhooks/eventsList webhook events
The events this organisation offers, each with available: whether the key's role can read the records the event is about. Only those can be subscribed to.
- Response
- 200 OK: a list of
PublicWebhookEvent - Errors
- 401 Unauthorized, 403 Forbidden (
ApiResponse); 429 Too Many Requests
/api/public/v1/webhooks/{id}Unsubscribe
Removes a subscription this key made; nothing more is delivered to it. A subscription made in the app or by another key answers 404, as one that does not exist.
| Parameter | In | Type | |
|---|---|---|---|
id * | path | string (uuid) |
- Response
- 200 OK:
PublicDeleted - Errors
- 401 Unauthorized, 403 Forbidden, 404 Not Found (
ApiResponse); 429 Too Many Requests
Objects
ApiError
| Field | Type | |
|---|---|---|
code | string | |
message | string | |
validationErrors | object |
ApiResponse
| Field | Type | |
|---|---|---|
success | boolean | |
data | ||
error | 0 | |
meta | 0 | |
redacted | boolean |
PaginationMeta
| Field | Type | |
|---|---|---|
page | integer, string (int32) | |
pageSize | integer, string (int32) | |
totalCount | integer, string (int32) | |
totalPages | integer, string (int32) | |
hasNext | boolean | |
hasPrevious | boolean |
PublicCompany
| Field | Type | |
|---|---|---|
id | string (uuid) | |
name | string | |
vatNumber | string | |
countryCode | string | |
address | string | |
city | string | |
postalCode | string | |
phone | string | |
email | string | |
website | string | |
notes | string | |
ownerUserId | string (uuid) | |
viesStatus | string | |
viesCheckedAt | string (date-time) | |
createdAt | string (date-time) | |
updatedAt | string (date-time) | |
tradingName | string | |
legalForm | string | |
registrationNumber | string | |
taxId | string | |
industry | string | |
employeeBand | string |
PublicCompanyWrite
| Field | Type | |
|---|---|---|
name | string | |
vatNumber | string | |
countryCode | string | |
address | string | |
city | string | |
postalCode | string | |
phone | string | |
email | string | |
website | string | |
notes | string | |
ownerUserId | string (uuid) | |
tradingName | string | |
legalForm | string | |
registrationNumber | string | |
taxId | string | |
industry | string | |
employeeBand | string |
PublicCustomer
| Field | Type | |
|---|---|---|
id | string (uuid) | |
firstName | string | |
lastName | string | |
email | string | |
phone | string | |
address | string | |
city | string | |
district | string | |
postalCode | string | |
countryCode | string | |
companyId | string (uuid) | |
ownerUserId | string (uuid) | |
assignedTeamId | string (uuid) | |
stageId | string (uuid) | |
notes | string | |
source | string | |
archivedAt | string (date-time) | |
createdAt | string (date-time) | |
updatedAt | string (date-time) | |
kind | string |
PublicCustomerCreate
| Field | Type | |
|---|---|---|
firstName | string | |
lastName | string | |
kind | string | |
email | string | |
phone | string | |
address | string | |
city | string | |
district | string | |
countryCode | string | |
companyId | string (uuid) |
PublicCustomerUpdate
| Field | Type | |
|---|---|---|
kind | string | |
firstName | string | |
lastName | string | |
email | string | |
phone | string | |
address | string | |
city | string | |
district | string | |
postalCode | string | |
countryCode | string | |
companyId | string (uuid) | |
ownerUserId | string (uuid) | |
notes | string |
PublicDeleted
| Field | Type | |
|---|---|---|
id | string (uuid) |
PublicInvoice
| Field | Type | |
|---|---|---|
id | string (uuid) | |
invoiceNumber | string | |
type | string | |
status | string | |
customerId | string (uuid) | |
currency | string | |
subtotal | number, string (double) | |
vatAmount | number, string (double) | |
total | number, string (double) | |
amountPaid | number, string (double) | |
issueDate | string (date) | |
dueDate | string (date) | |
paidDate | string (date) | |
billingName | string | |
billingVatNumber | string | |
createdAt | string (date-time) | |
updatedAt | string (date-time) |
PublicKeyDto
| Field | Type | |
|---|---|---|
id | string (uuid) | |
name | string | |
role | string | |
expiresAt | string (date-time) | |
rateLimitPerMinute | integer, string (int32) | |
canReadPersonalData | boolean |
PublicLead
| Field | Type | |
|---|---|---|
id | string (uuid) | |
firstName | string | |
lastName | string | |
email | string | |
phone | string | |
address | string | |
city | string | |
district | string | |
postalCode | string | |
countryCode | string | |
status | string | |
stageId | string (uuid) | |
priority | string | |
source | string | |
companyId | string (uuid) | |
ownerUserId | string (uuid) | |
assignedUserId | string (uuid) | |
estimatedBudgetEur | number, string (double) | |
propertyType | string | |
notes | string | |
nextFollowUpAt | string (date-time) | |
convertedCustomerId | string (uuid) | |
createdAt | string (date-time) | |
updatedAt | string (date-time) | |
kind | string |
PublicLeadCreate
| Field | Type | |
|---|---|---|
firstName | string | |
lastName | string | |
kind | string | |
email | string | |
phone | string | |
address | string | |
city | string | |
district | string | |
countryCode | string | |
stageId | string (uuid) | |
priority | string | |
source | string | |
companyId | string (uuid) | |
assignedUserId | string (uuid) | |
estimatedBudgetEur | number, string (double) | |
propertyType | string | |
notes | string | |
nextFollowUpAt | string (date-time) |
PublicLeadUpdate
| Field | Type | |
|---|---|---|
kind | string | |
firstName | string | |
lastName | string | |
email | string | |
phone | string | |
address | string | |
city | string | |
district | string | |
countryCode | string | |
status | string | |
priority | string | |
source | string | |
companyId | string (uuid) | |
ownerUserId | string (uuid) | |
assignedUserId | string (uuid) | |
estimatedBudgetEur | number, string (double) | |
propertyType | string | |
notes | string | |
nextFollowUpAt | string (date-time) |
PublicMeDto
| Field | Type | |
|---|---|---|
organization | PublicOrganizationDto | |
key | PublicKeyDto | |
permissions | object |
PublicOrganizationDto
| Field | Type | |
|---|---|---|
id | string (uuid) | |
name | string |
PublicPermissionDto
| Field | Type | |
|---|---|---|
view | string | |
create | string | |
update | string | |
delete | string |
PublicPipelineStage
| Field | Type | |
|---|---|---|
id | string (uuid) | |
name | string | |
code | string | |
sortOrder | integer, string (int32) | |
phase | string | |
isWinStage | boolean | |
isLossStage | boolean | |
isActive | boolean |
PublicProposal
| Field | Type | |
|---|---|---|
id | string (uuid) | |
proposalNumber | string | |
status | string | |
customerId | string (uuid) | |
leadId | string (uuid) | |
customerName | string | |
subtotalEur | number, string (double) | |
vatAmountEur | number, string (double) | |
totalCostEur | number, string (double) | |
sentAt | string (date-time) | |
viewedAt | string (date-time) | |
acceptedAt | string (date-time) | |
expiresAt | string (date-time) | |
createdAt | string (date-time) | |
updatedAt | string (date-time) |
PublicTask
| Field | Type | |
|---|---|---|
id | string (uuid) | |
title | string | |
description | string | |
category | string | |
priority | string | |
status | string | |
dueDate | string (date) | |
dueTime | string (time) | |
assignedUserId | string (uuid) | |
assignedTeamId | string (uuid) | |
customerId | string (uuid) | |
leadId | string (uuid) | |
createdByUserId | string (uuid) | |
completedAt | string (date-time) | |
createdAt | string (date-time) | |
updatedAt | string (date-time) |
PublicTaskCreate
| Field | Type | |
|---|---|---|
title | string | |
description | string | |
category | string | |
priority | string | |
dueDate | string (date) | |
dueTime | string (time) | |
assignedUserId | string (uuid) | |
assignedTeamId | string (uuid) | |
customerId | string (uuid) | |
leadId | string (uuid) |
PublicTokenError
| Field | Type | |
|---|---|---|
error | string | |
error_description | string |
PublicTokenRequest
| Field | Type | |
|---|---|---|
grant_type | string | |
client_id | string | |
client_secret | string | |
client_assertion_type | string | |
client_assertion | string |
PublicTokenResponse
| Field | Type | |
|---|---|---|
access_token | string | |
token_type | string | |
expires_in | integer, string (int32) |
PublicWebhookCreated
| Field | Type | |
|---|---|---|
id | string (uuid) | |
url | string | |
events | array of string | |
authHeaderName | string | |
payloadMode | string | |
verificationStatus | string | |
secret | string |
PublicWebhookEvent
| Field | Type | |
|---|---|---|
name | string | |
available | boolean |
PublicWebhookSubscribe
| Field | Type | |
|---|---|---|
url | string | |
events | array of string | |
description | string | |
authHeaderName | string | |
authHeaderValue | string | |
payloadMode | string |
PublicWebhookSubscription
| Field | Type | |
|---|---|---|
id | string (uuid) | |
url | string | |
events | array of string | |
isActive | boolean | |
createdAt | string (date-time) | |
verificationStatus | string | |
verifiedAt | string (date-time) | |
verificationError | string | |
payloadMode | string |
WebhookChange
A field an *.updated event changed. previous and current only in full payloads, and not for a key that may not read personal data.
| Field | Type | |
|---|---|---|
field | string | |
previous | string | |
current | string |
WebhookThinData
A thin webhook payload's data: the record's id, its type, and the API path that returns it.
| Field | Type | |
|---|---|---|
id | string (uuid) | |
object | string | lead, customer, company, task, proposal, invoice or system. |
url | string | e.g. /api/public/v1/leads/{id}. |