# Insyder Public API

Read and update the business data available to an Insyder user. API keys
are personal, restricted to explicitly selected workspaces and scopes, and
share a hard limit of 20 accepted requests per UTC second per user.

Imported Instagram, Meta, and iClosed facts are read-only. Products and
purchases expose a normalized `source` of `human` or `iclosed`; this is
provenance only and never exposes connection state or configuration.
An iClosed product's imported name and amount are immutable, while its
`active` flag is a tenant-managed catalogue overlay that an OWNER or ADMIN
may change. Purchases are append-only regardless of source. Revenue
analytics include both human-entered and iClosed-imported purchases.

A workspace's `currency` is readable on the account. New products capture
that currency at creation; changing the workspace currency later does not
reinterpret existing products or purchases. Currency administration,
connection credentials, configuration, synchronization controls, account
administration, billing, and analysis triggers are never exposed.

Imported lead identity/profile facts, content, interactions, runs,
snapshots, highlights, score history, iClosed results, competitor results,
and analytics have no public creation, replacement, update, or deletion
operation. Lead PATCH is deliberately limited to the user-managed status,
email, phone, and notes fields. Status history and purchases are append-only;
callers cannot create or relabel a record as `iclosed`.

Every response that reaches the public data router carries `X-Request-Id`,
`X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset`.
The limit is 20 accepted requests per fixed UTC second, aggregated across
all keys owned by the same user. A rejected 21st request also carries
`Retry-After` and uses the `rate_limit_exceeded` problem code.

`Idempotency-Key` is mandatory when creating a product, purchase, or
export. Results are retained for 24 hours. Reusing a key for the same
operation and body replays the original response; reusing it with a
different body returns `409 idempotency_key_conflict`.

Connection-result endpoints expose only normalized business fields.
Instagram cookies and session/proxy metadata, iClosed or Meta credentials,
OAuth state, connection health/configuration, raw upstream payloads, and
connect, disconnect, refresh, or synchronization controls are excluded.
Provider product/deal linkage IDs, raw deal rows, raw provider prices, and
import counters or errors are likewise excluded from products and purchases.

All reads require `data:read`. Lead updates require `leads:write`;
product mutations require `products:write`; purchase creation requires
`purchases:write`; and export creation/cancellation requires both
`data:read` and `exports:create`. Product writes additionally require the
caller's current workspace role to be OWNER or ADMIN.

Selecting a workspace on a key never replaces the live membership check.
A resource in another tenant and a nonexistent resource both return the
same `404 not_found`. Authentication failures, CORS preflight, export
workers, and direct S3 downloads do not consume the per-user quota.


Version: 1.0.0
License: Proprietary

## Servers

Production
```
https://api.insyder.io/v1
```

## Security

### ApiKeyAuth

[object Object]

Type: apiKey
In: header
Name: X-API-Key

