Boni CRM API
Tenant-scoped REST access to organizations, contacts, leads, opportunities, activities, and workspace settings.
Base and scoping
CRM resources are served from the Boni platform API under /v1/crm/. Every request resolves to exactly one organization and workspace; a credential issued for one workspace cannot read or write another, and the scope is enforced on the server rather than taken from the request body.
Access uses a Boni One service account or a delegated signed-in user, with read and write capability separated:
| Capability | Required |
|---|---|
| Read any CRM resource | CRM read |
| Create or change any CRM resource | CRM write |
| Change workspace settings | CRM write, plus an administrator or manager seat |
Integration producer endpoints—the lanes by which connected Boni products project their own events into CRM—are internal contracts bound to their specific product credential and are not part of this public surface.
Resources
| Resource | Endpoints |
|---|---|
| Organizations | `GET |
| Contacts | `GET |
| Leads | `GET |
| Opportunities | `GET |
| Activities | `GET |
| Search | GET /v1/crm/search across organizations, contacts, leads, and opportunities |
| Settings | `GET |
| Reference data | GET /v1/crm/dial-codes |
Behaviour worth knowing before you integrate
- Writes are upserts on a stable key. Sending the same record twice updates it instead of creating a duplicate, which makes retries and replays safe.
- Contact identity is resolved for you. A write carrying a phone number links to the existing person rather than creating a second copy; see contacts and companies for the matching rules.
- Bulk and producer writes can opt out of that resolution when they already carry their own record ids.
- Validation fails closed. An unknown enum value, a malformed identifier, or an out-of-range selection is rejected whole; nothing is partially applied.
Errors
| Status | Meaning |
|---|---|
400 | The request was understood but a value is invalid |
401 | Missing or invalid credentials |
403 | Authenticated, but not permitted for this organization, workspace, or capability |
404 | No such record in the caller's tenant, including records that exist elsewhere |
409 | The request conflicts with the record's current state—a confirmation value that does not match, a record that changed mid-operation, or an operation the record's origin does not allow |
A 404 is deliberately returned rather than a 403 when a record belongs to another tenant, so an identifier cannot be probed for existence across workspaces.
Permanent deletion is restricted by origin: records created by hand can be deleted with an explicit confirmation value and a stated reason, while records projected from a connected source are archived instead, so a source-backed history cannot be silently destroyed from the API.
See the developer overview for documentation formats, versioning, and credential handling.