Skip to content
Back to skills

Iblai Api Crm

ASecurity

Manage an ibl.ai organization's CRM via the platform API — people, organizations, pipelines and stages, lead sources, deals (with stage-move/won/lost actions), activities, and tags. Org-wide sales/relationship management. Use for lead capture, pipelines, and deal flow.

  • 15 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 20, 2026
ai-agentsgobashapisecurity

Works with

  • api

Security analysis

A100/100

Pro scans all 6 files and shows the line behind each finding

Scanned September 20, 2026

npx -y skills add iblai/vibe --skill iblai-api-crm --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Iblai Api Crm?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Iblai Api Crm
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/iblai-iblai-api-crm/badge)](https://www.skillsdirectory.com/skills/iblai-iblai-api-crm)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: iblai-api-crm
description: Manage an ibl.ai organization's CRM via the platform API — people, organizations, pipelines and stages, lead sources, deals (with stage-move/won/lost actions), activities, and tags. Org-wide sales/relationship management. Use for lead capture, pipelines, and deal flow.
metadata:
  kind: api
---

# iblai-api-crm

Manage an organization's **CRM** from the API: people and organizations,
pipelines and their stages, lead sources, deals (with stage-move / won / lost
actions), activities, and tags — all the sales and relationship-management
records for one organization. Use for lead capture, pipelines, and deal flow.

## Auth & conventions

- **Base URL:** `https://api.iblai.app/dm` — CRM is a Data Manager (DM)
  endpoint, so the **`/dm` prefix is required**; the `/api/crm/...` paths below
  are appended to it (e.g. `https://api.iblai.app/dm/api/crm/persons/`).
- **Header:** `Authorization: Api-Token $IBLAI_API_KEY` on every request. (The CRM
  developer docs phrase this as `Authorization: Token <key>` — it is the same
  Platform API Token.)
- **Scope:** Platform-scoped. Every record belongs to the organization resolved
  from the token, so there is **no `{org}` in the path**.
- **Ids:** integers for every resource **except** Person and Organization, whose
  ids are **UUID** strings.
- Not connected yet? Run **`/iblai-api-login`** first to populate `IBLAI_ORG`,
  `IBLAI_USERNAME`, and `IBLAI_API_KEY`.

## Resources

| Resource     | Path                                      | Id                              |
| ------------ | ----------------------------------------- | ------------------------------- |
| Person       | `/api/crm/persons/`                       | UUID                            |
| Organization | `/api/crm/organizations/`                 | UUID                            |
| Pipeline     | `/api/crm/pipelines/`                      | int                             |
| Stage        | `/api/crm/pipelines/{pipeline_id}/stages/` | int (nested under a pipeline)  |
| Lead Source  | `/api/crm/lead-sources/`                  | int                             |
| Deal         | `/api/crm/deals/`                         | int                             |
| Activity     | `/api/crm/activities/`                    | int                             |
| Tag          | `/api/crm/tags/`                          | int                             |

Each resource supports standard REST: **GET** (list), **POST** (create),
**GET** `{id}` (read), **PATCH** `{id}` (update), **DELETE** `{id}` (delete).
DELETE is destructive — confirm with the user first.

### Useful filters

- `owner={user_id}` — "my pipeline" / "my accounts".
- `owner__isnull=true` — unowned records.
- `?is_default=true` on pipelines — the seeded pipeline; its response embeds its
  stages inline.

## Pagination

List `GET`s are page-numbered. Navigate with `?page={n}` and override the page
size with `?page_size={n}` (default `50`). The list envelope is:

```json
{ "count": 137, "next_page": 3, "previous_page": 1, "results": [ /* … */ ] }
```

`next_page` / `previous_page` are page **numbers** (or `null` at the ends), not
URLs — a detail different from stock DRF pagination.

## Reads

### Person

- **GET** `/api/crm/persons/` — list people.
- **GET** `/api/crm/persons/{id}/` — read a person.

### Organization

- **GET** `/api/crm/organizations/` — list organizations.
- **GET** `/api/crm/organizations/{id}/` — read an organization.

### Pipeline

- **GET** `/api/crm/pipelines/` — list pipelines.
- **GET** `/api/crm/pipelines/{id}/` — read a pipeline.

### Stage

- **GET** `/api/crm/pipelines/{pipeline_id}/stages/` — list a pipeline's stages.
- **GET** `/api/crm/pipelines/{pipeline_id}/stages/{id}/` — read a stage.

### Lead Source

- **GET** `/api/crm/lead-sources/` — list lead sources.
- **GET** `/api/crm/lead-sources/{id}/` — read a lead source.

### Deal

- **GET** `/api/crm/deals/` — list deals.
- **GET** `/api/crm/deals/{id}/` — read a deal.

### Activity

- **GET** `/api/crm/activities/` — list activities.
- **GET** `/api/crm/activities/{id}/` — read an activity.

### Tag

- **GET** `/api/crm/tags/` — list tags.
- **GET** `/api/crm/tags/{id}/` — read a tag.

## Writes

### Person

- **POST** `/api/crm/persons/` — create a person.
- **PATCH** `/api/crm/persons/{id}/` — update a person.
- **DELETE** `/api/crm/persons/{id}/` — delete a person. Confirm with the user first.

**Person actions:**

- **POST** `/api/crm/persons/merge/` — merge duplicates into one: body
  `{ "primary_id": UUID, "duplicate_ids": [UUID, …] }`; reparents the duplicates'
  deals / activities / tags onto the primary. Destructive — confirm first.
- **POST** `/api/crm/persons/{id}/invite/` — email an invitation to the person's
  `primary_email`. Body (all optional): `is_admin` (bool), `is_staff` (bool),
  `enrollment_config` (object, forwarded to auto-enroll the invitee),
  `redirect_to` (url). Success returns the `invitation_id`; `409` if an active
  invitation already exists for that email (the response carries the existing
  `invitation_id`, so you can track / resend it), `422` if the person is already
  linked to a platform user. Sends outward — confirm with the user first.
- **POST** `/api/crm/persons/{id}/link-user/` — link the CRM person to an existing
  platform user: body `{ "user_id": int }` (required; the user must already be an
  active member of your org, else `403`). Sets `platform_user`.

### Organization

- **POST** `/api/crm/organizations/` — create an organization.
- **PATCH** `/api/crm/organizations/{id}/` — update an organization.
- **DELETE** `/api/crm/organizations/{id}/` — delete an organization. Confirm with the user first.

### Pipeline

- **POST** `/api/crm/pipelines/` — create a pipeline.
- **PATCH** `/api/crm/pipelines/{id}/` — update a pipeline.
- **DELETE** `/api/crm/pipelines/{id}/` — delete a pipeline. Confirm with the user first.

### Stage

- **POST** `/api/crm/pipelines/{pipeline_id}/stages/` — create a stage.
- **PATCH** `/api/crm/pipelines/{pipeline_id}/stages/{id}/` — update a stage.
- **DELETE** `/api/crm/pipelines/{pipeline_id}/stages/{id}/` — delete a stage. Confirm with the user first.

### Lead Source

- **POST** `/api/crm/lead-sources/` — create a lead source.
- **PATCH** `/api/crm/lead-sources/{id}/` — update a lead source.
- **DELETE** `/api/crm/lead-sources/{id}/` — delete a lead source. Confirm with the user first.

### Deal

- **POST** `/api/crm/deals/` — create a deal.
- **PATCH** `/api/crm/deals/{id}/` — update a deal.
- **DELETE** `/api/crm/deals/{id}/` — delete a deal. Confirm with the user first.

**Deal actions** (the canonical way to transition deals):

- **PATCH** `/api/crm/deals/{id}/` — reposition `stage` within a pipeline (allowed).
- **POST** `/api/crm/deals/{id}/move-stage/` — transition stage; body accepts
  `stage_code` (preferred) or `stage_id`.
- **POST** `/api/crm/deals/{id}/won/` — close the deal as won. Body optional:
  `stage_code` to target a specific `is_won` stage (defaults to the pipeline's
  first `is_won` stage by `sort_order`).
- **POST** `/api/crm/deals/{id}/lost/` — close the deal as lost. Body **requires**
  a non-empty `lost_reason` (≤255; `400` if missing); optional `stage_code`
  (defaults to the first `is_lost` stage).

### Activity

- **POST** `/api/crm/activities/` — create an activity.
- **PATCH** `/api/crm/activities/{id}/` — update an activity.
- **DELETE** `/api/crm/activities/{id}/` — delete an activity. Confirm with the user first.
- **POST** `/api/crm/activities/{id}/done/` — mark the activity done (stamps `done_at`; see `is_done`/`done_at` in the schema).

### Tag

- **POST** `/api/crm/tags/` — create a tag.
- **PATCH** `/api/crm/tags/{id}/` — update a tag.
- **DELETE** `/api/crm/tags/{id}/` — delete a tag. Cascades — removes every
  assignment on every person / organization / deal. Confirm with the user first.

**Attach / detach on a host** (`{host}` = `persons` | `organizations` | `deals`;
both need `Ibl.CRM/Tags/write`, a **separate** RBAC bucket from host-write — see
[`references/workflows.md`](references/workflows.md) § Tagging):

- **POST** `/api/crm/{host}/{id}/tags/` — attach an existing tag to a host record:
  body `{ "tag_id": int }` (`≥ 1`). Returns `201` with `{ assignment_id, tag }`;
  `409` if already attached (idempotent — carries the existing `assignment_id`, so
  treat it as success); `404` if the tag isn't in your org.
- **DELETE** `/api/crm/{host}/{id}/tags/{tag_id}/` — detach a tag (removes the
  assignment row, not the tag). `204` on success; `404` if it wasn't attached. Not
  idempotent — a repeat DELETE returns `404`; treat that as a no-op success.

## Example

Create a person:

```bash
curl -X POST \
  "https://api.iblai.app/dm/api/crm/persons/" \
  -H "Authorization: Api-Token $IBLAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Ada Lovelace",
    "primary_email": "ada@example.com",
    "lifecycle_stage": "lead"
  }'
```

## Notes

- CRM is served via the DM gateway at `https://api.iblai.app/dm/api/crm/`
  (equivalent to the legacy `https://platform.iblai.app/api/crm/` host; skills
  standardize on the `api.iblai.app/dm` form).
- Lifecycle stages are `lead | qualified | opportunity | customer | churned`.
- A CRM Person auto-links to a Platform user when a signup matches by email.
- Stages are nested under a pipeline; deal transitions go through the deal
  actions (`move-stage/`, `won/`, `lost/`) rather than ad-hoc edits.
- Every read is scoped to your org (the token's `platform`), so a record in
  another org returns `404`, not `403` — existence is never leaked. Treat `404`
  as "not found **or** not visible to you".

## Schema

Field-level request/response shape (**Mode** `req`/`opt`/`ro`) for every resource, plus the
enums and the confirmed filter query params, live in a reference file to keep this skill
scannable: **[`references/schema.md`](references/schema.md)**. Read it when you need exact
field names, types, defaults, or which filters a list `GET` accepts.

## Reference material

The endpoints and field schemas above are the authoritative, code-verified surface. These
companion files (ported from the CRM developer guide) preserve the surrounding concepts,
workflows, and guidance — read them for depth, not for endpoint truth:

- **[`references/schema.md`](references/schema.md)** — field-level request/response shape (**Mode** `req`/`opt`/`ro`), enums, and the confirmed filter query params for every resource.
- **[`references/guide.md`](references/guide.md)** — concepts & data model: system overview, write side-effects, the deal-status state machine, auth/security notes, the object graph, the resource map, and per-resource deletion/cascade behavior.
- **[`references/quickstart.md`](references/quickstart.md)** — end-to-end worked walkthrough: capture a lead, find the seeded pipeline, open a deal, move it through stages, and close it won.
- **[`references/workflows.md`](references/workflows.md)** — subsystem lifecycles: person onboarding (link / invite / merge / auto-link), deal lifecycle, activity timeline & auto-records, tagging, and CRM notifications (cross-refs `/iblai-api-notification`).
- **[`references/operations.md`](references/operations.md)** — filtering & pagination, the RBAC role/permission matrix (cross-refs `/iblai-api-rbac`), the error reference, and best practices.

Files in this skill

  • SKILL.md11.3 KB
  • references/guide.md23.8 KB
  • references/operations.md19.8 KB
  • references/quickstart.md12.1 KB
  • references/schema.md14 KB
  • references/workflows.md38.8 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.