Developers · REST API v1.0.0

MetriCRM REST API

Connect your ERP, website, BI tool or any other system to MetriCRM. Every endpoint below is generated from the same rules the app uses, so what you can do through the API always matches what the key's owner can do in MetriCRM.

Endpoint and field descriptions are in English.

Authentication

Create a key in Settings → API keys and send it as a bearer token. Keys look like mck_your-workspace_…, act as the person who created them and only reach the resources in their scopes. Use api.metricrm.com/v1 or your workspace address followed by /api/v1.

curl https://api.metricrm.com/v1/me \
  -H "Authorization: Bearer mck_your-workspace_…"

Pagination and filters

Lists return up to 100 records per page with a nextCursor; pass it back as cursor to get the next page. Sort by createdAt or updatedAt in either order, and use updatedSince to sync only what changed.

curl "https://api.metricrm.com/v1/contacts?limit=50&updatedSince=2026-10-01T00:00:00Z&order=asc&sort=updatedAt"
# → { "data": [ … ], "nextCursor": "WyIyMDI2LTEwLTEz…" }
curl "https://api.metricrm.com/v1/contacts?limit=50&cursor=WyIyMDI2LTEwLTEz…"

Errors

Errors use normal HTTP status codes and one JSON shape: a code you can program against, a readable message and, for invalid input, the fields to fix. 401 means the key is missing or no longer valid; 403 means its scopes, its owner's role or its IP allowlist do not allow the call; 404 also covers records the key cannot see.

HTTP/1.1 400 Bad Request
{ "error": { "code": "invalid_request",
    "message": "Some fields are missing or invalid.",
    "details": [ { "path": "email", "message": "Invalid email address" } ] } }

Rate limits

Each key has its own limit per minute (600 by default, set when you create the key). Every response tells you where you stand; when you reach the limit, wait for the number of seconds in Retry-After.

HTTP/1.1 429 Too Many Requests
RateLimit-Limit: 600
RateLimit-Remaining: 0
RateLimit-Reset: 42
Retry-After: 42

Idempotency

Send an Idempotency-Key header with POST requests. If the network fails and you retry with the same key and body within 24 hours, you get the first response back instead of a duplicate record.

curl https://api.metricrm.com/v1/contacts \
  -H "Authorization: Bearer $METRICRM_API_KEY" \
  -H "Idempotency-Key: 6f1c2a9e-0b6d-4c1e-9a55-2f1d0e7b3c11" \
  -H "Content-Type: application/json" \
  -d '{"firstName":"Aisyah","lastName":"Rahman","email":"aisyah@sinar.my"}'

Webhooks

Settings → Webhooks sends events (case.created, invoice.paid …) to your HTTPS endpoint as JSON. Each request is signed following Standard Webhooks: verify webhook-signature with your endpoint's whsec_ secret, reject old timestamps and use webhook-id to ignore repeats. Answer with any 2xx status; anything else is retried for about 3½ days.

// Node.js: verify a MetriCRM webhook (Standard Webhooks)
import { createHmac, timingSafeEqual } from "node:crypto";

function verify(secret, headers, rawBody) {
  const id = headers["webhook-id"], ts = headers["webhook-timestamp"];
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false; // too old
  const key = Buffer.from(secret.replace(/^whsec_/, ""), "base64");
  const expected = createHmac("sha256", key).update(`${id}.${ts}.${rawBody}`).digest();
  return headers["webhook-signature"].split(" ").some((s) => {
    const sig = Buffer.from(s.split(",")[1] ?? "", "base64");
    return sig.length === expected.length && timingSafeEqual(sig, expected);
  });
}

// Body: { "type": "case.created", "timestamp": "…",
//         "data": { "id": "…", "entityType": "case", "object": { … }, "changes": { … } } }

Authentication

Check which key and workspace you are using.

curl "https://api.metricrm.com/v1/me?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/me— Check a key

Returns the workspace, the key's name and scopes, and the user it acts as.

Accounts

Companies you do business with.

curl "https://api.metricrm.com/v1/accounts?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/accounts— List accounts

