Skip to content

Firmhound API Endpoints

Auto-generated: 2025-12-15 02:43:20Run python scripts/generate_api_docs.py to update.


Summary

Total Endpoints: 139

MethodCount
GET78
POST42
PUT5
PATCH4
DELETE10
CategoryCount
Admin39
User22
GPs19
Notifications14
Auth13
Search10
People Intelligence6
API Keys5
Billing5
Other5
Legal4
Export3
Funds3
Enrichment3
LPs3
People3
Settings3
Usage3

Endpoints by Category

Auth

MethodEndpointAuthDescription
POST/auth/forgot-password🌐Request a password reset email.
POST/auth/login🌐Authenticate user and return JWT tokens.
POST/auth/logout🔒Logout user.
GET/auth/me🔒Get current authenticated user info (FS-7104: returns both a...
PATCH/auth/me/onboarding🔒Update user's onboarding progress (FS-9052).
POST/auth/refresh🌐Refresh access token using refresh token.
POST/auth/register🌐Register a new user with 7 fields and automatic tier detecti...
POST/auth/resend-verification🔒Resend verification email to the authenticated user.
POST/auth/reset-password🌐Reset password using token from email.
DELETE/auth/sessions🔒Terminate all other sessions (except current).
GET/auth/sessions🔒List all active sessions for the current user.
DELETE/auth/sessions/{session_id}🔒Terminate a specific session.
POST/auth/verify-email🌐Verify user's email address using token from verification em...

GPs

MethodEndpointAuthDescription
GET/gps🌐Search fund managers (GPs) with 21+ filters.
GET/gps/{crd}🌐Get a single fund manager by CRD number.
GET/gps/{crd}/alumni🔒Get alumni (former employees) for a GP with PDL enrichment.
POST/gps/{crd}/alumni/unlock🔒Unlock alumni network data for a GP.
GET/gps/{crd}/amendments🌐Get ADV filing amendment history for a GP.
POST/gps/{crd}/careers/unlock-all🔒Bulk unlock career histories for a GP (20% discount).
GET/gps/{crd}/changes🌐Get derived field changes over time for a GP.
POST/gps/{crd}/enrich🔒Enrich a GP's control persons with education and employment ...
GET/gps/{crd}/enrich/status/{job_id}🌐Poll status of async enrichment job.
GET/gps/{crd}/enrichment-info🌐Check if a GP has been enriched without triggering enrichmen...
GET/gps/{crd}/filings🌐Get SEC filings for a specific GP.
GET/gps/{crd}/funds🌐Get funds managed by a specific GP.
GET/gps/{crd}/hiring🌐Get job postings and hiring velocity for a GP.
GET/gps/{crd}/metrics🌐Get derived firm metrics for a GP.
GET/gps/{crd}/related🌐Find similar GPs based on strategy, geography, and AUM band.
GET/gps/{crd}/stats🌐Get statistics for a specific GP.
GET/gps/{crd}/team🔒Get team roster for a GP with PDL enrichment.
GET/gps/{crd}/team/preview🔒Get team preview/teaser for People Intelligence UI.
POST/gps/{crd}/team/unlock🔒Unlock team roster data for a GP (People Intelligence purcha...

Funds

MethodEndpointAuthDescription
GET/funds🌐Search private funds.
GET/funds/{fund_id}🌐Get a single fund by fund ID.
GET/funds/{fund_id}/amendments🌐Get amendment history for a private fund.

LPs

MethodEndpointAuthDescription
GET/lps🌐Search and list LP entities.
GET/lps/{lp_id}🌐Get detailed information about a specific LP entity.
GET/lps/{lp_id}/investments🌐Get investment portfolio for a specific LP.

People

MethodEndpointAuthDescription
GET/people/search🌐Search people by name.
GET/people/{person_uid}🌐Get individual person profile.
GET/people/{person_uid}/history🌐Get full career history for a person.
MethodEndpointAuthDescription
GET/me/searches🔒List user's saved searches.
POST/me/searches🔒Create a new saved search.
DELETE/me/searches/{search_id}🔒Delete a saved search.
GET/me/searches/{search_id}🔒Get a specific saved search.
PUT/me/searches/{search_id}🔒Update a saved search.
GET/me/searches/{search_id}/run🔒Execute a saved search and return results.
GET/search🌐Unified search across GPs and funds.
GET/search/aggregate🌐Market aggregations for data analysis and benchmarking.
GET/search/autocomplete🌐Fast prefix matching for search UI typeahead.
GET/search/suggestions🌐Get search term suggestions based on popular/recent searches...

User

MethodEndpointAuthDescription
DELETE/me/account🔒Request account deletion (soft delete with 30-day recovery w...
GET/me/account/export🔒Export all user data (GDPR compliance).
POST/me/account/recover🌐Recover a deleted account within the 30-day recovery window.
GET/me/activity🔒Get activity feed aggregating recent events for user's saved...
GET/me/collections🔒List user's collections.
POST/me/collections🔒Create a new collection.
DELETE/me/collections/{collection_id}🔒Delete a collection and all its items.
GET/me/collections/{collection_id}🔒Get a collection with its items.
PATCH/me/collections/{collection_id}🔒Update collection name and/or description.
POST/me/collections/{collection_id}/items🔒Add a GP to a collection.
DELETE/me/collections/{collection_id}/items/{crd}🔒Remove a GP from a collection.
GET/me/notifications/preferences🔒Get user's email notification preferences.
PUT/me/notifications/preferences🔒Update user's email notification preferences.
POST/me/notifications/test🔒Send a test email to the authenticated user.
POST/me/notifications/unsubscribe🌐Unsubscribe from emails using the token from email footer.
GET/me/preferences🔒Get user's People Intelligence preferences.
PATCH/me/preferences🔒Update user's People Intelligence preferences.
GET/me/purchases🔒List all People Intelligence purchases for the current user.
GET/me/purchases/gp/{crd}🔒Get all People Intelligence purchases for a specific GP.
GET/me/watchlist🔒List user's watchlist items.
POST/me/watchlist🔒Add a GP to the watchlist.
DELETE/me/watchlist/{item_id}🔒Remove an item from the watchlist.

Billing

MethodEndpointAuthDescription
POST/billing/checkout🔒Create a Stripe Checkout session for tier upgrade.
GET/billing/free-tier-status🌐Get free tier usage status for the current API key (FS-6010)...
POST/billing/portal🔒Create a Stripe Customer Portal session for invoice/payment ...
GET/billing/subscription🔒Get current subscription status for the authenticated user.
POST/billing/webhook🌐Stripe webhook handler for payment events.

API Keys

MethodEndpointAuthDescription
GET/api-keys🔒List all API keys for the current user.
POST/api-keys🔒Create a new API key.
DELETE/api-keys/{key_id}🔒Revoke an API key.
GET/api-keys/{key_id}🔒Get details of a specific API key.
PATCH/api-keys/{key_id}🔒Update API key name.

Export

MethodEndpointAuthDescription
POST/export/csv🔒Export search results to CSV.
GET/export/fields🌐List available fields for export.

Usage

MethodEndpointAuthDescription
GET/usage🌐Get usage statistics for the current API key.
GET/usage/daily🌐Get daily usage breakdown for the current API key.
GET/usage/endpoints🌐Get statistics grouped by endpoint for the current API key.

Settings

MethodEndpointAuthDescription
GET/settings/spending-cap🔒Get current spending cap and usage.
PUT/settings/spending-cap🔒Update monthly spending cap.
PUT/settings/spending-cap/alerts🔒Update spending cap alert thresholds.

Admin

MethodEndpointAuthDescription
GET/admin/dataops/dashboard🔒Get combined command center dashboard data.
GET/admin/dataops/extractions🔒Get recent extraction runs.
POST/admin/dataops/extractions/trigger🔒Trigger an extraction for a source.
GET/admin/dataops/extractions/{run_id}🔒Get full details of an extraction run including diffs.
GET/admin/dataops/freshness🔒Get freshness summary by entity type and source.
GET/admin/dataops/freshness/queue🔒Get refresh queue status.
POST/admin/dataops/freshness/queue🔒Queue an entity for refresh.
POST/admin/dataops/freshness/queue/process🔒Trigger processing of the refresh queue.
GET/admin/dataops/freshness/stale🔒Get stale entities ordered by staleness.
GET/admin/dataops/health🔒Get overall system health status.
GET/admin/dataops/overrides🔒Get manual override records.
POST/admin/dataops/overrides🔒Create a manual data override.
DELETE/admin/dataops/overrides/{override_id}🔒Soft-delete a manual override.
GET/admin/dataops/quality🔒Get current data quality metrics.
GET/admin/dataops/quality/alerts🔒Get data quality alerts.
POST/admin/dataops/quality/alerts/{alert_id}/acknowledge🔒Acknowledge a quality alert.
POST/admin/dataops/quality/alerts/{alert_id}/resolve🔒Resolve a quality alert.
GET/admin/dataops/quality/trends🔒Get quality metric trends over time.
GET/admin/dataops/sources🔒Get status of all data sources.
POST/admin/jobs/daily-digest🔒Send daily digest emails.
POST/admin/jobs/market-intel🔒Send weekly market intelligence to Premier users.
POST/admin/jobs/payment-check🔒Check for payment failures and send dunning emails.
POST/admin/jobs/process-queue🔒Process the notification queue.
POST/admin/jobs/trial-check🔒Check for expiring trials and queue notifications.
GET/admin/notifications/🔒List all notification types in the registry.
POST/admin/notifications/🔒Create a new notification type.
GET/admin/notifications/analytics/overview🔒Get overview analytics for all notifications.
GET/admin/notifications/export🔒Export the entire notification registry as JSON.
POST/admin/notifications/import🔒Import notification definitions from JSON.
GET/admin/notifications/stats🔒Get aggregate notification statistics.
GET/admin/notifications/summary🔒Get summary statistics of the notification registry.
GET/admin/notifications/table🔒Get formatted table view of all notifications (text/plain).
POST/admin/notifications/test🔒Send a test notification to a specific email.
DELETE/admin/notifications/{notification_id}🔒Delete a notification type.
GET/admin/notifications/{notification_id}🔒Get full details of a notification.
PUT/admin/notifications/{notification_id}🔒Update a notification's settings.
POST/admin/notifications/{notification_id}/disable🔒Disable a notification.
POST/admin/notifications/{notification_id}/enable🔒Enable a notification.
GET/admin/notifications/{notification_id}/stats🔒Get analytics for a specific notification type.

Other

MethodEndpointAuthDescription
POST/hbs/survey🔒Submit monthly HBS feedback survey.
POST/hbs/verify🌐Verify HBS student email for free tier access.
GET/track/click/{tracking_id}🌐Click tracking endpoint.
GET/track/open/{tracking_id}.png🌐Tracking pixel endpoint.
GET/unsubscribe/{token}🌐One-click unsubscribe endpoint (GET for email client compati...
MethodEndpointAuthDescription
GET/legal/entity-info🌐Get legal entity information.
GET/legal/privacy🌐Get the Privacy Policy (when available).
GET/legal/terms🌐Get the API Terms of Service.
GET/legal/terms/version🌐Get current ToS version metadata.

Detailed Reference

Auth

POST /auth/forgot-password

Request a password reset email.

Generates a time-limited token (1 hour) and sends reset link. Rate limited: 3 requests per email per hour. Always returns success (to prevent email enumeration).

PropertyValue
Auth RequiredNo
Request BodyForgotPasswordRequest
Sourceauth.py:507

POST /auth/login

Authenticate user and return JWT tokens.

Validates credentials against database and returns access + refresh tokens. FS-7101: Creates new session and terminates all other sessions (single-device enforcement).

PropertyValue
Auth RequiredNo
Request BodyLoginRequest
Sourceauth.py:107

Parameters:

NameTypeRequiredDefaultDescription
http_requestrequestYes--

POST /auth/logout

Logout user.

For stateless JWT, we just acknowledge logout. Client should discard tokens.

PropertyValue
Auth RequiredYes
Sourceauth.py:340

GET /auth/me

Get current authenticated user info (FS-7104: returns both app and API tiers, FS-9052: includes onboarding status).

PropertyValue
Auth RequiredYes
Sourceauth.py:355

PATCH /auth/me/onboarding

Update user's onboarding progress (FS-9052).

  • step: Set current step (1-3). Can only increment (1→2→3). - completed: Mark onboarding as complete (auto-sets when step=3). Rules: 1. Steps can only be incremented (not decremented) 2. Setting step=3 automatically marks completed=true 3. Once completed=true, onboarding cannot be reset
PropertyValue
Auth RequiredYes
Request BodyUpdateOnboardingRequest
Sourceauth.py:399

POST /auth/refresh

Refresh access token using refresh token.

Validates refresh token and issues new access token.

PropertyValue
Auth RequiredNo
Sourceauth.py:296

Parameters:

NameTypeRequiredDefaultDescription
refresh_tokenstrYes--

POST /auth/register

Register a new user with 7 fields and automatic tier detection.

Tier Detection: - @mbaYYYY.hbs.edu -> hbs_student tier (free until graduation) - *.edu -> student tier (discounted) - Other -> free_trial tier (14 days)

PropertyValue
Auth RequiredNo
Request BodyRegisterRequest
Sourceauth.py:177

POST /auth/resend-verification

Resend verification email to the authenticated user.

Rate limited: 3 requests per hour per user. Only works if user is not already verified.

PropertyValue
Auth RequiredYes
Sourceauth.py:730

POST /auth/reset-password

Reset password using token from email.

Validates token, updates password, and invalidates all sessions. Token expires after 1 hour and is single-use.

PropertyValue
Auth RequiredNo
Request BodyResetPasswordRequest
Sourceauth.py:577

DELETE /auth/sessions

Terminate all other sessions (except current).

Used for "Sign out all devices" functionality in Settings. Requires current session ID in request headers (X-Session-ID).

PropertyValue
Auth RequiredYes
Sourceauth.py:878

GET /auth/sessions

List all active sessions for the current user.

Returns sessions with device info and activity timestamps. Used in Settings > Security & Sessions page.

PropertyValue
Auth RequiredYes
Sourceauth.py:829

DELETE /auth/sessions/{session_id}

Terminate a specific session.

Used to sign out a specific device from Settings > Security & Sessions.

PropertyValue
Auth RequiredYes
Sourceauth.py:854

Parameters:

NameTypeRequiredDefaultDescription
session_idstrYes--

POST /auth/verify-email

Verify user's email address using token from verification email.

Token is valid for 24 hours and is single-use. Upon verification, user gets full access to the platform.

PropertyValue
Auth RequiredNo
Request BodyVerifyEmailRequest
Sourceauth.py:654

GPs

GET /gps

Search fund managers (GPs) with 21+ filters.

Examples: /v1/gps?q=blackstone&min_aum=1000000000 /v1/gps?strategy=PE&state=NY&has_funds=true /v1/gps?aum_band=>10B&per_page=50 /v1/gps?min_employees=100&max_employees=500 /v1/gps?year_founded_min=2010&state_of_incorporation=DE /v1/gps?vintage_min=2020&fund_type=3c7&has_auditor=true /v1/gps?launched_within_months=24&exemption_type=506c /v1/gps?fund_size_min=100000000&min_investors=50 /v1/gps?manager_type=pe_vc&state=CA /v1/gps?manager_type=hedge_fund&min_aum=500000000

PropertyValue
Auth RequiredNo
Request BodyOptional
Sourcegps.py:59

Parameters:

NameTypeRequiredDefaultDescription
qoptionalNoNoneSearch name/DBA
cityoptionalNoNoneFilter by city
stateoptionalNoNoneFilter by state (US)
countryoptionalNoNoneFilter by country
min_aumoptionalNoNoneMinimum AUM ($)
max_aumoptionalNoNoneMaximum AUM ($)
aum_bandoptionalNoNoneAUM band: <100M, 100M-500M, 500M-1B, 1B-10B, >10B
strategyoptionalNoNoneStrategy: PE, VC, Hedge, RealEstate, Credit
registration_statusoptionalNoNoneregistered, exempt_reporting
has_fundsoptionalNoNoneOnly GPs with private funds
min_fund_countoptionalNoNoneMinimum fund count
max_fund_countoptionalNoNoneMaximum fund count
min_employeesoptionalNoNoneMinimum employees
max_employeesoptionalNoNoneMaximum employees
jurisdictionoptionalNoNonePrimary jurisdiction: US, UK, SG, HK
registered_afteroptionalNoNoneYYYY-MM-DD
registered_beforeoptionalNoNoneYYYY-MM-DD
year_founded_minoptionalNoNoneMinimum year founded
year_founded_maxoptionalNoNoneMaximum year founded
vintage_minoptionalNoNoneMinimum fund vintage year
vintage_maxoptionalNoNoneMaximum fund vintage year
launched_within_monthsoptionalNoNoneFunds launched within N months
fund_size_minoptionalNoNoneMinimum fund GAV ($)
fund_size_maxoptionalNoNoneMaximum fund GAV ($)
min_investorsoptionalNoNoneMinimum total investors across funds
max_investorsoptionalNoNoneMaximum total investors across funds
exemption_typeoptionalNoNoneForm D exemption: 506b, 506c, 3c1, 3c7
fund_typeoptionalNoNoneFund type: 3c1 or 3c7
state_of_incorporationoptionalNoNoneState where adviser is organized
has_auditoroptionalNoNoneHas auditor for any fund
auditor_nameoptionalNoNoneSearch by auditor name
manager_typeoptionalNoNoneManager type: pe_vc, hedge_fund, real_estate, other
pageintNo1Page number
per_pageintNo25Results per page
sortoptionalNoNoneSort: name, aum, fund_count, employees
orderoptionalNoascasc or desc

GET /gps/{crd}

Get a single fund manager by CRD number.

PropertyValue
Auth RequiredNo
Sourcegps.py:464

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--

GET /gps/{crd}/alumni

Get alumni (former employees) for a GP with PDL enrichment.

Returns former employees with their current positions, filtered and paginated. Cost: $0.50 per person returned. Parameters: - crd: GP CRD number - limit: Max results (default 50, max 100 for cost protection) - offset: Pagination offset - departed_after: Filter by departure date (YYYY-MM-DD) - current_role: Filter by current position type Response includes: - Alumni with PDL-enriched profiles - Pagination metadata (total_count, has_more) - Cost estimate Example: GET /v1/gps/12345/alumni?limit=25&departed_after=2020-01-01 → Returns up to 25 alumni who departed after 2020 → Cost: 25 × $0.50 = $12.50

PropertyValue
Auth RequiredYes
Request BodyOptional
PricingCost: $0.50
Sourcegps.py:1637

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--
limitintNo50Max results (default 50, max 100)
offsetintNo0Pagination offset
departed_afteroptionalNoNoneFilter by departure date (YYYY-MM-DD)
current_roleoptionalNoNoneFilter by current position type

POST /gps/{crd}/alumni/unlock

Unlock alumni network data for a GP.

Returns former employees with their current positions. Pricing: $0.50 per person

PropertyValue
Auth RequiredYes
PricingPricing: $0.50
Sourcegps.py:1715

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--

GET /gps/{crd}/amendments

Get ADV filing amendment history for a GP.

Returns chronological list of ADV filings and amendments with metadata. Shows filing dates, amendment types (annual/material/initial), and processing status. Pricing: $0.25 per request (flat fee, not per record)

PropertyValue
Auth RequiredNo
PricingPricing: $0.25
Sourcegps.py:1866

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--
limitintNo50Max amendments to return

POST /gps/{crd}/careers/unlock-all

Bulk unlock career histories for a GP (20% discount).

If person_ids is provided, unlock those specific people. Otherwise, unlock all team members the user has already purchased. Pricing: $0.75/person (20% discount = $0.60/person for bulk)

PropertyValue
Auth RequiredYes
Request BodyCareerBulkUnlockRequest
Pricing$0.75/person
Sourcegps.py:1527

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--

GET /gps/{crd}/changes

Get derived field changes over time for a GP.

Tracks changes in computed/derived fields like AUM, employee count, strategy, etc. by comparing snapshots taken at different filing dates. Pricing: $0.25 per request (flat fee, not per record)

PropertyValue
Auth RequiredNo
PricingPricing: $0.25
Sourcegps.py:1936

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--
limitintNo50Max change records to return

POST /gps/{crd}/enrich

Enrich a GP's control persons with education and employment data from PDL.

Supports two modes: - Synchronous (default): Blocks until enrichment completes, returns result immediately - Asynchronous (async_mode=true): Returns 202 Accepted with job_id for polling

PropertyValue
Auth RequiredYes
Request BodyEnrichRequest
Sourcegps.py:833

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--

GET /gps/{crd}/enrich/status/{job_id}

Poll status of async enrichment job.

PropertyValue
Auth RequiredNo
Sourcegps.py:969

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--
job_idstrYes--

GET /gps/{crd}/enrichment-info

Check if a GP has been enriched without triggering enrichment.

PropertyValue
Auth RequiredNo
Sourcegps.py:1015

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--

GET /gps/{crd}/filings

Get SEC filings for a specific GP.

PropertyValue
Auth RequiredNo
Request BodyOptional
Sourcegps.py:718

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--
form_typeoptionalNoNoneForm type: D, D/A
yearoptionalNoNoneFiling year
pageintNo1-
per_pageintNo25-

GET /gps/{crd}/funds

Get funds managed by a specific GP.

PropertyValue
Auth RequiredNo
Request BodyOptional
Sourcegps.py:582

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--
statusoptionalNoNoneactive, liquidating
fund_typeoptionalNoNone3c1, 3c7, all
min_gavoptionalNoNoneMinimum GAV
pageintNo1-
per_pageintNo25-

GET /gps/{crd}/hiring

Get job postings and hiring velocity for a GP.

Returns active job postings from Adzuna + career page scraping, along with hiring velocity metrics.

PropertyValue
Auth RequiredNo
Request BodyOptional
Pricing$0.10/request
Sourcegps_hiring.py:67

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--
roleoptionalNoNoneFilter by seniority: partner, md, vp, associate, analyst
departmentoptionalNoNoneFilter by department: investment, operations, ir, legal, finance
posted_afteroptionalNoNoneFilter by posted date (YYYY-MM-DD)
limitintNo50Max results (default 50, max 100)

GET /gps/{crd}/metrics

Get derived firm metrics for a GP.

Returns computed analytics: - AUM growth rate (YoY, 3Y CAGR) - Fund launch cadence - Average fund size trend - Employee growth rate Pricing: $0.15/request (flat fee, analytics endpoint type)

PropertyValue
Auth RequiredNo
Pricing$0.15/request
Sourcegps_analytics.py:23

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--

Find similar GPs based on strategy, geography, and AUM band.

Similarity factors: - Primary strategy match - Geographic proximity (state/country) - AUM band overlap - Fund count similarity Pricing: $0.15/request (flat fee, analytics endpoint type)

PropertyValue
Auth RequiredNo
Pricing$0.15/request
Sourcegps_analytics.py:146

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--
limitintNo10Max similar GPs to return

GET /gps/{crd}/stats

Get statistics for a specific GP.

PropertyValue
Auth RequiredNo
Sourcegps.py:666

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--

GET /gps/{crd}/team

Get team roster for a GP with PDL enrichment.

Returns team members with their profiles, filtered by role and paginated. Cost: $0.50 per person returned. Parameters: - crd: GP CRD number - limit: Max results (default 50, max 100 for cost protection) - offset: Pagination offset - role: Filter by role (partner, md, vp, associate, other) - sort: Sort order (seniority, tenure, name) Response includes: - Team members with PDL-enriched profiles - Pagination metadata (total_count, has_more) - Cost estimate Example: GET /v1/gps/12345/team?role=partner&limit=25 → Returns up to 25 partners → Cost: 25 × $0.50 = $12.50

PropertyValue
Auth RequiredYes
Request BodyOptional
PricingCost: $0.50
Sourcegps.py:1234

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--
limitintNo50Max results (default 50, max 100)
offsetintNo0Pagination offset
roleoptionalNoNoneFilter by role: partner, md, vp, associate, other
sortstrNosenioritySort by: seniority, tenure, name

GET /gps/{crd}/team/preview

Get team preview/teaser for People Intelligence UI.

Returns aggregate counts and structure WITHOUT revealing names. This enables the blurred teaser state showing titles visible, names blurred. FREE endpoint - no charge. Response includes: - Total team count - Count by seniority level (partner, md, vp, associate, other) - Tenure range (min/max years) - Alumni availability and count - Career data availability

PropertyValue
Auth RequiredYes
Sourcegps.py:1074

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--

POST /gps/{crd}/team/unlock

Unlock team roster data for a GP (People Intelligence purchase).

Tier options: - senior: Partners & Managing Directors only - investment_team: Partners through Associates (RECOMMENDED) - complete: All identified team members - custom: Specify count (system selects by seniority) Pricing: $0.50 per person Returns the unlocked team data and records the purchase.

PropertyValue
Auth RequiredYes
Request BodyTeamUnlockRequest
PricingPricing: $0.50
Sourcegps.py:1354

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--

Funds

GET /funds

Search private funds.

Examples: /v1/funds?q=capital partners /v1/funds?gp_crd=148826&fund_type=3c7 /v1/funds?min_vintage=2020&min_gav=100000000

PropertyValue
Auth RequiredNo
Request BodyOptional
Sourcefunds.py:23

Parameters:

NameTypeRequiredDefaultDescription
qoptionalNoNoneSearch fund name
gp_crdoptionalNoNoneFilter by GP CRD
gp_idoptionalNoNoneFilter by canonical GP ID
fund_typeoptionalNoNone3c1, 3c7, or all
is_masteroptionalNoNoneFilter master funds
is_feederoptionalNoNoneFilter feeder funds
min_gavoptionalNoNoneMinimum gross asset value
max_gavoptionalNoNoneMaximum gross asset value
vintage_yearoptionalNoNoneExact vintage year
min_vintageoptionalNoNoneMinimum vintage year
max_vintageoptionalNoNoneMaximum vintage year
jurisdictionoptionalNoNoneState/country of organization
statusoptionalNoNoneactive, liquidating
has_auditoroptionalNoNoneHas auditor info
pageintNo1-
per_pageintNo25-
sortoptionalNoNonename, gav, vintage_year
orderoptionalNoascasc or desc

GET /funds/{fund_id}

Get a single fund by fund ID.

PropertyValue
Auth RequiredNo
Sourcefunds.py:200

Parameters:

NameTypeRequiredDefaultDescription
fund_idstrYes--

GET /funds/{fund_id}/amendments

Get amendment history for a private fund.

Tracks changes to fund data from Form ADV Section 7.B amendments. Shows when fund data was updated via adviser ADV filings. Pricing: $0.25 per request (flat fee, not per record)

PropertyValue
Auth RequiredNo
PricingPricing: $0.25
Sourcefunds.py:266

Parameters:

NameTypeRequiredDefaultDescription
fund_idstrYes--
limitintNo50Max amendments to return

LPs

GET /lps

Search and list LP entities.

Returns limited partners (investors) extracted from Form D filings, with optional filters for entity type and investment activity. Examples: /v1/lps?q=pension /v1/lps?entity_type=endowment&min_investments=5 /v1/lps?invested_with_crd=12345 /v1/lps?sort=investment_count&order=desc Pricing: $0.10/request (flat fee)

PropertyValue
Auth RequiredNo
Request BodyOptional
Pricing$0.10/request
Sourcelps.py:73

Parameters:

NameTypeRequiredDefaultDescription
qoptionalNoNoneSearch LP name
entity_typeoptionalNoNoneFilter by type: pension, endowment, family_office, fund_of_funds, insurance, sovereign_wealth, corporate, other
min_investmentsoptionalNoNoneMinimum number of investments
invested_with_crdoptionalNoNoneFilter LPs who invested with specific GP (CRD)
pageintNo1Page number
per_pageintNo25Results per page
sortoptionalNonameSort: name, investment_count, created_at
orderoptionalNoascasc or desc

GET /lps/{lp_id}

Get detailed information about a specific LP entity.

Returns LP details including all investment relationships.

PropertyValue
Auth RequiredNo
Pricing$0.10/request
Sourcelps.py:229

Parameters:

NameTypeRequiredDefaultDescription
lp_idintYes--

GET /lps/{lp_id}/investments

Get investment portfolio for a specific LP.

Returns all investments made by this LP across different GPs/funds.

PropertyValue
Auth RequiredNo
Pricing$0.10/request
Sourcelps.py:309

Parameters:

NameTypeRequiredDefaultDescription
lp_idintYes--
pageintNo1-
per_pageintNo25-

People

Search people by name.

Uses fuzzy matching (trigram similarity) for name search. Only returns cached people (from prior enrichments).

PropertyValue
Auth RequiredNo
Request BodyOptional
PricingPricing: $0.50
Sourcepeople.py:122

Parameters:

NameTypeRequiredDefaultDescription
qstrNoEllipsisName search query
companyoptionalNoNoneFilter by company
limitintNo20Max results

GET /people/{person_uid}

Get individual person profile.

Returns cached PDL enrichment data including education, experience, and contact information.

PropertyValue
Auth RequiredNo
Pricing$0.50/request
Sourcepeople.py:35

Parameters:

NameTypeRequiredDefaultDescription
person_uidstrYes--
force_refreshboolNoFalseForce cache refresh from PDL

GET /people/{person_uid}/history

Get full career history for a person.

Returns chronological timeline of education and employment.

PropertyValue
Auth RequiredNo
Pricing$0.75/request
Sourcepeople.py:79

Parameters:

NameTypeRequiredDefaultDescription
person_uidstrYes--

Search

GET /me/searches

List user's saved searches.

PropertyValue
Auth RequiredYes
Sourceuser.py:93

Parameters:

NameTypeRequiredDefaultDescription
pageintNo1-
per_pageintNo25-

POST /me/searches

Create a new saved search.

PropertyValue
Auth RequiredYes
Request BodySavedSearchCreate
Sourceuser.py:112

Parameters:

NameTypeRequiredDefaultDescription
searchsavedsearchcreateYes--

DELETE /me/searches/{search_id}

Delete a saved search.

PropertyValue
Auth RequiredYes
Sourceuser.py:164

Parameters:

NameTypeRequiredDefaultDescription
search_idintYes--

GET /me/searches/{search_id}

Get a specific saved search.

PropertyValue
Auth RequiredYes
Sourceuser.py:123

Parameters:

NameTypeRequiredDefaultDescription
search_idintYes--

PUT /me/searches/{search_id}

Update a saved search.

PropertyValue
Auth RequiredYes
Request BodySavedSearchUpdate
Sourceuser.py:136

Parameters:

NameTypeRequiredDefaultDescription
search_idintYes--
updatesavedsearchupdateYes--

GET /me/searches/{search_id}/run

Execute a saved search and return results.

Loads the saved search filters and executes the GP search with those parameters. Updates last_run_at and last_match_count after execution. Flow: 1. Retrieves saved search by ID (verifies user ownership) 2. Extracts stored filter criteria from the saved search 3. Executes search using the same logic as GET /v1/gps 4. Updates last_run_at timestamp and last_match_count 5. Returns results in same format as /v1/gps with additional metadata Response includes: - data: Array of GP results matching the saved filters - meta.total: Total number of matching GPs - meta.page: Current page number - meta.per_page: Results per page - meta.saved_search_id: ID of the executed saved search - meta.saved_search_name: Name of the executed saved search Example: GET /v1/me/searches/123/run Response: { "data": [ { "crd": "12345", "name": "Example Capital", "aum": 5000000000, ... } ], "meta": { "total": 42, "page": 1, "per_page": 25, "saved_search_id": 123, "saved_search_name": "Large PE firms in NYC" } } Error Cases: - 404: Saved search not found or user doesn't own it - 401: User not authenticated

PropertyValue
Auth RequiredYes
Sourceuser.py:181

Parameters:

NameTypeRequiredDefaultDescription
search_idintYes--

Unified search across GPs and funds.

Example: /v1/search?q=blackstone&types=gp,fund

PropertyValue
Auth RequiredNo
Request BodyOptional
Sourcesearch.py:19

Parameters:

NameTypeRequiredDefaultDescription
qstrNoEllipsisSearch query
typesoptionalNoNoneComma-separated: gp,fund
limitintNo5Results per type

GET /search/aggregate

Market aggregations for data analysis and benchmarking.

Aggregation options: - strategy: AUM and fund count by primary strategy - state: Geographic distribution by US state - vintage: Fund count by vintage year - aum_band: GP count by AUM band Pricing: $0.15/request (flat fee, analytics endpoint type) Examples: /v1/search/aggregate?group_by=strategy /v1/search/aggregate?group_by=vintage

PropertyValue
Auth RequiredNo
Pricing$0.15/request
Sourcesearch.py:203

Parameters:

NameTypeRequiredDefaultDescription
group_bystrNoEllipsisGroup by: strategy, state, vintage, aum_band

GET /search/autocomplete

Fast prefix matching for search UI typeahead.

Uses PostgreSQL trigram index for fast fuzzy matching. Example: /v1/search/autocomplete?q=black&type=gp

PropertyValue
Auth RequiredNo
Request BodyOptional
Sourcesearch.py:91

Parameters:

NameTypeRequiredDefaultDescription
qstrNoEllipsisPartial query
typeoptionalNoNonegp, fund, or all
limitintNo10Max suggestions

GET /search/suggestions

Get search term suggestions based on popular/recent searches.

For MVP, returns matching GP names as suggestions.

PropertyValue
Auth RequiredNo
Sourcesearch.py:173

Parameters:

NameTypeRequiredDefaultDescription
qstrNoEllipsisPartial query
limitintNo5Max suggestions

User

DELETE /me/account

Request account deletion (soft delete with 30-day recovery window).

Process: 1. User confirms by typing "DELETE" and providing password 2. Account is soft-deleted (marked with deleted_at timestamp) 3. User has 30 days to recover the account 4. After 30 days, account is permanently deleted via scheduled job What's preserved during recovery window: - Saved searches - Watchlist - Export history - All account data What happens immediately: - All active sessions are invalidated - User is logged out - Subscription is cancelled (if active)

PropertyValue
Auth RequiredYes
Request BodyAccountDeleteRequest
Sourceuser.py:1371

GET /me/account/export

Export all user data (GDPR compliance).

Returns all user data in a structured format for download.

PropertyValue
Auth RequiredYes
Sourceuser.py:1552

POST /me/account/recover

Recover a deleted account within the 30-day recovery window.

This endpoint doesn't require authentication (since the user is logged out). Instead, it verifies the email and password.

PropertyValue
Auth RequiredNo
Request BodyAccountRecoverRequest
Sourceuser.py:1468

GET /me/activity

Get activity feed aggregating recent events for user's saved GPs and searches.

Activity Types: - new_filing: New SEC filings (ADV/Form D) for watchlist GPs - new_fund: New funds added for watchlist GPs Query Parameters: - types: Filter by comma-separated activity types (optional) - limit: Results per page (default 50, max 100) - offset: Pagination offset (default 0) - since: ISO 8601 datetime for filtering recent events (default: last 30 days) Response Format: json { "data": [ { "type": "new_filing", "crd": "123456", "gp_name": "Blackstone Group", "event_date": "2025-12-15T10:30:00Z", "details": { "form_type": "ADV" } }, { "type": "new_fund", "crd": "789012", "gp_name": "KKR", "event_date": "2025-12-14T15:00:00Z", "details": { "fund_name": "KKR Global Impact Fund III" } } ], "meta": { "total": 127, "limit": 50, "offset": 0, "types_included": ["new_filing", "new_fund"] } }

PropertyValue
Auth RequiredYes
Request BodyOptional
Sourceuser.py:1148

Parameters:

NameTypeRequiredDefaultDescription
typesoptionalNoNoneComma-separated activity types: new_filing,new_fund
limitintNo50Results per page
offsetintNo0Pagination offset
sinceoptionalNoNoneOnly events after this timestamp

GET /me/collections

List user's collections.

Returns all collections with item counts.

PropertyValue
Auth RequiredYes
Sourceuser.py:524

Parameters:

NameTypeRequiredDefaultDescription
pageintNo1-
per_pageintNo25-

POST /me/collections

Create a new collection.

Max 20 collections per user.

PropertyValue
Auth RequiredYes
Request BodyCollectionCreate
Sourceuser.py:584

Parameters:

NameTypeRequiredDefaultDescription
collectioncollectioncreateYes--

DELETE /me/collections/{collection_id}

Delete a collection and all its items.

CASCADE delete removes all collection_items automatically.

PropertyValue
Auth RequiredYes
Sourceuser.py:754

Parameters:

NameTypeRequiredDefaultDescription
collection_idintYes--

GET /me/collections/{collection_id}

Get a collection with its items.

Returns collection details and paginated list of GPs.

PropertyValue
Auth RequiredYes
Sourceuser.py:631

Parameters:

NameTypeRequiredDefaultDescription
collection_idintYes--
pageintNo1-
per_pageintNo100-

PATCH /me/collections/{collection_id}

Update collection name and/or description.

PropertyValue
Auth RequiredYes
Request BodyCollectionUpdate
Sourceuser.py:704

Parameters:

NameTypeRequiredDefaultDescription
collection_idintYes--
updatecollectionupdateYes--

POST /me/collections/{collection_id}/items

Add a GP to a collection.

Max 500 items per collection.

PropertyValue
Auth RequiredYes
Request BodyCollectionItemCreate
Sourceuser.py:780

Parameters:

NameTypeRequiredDefaultDescription
collection_idintYes--
itemcollectionitemcreateYes--

DELETE /me/collections/{collection_id}/items/{crd}

Remove a GP from a collection.

PropertyValue
Auth RequiredYes
Sourceuser.py:845

Parameters:

NameTypeRequiredDefaultDescription
collection_idintYes--
crdstrYes--

GET /me/notifications/preferences

Get user's email notification preferences.

Creates default preferences if none exist.

PropertyValue
Auth RequiredYes
ResponseEmailPreferencesResponse
Sourcenotifications.py:97

PUT /me/notifications/preferences

Update user's email notification preferences.

Any field not provided will keep its current value.

PropertyValue
Auth RequiredYes
Request BodyEmailPreferences
ResponseEmailPreferencesResponse
Sourcenotifications.py:144

Parameters:

NameTypeRequiredDefaultDescription
prefsemailpreferencesYes--

POST /me/notifications/test

Send a test email to the authenticated user.

Useful for verifying email delivery is working.

PropertyValue
Auth RequiredYes
Request BodyTestEmailRequest
Sourcenotifications.py:235

POST /me/notifications/unsubscribe

Unsubscribe from emails using the token from email footer.

Can unsubscribe from a specific category or all emails.

PropertyValue
Auth RequiredNo
Request BodyUnsubscribeRequest
Sourcenotifications.py:382

GET /me/preferences

Get user's People Intelligence preferences.

PropertyValue
Auth RequiredYes
Sourceuser.py:1051

PATCH /me/preferences

Update user's People Intelligence preferences.

  • one_click_enabled: Skip confirmation for purchases under threshold - one_click_threshold: Dollar amount threshold ($5-$500) - email_receipts: Send email receipt for each purchase - weekly_digest: Weekly summary of enrichment spend
PropertyValue
Auth RequiredYes
Request BodyPIPreferencesUpdate
Sourceuser.py:1088

Parameters:

NameTypeRequiredDefaultDescription
updatepipreferencesupdateYes--

GET /me/purchases

List all People Intelligence purchases for the current user.

Returns purchase history with GP names, types, and amounts.

PropertyValue
Auth RequiredYes
Sourceuser.py:896

Parameters:

NameTypeRequiredDefaultDescription
pageintNo1-
per_pageintNo25-

GET /me/purchases/gp/{crd}

Get all People Intelligence purchases for a specific GP.

This is used by the GP Profile page to determine what data the user has already unlocked (show unlocked state vs teaser).

PropertyValue
Auth RequiredYes
Sourceuser.py:972

Parameters:

NameTypeRequiredDefaultDescription
crdstrYes--

GET /me/watchlist

List user's watchlist items.

PropertyValue
Auth RequiredYes
Sourceuser.py:397

Parameters:

NameTypeRequiredDefaultDescription
pageintNo1-
per_pageintNo25-

POST /me/watchlist

Add a GP to the watchlist.

PropertyValue
Auth RequiredYes
Request BodyWatchlistItemCreate
Sourceuser.py:416

Parameters:

NameTypeRequiredDefaultDescription
itemwatchlistitemcreateYes--

DELETE /me/watchlist/{item_id}

Remove an item from the watchlist.

PropertyValue
Auth RequiredYes
Sourceuser.py:457

Parameters:

NameTypeRequiredDefaultDescription
item_idintYes--

Billing

POST /billing/checkout

Create a Stripe Checkout session for tier upgrade.

Authentication: Session token (JWT) required Redirects user to Stripe Checkout for payment. After successful payment, a webhook will upgrade the user's tier.

PropertyValue
Auth RequiredYes
Request BodyCheckoutRequest
ResponseCheckoutResponse
Sourcebilling.py:159

GET /billing/free-tier-status

Get free tier usage status for the current API key (FS-6010).

Returns current usage against the 1,000 free API call limit: - Total calls used - Calls remaining - Percentage used - Whether limit is exceeded Authentication: API key required Note: Only applies to free tier keys. Paid tiers have different limits.

PropertyValue
Auth RequiredNo
Request BodyApiKeyAuth
ResponseFreeTierStatus
Sourcebilling.py:346

Parameters:

NameTypeRequiredDefaultDescription
api_keyapikeyauthNo--

POST /billing/portal

Create a Stripe Customer Portal session for invoice/payment management.

Authentication: Session token (JWT) required The Customer Portal allows users to: - View invoice history - Update payment methods - Cancel subscriptions - Download receipts

PropertyValue
Auth RequiredYes
Request BodyCustomerPortalRequest
ResponseCustomerPortalResponse
Sourcebilling.py:230

GET /billing/subscription

Get current subscription status for the authenticated user.

Authentication: Session token (JWT) required Returns subscription details including tier, status, and billing period.

PropertyValue
Auth RequiredYes
ResponseSubscriptionResponse
Sourcebilling.py:291

POST /billing/webhook

Stripe webhook handler for payment events.

Authentication: Stripe signature verification (no JWT required) SECURITY: This endpoint MUST verify Stripe webhook signatures using the webhook secret. Never process events without verification! Handles events: - checkout.session.completed - Upgrade user tier - customer.subscription.updated - Update subscription status - customer.subscription.deleted - Downgrade to free tier - invoice.payment_succeeded - Record successful payment - invoice.payment_failed - Handle failed payment

PropertyValue
Auth RequiredNo
Request BodyRequest
ResponseWebhookResponse
Sourcebilling.py:429

Parameters:

NameTypeRequiredDefaultDescription
stripe_signaturestrNo--

API Keys

GET /api-keys

List all API keys for the current user.

By default, only shows active keys. Use include_revoked=true to show all.

PropertyValue
Auth RequiredYes
ResponseApiKeyListResponse
Sourceapi_keys.py:152

Parameters:

NameTypeRequiredDefaultDescription
include_revokedboolNoFalse-

POST /api-keys

Create a new API key.

IMPORTANT: The full API key is returned ONLY ONCE. Save it immediately - it cannot be retrieved later. Key Modes: - live: Production keys (fh_live_...) - real usage, real billing - test: Test keys (fh_test_...) - sandbox, no billing Rate Limits by Tier: - Starter: 100 requests/day - Growth: 10,000 requests/day - Scale: Unlimited Maximum Keys: 10 active keys per user

PropertyValue
Auth RequiredYes
Request BodyApiKeyCreate
ResponseApiKeyCreateResponse
Sourceapi_keys.py:48

DELETE /api-keys/{key_id}

Revoke an API key.

The key will be marked as inactive and cannot be used for authentication. The key record is kept for audit purposes.

PropertyValue
Auth RequiredYes
Sourceapi_keys.py:317

Parameters:

NameTypeRequiredDefaultDescription
key_idstrYes--

GET /api-keys/{key_id}

Get details of a specific API key.

PropertyValue
Auth RequiredYes
ResponseApiKeyResponse
Sourceapi_keys.py:208

Parameters:

NameTypeRequiredDefaultDescription
key_idstrYes--

PATCH /api-keys/{key_id}

Update API key name.

Only the name can be updated. Tier and other fields are immutable. To change tier, create a new key and revoke the old one.

PropertyValue
Auth RequiredYes
Request BodyApiKeyUpdate
ResponseApiKeyResponse
Sourceapi_keys.py:257

Parameters:

NameTypeRequiredDefaultDescription
key_idstrYes--

Export

POST /export/csv

Export search results to CSV.

Pro tier: max 1,000 rows Advanced tier: max 10,000 rows Example: json { "type": "gps", "filters": {"state": "NY", "min_aum": 1000000000}, "fields": ["name", "city", "state", "total_aum", "fund_count"] }

PropertyValue
Auth RequiredYes
Request BodyExportRequest
Sourceexport.py:75

GET /export/fields

List available fields for export.

PropertyValue
Auth RequiredNo
Sourceexport.py:222

Usage

GET /usage

Get usage statistics for the current API key.

Returns overall usage metrics including: - Total requests (all-time) - Requests today and this month - Average response time - Last request timestamp - Per-record billing info (FS-6030) - Tier limits and remaining quota Authentication: API key required

PropertyValue
Auth RequiredNo
Request BodyApiKeyAuth
ResponseUsageStats
Sourceusage.py:205

Parameters:

NameTypeRequiredDefaultDescription
api_keyapikeyauthNo--

GET /usage/daily

Get daily usage breakdown for the current API key.

Returns detailed daily statistics including: - Request counts (total, successful, failed) - Response time metrics (avg, min, max, p95) - Top endpoints for each day Authentication: API key required Date Range: Last 7 days by default, max 90 days

PropertyValue
Auth RequiredNo
Request BodyApiKeyAuth
ResponseDailyUsageResponse
Sourceusage.py:283

Parameters:

NameTypeRequiredDefaultDescription
daysintNo7Number of days to retrieve (1-90)
api_keyapikeyauthNo--

GET /usage/endpoints

Get statistics grouped by endpoint for the current API key.

Returns aggregated metrics for each endpoint: - Total request count - Average response time - Success rate (percentage) Authentication: API key required Date Range: Last 30 days by default, max 90 days

PropertyValue
Auth RequiredNo
Request BodyApiKeyAuth
ResponseEndpointStatsResponse
Sourceusage.py:367

Parameters:

NameTypeRequiredDefaultDescription
daysintNo30Number of days to analyze (1-90)
api_keyapikeyauthNo--

Settings

GET /settings/spending-cap

Get current spending cap and usage.

Returns the user's monthly spending cap, current spend for the period, percentage used, alert thresholds, and reset date.

PropertyValue
Auth RequiredYes
ResponseSpendingCapResponse
Sourcesettings.py:163

PUT /settings/spending-cap

Update monthly spending cap.

Sets the user's monthly spending cap. Minimum is $10, no maximum. Cap resets on the first day of each month.

PropertyValue
Auth RequiredYes
Request BodySpendingCapUpdate
ResponseSpendingCapResponse
Sourcesettings.py:191

Parameters:

NameTypeRequiredDefaultDescription
updatespendingcapupdateYes--

PUT /settings/spending-cap/alerts

Update spending cap alert thresholds.

Sets the percentage thresholds at which to send spending alerts. Thresholds must be between 0-100 and will be automatically sorted.

PropertyValue
Auth RequiredYes
Request BodyAlertThresholdsUpdate
ResponseSpendingCapResponse
Sourcesettings.py:232

Parameters:

NameTypeRequiredDefaultDescription
updatealertthresholdsupdateYes--

Admin

GET /admin/dataops/dashboard

Get combined command center dashboard data.

Single endpoint returning all data needed for a dashboard view.

PropertyValue
Auth RequiredYes
ResponseDashboardData
Sourcedataops_admin.py:766

GET /admin/dataops/extractions

Get recent extraction runs.

PropertyValue
Auth RequiredYes
Request BodyOptional
Sourcedataops_admin.py:431

Parameters:

NameTypeRequiredDefaultDescription
sourceoptionalNoNoneFilter by source
limitintNo20-

POST /admin/dataops/extractions/trigger

Trigger an extraction for a source.

Runs asynchronously via background task.

PropertyValue
Auth RequiredYes
Request BodyTriggerExtractionRequest
Sourcedataops_admin.py:826

Parameters:

NameTypeRequiredDefaultDescription
background_tasksbackgroundtasksYes--

GET /admin/dataops/extractions/{run_id}

Get full details of an extraction run including diffs.

PropertyValue
Auth RequiredYes
Sourcedataops_admin.py:469

Parameters:

NameTypeRequiredDefaultDescription
run_idintYes--

GET /admin/dataops/freshness

Get freshness summary by entity type and source.

PropertyValue
Auth RequiredYes
Sourcedataops_admin.py:620

GET /admin/dataops/freshness/queue

Get refresh queue status.

PropertyValue
Auth RequiredYes
Request BodyOptional
Sourcedataops_admin.py:690

Parameters:

NameTypeRequiredDefaultDescription
statusoptionalNoNone-
limitintNo50-

POST /admin/dataops/freshness/queue

Queue an entity for refresh.

PropertyValue
Auth RequiredYes
Request BodyQueueRefreshRequest
Sourcedataops_admin.py:916

POST /admin/dataops/freshness/queue/process

Trigger processing of the refresh queue.

PropertyValue
Auth RequiredYes
Request BodyBackgroundTasks
Sourcedataops_admin.py:955

Parameters:

NameTypeRequiredDefaultDescription
limitintNo100-
background_tasksbackgroundtasksNoNone-

GET /admin/dataops/freshness/stale

Get stale entities ordered by staleness.

PropertyValue
Auth RequiredYes
Sourcedataops_admin.py:653

Parameters:

NameTypeRequiredDefaultDescription
limitintNo100-

GET /admin/dataops/health

Get overall system health status.

Calculated from: - Source freshness (all sources updated within threshold) - Quality alerts (critical/warning counts) - Stale entity percentage

PropertyValue
Auth RequiredYes
ResponseHealthStatus
Sourcedataops_admin.py:322

GET /admin/dataops/overrides

Get manual override records.

PropertyValue
Auth RequiredYes
Request BodyOptional
Sourcedataops_admin.py:722

Parameters:

NameTypeRequiredDefaultDescription
active_onlyboolNoTrue-
override_typeoptionalNoNone-

POST /admin/dataops/overrides

Create a manual data override.

PropertyValue
Auth RequiredYes
Request BodyCreateOverrideRequest
Sourcedataops_admin.py:982

DELETE /admin/dataops/overrides/{override_id}

Soft-delete a manual override.

PropertyValue
Auth RequiredYes
Sourcedataops_admin.py:1028

Parameters:

NameTypeRequiredDefaultDescription
override_idintYes--

GET /admin/dataops/quality

Get current data quality metrics.

PropertyValue
Auth RequiredYes
Sourcedataops_admin.py:518

GET /admin/dataops/quality/alerts

Get data quality alerts.

PropertyValue
Auth RequiredYes
Sourcedataops_admin.py:555

Parameters:

NameTypeRequiredDefaultDescription
unresolved_onlyboolNoTrue-

POST /admin/dataops/quality/alerts/{alert_id}/acknowledge

Acknowledge a quality alert.

PropertyValue
Auth RequiredYes
Request BodyAcknowledgeAlertRequest
Sourcedataops_admin.py:859

Parameters:

NameTypeRequiredDefaultDescription
alert_idintYes--

POST /admin/dataops/quality/alerts/{alert_id}/resolve

Resolve a quality alert.

PropertyValue
Auth RequiredYes
Request BodyResolveAlertRequest
Sourcedataops_admin.py:887

Parameters:

NameTypeRequiredDefaultDescription
alert_idintYes--

Get quality metric trends over time.

PropertyValue
Auth RequiredYes
Sourcedataops_admin.py:586

Parameters:

NameTypeRequiredDefaultDescription
daysintNo7-

GET /admin/dataops/sources

Get status of all data sources.

PropertyValue
Auth RequiredYes
Sourcedataops_admin.py:378

POST /admin/jobs/daily-digest

Send daily digest emails.

Triggered by Cloud Scheduler daily at 6 AM ET.

PropertyValue
Auth RequiredYes
Sourcenotifications.py:531

POST /admin/jobs/market-intel

Send weekly market intelligence to Premier users.

Triggered by Cloud Scheduler Monday at 8 AM ET.

PropertyValue
Auth RequiredYes
Sourcenotifications.py:542

POST /admin/jobs/payment-check

Check for payment failures and send dunning emails.

Triggered by Cloud Scheduler hourly.

PropertyValue
Auth RequiredYes
Sourcenotifications.py:553

POST /admin/jobs/process-queue

Process the notification queue.

Triggered by Cloud Scheduler every hour.

PropertyValue
Auth RequiredYes
Sourcenotifications.py:509

POST /admin/jobs/trial-check

Check for expiring trials and queue notifications.

Triggered by Cloud Scheduler daily at 6 AM ET.

PropertyValue
Auth RequiredYes
Sourcenotifications.py:520

GET /admin/notifications/

List all notification types in the registry.

Returns summary view of each notification.

PropertyValue
Auth RequiredYes
Request BodyOptional
Sourcenotifications_admin.py:142

Parameters:

NameTypeRequiredDefaultDescription
typeoptionalNoNoneFilter by type
enabledoptionalNoNoneFilter by enabled status

POST /admin/notifications/

Create a new notification type.

The notification ID must be unique and follow snake_case naming.

PropertyValue
Auth RequiredYes
Request BodyNotificationCreate
ResponseNotificationDetail
Sourcenotifications_admin.py:289

Parameters:

NameTypeRequiredDefaultDescription
createnotificationcreateYes--

GET /admin/notifications/analytics/overview

Get overview analytics for all notifications.

PropertyValue
Auth RequiredYes
Sourcenotifications_admin.py:475

Parameters:

NameTypeRequiredDefaultDescription
daysintNo7Number of days to analyze

GET /admin/notifications/export

Export the entire notification registry as JSON.

PropertyValue
Auth RequiredYes
Sourcenotifications_admin.py:542

POST /admin/notifications/import

Import notification definitions from JSON.

By default, replaces all notifications. Use merge=True to only add/update.

PropertyValue
Auth RequiredYes
Request Bodydict
Sourcenotifications_admin.py:558

Parameters:

NameTypeRequiredDefaultDescription
datadictYes--
mergeboolNoFalseMerge with existing (vs replace)

GET /admin/notifications/stats

Get aggregate notification statistics.

PropertyValue
Auth RequiredYes
Sourcenotifications.py:564

GET /admin/notifications/summary

Get summary statistics of the notification registry.

PropertyValue
Auth RequiredYes
ResponseRegistrySummary
Sourcenotifications_admin.py:185

GET /admin/notifications/table

Get formatted table view of all notifications (text/plain).

PropertyValue
Auth RequiredYes
Sourcenotifications_admin.py:193

POST /admin/notifications/test

Send a test notification to a specific email.

Bypasses user preferences and rate limits (force=True).

PropertyValue
Auth RequiredYes
Request BodySendTestRequest
Sourcenotifications_admin.py:362

DELETE /admin/notifications/{notification_id}

Delete a notification type.

WARNING: This removes the notification definition. Any scheduled sends will fail.

PropertyValue
Auth RequiredYes
Sourcenotifications_admin.py:336

Parameters:

NameTypeRequiredDefaultDescription
notification_idstrYes--

GET /admin/notifications/{notification_id}

Get full details of a notification.

PropertyValue
Auth RequiredYes
ResponseNotificationDetail
Sourcenotifications_admin.py:202

Parameters:

NameTypeRequiredDefaultDescription
notification_idstrYes--

PUT /admin/notifications/{notification_id}

Update a notification's settings.

Only provided fields are updated.

PropertyValue
Auth RequiredYes
Request BodyNotificationUpdate
ResponseNotificationDetail
Sourcenotifications_admin.py:222

Parameters:

NameTypeRequiredDefaultDescription
notification_idstrYes--
updatenotificationupdateYes--

POST /admin/notifications/{notification_id}/disable

Disable a notification.

PropertyValue
Auth RequiredYes
Sourcenotifications_admin.py:267

Parameters:

NameTypeRequiredDefaultDescription
notification_idstrYes--

POST /admin/notifications/{notification_id}/enable

Enable a notification.

PropertyValue
Auth RequiredYes
Sourcenotifications_admin.py:249

Parameters:

NameTypeRequiredDefaultDescription
notification_idstrYes--

GET /admin/notifications/{notification_id}/stats

Get analytics for a specific notification type.

PropertyValue
Auth RequiredYes
Sourcenotifications_admin.py:411

Parameters:

NameTypeRequiredDefaultDescription
notification_idstrYes--
daysintNo7Number of days to analyze

Other

POST /hbs/survey

Submit monthly HBS feedback survey.

Required for continued free access. Surveys can only be submitted once per calendar month.

PropertyValue
Auth RequiredYes
Request BodyHBSSurveyRequest
Sourcehbs.py:108

POST /hbs/verify

Verify HBS student email for free tier access.

Validates email matches @mbaYYYY.hbs.edu pattern where YYYY is current year or future (valid graduation year).

PropertyValue
Auth RequiredNo
Request BodyHBSVerifyRequest
Sourcehbs.py:68

GET /track/click/{tracking_id}

Click tracking endpoint.

Called when user clicks a tracked link. Records the click and redirects to the original URL.

PropertyValue
Auth RequiredNo
Sourcenotifications.py:337

Parameters:

NameTypeRequiredDefaultDescription
tracking_idstrYes--
urlstrNoEllipsisBase64-encoded destination URL

GET /track/open/{tracking_id}.png

Tracking pixel endpoint.

Called when email is opened (image loads). Records the open event and returns a 1x1 transparent PNG.

PropertyValue
Auth RequiredNo
Sourcenotifications.py:304

Parameters:

NameTypeRequiredDefaultDescription
tracking_idstrYes--

GET /unsubscribe/{token}

One-click unsubscribe endpoint (GET for email client compatibility).

Returns a simple HTML page confirming the unsubscription.

PropertyValue
Auth RequiredNo
Request BodyOptional
Sourcenotifications.py:454

Parameters:

NameTypeRequiredDefaultDescription
tokenstrYes--
categoryoptionalNoNone-

Get legal entity information.

Returns structured information about Harris Capital Management LLC, the legal entity operating Firmhound. Returns: json { "legal_name": "Harris Capital Management LLC", "entity_type": "Limited Liability Company", "state_of_formation": "Wyoming", "entity_id": "2025-001685419", "status": "Active", "contact": { "legal": "legal@firmhound.com", "privacy": "privacy@firmhound.com", "support": "support@firmhound.com" } }

PropertyValue
Auth RequiredNo
Sourcelegal.py:108

Get the Privacy Policy (when available).

Status: Not yet implemented Planned: Will return full Privacy Policy in Markdown format

PropertyValue
Auth RequiredNo
Sourcelegal.py:94

Get the API Terms of Service.

Returns the full Terms of Service document in Markdown format. This is the same document available at docs/legal/api-terms-of-service.md Use this endpoint to: - Display ToS in your application - Verify current terms before accepting - Archive ToS versions for compliance Returns: Full ToS document (Markdown)

PropertyValue
Auth RequiredNo
Sourcelegal.py:35

Get current ToS version metadata.

Returns structured version information without the full document. Useful for checking if terms have been updated. Returns: json { "version": "1.0", "effective_date": "2026-01-01", "last_updated": "2025-12-11" }

PropertyValue
Auth RequiredNo
Sourcelegal.py:53

Firmhound API Documentation