Use Object API to read and update workspace records such as companies, items, orders, invoices, payments, and inventory.
Last updated: July 5, 2026
/v2/public/... namespace and keep the v1 structure where possible, so external developers can migrate with minimal endpoint changes.v2 migration note: Public API v1 is deprecated. If you still call /v1/public/..., update to /v2/public/... before June 25, 2026 00:00 UTC.| Object | List | Retrieve | Create | Update | Delete | Notes |
|---|---|---|---|---|---|---|
Deals (/v2/public/deals) | ✅ | ✅ | ✅ | ✅ | ✅ | Legacy /v1/public/cases aliases may still exist, but published docs use /deals |
| Companies | ✅ | ✅ | ✅ | ✅ | ✅ | Upsert by external_id; delete archives the record |
| Contacts | ✅ | ✅ | ✅ | ✅ | ✅ | Upsert by external_id; delete archives the record |
| Orders | ✅ | ✅ | ✅ | ✅ | ✅ | Single and bulk create; delete archives the record |
| Items | ✅ | ✅ | ✅ | ✅ | ✅ | Upsert by external_id; delete archives the record |
| Inventories | ✅ | ✅ | ✅ | ✅ | ✅ | Upsert by external_id; delete archives the record |
| Inventory Transactions | ✅ | ✅ | ✅ | ✅ | ✅ | Delete archives the record |
| Subscriptions | ✅ | ✅ | ✅ | ✅ | ✅ | Delete archives the record |
| Estimates | ✅ | ✅ | ✅ | ✅ | ✅ | Delete archives the record |
| Invoices | ✅ | ✅ | ✅ | ✅ | ✅ | Delete archives the record |
| Purchase Orders | ✅ | ✅ | ✅ | ✅ | ✅ | Upsert by external_id; delete archives the record |
Expenses (/v2/public/expenses) | ✅ | ✅ | ✅ | ✅ | ✅ | Upsert by external_id; delete archives the record |
| Bills | ✅ | ✅ | ✅ | ✅ | ✅ | Upsert by external_id; delete archives the record |
| Disbursements | ✅ | ✅ | ✅ | ✅ | ✅ | Upsert by external_id; delete archives the record |
| Revenue | ✅ | ✅ | ✅ | ✅ | ✅ | Upsert by external_id; delete archives the record |
| Payments | ✅ | ✅ | ✅ | ✅ | ✅ | Upsert by external_id; delete archives the record |
| Locations | ✅ | ✅ | ✅ | ✅ | ✅ | Upsert by external_id; delete archives the record |
| Meters | ✅ | ✅ | ✅ | ✅ | ✅ | Upsert by external_id; delete archives the record |
| Employees | ✅ | ✅ | ❌ | ❌ | ❌ | Read employee records and connect HR-related workflows |
| Workflows | ✅ | ✅ | ✅ | ✅ | ❌ | V2 action parity uses GET /api/v2/public/workflows, POST /api/v2/public/workflows, PATCH /api/v2/public/workflows/{workflow_ref}, GET /api/v2/public/workflows/actions, POST /api/v2/public/workflows/{workflow_ref}/run, and GET /api/v2/public/workflow-runs/{run_id} |
| Reports | ✅ | ✅ | ✅ | ✅ | ✅ | Salesforce-style reportMetadata; delete archives the record |
| Properties (Schema) | ✅ | ✅ | ✅ | ✅ | ✅ | Write supported for core commerce, finance, CRM, and HR objects where the object page exposes property endpoints |
GET /api/v2/public/workflows, POST /api/v2/public/workflows, PATCH /api/v2/public/workflows/{workflow_ref}, GET /api/v2/public/workflows/actions, POST /api/v2/public/workflows/{workflow_ref}/run, and GET /api/v2/public/workflow-runs/{run_id}.GET list or retrieve endpoints to confirm field names and IDs.POST, PUT, or PATCH for writes when the object supports them.curl "https://api.sanka.com/v2/public/orders" \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json"
external_id where the object supports them. This avoids duplicate records and makes retries safer.GET /v2/public/{object} list endpoint when your integration knows the Sanka object it needs and wants the canonical response for that object. These routes are the simplest path for normal sync jobs, dashboards, and record pickers.Use POST /v2/public/records/query when you are building a generic integration that switches object types at runtime, needs structured filter arrays, or needs to query custom object records through one route.| Need | Use |
|---|---|
| List companies, contacts, items, orders, invoices, or another known object | GET /v2/public/{object} |
| Search and page one known object with standard query parameters | GET /v2/public/{object}?search=...&limit=... |
Build one connector that accepts object_type dynamically | POST /v2/public/records/query |
| Send structured filters in the request body | POST /v2/public/records/query |
| Query custom object records from a generic sync worker | POST /v2/public/records/query |
records/query request:curl -X POST "https://api.sanka.com/v2/public/records/query" \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-d '{
"object_type": "company",
"limit": 100,
"sort": "standard:updated_at:asc",
"filters": [
{
"field": "standard:updated_at",
"operator": "gte",
"value": "2026-06-01T00:00:00Z"
}
]
}'
updated_at, id or created_at, id, so records with the same timestamp still page deterministically.Start with a date sort. Use sort=updated_at for oldest-to-newest syncs, sort=-updated_at for newest-to-oldest reads, or the matching created_at variants when creation time is the right checkpoint.curl "https://api.sanka.com/v2/public/items?limit=100&sort=updated_at" \
-H "Authorization: Bearer <api_key>"
meta.pagination.next_cursor:{
"success": true,
"data": {
"items": []
},
"meta": {
"ctx_id": "ctx_...",
"pagination": {
"page": 1,
"page_size": 100,
"total": 250,
"next_cursor": "eyJ2IjoxLCJzb3J0X2ZpZWxkIjoi..."
}
}
}
sort can be omitted on follow-up calls. If you include sort, it must match the cursor.curl "https://api.sanka.com/v2/public/items?limit=100&cursor=eyJ2IjoxLCJzb3J0X2ZpZWxkIjoi..." \
-H "Authorization: Bearer <api_key>"
records/query, include cursor in the JSON body:{
"object_type": "item",
"limit": 100,
"cursor": "eyJ2IjoxLCJzb3J0X2ZpZWxkIjoi..."
}
page with cursor; use page-based pagination only for small interactive pages where users need a specific page number.| Goal | Start with | Then use |
|---|---|---|
| Import customers | Companies | Contacts, properties, associations |
| Sync product master data | Items | Inventories, inventory transactions |
| Create a billing flow | Orders | Invoices, payments |
| Manage purchasing | Purchase Orders | Bills, disbursements |
| Track HR operations | Employees | Absences, attendance records |