Companies you do business with. Requires the `accounts:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
ownerIdstring (uuid)Only accounts owned by this user.
teamIdstring (uuid)Only accounts of this team.
parentIdstring (uuid)Only child accounts of this account.
emailstringExact email address (lower case).
tierstringExact tier.
POST/v1/accounts— Create an account

Requires the `accounts:write` scope.

Parameters

Idempotency-Key (header)stringAny unique value (a UUID works). A retry with the same key and body returns the first response instead of creating a duplicate. Kept for 24 hours.
Request body
namerequiredstring
legalNamestring | null
registrationNostring | null
industrystring | null
websitestring | null
emailstring (email) | null | ""
phonestring | null
addressobject | null
tierstring | null
parentIdstring (uuid) | null
ownerIdstring (uuid) | null
backupOwnerIdstring (uuid) | null
teamIdstring (uuid) | null
tagsstring[]
customobject
GET/v1/accounts/{id}— Get one record

Requires the `accounts:read` scope.

Parameters

idrequiredstring (uuid)Record id.
PATCH/v1/accounts/{id}— Update an account

Requires the `accounts:write` scope.

Parameters

idrequiredstring (uuid)Record id.
Request body
namestring
legalNamestring | null
registrationNostring | null
industrystring | null
websitestring | null
emailstring (email) | null | ""
phonestring | null
addressobject | null
tierstring | null
parentIdstring (uuid) | null
ownerIdstring (uuid) | null
backupOwnerIdstring (uuid) | null
teamIdstring (uuid) | null
tagsstring[]
customobject
DELETE/v1/accounts/{id}— Move an account to the recycle bin

Requires the `accounts:write` scope.

Parameters

idrequiredstring (uuid)Record id.
The Account object
idrequiredstring (uuid)
numberrequiredstring | null
namerequiredstring
legalNamerequiredstring | null
registrationNorequiredstring | null
industryrequiredstring | null
websiterequiredstring | null
emailrequiredstring | null
phonerequiredstring | null
addressrequiredobject | null
tierrequiredstring | null
parentIdrequiredstring (uuid) | null
ownerIdrequiredstring (uuid) | null
teamIdrequiredstring (uuid) | null
tagsrequiredstring[]
customrequiredobjectCustom field values by field key.
lastActivityAtrequiredstring (date-time) | null
createdAtrequiredstring (date-time)
updatedAtrequiredstring (date-time)

Contacts

People at your customers.

curl "https://api.metricrm.com/v1/contacts?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/contacts— List contacts

People at your customers. Requires the `contacts:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
accountIdstring (uuid)Only contacts whose primary account is this.
ownerIdstring (uuid)Only contacts owned by this user.
emailstringExact email address (lower case).
mobilestringExact mobile number in E.164 (+60…).
POST/v1/contacts— Create a contact

Requires the `contacts:write` scope.

Parameters

Idempotency-Key (header)stringAny unique value (a UUID works). A retry with the same key and body returns the first response instead of creating a duplicate. Kept for 24 hours.
Request body
firstNamestring | null
lastNamestring | null
fullNamestring | null
emailstring (email) | null | ""
mobilestring | null
officestring | null
homestring | null
titlestring | null
departmentstring | null
locale"en" | "ms" | "zh-CN" | null
ownerIdstring (uuid) | null
teamIdstring (uuid) | null
tagsstring[]
customobject
accountIdstring (uuid) | null
accountRolestring | null
GET/v1/contacts/{id}— Get one record

Requires the `contacts:read` scope.

Parameters

idrequiredstring (uuid)Record id.
PATCH/v1/contacts/{id}— Update a contact

Requires the `contacts:write` scope.

Parameters

idrequiredstring (uuid)Record id.
Request body
firstNamestring | null
lastNamestring | null
fullNamestring | null
emailstring (email) | null | ""
mobilestring | null
officestring | null
homestring | null
titlestring | null
departmentstring | null
locale"en" | "ms" | "zh-CN" | null
ownerIdstring (uuid) | null
teamIdstring (uuid) | null
tagsstring[]
customobject
DELETE/v1/contacts/{id}— Move a contact to the recycle bin

Requires the `contacts:write` scope.

Parameters

idrequiredstring (uuid)Record id.
The Contact object
idrequiredstring (uuid)
numberrequiredstring | null
firstNamerequiredstring | null
lastNamerequiredstring | null
fullNamerequiredstring
emailrequiredstring | null
mobilerequiredstring | null
officerequiredstring | null
homerequiredstring | null
titlerequiredstring | null
departmentrequiredstring | null
localerequiredstring | null
primaryAccountIdrequiredstring (uuid) | null
ownerIdrequiredstring (uuid) | null
teamIdrequiredstring (uuid) | null
tagsrequiredstring[]
customrequiredobjectCustom field values by field key.
lastActivityAtrequiredstring (date-time) | null
createdAtrequiredstring (date-time)
updatedAtrequiredstring (date-time)

