Earnings Transcripts
Earnings Call Transcripts¶
Bridge402 Finance provides access to quarterly earnings call transcripts from public companies through an x402-payment-protected API endpoint.
Overview¶
The earnings transcripts service bridges premium financial data (typically behind paid subscriptions) to Web3 applications and AI agents through crypto payments. This enables autonomous agents and decentralized applications to access professional-grade financial analysis data.
Primary Use Case: AI agents can use earnings transcripts to perform mention-market analysis on publicly traded companies. By pulling recent transcripts and comparing executive commentary, forward guidance, and management statements with prediction market odds, AI agents can develop sophisticated betting strategies that identify discrepancies between market expectations and actual company performance indicators.
Use Cases¶
- AI Mention-Market Analysis: AI agents analyze earnings transcripts to identify key mentions, forward guidance, and management sentiment, then compare these insights against prediction market odds to develop betting strategies on publicly traded companies
 - Prediction Market Strategy: Cross-reference executive commentary and company guidance from transcripts with prediction market probabilities to find arbitrage opportunities and mispriced outcomes
 - DeFi Integration: Build automated trading strategies that combine transcript analysis with on-chain prediction markets
 - Research Automation: Automate research workflows without traditional API subscriptions
 - Decentralized Analytics: Create on-chain analytics tools that leverage earnings data
 
API Endpoint¶
Get Earnings Transcript¶
POST /earnings-transcript
Retrieve earnings call transcripts from public companies.
Base URL: https://bridge402.tech
Query Parameters:
| Parameter | Type | Required | Description | Example | 
|---|---|---|---|---|
symbol | 
string | Yes | Stock symbol (NYSE/NASDAQ) | AAPL, MSFT, TSLA | 
year | 
integer | Yes | Year of earnings call | 2024 (2000-2030) | 
quarter | 
integer | Yes | Quarter number | 1, 2, 3, or 4 | 
network | 
string | No | Payment network preference | base or sol/solana | 
Headers:
| Header | Type | Required | Description | 
|---|---|---|---|
X-PAYMENT | 
string | Yes* | Base64-encoded x402 payment data | 
*Required for access. If omitted, returns payment invoice (402 response).
Request Examples¶
Get Payment Invoice (Without Payment)¶
curl -X POST "https://bridge402.tech/earnings-transcript?symbol=AAPL&year=2024&quarter=1&network=sol"
Response (402 Payment Required):
{
  "x402Version": 1,
  "error": "X-PAYMENT header is required",
  "accepts": [
    {
      "scheme": "exact",
      "network": "solana",
      "maxAmountRequired": "50000",
      "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
      "payTo": "BjxbJg48jQmoBLJnRunB1CMY5SZwvcUmnXCaWNeSXBei",
      "resource": "https://bridge402.tech/earnings-transcript",
      "description": "Access to AAPL Q1 2024 earnings call transcript [Solana/USDC]",
      "mimeType": "application/json",
      "maxTimeoutSeconds": 120,
      "extra": {
        "product": "Bridge402 Finance — Earnings Transcript (Solana)",
        "symbol": "AAPL",
        "year": 2024,
        "quarter": 1,
        "provider": "Bridge402 Finance",
        "feePayer": "2wKupLR9q6wXYppw8Gr2NvWxKBUqm4PPJKkQfoxHDBg4"
      }
    }
  ],
  "symbol": "AAPL",
  "year": 2024,
  "quarter": 1
}
Get Transcript with Payment¶
curl -X POST "https://bridge402.tech/earnings-transcript?symbol=AAPL&year=2024&quarter=1&network=sol" \
  -H "X-PAYMENT: <base64-encoded-x402-payment>"
Response (200 Success):
The successful response returns an array of transcript objects. Example response:
[
  {
    "symbol": "TSLA",
    "period": "Q1",
    "year": 2024,
    "date": "2024-04-23",
    "content": "Martin Viecha: Tesla's First Quarter 2024 Q&A Webcast. My name is Martin Viecha, VP of Investor Relations, and I'm joined today by Elon Musk, Vaibhav Taneja, and a number of other executives. Our Q1 results were announced at about 3.00 p.m. Central Time in the Update Deck we published at the same link as this webcast. During this call, we will discuss our..."
  }
]
Response Fields:
| Field | Type | Description | 
|---|---|---|
symbol | 
string | Stock ticker symbol (e.g., TSLA, AAPL) | 
period | 
string | Quarter period (Q1, Q2, Q3, Q4) | 
year | 
integer | Year of the earnings call | 
date | 
string | Date of the earnings call (YYYY-MM-DD format) | 
content | 
string | Full transcript content | 
Complete Response with Payment Verification:
{
  "transcripts": [
    {
      "symbol": "TSLA",
      "period": "Q1",
      "year": 2024,
      "date": "2024-04-23",
      "content": "Martin Viecha: Tesla's First Quarter 2024 Q&A Webcast..."
    }
  ],
  "payment": {
    "verified": true,
    "settled": true,
    "txHash": "0x9abc...",
    "network": "solana"
  },
  "metadata": {
    "provider": "Bridge402 Finance",
    "endpoint": "earning-call-transcript",
    "timestamp": 1703123456.789
  }
}
Pricing¶
- Cost: $0.05 USDC per transcript (50,000 atomic units)
 - Payment Networks: Base or Solana (USDC)
 - No Subscription Required: Pay-per-use model perfect for AI agents and intermittent access
 
