Skip to main content
POST
/
v1
/
feed
POST /v1/feed
curl --request POST \
  --url https://api.fintool.com/v1/feed
{
  "error": {
    "code": "invalid_request",
    "message": "Missing required field: tickers"
  }
}

Overview

Retrieve a structured feed of company documents, earnings reports, news, press releases, and other financial content. The endpoint returns organized updates with citations and key highlights.

Request

tickers
array
required
Array of stock ticker symbols to retrieve feeds for (e.g., ["DUOL", "TSLA"])
doc_types
array
Filter by document types. If omitted, returns all types.Available types:
  • 10-K - Annual reports
  • 10-Q - Quarterly reports
  • 8-K - Current reports (material events)
  • EARNINGS_CALL - Earnings call transcripts
  • NEWS - News articles
  • PRESS_RELEASE - Company press releases
  • PRESENTATION - Company presentations
start_date
string
Filter documents from this date forward (ISO 8601 format: YYYY-MM-DD)
end_date
string
Filter documents up to this date (ISO 8601 format: YYYY-MM-DD)
limit
number
default:50
Maximum number of feed items to return (1-100)

Request Example

curl -X POST https://api.fintool.com/v1/feed \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tickers": ["DUOL"],
    "doc_types": ["EARNINGS_CALL", "8-K", "NEWS"],
    "start_date": "2025-10-01",
    "limit": 10
  }'

Response

items
array
Array of feed items sorted by date (newest first)
total_items
number
Total number of items returned
date_range
object

Response Example

{
  "items": [
    {
      "ticker": "DUOL",
      "company_name": "Duolingo",
      "title": "Duolingo Reports Strong Q3 2025 and Prioritizes Long-Term User Growth",
      "date": "2025-11-05T14:30:00Z",
      "doc_type": "EARNINGS_CALL",
      "categories": ["Earnings", "New Projects/Investments", "Guidance Update"],
      "stock_change": {
        "percentage": -0.79,
        "direction": "down"
      },
      "sentiment": "positive",
      "highlights": [
        {
          "text": "Duolingo achieved strong Q3 2025 results, reporting 36% year-over-year daily active user (DAU) growth and guiding to nearly $1.2 billion in bookings for the year, a 33% increase, with an adjusted EBITDA margin of 29%.",
          "citations": [
            {
              "source": "Earnings Transcript",
              "chunk_id": "duol_q3_2025_earnings_001"
            }
          ]
        },
        {
          "text": "The company is implementing a durable strategic shift to prioritize long-term user growth and teaching efficacy over short-term monetization, driven by the significant opportunity in AI-powered education.",
          "citations": [
            {
              "source": "Earnings Transcript",
              "chunk_id": "duol_q3_2025_earnings_045"
            },
            {
              "source": "Earnings Transcript",
              "chunk_id": "duol_q3_2025_earnings_067"
            }
          ]
        },
        {
          "text": "This reprioritization is expected to lead to some deceleration in bookings and revenue growth in Q4 and potentially into 2026, as resources are reallocated towards product innovation and user acquisition.",
          "citations": [
            {
              "source": "Earnings Transcript",
              "chunk_id": "duol_q3_2025_earnings_089"
            }
          ]
        },
        {
          "text": "Product developments include expanding content for the top nine languages to a professional proficiency level, introducing guided video calls, and enhancing math and music courses.",
          "citations": [
            {
              "source": "Earnings Transcript",
              "chunk_id": "duol_q3_2025_product_012"
            }
          ]
        },
        {
          "text": "The chess course is the fastest-growing, with player-versus-player (PVP) functionality rolling out.",
          "citations": [
            {
              "source": "Earnings Transcript",
              "chunk_id": "duol_q3_2025_product_034"
            }
          ]
        },
        {
          "text": "Max subscribers now constitute 9% of total subscribers, with bookings doubling year-over-year in Q3, and Max renewals are performing slightly better than Super subscribers.",
          "citations": [
            {
              "source": "Earnings Transcript",
              "chunk_id": "duol_q3_2025_metrics_056"
            }
          ]
        }
      ]
    }
  ],
  "total_items": 1,
  "date_range": {
    "start": "2025-10-01",
    "end": "2025-11-14"
  }
}

Use Cases

Company Intelligence