Cases

Customer service cases (MetriCare). New cases are routed like any other case.

curl "https://api.metricrm.com/v1/cases?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/cases— List cases

Customer service cases (MetriCare). New cases are routed like any other case. Requires the `cases:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
statusstringExact status key.
prioritystringExact priority key.
accountIdstring (uuid)Only cases of this account.
contactIdstring (uuid)Only cases of this contact.
assigneeIdstring (uuid)Only cases assigned to this user.
teamIdstring (uuid)Only cases of this team.
POST/v1/cases— Create a case

Requires the `cases:write` scope.

Parameters

Idempotency-Key (header)stringAny unique value (a UUID works). A retry with the same key and body returns the first response instead of creating a duplicate. Kept for 24 hours.
Request body
subjectrequiredstring
descriptionstring
categoryIdstring (uuid) | null
subCategoryIdstring (uuid) | null
prioritystring | null
statusstring | null
accountIdstring (uuid) | null
contactIdstring (uuid) | null
assigneeIdstring (uuid) | null
teamIdstring (uuid) | null
tagsstring[]
customobject
GET/v1/cases/{id}— Get one record

Requires the `cases:read` scope.

Parameters

idrequiredstring (uuid)Record id.
PATCH/v1/cases/{id}— Update a case

Requires the `cases:write` scope.

Parameters

idrequiredstring (uuid)Record id.
Request body
subjectstring
descriptionstring
categoryIdstring (uuid) | null
subCategoryIdstring (uuid) | null
prioritystring
accountIdstring (uuid) | null
contactIdstring (uuid) | null
tagsstring[]
customobject
resolutionstring | null
DELETE/v1/cases/{id}— Delete a case

Requires the `cases:write` scope.

Parameters

idrequiredstring (uuid)Record id.
The Case object
idrequiredstring (uuid)
numberrequiredstring
subjectrequiredstring
descriptionrequiredstring
channelrequiredstring
categoryIdrequiredstring (uuid) | null
subCategoryIdrequiredstring (uuid) | null
priorityrequiredstring
statusrequiredstring
statusCategoryrequiredstring
accountIdrequiredstring (uuid) | null
contactIdrequiredstring (uuid) | null
assigneeIdrequiredstring (uuid) | null
teamIdrequiredstring (uuid) | null
tagsrequiredstring[]
customrequiredobjectCustom field values by field key.
resolutionrequiredstring | null
languagerequiredstring | null
firstResponseDueAtrequiredstring (date-time) | null
resolutionDueAtrequiredstring (date-time) | null
firstRespondedAtrequiredstring (date-time) | null
slaStaterequiredstring
resolvedAtrequiredstring (date-time) | null
closedAtrequiredstring (date-time) | null
createdAtrequiredstring (date-time)
updatedAtrequiredstring (date-time)

Case comments

Replies and internal notes on cases. A public comment is emailed to the case contact.

curl "https://api.metricrm.com/v1/comments?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/comments— List case comments

Replies and internal notes on cases. A public comment is emailed to the case contact. Requires the `cases:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
caseIdstring (uuid)Only comments on this case.
kind"public" | "internal"Public replies or notes.
POST/v1/comments— Add a reply or internal note to a case

Requires the `cases:write` scope.

Parameters

Idempotency-Key (header)stringAny unique value (a UUID works). A retry with the same key and body returns the first response instead of creating a duplicate. Kept for 24 hours.
Request body
caseIdrequiredstring (uuid)
kindrequired"public" | "internal"
htmlrequiredstringHTML body (sanitised).
GET/v1/comments/{id}— Get one record

Requires the `cases:read` scope.

Parameters

idrequiredstring (uuid)Record id.
The CaseComment object
idrequiredstring (uuid)
caseIdrequiredstring (uuid)
kindrequired"public" | "internal"
authorTyperequiredstring
authorIdrequiredstring (uuid) | null
authorNamerequiredstring | null
bodyrequiredstringSanitised HTML.
viarequiredstring | null
createdAtrequiredstring (date-time)

Leads

Prospects to qualify (MetriSales). New leads are routed to a sales rep.

curl "https://api.metricrm.com/v1/leads?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/leads— List leads

