Skip to content

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

{
  "detail": "Quarter must be 1, 2, 3, or 4"
}

402 Payment Required

{
  "x402Version": 1,
  "error": "X-PAYMENT header is required",
  "accepts": [...]
}

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

  1. Cache Transcripts: Transcripts don't change once published - cache results locally
  2. Batch Requests: Request invoices for multiple transcripts, then pay and fetch efficiently
  3. Error Handling: Always handle 402 responses to get payment requirements
  4. Network Selection: Choose network based on your wallet/capabilities (Base or Solana)
  5. 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