## Download OpenAPI description

 - [Insyder Public API](https://docs.insyder.io/_bundle/@l10n/en/api/openapi.yaml)

## Accounts

 - [GET /accounts](https://docs.insyder.io/en/api/openapi/accounts/listaccounts.md): Returns the intersection of the key's selected workspaces and the user's current memberships.
 - [GET /accounts/{account_id}](https://docs.insyder.io/en/api/openapi/accounts/getaccount.md)
## Leads

 - [GET /accounts/{account_id}/leads](https://docs.insyder.io/en/api/openapi/leads/listleads.md)
 - [GET /accounts/{account_id}/leads/by-email](https://docs.insyder.io/en/api/openapi/leads/findleadbyemail.md): Find a lead by its exact email address in the selected workspace, ignoring case and surrounding spaces. Returns the same details as Get a lead. Returns 404 when no lead matches and 409 with code `ambi
 - [GET /accounts/{account_id}/leads/{lead_id}](https://docs.insyder.io/en/api/openapi/leads/getlead.md)
 - [PATCH /accounts/{account_id}/leads/{lead_id}](https://docs.insyder.io/en/api/openapi/leads/updatelead.md): Requires `leads:write`. Omitted fields are unchanged; null clears email, phone, or notes.
 - [GET /accounts/{account_id}/leads/{lead_id}/interactions](https://docs.insyder.io/en/api/openapi/leads/listleadinteractions.md)
 - [GET /accounts/{account_id}/leads/{lead_id}/activity](https://docs.insyder.io/en/api/openapi/leads/getleadactivity.md)
 - [GET /accounts/{account_id}/leads/{lead_id}/status-history](https://docs.insyder.io/en/api/openapi/leads/listleadstatushistory.md)
 - [GET /accounts/{account_id}/leads/{lead_id}/score-history](https://docs.insyder.io/en/api/openapi/leads/listleadscorehistory.md)
 - [GET /accounts/{account_id}/leads/{lead_id}/purchases](https://docs.insyder.io/en/api/openapi/leads/listleadpurchases.md)
 - [GET /accounts/{account_id}/leads/{lead_id}/iclosed-calls](https://docs.insyder.io/en/api/openapi/leads/listleadiclosedcalls.md)
 - [GET /accounts/{account_id}/contents/{content_id}/leads](https://docs.insyder.io/en/api/openapi/leads/listcontentleads.md)
## Content

 - [GET /accounts/{account_id}/contents](https://docs.insyder.io/en/api/openapi/content/listcontent.md)
 - [GET /accounts/{account_id}/contents/{content_id}](https://docs.insyder.io/en/api/openapi/content/getcontent.md)
 - [GET /accounts/{account_id}/contents/{content_id}/interactions](https://docs.insyder.io/en/api/openapi/content/listcontentinteractions.md)
 - [GET /accounts/{account_id}/contents/{content_id}/leads](https://docs.insyder.io/en/api/openapi/content/listcontentleads.md)
 - [GET /accounts/{account_id}/contents/{content_id}/snapshots](https://docs.insyder.io/en/api/openapi/content/listcontentsnapshots.md)
## Interactions

 - [GET /accounts/{account_id}/leads/{lead_id}/interactions](https://docs.insyder.io/en/api/openapi/interactions/listleadinteractions.md)
 - [GET /accounts/{account_id}/contents/{content_id}/interactions](https://docs.insyder.io/en/api/openapi/interactions/listcontentinteractions.md)
 - [GET /accounts/{account_id}/interactions](https://docs.insyder.io/en/api/openapi/interactions/listinteractions.md)
## Products

 - [GET /accounts/{account_id}/products](https://docs.insyder.io/en/api/openapi/products/listproducts.md)
 - [POST /accounts/{account_id}/products](https://docs.insyder.io/en/api/openapi/products/createproduct.md): Requires `products:write` and an effective OWNER or ADMIN role. Creates a `human` product in the workspace's current currency; the request cannot select a different currency or source.
 - [GET /accounts/{account_id}/products/{product_id}](https://docs.insyder.io/en/api/openapi/products/getproduct.md)
 - [PATCH /accounts/{account_id}/products/{product_id}](https://docs.insyder.io/en/api/openapi/products/updateproduct.md): Requires `products:write` and an effective OWNER or ADMIN role. For a `human` product, all documented fields are mutable. For an `iclosed` product, only `active` is tenant-managed; a PATCH containing
 - [DELETE /accounts/{account_id}/products/{product_id}](https://docs.insyder.io/en/api/openapi/products/archiveproduct.md): Requires `products:write` and an effective OWNER or ADMIN role. Archives rather than physically deleting the product; repeating the request is safe. Archiving is permitted for either source because `a
## Purchases

 - [GET /accounts/{account_id}/leads/{lead_id}/purchases](https://docs.insyder.io/en/api/openapi/purchases/listleadpurchases.md)
 - [GET /accounts/{account_id}/purchases](https://docs.insyder.io/en/api/openapi/purchases/listpurchases.md)
 - [POST /accounts/{account_id}/purchases](https://docs.insyder.io/en/api/openapi/purchases/createpurchase.md): Requires `purchases:write`. Creates a `human` purchase. Purchases are append-only regardless of source and automatically move the lead to `customer`.
 - [GET /accounts/{account_id}/purchases/{purchase_id}](https://docs.insyder.io/en/api/openapi/purchases/getpurchase.md)
## History

 - [GET /accounts/{account_id}/leads/{lead_id}/status-history](https://docs.insyder.io/en/api/openapi/history/listleadstatushistory.md)
 - [GET /accounts/{account_id}/leads/{lead_id}/score-history](https://docs.insyder.io/en/api/openapi/history/listleadscorehistory.md)
 - [GET /accounts/{account_id}/contents/{content_id}/snapshots](https://docs.insyder.io/en/api/openapi/history/listcontentsnapshots.md)
 - [GET /accounts/{account_id}/runs](https://docs.insyder.io/en/api/openapi/history/listruns.md)
 - [GET /accounts/{account_id}/snapshots](https://docs.insyder.io/en/api/openapi/history/listaccountsnapshots.md)
 - [GET /accounts/{account_id}/content-snapshots](https://docs.insyder.io/en/api/openapi/history/listallcontentsnapshots.md)
 - [GET /accounts/{account_id}/highlights](https://docs.insyder.io/en/api/openapi/history/listhighlights.md)
 - [GET /accounts/{account_id}/highlights/{highlight_id}](https://docs.insyder.io/en/api/openapi/history/gethighlight.md)
 - [GET /accounts/{account_id}/highlights/{highlight_id}/items](https://docs.insyder.io/en/api/openapi/history/listhighlightitems.md)
## Analytics

 - [GET /accounts/{account_id}/leads/{lead_id}/activity](https://docs.insyder.io/en/api/openapi/analytics/getleadactivity.md)
 - [GET /accounts/{account_id}/analytics/overview](https://docs.insyder.io/en/api/openapi/analytics/getanalyticsoverview.md)
 - [GET /accounts/{account_id}/analytics/lead-growth](https://docs.insyder.io/en/api/openapi/analytics/getleadgrowthanalytics.md)
 - [GET /accounts/{account_id}/analytics/audience-series](https://docs.insyder.io/en/api/openapi/analytics/getaudienceseries.md)
 - [GET /accounts/{account_id}/analytics/audience-segments](https://docs.insyder.io/en/api/openapi/analytics/getaudiencesegments.md)
 - [GET /accounts/{account_id}/analytics/funnel](https://docs.insyder.io/en/api/openapi/analytics/getfunnelanalytics.md)
 - [GET /accounts/{account_id}/analytics/revenue](https://docs.insyder.io/en/api/openapi/analytics/getrevenueanalytics.md): Includes append-only purchases from both `human` and `iclosed` sources; no connection or raw deal data is returned.
 - [GET /accounts/{account_id}/analytics/content-performance](https://docs.insyder.io/en/api/openapi/analytics/getcontentperformanceanalytics.md)
 - [GET /accounts/{account_id}/analytics/comment-behavior](https://docs.insyder.io/en/api/openapi/analytics/getcommentbehavioranalytics.md)
 - [GET /accounts/{account_id}/analytics/story-performance](https://docs.insyder.io/en/api/openapi/analytics/getstoryperformanceanalytics.md)
 - [GET /accounts/{account_id}/analytics/team-conversion](https://docs.insyder.io/en/api/openapi/analytics/getteamconversionanalytics.md)
## Competitors

 - [GET /accounts/{account_id}/competitors](https://docs.insyder.io/en/api/openapi/competitors/listcompetitors.md)
 - [GET /accounts/{account_id}/competitors/{competitor_id}](https://docs.insyder.io/en/api/openapi/competitors/getcompetitor.md): The latest-run fields describe an existing analysis only. This API cannot start or refresh one.
 - [GET /accounts/{account_id}/competitors/{competitor_id}/interactions](https://docs.insyder.io/en/api/openapi/competitors/listcompetitorinteractions.md)
 - [GET /accounts/{account_id}/competitors/{competitor_id}/content-performance](https://docs.insyder.io/en/api/openapi/competitors/getcompetitorcontentperformance.md)
 - [GET /accounts/{account_id}/competitors/{competitor_id}/reactive-profiles](https://docs.insyder.io/en/api/openapi/competitors/listcompetitorreactiveprofiles.md)
## Connection results

 - [GET /accounts/{account_id}/leads/{lead_id}/iclosed-calls](https://docs.insyder.io/en/api/openapi/connection-results/listleadiclosedcalls.md)
 - [GET /accounts/{account_id}/iclosed/calls](https://docs.insyder.io/en/api/openapi/connection-results/listiclosedcalls.md): Never includes OAuth tokens, connection state, mappings, synchronization internals, or the upstream raw payload.
## Exports

 - [POST /accounts/{account_id}/exports](https://docs.insyder.io/en/api/openapi/exports/createexport.md): Requires `data:read` and `exports:create`.
 - [GET /exports/{export_id}](https://docs.insyder.io/en/api/openapi/exports/getexport.md)
 - [DELETE /exports/{export_id}](https://docs.insyder.io/en/api/openapi/exports/deleteexport.md): Requires both `data:read` and `exports:create`. Generated objects are deleted and a running workflow is stopped.