Prospects to qualify (MetriSales). New leads are routed to a sales rep. Requires the `leads:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
statusstringExact status.
ownerIdstring (uuid)Only leads owned by this user.
emailstringExact email address (lower case).
POST/v1/leads— Create a lead

Requires the `leads:write` scope.

Parameters

Idempotency-Key (header)stringAny unique value (a UUID works). A retry with the same key and body returns the first response instead of creating a duplicate. Kept for 24 hours.
Request body
fullNamerequiredstring
companyNamestring | null
emailstring (email) | null | ""
phonestring | null
source"web_form" | "email" | "chat" | "social" | "import" | "api" | "manual"
sourceDetailstring | null
ownerIdstring (uuid) | null
teamIdstring (uuid) | null
fieldsobject
languagestring | null
GET/v1/leads/{id}— Get one record

Requires the `leads:read` scope.

Parameters

idrequiredstring (uuid)Record id.
PATCH/v1/leads/{id}— Update a lead

Requires the `leads:write` scope.

Parameters

idrequiredstring (uuid)Record id.
Request body
fullNamestring
companyNamestring | null
emailstring (email) | null | ""
phonestring | null
status"new" | "contacted" | "qualifying"
fieldsobject
DELETE/v1/leads/{id}— Delete a lead

Requires the `leads:write` scope.

Parameters

idrequiredstring (uuid)Record id.
The Lead object
idrequiredstring (uuid)
numberrequiredstring
fullNamerequiredstring
companyNamerequiredstring | null
emailrequiredstring | null
phonerequiredstring | null
sourcerequiredstring
sourceDetailrequiredstring | null
statusrequiredstring
ownerIdrequiredstring (uuid) | null
teamIdrequiredstring (uuid) | null
fieldsrequiredobject
scorerequiredinteger | null
languagerequiredstring | null
accountIdrequiredstring (uuid) | null
contactIdrequiredstring (uuid) | null
dealIdrequiredstring (uuid) | null
convertedAtrequiredstring (date-time) | null
disqualifiedReasonrequiredstring | null
createdAtrequiredstring (date-time)
updatedAtrequiredstring (date-time)

Opportunities

Deals in your sales pipelines.

curl "https://api.metricrm.com/v1/opportunities?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/opportunities— List opportunities

Deals in your sales pipelines. Requires the `deals:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
status"open" | "won" | "lost"Open, won or lost.
pipelineIdstring (uuid)Only deals in this pipeline.
stageKeystringExact stage key.
accountIdstring (uuid)Only deals of this account.
ownerIdstring (uuid)Only deals owned by this user.
POST/v1/opportunities— Create an opportunity

Requires the `deals:write` scope.

Parameters

Idempotency-Key (header)stringAny unique value (a UUID works). A retry with the same key and body returns the first response instead of creating a duplicate. Kept for 24 hours.
Request body
namerequiredstring
accountIdstring (uuid) | null
contactIdstring (uuid) | null
pipelineIdstring (uuid) | null
stageKeystring | null
amountSeninteger
currencystring
expectedCloseDatestring (date) | null
ownerIdstring (uuid) | null
teamIdstring (uuid) | null
sourcestring | null
competitorsstring[]
nextStepstring | null
GET/v1/opportunities/{id}— Get one record

Requires the `deals:read` scope.

Parameters

idrequiredstring (uuid)Record id.
PATCH/v1/opportunities/{id}— Update an opportunity

Requires the `deals:write` scope.

Parameters

idrequiredstring (uuid)Record id.
Request body
namestring
accountIdstring (uuid) | null
contactIdstring (uuid) | null
amountSeninteger
expectedCloseDatestring (date) | null
ownerIdstring (uuid) | null
teamIdstring (uuid) | null
sourcestring | null
competitorsstring[]
nextStepstring | null
DELETE/v1/opportunities/{id}— Delete an opportunity

Requires the `deals:write` scope.

Parameters

