Full-text search across every provider's research. Results from providers the caller is not entitled to keep their descriptive metadata, with the rating and price target withheld. Filters: q, sectors, tickers, provider_ids, rating, note_types, analysts, published_since. Anonymous callers are admitted only on a public branded portal, scoped to its provider.
REST API
Every endpoint is versioned under /api/v1 and returns snake_case JSON. Send an API key as X-API-Key: rsc_...; a key sent as a Bearer token is not recognised. A signed-in browser sends its session cookie, and the session token from /auth/verify can be sent as Authorization: Bearer <token>. Browse the interactive reference at /swagger or download the raw OpenAPI 3.1 spec. Need a key? Grab one from your Integrations tab.
Access
- public
- No credentials needed. What comes back can still depend on who is asking: see each endpoint.
- signed-in
- Any session or API key.
- session
- A signed-in user. API keys are refused, because a key has no user of its own.
- provider-admin
- A session whose organisation role is admin, a platform administrator, or an API key of the provider's organisation created with the admin scope, which only an organisation admin can grant. Other members, and keys without that scope, are refused.
- org-admin
- A session whose organisation role is admin. API keys and other members are refused.
- platform-admin
- Platform administrators only.
- ingest
- Any session, or an API key created with the ingest scope.
Buy-Side
13 endpoints
Cross-library research, watchlists, content access, and analytics for buy-side users.
Research & Search
Paginated feed of the latest notes from entitled providers. Filters: sectors, analysts, tickers, provider_id, note_type, since, rating_changes, language. Anonymous callers are admitted only on a public branded portal, scoped to its provider.
Entitlement-checked access to a note: returns its content URL and format, and records the read.
Streams a note's content. Hosted PDFs are watermarked for the reader; notes hosted by the provider redirect (302) to its URL.
Watchlists
List every watchlist for the signed-in user with the tickers each contains.
Create a new named watchlist.
Add a ticker to a watchlist.
Remove a ticker from a watchlist.
Coverage & Analysts
Coverage map across the caller's entitled providers, ranked by note count. Anonymous callers get an empty list, except on a public branded portal, where they see its provider's coverage.
Analyst discovery across the caller's entitled providers, ranked by published-note count. Anonymous callers get an empty list, except on a public branded portal, where they see its provider's analysts.
Analytics
The signed-in user's own research activity over the last 30 days (days sets the window, from 1 to 365): counts of searches, feed pages, note requests and note streams, a per-day series, and the notes most recently opened. An API key is refused, because a key has no user of its own.
Per-member usage across the caller's organisation over the last 30 days; days sets the window, from 1 to 365.
Portal
Branded portal configuration for the requesting hostname (Cloudflare-routed subdomain).
Sell-Side
39 endpoints
Provider self-service: profile, entitlements, templates, billing, and rate limits. Reads are open to anyone signed in to the provider's organisation; changes need a provider admin.
Provider Profile
Provider directory with display name, health status, metadata mode, note count, and latest note.
The caller's own provider profile.
Update the provider's display name and metadata mode.
Provider portal configuration: branding, slug, primary colour, custom config.
Update branded portal configuration.
Research Ingestion
Push research note metadata to the hub (sell-side ingestion). A batch is written only to the caller's own provider.
Entitlements & Access
List clients entitled to this provider's research, joined to org name.
Grant a client organisation access to this provider (buy_side_org_id, optional access_type, expires_at and template_id). Re-granting updates the one entitlement, re-activating a revoked one. An organisation that owns another research provider is refused (422), an unknown one is 404.
Revoke an entitlement (sets access type to blocked).
Toggle user-level scoping on an entitlement.
Bulk-set per-user allow/deny/clear on a user-scoped entitlement.
Bind a template to an entitlement, copying its rules.
Clients & Contacts
Create a client organisation (name, optional domain, org_type, institution_type, regions, asset_classes), or attach to the existing one its email domain identifies when that organisation is already yours. A domain registered to an organisation outside your reach is refused (409) without naming it.
Add people to your client organisations, or update their names: up to 500 rows of buy_side_org_id, email, display_name and role, with one outcome per row (created, updated, or skipped with the reason). No email is sent. preview: true reports the outcomes and writes nothing.
Remove a person who has left a client firm: archives the account, drops their per-user grants, cancels unused sign-in links, ends their sessions and revokes API keys they created. Refused with 409 org_shared_with_other_providers when other providers also serve the firm (deny them per user on your own entitlement instead), 403 for a peer broker's staff, 409 for a firm's last admin.
Restore a removed contact, under the same rules. Access rights are not restored; re-grant what they should read.
Remove many contacts at once: user_ids, up to 500 per call. Each person goes through the single removal's rules, so one refusal never fails the batch: the answer counts succeeded, unchanged, refused and failed, then gives one row per id with its outcome (removed, already_removed, refused or failed) and, when refused, the same code and detail the single route returns.
Restore many removed contacts at once, under the same rules and with the same per-id answer (restored, not_archived, refused or failed). Access rights are not restored.
Move client contacts between your Institutional and Corporate lists: user_ids (up to 500), categories (institutional and/or corporate) and mode (add keeps any other list the person is on, remove takes one away, set makes the list exactly what you name). One row per id: changed, unchanged, or refused with contact_not_found, not_a_client_contact (a portal registrant or your own staff) or last_category (a contact always keeps one).
Templates
List access templates owned by this provider with rules + client counts.
Create a new access template.
Add a rule to a template (sector, analyst, ticker, region, etc.).
Re-apply the template's current rules to every linked entitlement.
Team & Delegation
Every active user in the provider's organisation, with a summary of the coverage and template-editor rights each holds.
The (exchange, ticker) pairs one analyst covers. A member may also read their own. A userId outside the caller's organisation is 404, not 403.
Give an analyst coverage of one (exchange, ticker), so their forecast ingests for it pass without provider-admin escalation. The grant is attributed to the caller, so an API key is refused: it has no user to record.
Withdraw one coverage grant.
The forecast templates one analyst may edit the structure of. A member may also read their own.
Let an analyst edit one forecast template, which must belong to the caller's provider. Attributed like the coverage grant, so an API key is refused.
Withdraw one template-editor grant. Open to a key, unlike the grant: withdrawing records no attribution.
Analytics & Payouts
Aggregate provider analytics: client counts, note counts, content access, templates.
Usage dashboard with active client count, note count, and 30-day publication count.
Per-client metrics with org name and access status.
Monthly publication trend data for the dashboard chart.
Provider payout summary from completed purchases, totalled per currency (by_currency); never summed across currencies.
Pricing & Rate Limits
List pricing tiers for this provider.
Create a new pricing tier (per-note or bundle pricing).
List rate-limit rules configured for this provider.
Create a new rate-limit rule (per-org, per-user, or global).
Admin & Protocol
10 endpoints
Platform administration, and protocol-wide analytics any signed-in caller can read. Routes under /api/v1/admin and /api/v1/entitlements/platform are also reachable only from allow-listed IP addresses.
Admin Operations
Create a new provider record (admin onboarding).
Paged list of every entitlement with org names.
Protocol-level entitlement grant (any org to any provider).
Protocol-level entitlement revoke for any organisation and provider.
Live system health: PostgreSQL, Redis, per-provider health and counts.
Immutable audit log: every API request with caller, status, duration, and error detail.
Protocol Analytics
Protocol-wide totals: providers, organisations, notes, transactions.
Protocol-wide coverage map ranked by distinct note count.
Protocol-wide research velocity over the last 30 days.
Protocol-wide analyst league table by published-note count.
Auth & Identity
10 endpoints
Magic-link login, session lifecycle, API key management, and CSRF protection.
Authentication
Issue a magic-link email to start a session.
Exchange a magic-link token for a session cookie + Bearer token.
Sign out: revokes every session the signed-in user holds, not only this one, and clears the session cookie. Safe to call when already signed out.
Issue an anti-forgery token for cookie-authenticated state changes.
API Keys
List API keys for the caller's organisation (metadata only).
Create a new API key. Raw key returned once. A key cannot hold the ingest or admin scope unless the session creating it does.
Revoke an API key. An org admin may revoke any of the organisation's keys; any other member only a key they created.
Health & Billing
Readiness probe: overall status plus a per-check status for the database, Redis and schema parity.
Starts a per-note purchase: records a pending purchase priced from the note's pricing tier, with the hub fee and provider payout.
Stripe webhook receiver, signature-verified. A completed checkout confirms the purchase and grants access; a refund or dispute revokes it.