Integration Examples¶
Python Example¶
import asyncio
import httpx
async def get_earnings_transcript(symbol: str, year: int, quarter: int, payment_data: str):
    """Get earnings transcript with x402 payment"""
    async with httpx.AsyncClient() as client:
        response = await client.post(
            "https://bridge402.tech/earnings-transcript",
            params={
                "symbol": symbol,
                "year": year,
                "quarter": quarter,
                "network": "sol"  # or "base"
            },
            headers={"X-PAYMENT": payment_data}
        )
        if response.status_code == 200:
            data = response.json()
            # Response may be an array of transcripts or object with transcripts key
            if isinstance(data, list):
                transcripts = data
            elif isinstance(data, dict) and "transcripts" in data:
                transcripts = data["transcripts"]
            else:
                transcripts = [data] if isinstance(data, dict) else data
            return transcripts
        elif response.status_code == 402:
            # Payment required - get invoice
            invoice = response.json()
            print(f"Payment required: {invoice['accepts'][0]['maxAmountRequired']} atomic units")
            return invoice
        else:
            raise Exception(f"Request failed: {response.status_code} - {response.text}")
# Usage
transcripts = await get_earnings_transcript("TSLA", 2024, 1, "<your-x402-payment>")
if transcripts and len(transcripts) > 0:
    first_transcript = transcripts[0]
    print(f"Symbol: {first_transcript['symbol']}")
    print(f"Date: {first_transcript['date']}")
    print(f"Content preview: {first_transcript['content'][:200]}...")
JavaScript/Node.js Example¶
import { request } from 'undici';
async function getEarningsTranscript(symbol, year, quarter, paymentData) {
    const url = `https://bridge402.tech/earnings-transcript?symbol=${symbol}&year=${year}&quarter=${quarter}&network=sol`;
    const res = await request(url, {
        method: 'POST',
        headers: {
            'X-PAYMENT': paymentData
        }
    });
    const data = await res.body.json();
    // Handle array response or object with transcripts key
    let transcripts = [];
    if (Array.isArray(data)) {
        transcripts = data;
    } else if (data.transcripts) {
        transcripts = data.transcripts;
    } else if (data.symbol) {
        transcripts = [data];
    }
    return transcripts;
}
// Usage
const transcripts = await getEarningsTranscript('TSLA', 2024, 1, '<your-x402-payment>');
if (transcripts.length > 0) {
    const transcript = transcripts[0];
    console.log(`Symbol: ${transcript.symbol}`);
    console.log(`Date: ${transcript.date}`);
    console.log(`Period: ${transcript.period}`);
    console.log(`Content: ${transcript.content.substring(0, 200)}...`);
}
Batch Processing¶
For processing multiple transcripts, request invoices first, then make payments for each:
companies = [
    {"symbol": "AAPL", "year": 2024, "quarter": 1},
    {"symbol": "MSFT", "year": 2024, "quarter": 1},
    {"symbol": "GOOGL", "year": 2024, "quarter": 1},
]
async def batch_transcripts(companies):
    results = []
    for company in companies:
        # Get invoice
        invoice = await get_invoice(**company)
        # Generate payment for invoice
        payment = await create_payment(invoice)
        # Get transcript
        transcript = await get_earnings_transcript(
            company["symbol"],
            company["year"],
            company["quarter"],
            payment
        )
        results.append(transcript)
    return results
Error Handling¶
Common Errors¶
400 Bad Request
402 Payment Required
404 Not Found - Transcript may not exist for the specified symbol/year/quarter - Check that the company has public earnings calls
500 Internal Server Error - Upstream API may be unavailable - Retry the request
Response Format¶
Transcript Object Structure¶
Each transcript in the response array contains:
- symbol: Stock ticker symbol (e.g., "TSLA", "AAPL")
 - period: Quarter identifier (e.g., "Q1", "Q2", "Q3", "Q4")
 - year: Year of the earnings call (integer)
 - date: Call date in YYYY-MM-DD format
 - content: Complete transcript text with speaker names and full conversation
 
Example Transcript Structure¶
{
  "symbol": "TSLA",
  "period": "Q1",
  "year": 2024,
  "date": "2024-04-23",
  "content": "Martin Viecha: Tesla's First Quarter 2024 Q&A Webcast..."
}
The content field contains the full transcript including:
- Speaker names (e.g., "Martin Viecha:", "Elon Musk:")
- Executive commentary
- Analyst questions
- Management responses
- Discussion topics
Best Practices¶
- Cache Transcripts: Transcripts don't change once published - cache results locally
 - Batch Requests: Request invoices for multiple transcripts, then pay and fetch efficiently
 - Error Handling: Always handle 402 responses to get payment requirements
 - Network Selection: Choose network based on your wallet/capabilities (Base or Solana)
 - Validation: Check transcript availability before processing payment
 