idrequiredstring (uuid)Record id.
The Opportunity object
idrequiredstring (uuid)
numberrequiredstring
namerequiredstring
accountIdrequiredstring (uuid) | null
contactIdrequiredstring (uuid) | null
pipelineIdrequiredstring (uuid) | null
stageKeyrequiredstring
probabilityrequiredinteger
amountSenrequiredintegerDeal value in the smallest currency unit (sen for MYR).
currencyrequiredstring
expectedCloseDaterequiredstring (date) | null
ownerIdrequiredstring (uuid) | null
teamIdrequiredstring (uuid) | null
sourcerequiredstring | null
leadIdrequiredstring (uuid) | null
competitorsrequiredstring[]
nextSteprequiredstring | null
statusrequired"open" | "won" | "lost"
wonAtrequiredstring (date-time) | null
lostAtrequiredstring (date-time) | null
lostReasonrequiredstring | null
createdAtrequiredstring (date-time)
updatedAtrequiredstring (date-time)

Quotations

Quotations with line items, discounts and SST. Approval rules still apply.

curl "https://api.metricrm.com/v1/quotations?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/quotations— List quotations

Quotations with line items, discounts and SST. Approval rules still apply. Requires the `quotations:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
statusstringExact status.
dealIdstring (uuid)Only quotations for this opportunity.
accountIdstring (uuid)Only quotations for this account.
POST/v1/quotations— Create a draft quotation

Requires the `quotations:write` scope.

Parameters

Idempotency-Key (header)stringAny unique value (a UUID works). A retry with the same key and body returns the first response instead of creating a duplicate. Kept for 24 hours.
Request body
titlerequiredstring
dealIdstring (uuid) | null
accountIdstring (uuid) | null
contactIdstring (uuid) | null
priceListIdstring (uuid) | null
tierstring | null
language"en" | "ms" | "zh-CN"
validUntilstring | null
paymentTermsDaysinteger | null
termsstring | null
notesstring | null
itemsobject[]
GET/v1/quotations/{id}— Get one record

Requires the `quotations:read` scope.

Parameters

idrequiredstring (uuid)Record id.
PATCH/v1/quotations/{id}— Replace a draft quotation (send every field and all line items)

Requires the `quotations:write` scope.

Parameters

idrequiredstring (uuid)Record id.
Request body
titlerequiredstring
dealIdstring (uuid) | null
accountIdstring (uuid) | null
contactIdstring (uuid) | null
priceListIdstring (uuid) | null
tierstring | null
language"en" | "ms" | "zh-CN"
validUntilstring | null
paymentTermsDaysinteger | null
termsstring | null
notesstring | null
itemsobject[]
DELETE/v1/quotations/{id}— Delete a draft quotation

Requires the `quotations:write` scope.

Parameters

idrequiredstring (uuid)Record id.
The Quotation object
idrequiredstring (uuid)
numberrequiredstring
versionrequiredinteger
titlerequiredstring
dealIdrequiredstring (uuid) | null
accountIdrequiredstring (uuid) | null
contactIdrequiredstring (uuid) | null
ownerIdrequiredstring (uuid) | null
statusrequiredstring
currencyrequiredstring
languagerequiredstring
validUntilrequiredstring (date) | null
paymentTermsDaysrequiredinteger | null
termsrequiredstring | null
grossSenrequiredintegerBefore discount and tax in the smallest currency unit (sen for MYR).
discountSenrequiredintegerDiscount in the smallest currency unit (sen for MYR).
taxSenrequiredintegerTax in the smallest currency unit (sen for MYR).
totalSenrequiredintegerTotal in the smallest currency unit (sen for MYR).
sentAtrequiredstring (date-time) | null
decidedAtrequiredstring (date-time) | null
createdAtrequiredstring (date-time)
updatedAtrequiredstring (date-time)

Orders

Sales orders, created from accepted quotations.

curl "https://api.metricrm.com/v1/orders?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/orders— List orders

Sales orders, created from accepted quotations. Requires the `orders:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
statusstringExact status.
accountIdstring (uuid)Only orders of this account.
quoteIdstring (uuid)Only the order for this quotation.
POST/v1/orders— Create the sales order for an accepted quotation

Requires the `orders:write` scope.

Parameters

Idempotency-Key (header)stringAny unique value (a UUID works). A retry with the same key and body returns the first response instead of creating a duplicate. Kept for 24 hours.
Request body
quoteIdrequiredstring (uuid)
GET/v1/orders/{id}— Get one record

Requires the `orders:read` scope.

Parameters

