# CRM API

> Create, list, update and convert leads, and manage deals.

Canonical page: https://aozo.in/docs/api/crm-api
Last updated: 2026-11-12
Product: Open API
Section: Reference

All CRM endpoints are under /api/crm and need the Authorization and X-Organization-Id headers. Lists return arrays.

## Leads

| Method and path | What it does |
| --- | --- |
| GET /api/crm/leads | List leads, newest first |
| POST /api/crm/leads | Create a lead |
| GET /api/crm/leads/:id | Get one lead |
| PUT /api/crm/leads/:id | Update a lead |
| DELETE /api/crm/leads/:id | Delete a lead |
| GET /api/crm/leads/:id/activities | List a lead’s activity |
| POST /api/crm/leads/:id/activities | Add a note to a lead |
| POST /api/crm/leads/:id/convert | Convert a lead into a deal and company |

### Create a lead

| Field | Type | Notes |
| --- | --- | --- |
| name | string | Required |
| email, phone, company | string | Optional |
| status | string | NEW (default), CONTACTED, QUALIFIED, PROPOSAL, WON or LOST |
| source | string | Where the lead came from. Default WEB |
| value | number | Expected value in rupees. Default 0 |
| notes | string | Optional |
| assignedToId | number | The user who owns the lead |
| companyId, partnerId | number | Link to an existing company or partner |
| customFields | object | Values for your custom fields |
| notify | boolean | Send a notification about the new lead |

**Request**

```bash
curl -X POST https://api.aozo.in/api/crm/leads \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Organization-Id: $ORG" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Sharma Traders", "company": "Sharma Traders", "source": "WEB", "value": 48500 }'
```

**Response, 201 (some fields omitted)**

```json
{
  "id": 148,
  "name": "Sharma Traders",
  "company": "Sharma Traders",
  "status": "NEW",
  "source": "WEB",
  "value": 48500,
  "probability": 10,
  "score": 25,
  "createdAt": "2026-11-13T09:30:00.000Z"
}
```

AOZO calculates the lead’s score and probability for you from its status, value and source.

### Update a lead

Send any of the create fields to PUT /api/crm/leads/:id. If your CRM settings require a lost reason, include lostReason when you set status to LOST.

### Convert a lead

**Body for POST /api/crm/leads/:id/convert**

```json
{ "createDeal": true, "createContact": true, "dealTitle": "Sharma Traders: annual plan", "dealAmount": 48500 }
```

## Deals

| Method and path | What it does |
| --- | --- |
| GET /api/crm/deals | List deals |
| POST /api/crm/deals | Create a deal |
| GET /api/crm/deals/:id | Get one deal |
| PUT /api/crm/deals/:id | Update a deal, for example move its stage |
| DELETE /api/crm/deals/:id | Delete a deal |
| POST /api/crm/deals/:id/link-invoices | Link invoices to a deal with { invoiceIds } |

| Field | Type | Notes |
| --- | --- | --- |
| title | string | Required |
| amount | number | Deal value in rupees. Default 0 |
| stage | string | DISCOVERY (default), DEMO, PROPOSAL, NEGOTIATION, WON or LOST |
| closeDate | date string | Expected close date |
| companyName, contactEmail, notes | string | Optional |
| assignedToId, leadId, companyId, contactId | number | Links to other records |

## Other CRM resources

These live under /api/crm as well: contacts, companies, tasks, partners, workflows, templates, targets, custom-fields, import and settings.
