Michi

Michi API Documentation

Programmatic access to your relationship data. REST, JSON, cursor-paginated.

Getting started

Base URL

https://www.michiplatform.com/api/v1

Authentication

Pass your API key (Settings → Integrations → API access) as a Bearer token:

Authorization: Bearer michi_live_…

Rate limits (per minute, by plan)

pro: 100/minteam: 500/mingrowth: 2000/minother: 20/min

Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. A 429 also returns Retry-After.

Pagination

List endpoints are cursor-paginated. Pass ?limit (max 100) and the meta.next_cursor from the previous response as ?cursor.

Contacts

People you track across companies.

GET/contacts

List contacts (paginated).

Parameters

limitquery · integerItems per page (default 20, max 100).
cursorquery · stringOpaque cursor from a previous response's meta.next_cursor.
searchquery · stringFilter by name or email (case-insensitive).
company_idquery · stringOnly contacts at this company.

Example response

{
  "data": [
    {
      "id": "c1a2…",
      "first_name": "Ada",
      "last_name": "Lovelace",
      "email": "ada@example.com",
      "title": "CTO",
      "company_id": "co_9f…",
      "company_name": "Analytical Engines",
      "created_at": "2026-06-01T10:00:00Z",
      "updated_at": "2026-06-02T09:00:00Z"
    }
  ],
  "meta": {
    "total": 1,
    "next_cursor": null
  }
}
POST/contacts

Create a contact.

Request body

first_name *string
last_namestring
emailstring
titlestring
company_idstring

Example response

{
  "data": {
    "id": "c1a2…",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "email": "ada@example.com",
    "title": "CTO",
    "company_id": "co_9f…",
    "company_name": "Analytical Engines",
    "created_at": "2026-06-01T10:00:00Z",
    "updated_at": "2026-06-02T09:00:00Z"
  }
}
GET/contacts/{id}

Fetch a contact.

Parameters

idpath · string · requiredContact id.

Example response

{
  "data": {
    "id": "c1a2…",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "email": "ada@example.com",
    "title": "CTO",
    "company_id": "co_9f…",
    "company_name": "Analytical Engines",
    "created_at": "2026-06-01T10:00:00Z",
    "updated_at": "2026-06-02T09:00:00Z"
  }
}
PUT/contacts/{id}

Update a contact.

Parameters

idpath · string · requiredContact id.

Request body

first_namestring
last_namestring
emailstring
titlestring
company_idstring

Example response

{
  "data": {
    "id": "c1a2…",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "email": "ada@example.com",
    "title": "CTO",
    "company_id": "co_9f…",
    "company_name": "Analytical Engines",
    "created_at": "2026-06-01T10:00:00Z",
    "updated_at": "2026-06-02T09:00:00Z"
  }
}
DELETE/contacts/{id}

Soft-delete a contact.

Parameters

idpath · string · requiredContact id.

Example response

{
  "data": {
    "id": "c1a2…",
    "deleted": true
  }
}

Companies

Organisations: customers, partners, suppliers, investors.

GET/companies

List companies (paginated).

Parameters

limitquery · integerItems per page (default 20, max 100).
cursorquery · stringOpaque cursor from a previous response's meta.next_cursor.
searchquery · stringFilter by name (case-insensitive).
typequery · stringExact match on company type.

Example response

{
  "data": [
    {
      "id": "co_9f…",
      "name": "Analytical Engines",
      "website": "https://ae.example",
      "industry": null,
      "type": "Research",
      "description": "Strategic fit for the pilot programme.",
      "created_at": "2026-06-01T10:00:00Z",
      "updated_at": "2026-06-02T09:00:00Z"
    }
  ],
  "meta": {
    "total": 1,
    "next_cursor": null
  }
}
POST/companies

Create a company.

Request body

name *string
websitestring
typestring
descriptionstringMaps to the rationale field.

Example response

