Ordo's API
Let other programs work with your data in Ordo.
On this page 13 sections
- An admin makes an API key for another program.
- A key can do only what its person can do in Ordo.
- Webhooks tell your program when something happens.
Where: Settings → Connections (admins)
With an API key, your website, a script, Make, n8n or Zapier can read and change companies, people and deals. They can do the same with meetings and tasks, and write updates on a record's timeline. An API is the way one program works with another, and an API key is like a password for a program. A webhook works the other way: Ordo tells your program when something happens.
Try it
- Settings
- Connections
- New API key
Give the key a name, for example "Zapier" or "Our website". Choose Whose key it is, and click Make the key. Copy the key at once. Ordo shows it only this one time.
How it works
- Whose key: each key belongs to one person, and it can do only what this person can do in Ordo. A sales rep's key sees the rep's own records. A manager's key sees their team's records. An admin's key sees everything.
- The same rules: a key follows the same rules as the screens. Change history shows each change as made by the key's person.
- Shown once: Ordo shows a new key only one time. Copy it at once, and put it in the other program.
- Take back: click Take back next to a key. It stops working at once.
- Every admin knows: when someone makes a key, every other admin is told in the bell.
Send the key with each request
A request is one message from a program to Ordo, for example "send me the list of companies". The program sends the key with each request, in its Authorization header. A header is a line at the start of the request.
GET https://app.ordo-crm.com/api/v1/companies
Authorization: Bearer ordo_w1a2b3c4d5e6_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- Ordo Cloud: the address is
https://app.ordo-crm.com. The key itself says which company it is for. - Ordo On-site: the address is your own Ordo, for example
https://ordo.yourcompany.com. A program outside your office can reach it only if your Ordo is open to the internet. The Setup guide shows how, in "Use Ordo outside the office".
Send JSON with Content-Type: application/json. JSON is a simple way to write data as text. Times are in UTC, like 2026-11-03T08:00:00Z. Dates are like 2026-11-03.
Limits
- Each key can send at most 60 requests a minute.
- The whole company can send at most 10,000 requests a day. The day starts at midnight UTC.
Past a limit, Ordo answers 429 with a Retry-After header. It is the number of seconds to wait.
What a program can do
| Request | What it does |
|---|---|
GET /api/v1/<things> | A list, newest first |
GET /api/v1/<things>/<id> | One of them |
POST /api/v1/<things> | A new one. Ordo answers 201. |
PATCH /api/v1/<things>/<id> | A change: only the fields you send |
<things> is companies, people, deals, activities (meetings and tasks) or notes. Nothing is deleted through the API.
Lists
A list comes in pages:
{ "data": [ { "id": 7, "name": "Acme Robotics", "...": "..." } ], "has_more": true, "next_offset": 50 }
To choose what a list shows, add these to the address after a ?, for example /api/v1/[email protected]. Put & between two of them.
| Add | What it does |
|---|---|
limit= | How many in one page: 1 to 100. Normally 50. |
offset= | Where the page starts. Use next_offset from the page before. |
q= | Search the names, emails and websites. |
created_since=, updated_since= | Only the ones made or changed since a date or time. |
sort=updated | The ones changed last come first. Normally the newest come first. |
email= | People: the person with this email. |
company_id= | People, deals, activities: the ones at this company. |
stage= | Deals: the ones at this stage, for example stage=Won. |
deal_id=, person_id=, type=, status= | Activities: the ones about this deal or person. type=Task or Meeting. status=Planned, Done or Canceled. |
The fields
A field is one part of a record, for example its name or its owner. The API uses the same names as Ordo's screens: companies, people and deals.
Companies
| Field | What it is |
|---|---|
id | Set by Ordo |
name | Needed. The company's name. No two companies have the same name. |
status | Prospect, Customer or Inactive |
company_type, tier | The company type. Ordo sets its tier from the type. |
industry, website, employees, country, address, phone, email, summary | The company's details, as on its page |
owner_id, owner | Who owns it, and their name. A new record belongs to the key's person, unless you give an owner_id. A sales rep's key always makes the rep the owner. |
created_at, updated_at, url | Set by Ordo. url opens the record in Ordo. |
People
| Field | What it is |
|---|---|
name | Needed |
company_id, company | Needed: the company's ID, or its name in company. With a name, Ordo uses the company with that name, or makes a new one. If you send neither, Ordo finds the company from a work email. |
email, job_title, phone, source, buying_role | buying_role is Decision Maker, Influencer, Blocker or Unknown. |
primary_contact | Set by Ordo: the company's main person |
owner_id, owner, created_at, updated_at, url | As for companies |
Deals
| Field | What it is |
|---|---|
name, company_id (or company) | Needed |
main_contact_id, main_contact | The person at the company |
amount, currency | currency is like USD or TWD. Without it, Ordo uses its default deal currency, from Settings → Currency. |
stage | A stage of the deal's pipeline, for example Discovery, Proposal, Won or Lost |
probability | Set by Ordo from the stage |
close_date | The expected close date |
closed_on, loss_reason | When it was won or lost, and why it was lost |
why_they_buy, blocking | "Why they'll buy" and "What's blocking", as on the deal's page |
pipeline_id, owner_id, owner, created_at, updated_at, url | The deal's sales pipeline. The others are as for companies. |
Activities: meetings and tasks
| Field | What it is |
|---|---|
subject | Needed |
type | Task or Meeting |
format | Meetings: Online or Offline |
status | Planned, Done or Canceled |
priority | Low, Normal, High or Urgent |
due_date, due_time, length_minutes | due_time and length_minutes are for meetings |
company_id, person_id, deal_id, notes | The company, person and deal it is about, and its notes |
completed_on | Set by Ordo when it is done |
owner_id, owner, created_at, updated_at, url | As for companies |
Ordo doesn't make the same open task twice. The same open task has the same subject, for the same record and person. Then Ordo answers with the task that is already there, with "existing": true.
Notes: a record's updates
GET /api/v1/notes?company_id=7(orperson_id=,deal_id=): a record's updates, newest first.POST /api/v1/noteswith{ "deal_id": 42, "body": "Called Jane: budget approved" }. You can also sendactivity_id(one of the record's meetings or tasks) andon_date(an earlier day).PATCH /api/v1/notes/<id>with a newbody. Only the person who wrote it, or an admin, can do this.
When something is wrong
Ordo answers with a status code and a sentence that says what to do. A status code is a number that says how the request went.
{ "error": "There's no field colour on companies. The fields are: name, status, ..." }
| Code | What it means |
|---|---|
400 | Something in the request is wrong: a field Ordo doesn't know, or a value it can't take |
401 | No key, or the key doesn't work: it is wrong, or it was taken back |
402 | Ordo is read-only for this company because its trial ended: the data can be seen, but not changed. Or Ordo On-site's licence is full. |
403 | The key can't do this, for example because it isn't an API request |
404 | It isn't there, or the key's person may not see it |
409 | It would make a second one of something that must be unique, like a company's name or a person's email |
429 | Too many requests: wait the seconds in Retry-After |
Webhooks: Ordo tells your program
A webhook is an address of your program. When something happens, Ordo sends a short message to it: a POST request with JSON.
Add a webhook
- An admin adds it in Settings → Connections → New webhook: the address, and what to send. Ordo then shows its signing secret (
whsec_…). An admin can see it again with Show secret. - A program can add its own webhook with its API key, and remove it when it is done.
POST /api/v1/webhookswith{ "url": "https://...", "events": ["deal.won"] }answers with itsidandsecret.DELETE /api/v1/webhooks/<id>removes it.GET /api/v1/webhookslists the key's own webhooks. When a key is taken back, its webhooks go with it.
A webhook sends only what its person may see. Ordo Cloud sends only to public https:// addresses.
What Ordo sends
| Event | When |
|---|---|
deal.won | A deal is won |
deal.lost | A deal is lost |
deal.stage_changed | A deal moves to another stage. previous_stage says where it was. |
company.created | A new company |
person.created | A new person |
activity.done | A meeting or task is done |
payment.overdue | A payment is overdue. data has the payment and its deal. |
ping | A test, from Send a test |
The message
{
"id": "evt_5xKq2c9TfQ8a",
"event": "deal.won",
"created_at": "2026-11-03T08:00:00Z",
"data": { "id": 42, "name": "40 cameras", "company": "Acme Robotics", "stage": "Won", "amount": 48000, "...": "..." }
}
data is the record as the API shows it. Your program answers with any 2xx code within 10 seconds. A 2xx code, like 200, means that all is well. If your program doesn't answer, Ordo tries again after 1 minute, after 10 minutes, and then every hour. A webhook that fails for a whole day is turned off, and the admins are told in the bell.
Settings → Connections → What was sent shows each message and how it went, with Send again.
Check that a message came from Ordo
Each message has this header:
X-Ordo-Signature: t=1762156800,v1=5257a869e7ec...
v1 is the HMAC-SHA256, in hex, of the text <t>.<the body as sent>, made with the webhook's secret. HMAC-SHA256 is a standard way to sign a text with a secret. Make the same in your program, and compare the two. Also check that t is recent, for example within 5 minutes. Then nobody can send an old message again.
JavaScript (Node):
import crypto from "node:crypto";
function fromOrdo(rawBody, header, secret) {
const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const want = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
return Math.abs(Date.now() / 1000 - Number(t)) < 300 && v1?.length === want.length && crypto.timingSafeEqual(Buffer.from(want), Buffer.from(v1));
}
Python:
import hashlib, hmac, time
def from_ordo(raw_body: bytes, header: str, secret: str) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
want = hmac.new(secret.encode(), f"{parts['t']}.".encode() + raw_body, hashlib.sha256).hexdigest()
return abs(time.time() - int(parts["t"])) < 300 and hmac.compare_digest(want, parts["v1"])
Other headers: X-Ordo-Event (the event) and X-Ordo-Delivery (the message's number in What was sent).
Make, n8n and Zapier
Make, n8n and Zapier each have a step that sends a web request, and a step that waits for a webhook. In Make, they are the HTTP and Webhooks modules. In n8n, they are the HTTP Request and Webhook nodes. In Zapier, both are in Webhooks by Zapier.
- To read or change records in Ordo: use the step that sends a web request. Put the API key in its
Authorizationheader, as above. - To hear from Ordo: use the step that waits for a webhook. Copy its address, and add it in Ordo as a new webhook.
Good to know
- The API and webhooks are in every plan: Cloud, Cloud + AI and On-site. They cost nothing extra.
- Version 1 of the API stays as it is. New fields may come, but no field is renamed or removed.
- Ordo doesn't keep the key itself, only a scrambled copy that can't be turned back. So nobody can see a key again, an admin included.
Questions
Is the API in every plan?
Yes. The API and webhooks are in Cloud, Cloud + AI and On-site. They cost nothing extra.
Who can make an API key?
Only an admin, in Settings → Connections. Each key belongs to one person, and it can do only what that person can do.
I lost a key. Can I see it again?
No. Ordo shows a key only once. Take the old key back, and make a new one.
Can a program delete records through the API?
No. A program can read, add and change records. Nothing is deleted through the API.