KasarKasar Docs
API Reference

API Overview

Complete reference for the Kasar CRM REST API. Endpoints, response format, error handling, and rate limits.

The Kasar API gives you programmatic access to your CRM data. It follows REST conventions, returns JSON, and uses bearer token authentication.

Base URL

https://kasar.app/api/v1

All requests must use HTTPS. Your organization is identified by the API token — no subdomain needed.

Endpoints

Records

MethodPathDescription
GET/records/{object}List records with filters, sorting, and pagination
GET/records/{object}/{id}Get a single enriched record
POST/records/{object}Create a record with defaults
PUT/records/{object}/{id}Update a record
PATCH/records/{object}/{id}Update a record (alias of PUT)
DELETE/records/{object}/{id}Delete a single record
DELETE/records/{object}Delete records (batch)
POST/records/{object}/searchSearch with FilterGroup in body
PUT/records/{object}/{id}/associations/{toObject}/{toId}Create an association
DELETE/records/{object}/{id}/associations/{toObject}/{toId}Remove an association
POST/records/{object}/batch/createBatch create (max 100)
POST/records/{object}/batch/updateBatch update (max 100)
POST/records/{object}/batch/upsertBatch create or update (max 100)

Tasks

MethodPathDescription
GET/tasksList tasks with mode presets and filters
POST/tasksCreate a task
PUT/tasks/{id}Update a task
PUT/tasks/{id}/completeComplete or reopen a task
GET/tasks/statsGet task statistics
DELETE/tasks/{id}Delete a task

Notes

MethodPathDescription
GET/notesList notes with visibility filtering
POST/notesCreate a note
PUT/notes/{id}Update a note
DELETE/notes/{id}Delete a note

Schema

MethodPathDescription
GET/schemaList all objects and their fields
GET/schema/{object}Get full schema for a specific object

Pipelines

MethodPathDescription
GET/pipelinesList all pipelines with steps
PUT/pipelines/{object}/{id}/moveMove a record to a pipeline step
MethodPathDescription
GET/searchFull-text search across objects

Aggregations

MethodPathDescription
GET/aggregate/{object}Run aggregation queries

Activity

MethodPathDescription
GET/activity/{object}/{id}Get activity feed for a record

Inbox

MethodPathDescription
GET/inbox/threadsList email threads
GET/inbox/threads/{id}Get thread with messages
PUT/inbox/threads/{id}Mark thread read/unread
GET/interactions/{id}Get interaction detail

Bulk Operations

MethodPathDescription
POST/bulkBulk update, add relation, or remove relation

Import / Export

MethodPathDescription
POST/import/{object}Import records in batch
GET/export/{object}Export records as JSON or CSV

Users

MethodPathDescription
GET/meGet current authenticated user
GET/usersList workspace users
GET/integrations/statusIntegration credentials status

Duplicates

MethodPathDescription
POST/duplicatesDetect or merge duplicates

Response Format

All successful responses return JSON with a consistent structure.

Single record:

{
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "first_name": "Alice",
    "last_name": "Martin",
    "email": "alice@example.com",
    "created_at": "2025-01-15T10:30:00Z"
  }
}

Paginated list:

{
  "data": [
    { "id": "...", "first_name": "Alice", "last_name": "Martin" },
    { "id": "...", "first_name": "Bob", "last_name": "Dupont" }
  ],
  "total": 142,
  "nextCursor": "eyJpZCI6IjU1MGU4NDAw..."
}

Use the nextCursor value as a query parameter to fetch the next page of results. When nextCursor is null, you have reached the last page.

Error Format

Errors return an appropriate HTTP status code and a JSON body:

{
  "error": true,
  "code": "VALIDATION_ERROR",
  "message": "Field 'email' must be a valid email address"
}

Error Codes

CodeHTTP StatusDescription
INVALID_OBJECT400The requested object type does not exist
MISSING_REQUIRED_FIELD400A required field is missing from the request body
VALIDATION_ERROR400A field value does not pass validation
PERMISSION_DENIED403The token does not have permission for this action
RECORD_NOT_FOUND404No record found with the given ID
DUPLICATE_RECORD409A record with the same unique field value already exists

Rate Limits

The API enforces rate limits per token. When you exceed the limit, the API returns HTTP 429 Too Many Requests with a Retry-After header indicating how many seconds to wait before retrying.

Design your integrations to handle 429 responses gracefully with exponential backoff.

CORS

The API sets appropriate CORS headers for browser-based requests. If you are calling the API from a frontend application, requests from your configured domain are allowed automatically. For server-to-server integrations, CORS does not apply.

Endpoint Reference

On this page