{
  "data": {
    "id": "co_9f…",
    "name": "Analytical Engines",
    "website": "https://ae.example",
    "industry": null,
    "type": "Research",
    "description": "Strategic fit for the pilot programme.",
    "created_at": "2026-06-01T10:00:00Z",
    "updated_at": "2026-06-02T09:00:00Z"
  }
}
GET/companies/{id}

Fetch a company.

Parameters

idpath · string · requiredCompany id.

Example response

{
  "data": {
    "id": "co_9f…",
    "name": "Analytical Engines",
    "website": "https://ae.example",
    "industry": null,
    "type": "Research",
    "description": "Strategic fit for the pilot programme.",
    "created_at": "2026-06-01T10:00:00Z",
    "updated_at": "2026-06-02T09:00:00Z"
  }
}
PUT/companies/{id}

Update a company.

Parameters

idpath · string · requiredCompany id.

Request body

namestring
websitestring
typestring
descriptionstring

Example response

{
  "data": {
    "id": "co_9f…",
    "name": "Analytical Engines",
    "website": "https://ae.example",
    "industry": null,
    "type": "Research",
    "description": "Strategic fit for the pilot programme.",
    "created_at": "2026-06-01T10:00:00Z",
    "updated_at": "2026-06-02T09:00:00Z"
  }
}
DELETE/companies/{id}

Soft-delete a company.

Parameters

idpath · string · requiredCompany id.

Example response

{
  "data": {
    "id": "co_9f…",
    "deleted": true
  }
}

Opportunities

Deals across every pipeline.

GET/opportunities

List opportunities (paginated).

Parameters

limitquery · integerItems per page (default 20, max 100).
cursorquery · stringOpaque cursor from a previous response's meta.next_cursor.
pipelinequery · stringExact match, e.g. "Commercial / Pilot".
stagequery · stringExact match on stage.

Example response

{
  "data": [
    {
      "id": "op_3b…",
      "name": "Pilot — Analytical Engines",
      "pipeline": "Commercial / Pilot",
      "stage": "Pilot interest confirmed",
      "deal_value": 50000,
      "company_id": "co_9f…",
      "contact_id": null,
      "created_at": "2026-06-01T10:00:00Z",
      "updated_at": "2026-06-02T09:00:00Z"
    }
  ],
  "meta": {
    "total": 1,
    "next_cursor": null
  }
}
POST/opportunities

Create an opportunity.

Request body

name *string
pipeline *string
stage *string
deal_valuenumber
company_idstring

Example response

{
  "data": {
    "id": "op_3b…",
    "name": "Pilot — Analytical Engines",
    "pipeline": "Commercial / Pilot",
    "stage": "Pilot interest confirmed",
    "deal_value": 50000,
    "company_id": "co_9f…",
    "contact_id": null,
    "created_at": "2026-06-01T10:00:00Z",
    "updated_at": "2026-06-02T09:00:00Z"
  }
}
GET/opportunities/{id}

Fetch an opportunity.

Parameters

idpath · string · requiredOpportunity id.

Example response

{
  "data": {
    "id": "op_3b…",
    "name": "Pilot — Analytical Engines",
    "pipeline": "Commercial / Pilot",
    "stage": "Pilot interest confirmed",
    "deal_value": 50000,
    "company_id": "co_9f…",
    "contact_id": null,
    "created_at": "2026-06-01T10:00:00Z",
    "updated_at": "2026-06-02T09:00:00Z"
  }
}
PUT/opportunities/{id}

Update an opportunity.

Parameters

idpath · string · requiredOpportunity id.

Request body

namestring
pipelinestring
stagestring
deal_valuenumber
company_idstring

Example response

{
  "data": {
    "id": "op_3b…",
    "name": "Pilot — Analytical Engines",
    "pipeline": "Commercial / Pilot",
    "stage": "Pilot interest confirmed",
    "deal_value": 50000,
    "company_id": "co_9f…",
    "contact_id": null,
    "created_at": "2026-06-01T10:00:00Z",
    "updated_at": "2026-06-02T09:00:00Z"
  }
}
DELETE/opportunities/{id}

Soft-delete an opportunity.