Monitor multiple companies for material events and updates

Investment Research

Track earnings, guidance, and strategic initiatives

News Aggregation

Build custom financial news feeds for your users

Alert Systems

Create alerts for specific document types or events

Filtering Strategies

By Document Type

# Get only earnings-related content
payload = {
    "tickers": ["AAPL", "MSFT"],
    "doc_types": ["EARNINGS_CALL", "8-K"],
    "limit": 20
}

By Date Range

# Get last 30 days of updates
from datetime import datetime, timedelta

end_date = datetime.now()
start_date = end_date - timedelta(days=30)

payload = {
    "tickers": ["TSLA"],
    "start_date": start_date.strftime("%Y-%m-%d"),
    "end_date": end_date.strftime("%Y-%m-%d")
}

Multiple Tickers

# Monitor a portfolio of companies
payload = {
    "tickers": ["AAPL", "MSFT", "GOOGL", "AMZN", "META"],
    "doc_types": ["EARNINGS_CALL", "NEWS", "PRESS_RELEASE"],
    "limit": 50
}

Categories

Feed items are automatically categorized based on content:
  • Earnings - Financial results and metrics
  • Guidance Update - Forward-looking statements
  • New Projects/Investments - Strategic initiatives
  • Leadership Changes - Executive appointments/departures
  • Product Launches - New products or features
  • Regulatory - Legal and compliance updates
  • Mergers & Acquisitions - M&A activity
  • Financial - Financing, dividends, buybacks

Pagination

For large result sets, use date-based pagination:
# First request
response1 = requests.post(url, json={
    "tickers": ["AAPL"],
    "limit": 50
})

# Get the oldest date from first batch
oldest_date = response1.json()["items"][-1]["date"]

# Second request - get older items
response2 = requests.post(url, json={
    "tickers": ["AAPL"],
    "end_date": oldest_date,
    "limit": 50
})

Error Responses

{
  "error": {
    "code": "invalid_request",
    "message": "Missing required field: tickers"
  }
}

Best Practices

For optimal performance, request feeds for 5-10 tickers at a time. For larger portfolios, make multiple parallel requests.
Narrow date ranges improve response times. For real-time monitoring, query the last 7-30 days rather than all historical data.
Feed content doesn’t change frequently. Cache responses for at least 15 minutes to reduce API calls.
Specify only the document types you need. This reduces processing time and returns more focused results.
Use categories to filter and prioritize feed items programmatically based on your use case.

Integration Example

Here’s a complete example of building a company monitoring dashboard:
import requests
from datetime import datetime, timedelta

class FintoolFeedMonitor:
    def __init__(self, api_key):
        self.api_key = api_key
        self.base_url = "https://api.fintool.com/v1/feed"

    def get_portfolio_feed(self, tickers, days=7):
        """Get feed for a portfolio of tickers"""
        end_date = datetime.now()
        start_date = end_date - timedelta(days=days)

        response = requests.post(
            self.base_url,
            headers={
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json"
            },
            json={
                "tickers": tickers,
                "doc_types": ["EARNINGS_CALL", "8-K", "NEWS"],
                "start_date": start_date.strftime("%Y-%m-%d"),
                "limit": 100
            }
        )

        return response.json()["items"]

    def filter_by_category(self, items, category):
        """Filter feed items by category"""
        return [
            item for item in items
            if category in item.get("categories", [])
        ]

    def get_earnings_updates(self, tickers):
        """Get only earnings-related updates"""
        items = self.get_portfolio_feed(tickers, days=90)
        return self.filter_by_category(items, "Earnings")

# Usage
monitor = FintoolFeedMonitor("YOUR_API_KEY")

# Monitor tech portfolio
tech_stocks = ["AAPL", "MSFT", "GOOGL", "META", "AMZN"]
recent_updates = monitor.get_portfolio_feed(tech_stocks, days=7)

# Get earnings updates only
earnings = monitor.get_earnings_updates(tech_stocks)

for item in earnings:
    print(f"\n{item['company_name']} - {item['title']}")
    print(f"Date: {item['date']}")
    print(f"Stock: {item['stock_change']['percentage']}%")
    print("\nKey Highlights:")
    for highlight in item['highlights'][:3]:  # Top 3 highlights
        print(f"  • {highlight['text']}")

Next Steps