Getting started
Base URL
https://www.michiplatform.com/api/v1Authentication
Pass your API key (Settings → Integrations → API access) as a Bearer token:
Authorization: Bearer michi_live_…Rate limits (per minute, by plan)
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.
OpenAPI spec
/api/v1/openapi.json →Contacts
People you track across companies.
/contactsList contacts (paginated).
Parameters
| limit | query · integer | Items per page (default 20, max 100). |
| cursor | query · string | Opaque cursor from a previous response's meta.next_cursor. |
| search | query · string | Filter by name or email (case-insensitive). |
| company_id | query · string | Only 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
}
}/contactsCreate a contact.
Request body
| first_name * | string | |
| last_name | string | |
| string | ||
| title | string | |
| company_id | string |
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"
}
}/contacts/{id}Fetch a contact.
Parameters
| id | path · string · required | Contact 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"
}
}/contacts/{id}Update a contact.
Parameters
| id | path · string · required | Contact id. |
Request body
| first_name | string | |
| last_name | string | |
| string | ||
| title | string | |
| company_id | string |
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"
}
}/contacts/{id}Soft-delete a contact.
Parameters
| id | path · string · required | Contact id. |
Example response
{
"data": {
"id": "c1a2…",
"deleted": true
}
}Companies
Organisations: customers, partners, suppliers, investors.
/companiesList companies (paginated).
Parameters
| limit | query · integer | Items per page (default 20, max 100). |
| cursor | query · string | Opaque cursor from a previous response's meta.next_cursor. |
| search | query · string | Filter by name (case-insensitive). |
| type | query · string | Exact 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
}
}/companiesCreate a company.
Request body
| name * | string | |
| website | string | |
| type | string | |
| description | string | Maps 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"
}
}/companies/{id}Fetch a company.
Parameters
| id | path · string · required | Company 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"
}
}/companies/{id}Update a company.
Parameters
| id | path · string · required | Company id. |
Request body
| name | string | |
| website | string | |
| type | string | |
| description | string |
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"
}
}/companies/{id}Soft-delete a company.
Parameters
| id | path · string · required | Company id. |
Example response
{
"data": {
"id": "co_9f…",
"deleted": true
}
}Opportunities
Deals across every pipeline.
/opportunitiesList opportunities (paginated).
Parameters
| limit | query · integer | Items per page (default 20, max 100). |
| cursor | query · string | Opaque cursor from a previous response's meta.next_cursor. |
| pipeline | query · string | Exact match, e.g. "Commercial / Pilot". |
| stage | query · string | Exact 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
}
}/opportunitiesCreate an opportunity.
Request body
| name * | string | |
| pipeline * | string | |
| stage * | string | |
| deal_value | number | |
| company_id | string |
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"
}
}/opportunities/{id}Fetch an opportunity.
Parameters
| id | path · string · required | Opportunity 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"
}
}/opportunities/{id}Update an opportunity.
Parameters
| id | path · string · required | Opportunity id. |
Request body
| name | string | |
| pipeline | string | |
| stage | string | |
| deal_value | number | |
| company_id | string |
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"
}
}/opportunities/{id}Soft-delete an opportunity.
Parameters
| id | path · string · required | Opportunity id. |
Example response
{
"data": {
"id": "op_3b…",
"deleted": true
}
}Grants
Non-dilutive funding pipeline.
/grantsList grants (paginated).
Parameters
| limit | query · integer | Items per page (default 20, max 100). |
| cursor | query · string | Opaque cursor from a previous response's meta.next_cursor. |
| status | query · string | Exact 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
}
}/grantsCreate a grant.
Request body
| grant_name * | string | |
| funder | string | |
| value | number | |
| status | string | |
| deadline | string | YYYY-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"
}
}/grants/{id}Fetch a grant.
Parameters
| id | path · string · required | Grant 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"
}
}/grants/{id}Update a grant.
Parameters
| id | path · string · required | Grant id. |
Request body
| grant_name | string | |
| funder | string | |
| value | number | |
| status | string | |
| deadline | string |
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"
}
}/grants/{id}Soft-delete a grant.
Parameters
| id | path · string · required | Grant id. |
Example response
{
"data": {
"id": "gr_7c…",
"deleted": true
}
}Notes
Meeting notes linked to a company, contact, or opportunity. Immutable — no update.
/notesList notes (paginated).
Parameters
| limit | query · integer | Items per page (default 20, max 100). |
| cursor | query · string | Opaque cursor from a previous response's meta.next_cursor. |
| entity_type | query · string | company | contact | opportunity (with entity_id). |
| entity_id | query · string | The 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
}
}/notesCreate a note.
Request body
| objective | string | Required unless next_step is set. |
| next_step | string | |
| entity_type | string | company | contact | opportunity. |
| entity_id | string |
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"
}
}/notes/{id}Soft-delete a note.
Parameters
| id | path · string · required | Note 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.
/transcriptsList transcripts (paginated).
Parameters
| limit | query · integer | Items per page (default 20, max 100). |
| cursor | query · string | Opaque cursor from a previous response's meta.next_cursor. |
| status | query · string | processed | processing | failed | blocked | skipped. |
| source | query · string | Where 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
}
}/transcripts/{id}Fetch one transcript.
Parameters
| id | path · string · required | Transcript 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.
/webhooksList 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"
}
]
}/webhooksSubscribe. Returns the signing secret once.
Request body
| url * | string | https only. Where deliveries are POSTed. |
| events * | string | Array 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>"
}
}/webhooks/{id}Unsubscribe.
Parameters
| id | path · string · required | Webhook id. |
Example response
{
"data": {
"id": "wh_4e…",
"deleted": true
}
}Pipeline stages
Read the configured stages for a workspace.
/pipeline-stages/{workspace}List a workspace's stages.
Parameters
| workspace | path · string · required | customers | partners | investors | grants | suppliers. |
Example response
{
"data": {
"workspace": "customers",
"stages": [
{
"id": "st_1…",
"name": "Researching",
"color": "#6B7280",
"position": 0
}
]
}
}