Parameters

idpath · string · requiredOpportunity id.

Example response

{
  "data": {
    "id": "op_3b…",
    "deleted": true
  }
}

Grants

Non-dilutive funding pipeline.

GET/grants

List grants (paginated).

Parameters

limitquery · integerItems per page (default 20, max 100).
cursorquery · stringOpaque cursor from a previous response's meta.next_cursor.
statusquery · stringExact match on status.

Example response

{
  "data": [
    {
      "id": "gr_7c…",
      "grant_name": "EIC Accelerator",
      "funder": "European Innovation Council",
      "value": 2500000,
      "status": "Drafting",
      "deadline": "2026-09-15",
      "created_at": "2026-06-01T10:00:00Z",
      "updated_at": "2026-06-02T09:00:00Z"
    }
  ],
  "meta": {
    "total": 1,
    "next_cursor": null
  }
}
POST/grants

Create a grant.

Request body

grant_name *string
funderstring
valuenumber
statusstring
deadlinestringYYYY-MM-DD.

Example response

{
  "data": {
    "id": "gr_7c…",
    "grant_name": "EIC Accelerator",
    "funder": "European Innovation Council",
    "value": 2500000,
    "status": "Drafting",
    "deadline": "2026-09-15",
    "created_at": "2026-06-01T10:00:00Z",
    "updated_at": "2026-06-02T09:00:00Z"
  }
}
GET/grants/{id}

Fetch a grant.

Parameters

idpath · string · requiredGrant id.

Example response

{
  "data": {
    "id": "gr_7c…",
    "grant_name": "EIC Accelerator",
    "funder": "European Innovation Council",
    "value": 2500000,
    "status": "Drafting",
    "deadline": "2026-09-15",
    "created_at": "2026-06-01T10:00:00Z",
    "updated_at": "2026-06-02T09:00:00Z"
  }
}
PUT/grants/{id}

Update a grant.

Parameters

idpath · string · requiredGrant id.

Request body

grant_namestring
funderstring
valuenumber
statusstring
deadlinestring

Example response

{
  "data": {
    "id": "gr_7c…",
    "grant_name": "EIC Accelerator",
    "funder": "European Innovation Council",
    "value": 2500000,
    "status": "Drafting",
    "deadline": "2026-09-15",
    "created_at": "2026-06-01T10:00:00Z",
    "updated_at": "2026-06-02T09:00:00Z"
  }
}
DELETE/grants/{id}

Soft-delete a grant.

Parameters

idpath · string · requiredGrant id.

Example response

{
  "data": {
    "id": "gr_7c…",
    "deleted": true
  }
}

Notes

Meeting notes linked to a company, contact, or opportunity. Immutable — no update.

GET/notes

List notes (paginated).

Parameters

limitquery · integerItems per page (default 20, max 100).
cursorquery · stringOpaque cursor from a previous response's meta.next_cursor.
entity_typequery · stringcompany | contact | opportunity (with entity_id).
entity_idquery · stringThe linked record id.

Example response

{
  "data": [
    {
      "id": "no_2a…",
      "objective": "Confirm pilot scope",
      "next_step": "Send SOW",
      "entity_type": "opportunity",
      "entity_id": "op_3b…",
      "created_at": "2026-06-01T10:00:00Z"
    }
  ],
  "meta": {
    "total": 1,
    "next_cursor": null
  }
}
POST/notes

Create a note.

Request body

objectivestringRequired unless next_step is set.
next_stepstring
entity_typestringcompany | contact | opportunity.
entity_idstring

Example response

{
  "data": {
    "id": "no_2a…",
    "objective": "Confirm pilot scope",
    "next_step": "Send SOW",
    "entity_type": "opportunity",
    "entity_id": "op_3b…",
    "created_at": "2026-06-01T10:00:00Z"
  }
}
DELETE/notes/{id}

Soft-delete a note.

Parameters

idpath · string · requiredNote id.

Example response

{
  "data": {
    "id": "no_2a…",
    "deleted": true
  }
}

