Partner API · connector standard · concept shell

The connector reference.

Everything a platform needs to become a lane on Fanogram: authenticate, declare what you can honour, stream what happened, and execute the actions we hand back. Chat, CRM, co-pilot, autopilot and payments are inherited. You do not implement them.

Illustrative · endpoints not contractual This is a design shell. Every path, parameter, payload and error code on this page is invented to make the layout reviewable. Take the real contract from engineering, not from here.
What this API is

This reference documents the connector standard: the Connect engine’s ExternalPlatformProvider contract, published via @fanogram/connect-contracts. It is the API for connecting a platform as a lane on Fanogram: your creators’ identity and auth, thread and message webhooks, media, the shared fan record, attribution, and the payments hand-off. Running the engines inside your own product is a separate, coming-soon offering and carries no endpoint documentation on this page: see Engines overview.

Getting started

Three things happen before your first event lands: you log in to the partner dashboard and generate a sandbox key, you register your platform with the capabilities you can honour, and you point a webhook at your side. Nothing in the sandbox touches real money or a real fan.

Sandbox keys Issued per partner

Keys are issued per partner, inside the dashboard, after you log in. There is no public key endpoint, and no page (this one included) ever displays a real key.

Log in to generate your sandbox keys →
Key format · example only
fg_live_…………………………………… (shown once at creation)
Format example · never shown again

The value above shows the key format and nothing more: this is a concept page and it has no secret to show. A real key is displayed exactly once, at the moment you create it in the dashboard, and is stored only as a hash on our side. If you lose it, you rotate it. We cannot recover it, and no support route can.

Rate limits

Limits are per key and scale with your connector’s stage: sandbox, pilot and production keys each carry a different ceiling. The exact numbers, along with every commercial term, live in docs/PRICING-CANONICAL.md; this page never quotes them, so it can never drift from them.

Auth

Every request carries a bearer key. Every request that acts on a creator also carries the creator scope you were granted. A key alone can read your connector, never a creator’s fans. Access decisions fail closed: an unresolvable scope is a 403, never a silent empty list.

curl https://api.fanogram.co/v1/connectors/self \
  -H "Authorization: Bearer fg_live_…" \
  -H "Fg-Creator-Scope: crt_9f2a41" \
  -H "Fg-Api-Version: 2026-08-01"
Scope, not trust

A creator grants your connector a scope; you cannot mint one. Revocation is immediate and one-sided: the creator revokes, your next call is a 403, and no cached grant survives it.

Connector standard

Registration is where you declare what your platform can actually do. Capabilities you do not declare are never offered to your creators, and never appear in their UI. A lane cannot over-promise by accident; that is the whole point of declaring rather than discovering.

Illustrative · endpoints not contractual Reference block below is shape-only.
POST /v1/connectors Idempotent

Register a platform, or update its declared capabilities. Re-posting with the same slug updates in place.

ParameterTypeDescription
slugstringRequired Stable lowercase identifier for your platform. Immutable once live.
display_namestringRequired Shown to creators in the connect flow and on their lane chips.
capabilities[]string[]Required What you can honour: chat.send, chat.media, payments.unlock, crm.read. Anything omitted is never offered.
webhook_urlstringRequired HTTPS endpoint that receives signed actions. Must respond 2xx within 5s.
regions[]string[]Optional ISO country codes you can serve. Omit for no restriction.
contact_emailstringOptional Where delivery failures and deprecation notices are sent.
{
  "slug": "yourplatform",
  "display_name": "Your Platform",
  "capabilities": [
    "chat.send",
    "chat.media",
    "payments.unlock",
    "crm.read"
  ],
  "webhook_url": "https://api.yourplatform.com/fg/actions",
  "regions": ["GB", "US", "DE"]
}
POST /v1/identities/link Idempotent

Map one of your user ids onto the shared fan or creator record. After linking, a fan who exists in two lanes is one fan, with one lifetime value.

ParameterTypeDescription
external_idstringRequired The id in your system. Never re-used for a different person.
roleenumRequired fan or creator.
creator_scopestringRequired Which creator’s world this identity belongs to.
handlestringOptional Display handle. Improves matching against an existing record.

