Skip to main content
Skip to content

API Documentation

Complete reference for the Marlowe Research REST API

Authentication
All API requests require authentication via Bearer token

Include your API key in the Authorization header:

Authorization: Bearer mk_live_your_api_key_here

Important: Keep your API key secret. Never expose it in client-side code or public repositories.

Rate Limiting
API requests are rate limited per key

Rate limits are configured per API key (default: 100 requests/minute). When exceeded, you'll receive a 429 response:

{
  "error": "Rate Limit Exceeded",
  "message": "Too many requests. Please wait before trying again.",
  "retryAfter": 60
}
Endpoints
Available API endpoints and their permissions
GET/api/v1/health

Check API health status

GET/api/v1/searchsearch

Search for companies by name or symbol

Parameters:

q(string)required- Search query
limit(number)- Max results (default 10, max 50)
GET/api/v1/profile/:symbolanalysis

Get company profile information

GET/api/v1/executives/:symbolanalysis

Get key executives for a company

GET/api/v1/analysis/:symbolanalysis

Get full management analysis for a symbol

GET/api/v1/analysis/:symbol/scoreanalysis

Get management score breakdown

POST/api/v1/analysis/:symbolanalysis

Trigger a new analysis for a symbol

GET/api/v1/history/:symbolanalysis

Get analysis history for a symbol

Parameters:

limit(number)- Max results (default 10, max 100)
GET/api/v1/watchlistwatchlist

Get your watchlist

GET/api/v1/microstructure/:symbolmicrostructure

Get market microstructure data (Databento)

GET/api/v1/batch/scoresanalysis

Get scores for multiple symbols

Parameters:

symbols(string)required- Comma-separated symbols (max 10)
Example Responses
{
  "success": true,
  "symbol": "AAPL",
  "companyName": "Apple Inc.",
  "overallScore": 78,
  "analysis": {
    "ceo": "Tim Cook",
    "marketCap": 2850000000000,
    "insiderOwnershipPct": 0.07,
    "executives": [...],
    "questionScores": [...]
  },
  "analyzedAt": "2025-01-10T14:30:00.000Z"
}
Symbol Scoping
Restrict API keys to specific symbols for security

When creating an API key, you can optionally restrict it to specific stock symbols. This is useful for:

  • Limiting third-party integrations to only the symbols they need
  • Creating separate keys for different portfolios or clients
  • Reducing risk if a key is compromised

If a key with symbol restrictions tries to access a non-allowed symbol, it will receive a 403 Forbidden response:

{
  "error": "Forbidden",
  "message": "This API key is not authorized to access symbol 'MSFT'. Allowed symbols: AAPL, GOOGL"
}
Webhooks
Get notified when analysis completes or scores change

Configure webhooks to receive real-time notifications when:

  • analysis.completed - A new analysis finishes for a watched symbol
  • score.changed - A symbol's management score changes significantly
  • alert.triggered - A custom alert condition is met

Webhook payloads include a signature header for verification:

POST /your-webhook-endpoint
X-Webhook-Signature: sha256=abc123...
Content-Type: application/json

{
  "event": "analysis.completed",
  "symbol": "AAPL",
  "score": 78,
  "previousScore": 75,
  "timestamp": "2025-01-10T14:30:00.000Z"
}
Python SDK
Official Python client for the Marlowe Research API

Install the official Python SDK:

pip install marlowe-research

Quick start:

from marlowe_research import MarloweClient

client = MarloweClient(api_key="mk_live_your_api_key")

# Search for companies
results = client.search("Apple")
for company in results:
    print(f"{company.symbol}: {company.name}")

# Get management analysis
analysis = client.get_analysis("AAPL")
print(f"Score: {analysis.overall_score} ({analysis.grade})")

# Compare multiple companies
comparison = client.compare(["AAPL", "MSFT", "GOOGL"])
for symbol, score in sorted(comparison.items(), key=lambda x: x[1].overall_score, reverse=True):
    print(f"{symbol}: {score.overall_score}")

# Screen for high-quality management
top_companies = client.screen(["AAPL", "MSFT", "GOOGL", "META"], min_score=75)
for company in top_companies:
    print(f"{company.symbol}: {company.overall_score}")

The SDK provides typed data models, automatic retries, and comprehensive error handling.