idrequiredstring (uuid)Record id.
The Order object
idrequiredstring (uuid)
numberrequiredstring
quoteIdrequiredstring (uuid) | null
dealIdrequiredstring (uuid) | null
accountIdrequiredstring (uuid) | null
contactIdrequiredstring (uuid) | null
ownerIdrequiredstring (uuid) | null
titlerequiredstring
statusrequiredstring
currencyrequiredstring
totalSenrequiredintegerTotal in the smallest currency unit (sen for MYR).
taxSenrequiredintegerTax in the smallest currency unit (sen for MYR).
fulfilledAtrequiredstring (date-time) | null
cancelledAtrequiredstring (date-time) | null
createdAtrequiredstring (date-time)
updatedAtrequiredstring (date-time)

Invoices

Invoices with SST and payment status.

curl "https://api.metricrm.com/v1/invoices?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/invoices— List invoices

Invoices with SST and payment status. Requires the `invoices:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
statusstringExact status.
accountIdstring (uuid)Only invoices of this account.
orderIdstring (uuid)Only invoices for this order.
POST/v1/invoices— Create a draft invoice

Requires the `invoices:write` scope.

Parameters

Idempotency-Key (header)stringAny unique value (a UUID works). A retry with the same key and body returns the first response instead of creating a duplicate. Kept for 24 hours.
Request body
titlerequiredstring
accountIdstring (uuid) | null
contactIdstring (uuid) | null
language"en" | "ms" | "zh-CN"
issueDatestring | null
paymentTermsDaysinteger | null
termsstring | null
notesstring | null
itemsobject[]
GET/v1/invoices/{id}— Get one record

Requires the `invoices:read` scope.

Parameters

idrequiredstring (uuid)Record id.
PATCH/v1/invoices/{id}— Replace a draft invoice (send every field and all line items)

Requires the `invoices:write` scope.

Parameters

idrequiredstring (uuid)Record id.
Request body
titlerequiredstring
accountIdstring (uuid) | null
contactIdstring (uuid) | null
language"en" | "ms" | "zh-CN"
issueDatestring | null
paymentTermsDaysinteger | null
termsstring | null
notesstring | null
itemsobject[]
The Invoice object
idrequiredstring (uuid)
numberrequiredstring
orderIdrequiredstring (uuid) | null
dealIdrequiredstring (uuid) | null
accountIdrequiredstring (uuid) | null
contactIdrequiredstring (uuid) | null
ownerIdrequiredstring (uuid) | null
titlerequiredstring
statusrequiredstring
currencyrequiredstring
languagerequiredstring
issueDaterequiredstring (date)
dueDaterequiredstring (date)
paymentTermsDaysrequiredinteger
totalSenrequiredintegerTotal in the smallest currency unit (sen for MYR).
taxSenrequiredintegerTax in the smallest currency unit (sen for MYR).
paidSenrequiredintegerPaid so far in the smallest currency unit (sen for MYR).
sentAtrequiredstring (date-time) | null
paidAtrequiredstring (date-time) | null
voidedAtrequiredstring (date-time) | null
createdAtrequiredstring (date-time)
updatedAtrequiredstring (date-time)

Payments

Payments recorded against invoices (bank transfer, cash, cheque, card).

curl "https://api.metricrm.com/v1/payments?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/payments— List payments

Payments recorded against invoices (bank transfer, cash, cheque, card). Requires the `invoices:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
invoiceIdstring (uuid)Only payments for this invoice.
POST/v1/payments— Record a payment against an invoice

Requires the `invoices:write` scope.

Parameters

Idempotency-Key (header)stringAny unique value (a UUID works). A retry with the same key and body returns the first response instead of creating a duplicate. Kept for 24 hours.
Request body
amountSenrequiredinteger
methodrequired"bank_transfer" | "cash" | "cheque" | "card" | "online" | "other"
referencestring | null
paidOnrequiredstring
notestring | null
invoiceIdrequiredstring (uuid)
GET/v1/payments/{id}— Get one record

Requires the `invoices:read` scope.

Parameters

idrequiredstring (uuid)Record id.
The Payment object
idrequiredstring (uuid)
invoiceIdrequiredstring (uuid)
numberrequiredstring
amountSenrequiredintegerAmount in the smallest currency unit (sen for MYR).
methodrequiredstring
referencerequiredstring | null
paidOnrequiredstring (date)
noterequiredstring | null
sourcerequiredstring
voidedAtrequiredstring (date-time) | null
createdAtrequiredstring (date-time)

Products

Your product and service catalogue.

curl "https://api.metricrm.com/v1/products?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/products— List products