Transcripts

Meeting transcripts. Read-only, and metadata only: the transcript text and the AI extraction derived from it are never returned. Resolves the id carried by the transcript.processed webhook.

GET/transcripts

List transcripts (paginated).

Parameters

limitquery · integerItems per page (default 20, max 100).
cursorquery · stringOpaque cursor from a previous response's meta.next_cursor.
statusquery · stringprocessed | processing | failed | blocked | skipped.
sourcequery · stringWhere the transcript came from, e.g. fathom | paste.

Example response

{
  "data": [
    {
      "id": "tr_5d…",
      "source": "fathom",
      "meeting_title": "Analytical Engines — pilot scoping",
      "meeting_started_at": "2026-06-01T14:00:00Z",
      "meeting_ended_at": "2026-06-01T14:47:00Z",
      "meeting_duration_seconds": 2820,
      "attendee_count": 4,
      "status": "processed",
      "processed_at": "2026-06-01T14:52:11Z",
      "linked_company_id": "co_9f…",
      "linked_opportunity_id": "op_3b…",
      "linked_contact_ids": [
        "c1a2…"
      ],
      "created_at": "2026-06-01T14:48:02Z"
    }
  ],
  "meta": {
    "total": 1,
    "next_cursor": null
  }
}
GET/transcripts/{id}

Fetch one transcript.

Parameters

idpath · string · requiredTranscript id.

Example response

{
  "data": {
    "id": "tr_5d…",
    "source": "fathom",
    "meeting_title": "Analytical Engines — pilot scoping",
    "meeting_started_at": "2026-06-01T14:00:00Z",
    "meeting_ended_at": "2026-06-01T14:47:00Z",
    "meeting_duration_seconds": 2820,
    "attendee_count": 4,
    "status": "processed",
    "processed_at": "2026-06-01T14:52:11Z",
    "linked_company_id": "co_9f…",
    "linked_opportunity_id": "op_3b…",
    "linked_contact_ids": [
      "c1a2…"
    ],
    "created_at": "2026-06-01T14:48:02Z"
  }
}

Webhooks

Subscribe to events programmatically. This is what a REST-hook integration such as the Zapier connector uses; the Settings UI equivalent needs a browser session and cannot serve an API key.

GET/webhooks

List your subscriptions.

Example response

{
  "data": [
    {
      "id": "wh_4e…",
      "url": "https://hooks.zapier.com/hooks/standard/…",
      "events": [
        "contact.created"
      ],
      "status": "active",
      "last_delivery_at": "2026-06-02T09:00:00Z",
      "last_status_code": 200,
      "failing_since": null,
      "suspended_at": null,
      "created_at": "2026-06-01T10:00:00Z"
    }
  ]
}
POST/webhooks

Subscribe. Returns the signing secret once.

Request body

url *stringhttps only. Where deliveries are POSTed.
events *stringArray of event keys, e.g. ["contact.created"].

Example response

{
  "data": {
    "id": "wh_4e…",
    "url": "https://hooks.zapier.com/hooks/standard/…",
    "events": [
      "contact.created"
    ],
    "status": "active",
    "last_delivery_at": "2026-06-02T09:00:00Z",
    "last_status_code": 200,
    "failing_since": null,
    "suspended_at": null,
    "created_at": "2026-06-01T10:00:00Z",
    "secret": "<64 hex chars, shown only here>"
  }
}
DELETE/webhooks/{id}

Unsubscribe.

Parameters

idpath · string · requiredWebhook id.

Example response

{
  "data": {
    "id": "wh_4e…",
    "deleted": true
  }
}

Pipeline stages

Read the configured stages for a workspace.

GET/pipeline-stages/{workspace}

List a workspace's stages.

Parameters

workspacepath · string · requiredcustomers | partners | investors | grants | suppliers.

Example response

{
  "data": {
    "workspace": "customers",
    "stages": [
      {
        "id": "st_1…",
        "name": "Researching",
        "color": "#6B7280",
        "position": 0
      }
    ]
  }
}