Per-platform enablement

Implementing the standard once grants access to the standardised capabilities. Which of them are enabled for a given lane is a per-platform decision, ruled on the Connect engine’s side: a ruling, not a default. Registration declares what your platform can honour; the engine’s enablement rules decide what your lane actually offers. A capability that is declared but not enabled for your lane is never offered to your creators, and calling it is refused: like every access decision on this page, enablement fails closed.

Who connects

Trust and compliance

Chat API

The differentiator, in endpoint form: a connected platform is not handed a read-only feed and asked to rebuild a chat client. Your lane gets the thread itself (send, media, drafts, unsend, reactions and read state), with correctness owned on our side. This is part of the connector standard, for platforms connected as lanes; it is not the standalone engine offering. See the partner overview for why that matters.

Illustrative · endpoints not contractual Shape-only. The co-pilot / autopilot mode names, however, are fixed vocabulary and will not change: approve-each and autonomous, never a third mode.
POST /v1/threads/{thread_id}/messages Rate limited

Send into a thread from your surface. The message lands in the same thread the creator sees in Fanogram, attributed to whoever your key says sent it.

ParameterTypeDescription
bodystringRequired Message text. Max 4000 characters after normalisation.
media_ids[]string[]Optional Vault media to attach. Paid attachments are watermarked to the buying fan automatically.
priceintegerOptional Fan-facing unlock price in minor units. Omit for a free send.
modeenumOptional direct · co-pilot (creates a draft awaiting approval) · autopilot (sends autonomously, subject to guardrails).
idempotency_keystringOptional Retry safely. A repeat within 24h returns the original message, not a duplicate.
curl -X POST https://api.fanogram.co/v1/threads/thr_71c/messages \
  -H "Authorization: Bearer fg_live_…" \
  -H "Fg-Creator-Scope: crt_9f2a41" \
  -H "Content-Type: application/json" \
  -d '{
    "body": "It’s live. It unlocks right here in the chat.",
    "media_ids": ["med_28ba9f"],
    "price": 2400,
    "mode": "co-pilot",
    "idempotency_key": "snd_2026-08-12_01"
  }'
Two modes, and only two

co-pilot drafts and waits for the creator. autopilot sends on its own. There is no third mode anywhere in the product, and the same two words are used for chat, auto-post and scripts.

GET /v1/fans/{fan_id} Cacheable 60s

The CRM record behind the thread: lifetime value, tags, lanes and last activity. Read-only from a partner key; writes go through the event stream.

{
  "id": "fan_a81f30",
  "handle": "alex",
  "lifetime_value": 92700,       // minor units, fan-facing
  "currency": "USD",
  "lanes": ["telegram", "yourplatform"],
  "tags": ["vip", "renewed"],
  "last_active_at": "2026-08-12T08:52:10Z"
}

Payments

You render the money; you never hold it. Fanogram is merchant of record, mints the transaction, and settles out through the Spire rail. Your side asks for an unlock and reads the resulting ledger line; there is no partner-side book to reconcile.

Concept · not on live yet

The Spire settlement rail is coming soon on both Fanogram and Folo. The existing processors (CCBill, Centrobill, Paybl) are live behind the same interface. Treat the settlement fields below as design, not as a shipped behaviour.

Illustrative · endpoints not contractual Shape-only, and doubly so here: settlement semantics are still being specified.
POST /v1/unlocks Idempotent

Charge a fan for a paid message or vault item and record the resulting ledger line. Splits are resolved server-side from the creator’s configuration. A partner never computes a share.

ParameterTypeDescription
fan_idstringRequired Who is paying. Must be linked via /v1/identities/link.
message_idstringRequired The paid message being unlocked.
amountintegerRequired Fan-facing price in minor units. Must match the message’s declared price.
idempotency_keystringRequired Required here, not optional: a double-charge is not a recoverable error.
{
  "id": "unl_5d7a02",
  "state": "captured",
  "amount": 2400,
  "currency": "USD",
  "merchant_of_record": "fanogram",
  "processor": "ccbill",
  "ledger_entry": "led_9ce441",
  "splits": "resolved_server_side",  // terms: PRICING-CANONICAL.md
  "settlement": {
    "rail": "spire",
    "status": "pending_launch"       // concept, not live
  }
}