Your product and service catalogue. Requires the `products:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
status"active" | "archived"Active or archived.
skustringExact SKU (upper case).
POST/v1/products— Create a product

Requires the `products:write` scope.

Parameters

Idempotency-Key (header)stringAny unique value (a UUID works). A retry with the same key and body returns the first response instead of creating a duplicate. Kept for 24 hours.
Request body
skurequiredstring
namerequiredstring
descriptionstring | null
unitstring
priceSenrequiredinteger
costSeninteger | null
currencystring
taxCategoryIdstring (uuid) | null
parentIdstring (uuid) | null
optionsobject
status"active" | "archived"
GET/v1/products/{id}— Get one record

Requires the `products:read` scope.

Parameters

idrequiredstring (uuid)Record id.
PATCH/v1/products/{id}— Replace a product (send every field)

Requires the `products:write` scope.

Parameters

idrequiredstring (uuid)Record id.
Request body
skurequiredstring
namerequiredstring
descriptionstring | null
unitstring
priceSenrequiredinteger
costSeninteger | null
currencystring
taxCategoryIdstring (uuid) | null
parentIdstring (uuid) | null
optionsobject
status"active" | "archived"
The Product object
idrequiredstring (uuid)
skurequiredstring
namerequiredstring
descriptionrequiredstring | null
unitrequiredstring
priceSenrequiredintegerList price in the smallest currency unit (sen for MYR).
costSenrequiredinteger | null
currencyrequiredstring
taxCategoryIdrequiredstring (uuid) | null
parentIdrequiredstring (uuid) | null
optionsrequiredobject
statusrequired"active" | "archived"
createdAtrequiredstring (date-time)
updatedAtrequiredstring (date-time)

Tasks

Follow-ups with due dates and reminders.

curl "https://api.metricrm.com/v1/tasks?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/tasks— List tasks

Follow-ups with due dates and reminders. Requires the `tasks:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
status"open" | "done" | "cancelled"Open, done or cancelled.
assigneeIdstring (uuid)Only tasks assigned to this user.
accountIdstring (uuid)Only tasks about this account.
contactIdstring (uuid)Only tasks about this contact.
POST/v1/tasks— Create a task

Requires the `tasks:write` scope.

Parameters

Idempotency-Key (header)stringAny unique value (a UUID works). A retry with the same key and body returns the first response instead of creating a duplicate. Kept for 24 hours.
Request body
titlerequiredstring
descriptionstring | null
priority"low" | "medium" | "high" | "urgent"
dueAtstring (date-time) | null
remindAtstring (date-time) | null
assigneeIdstring (uuid) | null
teamIdstring (uuid) | null
entityTypestring | null
entityIdstring (uuid) | null
recurrenceobject | null
GET/v1/tasks/{id}— Get one record

Requires the `tasks:read` scope.

Parameters

idrequiredstring (uuid)Record id.
PATCH/v1/tasks/{id}— Update a task

Requires the `tasks:write` scope.

Parameters

idrequiredstring (uuid)Record id.
Request body
titlestring
descriptionstring | null
priority"low" | "medium" | "high" | "urgent"
dueAtstring (date-time) | null
remindAtstring (date-time) | null
assigneeIdstring (uuid) | null
teamIdstring (uuid) | null
entityTypestring | null
entityIdstring (uuid) | null
recurrenceobject | null
DELETE/v1/tasks/{id}— Delete a task

Requires the `tasks:write` scope.

Parameters

idrequiredstring (uuid)Record id.
The Task object
idrequiredstring (uuid)
numberrequiredstring | null
titlerequiredstring
descriptionrequiredstring | null
statusrequired"open" | "done" | "cancelled"
priorityrequiredstring
dueAtrequiredstring (date-time) | null
remindAtrequiredstring (date-time) | null
assigneeIdrequiredstring (uuid) | null
teamIdrequiredstring (uuid) | null
entityTyperequiredstring | null
entityIdrequiredstring (uuid) | null
accountIdrequiredstring (uuid) | null
contactIdrequiredstring (uuid) | null
completedAtrequiredstring (date-time) | null
createdAtrequiredstring (date-time)
updatedAtrequiredstring (date-time)

Activities

The timeline on accounts and contacts: calls, emails, chats, notes and more.

curl "https://api.metricrm.com/v1/activities?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/activities— List activities