Use Cases for AI Agents¶
Mention-Market Analysis & Prediction Market Strategy¶
AI agents can use earnings transcripts to perform mention-market analysis and develop betting strategies by comparing executive commentary against prediction market odds:
async def mention_market_analysis(symbol: str, year: int, quarter: int, prediction_market_odds: dict):
    """
    AI agent workflow for mention-market analysis on publicly traded companies.
    Compares earnings transcript insights with prediction market odds to develop betting strategies.
    """
    # 1. Get recent earnings transcript
    transcripts = await get_earnings_transcript(symbol, year, quarter, payment)
    if not transcripts or len(transcripts) == 0:
        return None
    transcript = transcripts[0]
    content = transcript['content']
    # 2. Extract key mentions and forward guidance using LLM
    mentions = await extract_mentions(content, [
        "revenue guidance",
        "earnings projections",
        "growth targets",
        "market expansion",
        "product launches",
        "strategic initiatives"
    ])
    # 3. Analyze sentiment and quantitative targets
    sentiment_analysis = await analyze_sentiment(content)
    forward_guidance = await extract_forward_guidance(content)
    # 4. Compare transcript insights with prediction market odds
    discrepancies = []
    for outcome, market_odds in prediction_market_odds.items():
        # Check if transcript mentions support or contradict market expectations
        transcript_signal = evaluate_outcome_against_transcript(outcome, mentions, forward_guidance)
        if transcript_signal['confidence'] > 0.7:
            # Calculate value based on discrepancy
            value = calculate_arbitrage_value(
                transcript_signal['probability'],
                market_odds['probability']
            )
            if abs(value) > 0.1:  # 10% discrepancy threshold
                discrepancies.append({
                    "outcome": outcome,
                    "market_probability": market_odds['probability'],
                    "transcript_probability": transcript_signal['probability'],
                    "value": value,
                    "recommendation": "BUY" if value > 0 else "SELL"
                })
    # 5. Generate betting strategy
    return {
        "symbol": symbol,
        "date": transcript['date'],
        "period": transcript['period'],
        "key_mentions": mentions,
        "sentiment": sentiment_analysis,
        "forward_guidance": forward_guidance,
        "prediction_market_discrepancies": discrepancies,
        "recommended_actions": rank_betting_opportunities(discrepancies)
    }
Prediction Market Bot Integration¶
// AI agent that compares earnings transcripts with prediction market odds
async function predictionMarketStrategy(symbol, predictionMarketAPI) {
    // Get latest earnings transcript
    const latestQuarter = getLatestQuarter();
    const transcripts = await getEarningsTranscript(
        symbol,
        latestQuarter.year,
        latestQuarter.quarter,
        paymentData
    );
    if (!transcripts || transcripts.length === 0) {
        return null;
    }
    const transcript = transcripts[0];
    // Analyze transcript for key signals
    const analysis = await analyzeTranscript(transcript.content, {
        extractGuidance: true,
        sentimentAnalysis: true,
        mentionExtraction: true
    });
    // Get current prediction market odds
    const marketOdds = await predictionMarketAPI.getOdds(symbol);
    // Compare transcript insights with market expectations
    const opportunities = [];
    for (const [outcome, odds] of Object.entries(marketOdds)) {
        const transcriptProbability = evaluateAgainstTranscript(outcome, analysis);
        const marketProbability = odds.probability;
        const edge = transcriptProbability - marketProbability;
        if (Math.abs(edge) > 0.15) {  // 15% edge threshold
            opportunities.push({
                outcome,
                marketProbability,
                transcriptProbability,
                edge,
                expectedValue: calculateEV(edge, odds.payout)
            });
        }
    }
    // Generate betting recommendations
    return opportunities
        .sort((a, b) => b.expectedValue - a.expectedValue)
        .slice(0, 5);  // Top 5 opportunities
}
Basic Transcript Analysis¶
async def analyze_earnings(symbol: str, year: int, quarter: int):
    """Basic AI agent workflow for earnings analysis"""
    # 1. Get transcript
    transcripts = await get_earnings_transcript(symbol, year, quarter, payment)
    if not transcripts or len(transcripts) == 0:
        return None
    transcript = transcripts[0]
    # 2. Extract key metrics and insights
    content = transcript['content']
    insights = await analyze_with_ai(content)
    return {
        "symbol": symbol,
        "date": transcript['date'],
        "period": transcript['period'],
        "insights": insights,
        "source": "Bridge402 Finance"
    }
Support¶
For questions about earnings transcripts or integration help, refer to: - Payment Integration Guide - Examples - Contact the Bridge402 development team