Webhooks

Step 4 of the connector standard: we hand you signed actions to perform. Your side stays a thin, verifiable executor. Verify the signature, do the thing, return 2xx.

Illustrative · endpoints not contractual Event names and payload shape are shape-only.
POST your webhook_url · action.dispatch At least once
{
  "id": "evt_0f3b7c",
  "type": "action.dispatch",
  "sequence": 418,
  "created_at": "2026-08-12T09:33:01Z",
  "data": {
    "action": "send_message",
    "thread_id": "thr_71c",
    "external_fan_id": "u_88213",
    "body": "It’s live. It unlocks right here in the chat.",
    "media": [{ "url": "https://cdn.fanogram.co/…", "expires_in": 600 }]
  }
}

Engines overview

Different offering · coming soon · not the connector standard

Everything in this section describes standalone engine use: the engines running inside a partner’s own product. That is a separate offering from the connector standard documented above, and the two are never mixed: no endpoint on this page belongs to it, and none is documented here yet. The engines only run Fanogram itself today. Register interest with the team and watch the docs changelog for the launch.

Four surfaces arrive wired to one fan record. A conversation that starts in your app, a sale that closes in ours and a payout that settles next week are the same object with three views, not three integrations you reconcile by hand:

Chat: the surface, not a feed

Most partner APIs in this category hand you events and wish you luck. You rebuild threading, media and the AI layer yourself, and it drifts from the source of truth on the first release. Ours will expose the chat surface itself: your creators answer inside your app, and the thread, fan record and attribution are the same objects we run. The Chat API above is a different thing: it documents the connected-platform lane under the connector standard. The standalone reference lands here when this offering opens.

Payments: without becoming the bank

Being the merchant of record in this category is the expensive part: high-risk processing, chargeback exposure, KYC and payout compliance in every country. Fanogram mints the transaction instead. One ledger records the split, refund, chargeback and payout, and Spire settles it out. The Payments section above covers the connector standard’s hand-off for connected lanes; no standalone payments reference exists yet.

Errors

Errors are machine-readable first. Every response carries a stable code, a human message that is safe to log, and a request_id to quote. Access failures fail closed: you get a refusal, never a quietly empty result.

CodeStatusMeaningWhat to do
invalid_key401 Key missing, malformed or rotated.Re-read from your secret store; do not retry.
scope_revoked403 The creator revoked your grant.Stop calling for that creator and drop cached state.
capability_not_declared403 You called something you did not register in step 1. Re-register with the capability, or stop offering it in your UI.
identity_unlinked404 The external id has no shared record.Call /v1/identities/link first.
price_mismatch409 Unlock amount does not match the message price. Re-read the message; never reconcile by adjusting the amount.
rate_limited429 Ceiling for this key reached. Back off using Retry-After. Limits scale with connector stage.
guardrail_blocked422 An autopilot send hit a hard safety limit. Surface the refusal to the creator. Guardrails are not settings and cannot be disabled.

Changelog

Breaking changes ship behind a dated Fg-Api-Version. A version is supported for twelve months after its successor lands, and deprecations are announced here before they are enforced.

2026-08-29
ChangedScope: connecting platforms only

This reference now documents the connector standard (the Connect engine’s ExternalPlatformProvider contract, via @fanogram/connect-contracts) exclusively. Standalone engine use is a separate coming-soon offering with no endpoints here. Keys are issued in the partner dashboard, after login.

2026-08-12
AddedPartner docs shell

This reference published as a design shell. Endpoints illustrative pending the engineering contract.

2026-08-01
Changedmode vocabulary fixed

Chat send modes are co-pilot and autopilot only. Any third mode name in earlier drafts is retired.

2026-07-24
Addedcapabilities[] on registration

Connectors now declare what they can honour. Undeclared capabilities are never offered to creators.

2026-07-09
DeprecatedUnsigned webhooks

Fg-Signature verification becomes mandatory in the next dated version.