The timeline on accounts and contacts: calls, emails, chats, notes and more. Requires the `activities:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
accountIdstring (uuid)Only activities on this account.
contactIdstring (uuid)Only activities on this contact.
kindstringExact kind (call, email, note …).
POST/v1/activities— Log an activity (a call, meeting note or email from another system)

Requires the `activities:write` scope.

Parameters

Idempotency-Key (header)stringAny unique value (a UUID works). A retry with the same key and body returns the first response instead of creating a duplicate. Kept for 24 hours.
Request body
kindrequired"call" | "email" | "chat" | "note"
accountIdstring (uuid) | null
contactIdstring (uuid) | null
titlerequiredstring
bodystring | null
occurredAtstring (date-time) | null
GET/v1/activities/{id}— Get one record

Requires the `activities:read` scope.

Parameters

idrequiredstring (uuid)Record id.
The Activity object
idrequiredstring (uuid)
kindrequiredstring
subjectTyperequiredstring
subjectIdrequiredstring (uuid)
accountIdrequiredstring (uuid) | null
contactIdrequiredstring (uuid) | null
titlerequiredstring
bodyrequiredstring | nullShort preview (up to 500 characters).
actorUserIdrequiredstring (uuid) | null
actorTyperequiredstring
occurredAtrequiredstring (date-time)

Knowledge base

Knowledge base articles with their published translations.

curl "https://api.metricrm.com/v1/articles?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/articles— List knowledge base

Knowledge base articles with their published translations. Requires the `knowledge:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
statusstringExact status (published, draft …).
visibility"internal" | "public"Internal or public.
categoryIdstring (uuid)Only articles in this category.
GET/v1/articles/{id}— Get one record

Requires the `knowledge:read` scope.

Parameters

idrequiredstring (uuid)Record id.
The Article object
idrequiredstring (uuid)
numberrequiredstring | null
categoryIdrequiredstring (uuid) | null
slugrequiredstring
visibilityrequired"internal" | "public"
statusrequiredstring
tagsrequiredstring[]
versionrequiredinteger
publishedAtrequiredstring (date-time) | null
translationsrequiredobject[]Published content per language.
createdAtrequiredstring (date-time)
updatedAtrequiredstring (date-time)

Messages

Messages in MetriChat conversations (web chat, WhatsApp, SMS and more).

curl "https://api.metricrm.com/v1/messages?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/messages— List messages

Messages in MetriChat conversations (web chat, WhatsApp, SMS and more). Requires the `messages:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
conversationIdstring (uuid)Only messages in this conversation.
direction"in" | "out" | "note" | "system"Incoming, outgoing, internal note or system.
POST/v1/messages— Reply in a conversation (through its channel)

Requires the `messages:write` scope.

Parameters

Idempotency-Key (header)stringAny unique value (a UUID works). A retry with the same key and body returns the first response instead of creating a duplicate. Kept for 24 hours.
Request body
conversationIdrequiredstring (uuid)
textrequiredstring
GET/v1/messages/{id}— Get one record

Requires the `messages:read` scope.

Parameters

idrequiredstring (uuid)Record id.
The Message object
idrequiredstring (uuid)
conversationIdrequiredstring (uuid)
directionrequired"in" | "out" | "note" | "system"
authorrequired"customer" | "agent" | "bot" | "system"
authorUserIdrequiredstring (uuid) | null
bodyrequiredstring
statusrequiredstring | null
createdAtrequiredstring (date-time)

Users

People in this workspace (read only).

curl "https://api.metricrm.com/v1/users?limit=10" \
  -H "Authorization: Bearer $METRICRM_API_KEY"
GET/v1/users— List users

People in this workspace (read only). Requires the `users:read` scope.

Parameters

limitintegerPage size, 1–100 (default 25).
cursorstringThe nextCursor of the previous page.
sort"createdAt" | "updatedAt"Sort field (default createdAt).
order"asc" | "desc"Sort order (default desc).
createdSincestring (date-time)Only records created after this time (ISO 8601).
updatedSincestring (date-time)Only records changed after this time — use for incremental sync.
statusstringExact status (active, invited …).
emailstringExact email address.
GET/v1/users/{id}— Get one record

Requires the `users:read` scope.

Parameters

idrequiredstring (uuid)Record id.
The User object
idrequiredstring (uuid)
emailrequiredstring
displayNamerequiredstring
titlerequiredstring | null
localerequiredstring | null
timezonerequiredstring | null
statusrequiredstring
availabilityrequiredstring
createdAtrequiredstring (date-time)