AGM Calendar & Governance API

Programmatic access to annual meeting dates, board profiles, vote outcomes, and institutional holder data for 5,000+ companies across 20 global indices.

13
Endpoints
5,000+
Companies
20
Indices
25,000
Requests / Day
AGM Monitor API
Full programmatic access to AGM calendar data, governance intelligence, board profiles, vote results, institutional holders, and proxy voting data.
Contact Us
25,000 requests / day
  • AGM dates for 5,000+ companies
  • 20 indices across 16 countries
  • Governance timeline (record dates, deadlines)
  • Board of director profiles
  • Vote results & proposal outcomes
  • Institutional holders (top 50)
  • Proxy voting records (N-PX)
  • Governance practices & structures
  • Executive & director compensation
  • News, activism & peer benchmarking
  • Also available via MCP for AI agents
Contact Sales

Authentication

All API requests require a paid API key passed via the Authorization header. Contact sales to obtain your key.

Authorization: Bearer agm_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxx

Base URL

https://api.agmmonitor.com/v1

All endpoints return JSON with a standard response envelope:

{ "status": "ok", "data": { ... }, "meta": { "generated_at": "2026-03-05T12:00:00Z", "request_id": "req_abc123" } }

Endpoint Reference

Calendar Endpoints
GET /v1/indices

List all available indices with company counts and region info.

Example Response
{ "status": "ok", "data": { "indices": [ { "id": "sp500", "name": "S&P 500", "region": "us", "companies": 497 }, { "id": "russell3000", "name": "Russell 3000", "region": "us", "companies": 2942 }, { "id": "ftse100", "name": "FTSE 100", "region": "uk", "companies": 100 }, ... ] } }
GET /v1/calendar/{index}

Full AGM calendar for an index. Returns meeting dates, confidence levels, filing sources, and URLs for all companies in the index.

ParameterTypeDescription
indexpathIndex ID: sp500, russell3000, ftse100, ftse350, etc.
yearqueryFilter by meeting year (e.g. 2026)
sectorqueryFilter by sector (e.g. Information Technology)
confidencequeryFilter by confidence: confirmed, scheduled, predicted
meeting_afterqueryOnly meetings on or after this date (ISO 8601)
meeting_beforequeryOnly meetings on or before this date (ISO 8601)
limitqueryMax results (default: 100, max: 500)
offsetqueryPagination offset (default: 0)
# Get all S&P 500 AGM dates curl -H "Authorization: Bearer agm_live_your_api_key" \ "https://api.agmmonitor.com/v1/calendar/sp500" # Filter: confirmed 2026 meetings in tech sector curl -H "Authorization: Bearer agm_live_your_api_key" \ "https://api.agmmonitor.com/v1/calendar/sp500?year=2026&confidence=confirmed&sector=Information+Technology"
import requests API_KEY = "agm_live_your_api_key" headers = {"Authorization": f"Bearer {API_KEY}"} # Get S&P 500 AGM calendar response = requests.get( "https://api.agmmonitor.com/v1/calendar/sp500", headers=headers ) calendar = response.json() for company in calendar["data"]["companies"]: meeting = company["meetings"].get("2026", {}) if meeting: print(f"{company['ticker']}: {meeting['meeting_date']} ({meeting['confidence']})")
const API_KEY = "agm_live_your_api_key"; const response = await fetch( "https://api.agmmonitor.com/v1/calendar/sp500", { headers: { "Authorization": `Bearer ${API_KEY}` } } ); const { data } = await response.json(); data.companies.forEach(company => { const meeting = company.meetings["2026"]; if (meeting) { console.log(`${company.ticker}: ${meeting.meeting_date} (${meeting.confidence})`); } });
Example Response
{ "status": "ok", "data": { "index": "sp500", "company_count": 497, "companies": [ { "ticker": "AAPL", "company_name": "Apple Inc.", "cik": "320193", "sector": "Information Technology", "meetings": { "2025": { "meeting_date": "2025-02-25", "source": "8K_5.07", "confidence": "confirmed", "meeting_type": "annual", "filing_url": "https://www.sec.gov/Archives/edgar/..." }, "2026": { "meeting_date": "2026-02-24", "source": "8K_5.07", "confidence": "confirmed", "meeting_type": "annual", "filing_url": "https://www.sec.gov/Archives/edgar/..." } } }, ... ] } }
GET /v1/calendar/{index}/{ticker}

AGM data for a single company within an index. Returns all meeting years available.

ParameterTypeDescription
indexpathIndex ID (e.g. sp500)
tickerpathCompany ticker (e.g. AAPL)
Example Response
{ "status": "ok", "data": { "ticker": "AAPL", "company_name": "Apple Inc.", "cik": "320193", "sector": "Information Technology", "meetings": { "2025": { "meeting_date": "2025-02-25", "confidence": "confirmed", ... }, "2026": { "meeting_date": "2026-02-24", "confidence": "confirmed", ... } } } }
Governance Endpoints
GET /v1/governance/timeline/{ticker}

Governance timeline for a company: estimated record dates, 14a-8 shareholder proposal deadlines, nomination windows, and earnings dates.

Example Response
{ "status": "ok", "data": { "ticker": "AAPL", "record_date": { "value": "2026-01-02", "confidence": "confirmed" }, "proposal_deadline_14a8": { "value": "2025-09-25", "confidence": "confirmed" }, "nomination_window": { "open_date": "2025-10-27", "close_date": "2025-11-26", "confidence": "confirmed" }, "last_earnings": { "value": "2026-01-30", "confidence": "confirmed" }, "next_earnings": { "value": "2026-05-01", "confidence": "estimated" } } }
GET /v1/governance/board/{ticker}

Full board of directors profile: names, roles, tenure, committee membership, independence status, and meeting attendance.

curl -H "Authorization: Bearer agm_live_your_api_key" \ "https://api.agmmonitor.com/v1/governance/board/AAPL"
# Get Apple's board of directors response = requests.get( "https://api.agmmonitor.com/v1/governance/board/AAPL", headers=headers ) board = response.json()["data"] print(f"Board size: {board['board_size']}") for d in board["directors"]: print(f" {d['name']} - {d['role']} (since {d['tenure_start']})")
Example Response
{ "status": "ok", "data": { "ticker": "AAPL", "board_size": 8, "board_meetings_held": 5, "directors": [ { "name": "Tim Cook", "role": "CEO & Director", "age": 65, "tenure_start": 2011, "independent": false, "committees": [], "attendance_pct": 100 }, ... ], "source_filing": "DEF 14A", "source_filing_url": "https://www.sec.gov/..." } }
GET /v1/governance/practices/{ticker}

Corporate governance structure: voting standards, proxy access terms, board classification, special meeting rights, and supermajority requirements.

Example Response
{ "status": "ok", "data": { "ticker": "AAPL", "classified_board": false, "voting_standard": "Majority of votes cast", "proxy_access": { "enabled": true, "terms": "3% for 3 years, up to 20% of board" }, "independent_chair": true, "dual_class_shares": false, "special_meeting_rights": { "shareholders_can_call": true, "threshold": "10% of outstanding shares" } } }
GET /v1/governance/votes/{ticker}

Proxy vote results: proposal descriptions, management recommendations, vote counts, percentages, and outcomes for each ballot item.

ParameterTypeDescription
tickerpathCompany ticker (e.g. AAPL)
yearqueryMeeting year (default: most recent)
Example Response
{ "status": "ok", "data": { "ticker": "AAPL", "meeting_date": "2026-02-24", "proposals": [ { "proposal_number": 1, "description": "Election of Directors", "proposal_type": "director_election", "mgmt_recommendation": "FOR", "outcome": "passed", "pct_for": 96.3 }, ... ] } }
GET /v1/governance/holders/{ticker}

Top 50 institutional holders: shares held, ownership percentage, quarter-over-quarter changes, voting authority breakdown, and 13D/13G filing status.

Example Response
{ "status": "ok", "data": { "ticker": "AAPL", "total_institutional_pct": 73.8, "holders": [ { "rank": 1, "holder_name": "Vanguard Group Inc", "shares": 1303689219, "pct_shares_outstanding": 8.72, "shares_change_pct": 0.38, "change_type": "increased" }, ... ] } }
GET /v1/governance/proxy-votes/{ticker}

How top institutional investors actually voted on each ballot item, sourced from SEC Form N-PX filings. Includes management alignment analysis.

Example Response
{ "status": "ok", "data": { "ticker": "AAPL", "meeting_date": "2026-02-24", "voters": [ { "holder_name": "Vanguard Group Inc", "shares": 1303689219, "pct_shares": 8.72, "votes": [ { "proposal_number": 1, "how_voted": "FOR" }, { "proposal_number": 4, "how_voted": "AGAINST" } ] }, ... ] } }
Company Intelligence Endpoints
GET /v1/compensation/{ticker}

Executive and director compensation: summary compensation tables, say-on-pay history, compensation committee details, stock ownership guidelines, pay-for-performance analysis, and CEO pay ratio.

ParameterTypeDescription
tickerpathCompany ticker (e.g. AAPL)
sectionqueryOptional. Filter to a section: summary, directors, say_on_pay, committee, pay_performance
Example Response
{ "status": "ok", "data": { "ticker": "AAPL", "fiscal_year": "FY2024", "source_filing": "DEF 14A", "compensation_consultant": { "name": "Semler Brossy Consulting Group LLC", "independent": true }, "executives": [ { "name": "Tim Cook", "title": "CEO", "salary": 3000000, "stock_awards": 49998000, "non_equity_incentive": 12000000, "total": 66070000 }, ... ], "say_on_pay": [ { "year": 2025, "support_pct": 90.2, "outcome": "passed" }, { "year": 2024, "support_pct": 64.7, "outcome": "passed" } ], "ceo_pay_ratio": 672, "median_employee_pay": 94118 } }
GET /v1/news/{ticker}

Recent company news: headlines, summaries, sources, publication dates, and categories. Covers earnings, governance events, M&A, leadership changes, and more.

ParameterTypeDescription
tickerpathCompany ticker (e.g. AAPL)
limitqueryMax articles to return (default: 20, max: 50)
Example Response
{ "status": "ok", "data": { "ticker": "AAPL", "article_count": 10, "articles": [ { "headline": "Apple Reports Record Q1 FY2026 Revenue of $143.8 Billion", "summary": "Apple posted record quarterly revenue of $143.8B, up 16% YoY...", "source": "Apple Newsroom", "datetime": 1738108800, "category": "company", "url": "https://www.apple.com/newsroom/..." }, ... ] } }
GET /v1/activism/{ticker}

Activist campaigns targeting a company: activist identity, campaign timeline, demands, outcomes, stake percentages, related SEC filings, and media coverage.

ParameterTypeDescription
tickerpathCompany ticker (e.g. AAPL)
statusqueryFilter by campaign status: active, settled, or all (default)
Example Response
{ "status": "ok", "data": { "ticker": "AAPL", "campaigns": [ { "activist": "National Center for Public Policy Research", "activist_type": "institutional_investor", "campaign_start": "2023-01-10", "campaign_end": "2024-02-28", "status": "settled", "stake_pct": 0.01, "demands": [ "Publish third-party audit of AI systems", "Disclose whether DEI programs involve discrimination" ], "outcome": "Proposals received under 5% support and were defeated.", "filings": [ { "type": "DEF 14A", "date": "2023-01-10", "url": "https://sec.gov/..." } ] }, ... ] } }
GET /v1/peers/{ticker}

Peer benchmarking: company's self-selected peer group with comparative compensation analysis, CEO pay ratios, say-on-pay support, and governance structure comparisons sourced from the DEF 14A.

ParameterTypeDescription
tickerpathCompany ticker (e.g. AAPL)
Example Response
{ "status": "ok", "data": { "ticker": "AAPL", "fiscal_year": "FY2025", "peers": [ { "ticker": "MSFT", "name": "Microsoft Corporation" }, { "ticker": "GOOGL", "name": "Alphabet Inc." }, { "ticker": "AMZN", "name": "Amazon.com, Inc." }, { "ticker": "META", "name": "Meta Platforms, Inc." }, { "ticker": "NVDA", "name": "NVIDIA Corporation" } ], "compensation": { "AAPL": { "ceo_name": "Tim Cook", "ceo_total_comp": 63200000, "ceo_pay_ratio": 672, "say_on_pay_support_pct": 80.5 }, "MSFT": { "ceo_name": "Satya Nadella", "ceo_total_comp": 79400000, "ceo_pay_ratio": 418, "say_on_pay_support_pct": 94.2 }, "GOOGL": { "ceo_name": "Sundar Pichai", "ceo_total_comp": 226000000, "ceo_pay_ratio": 808, "say_on_pay_support_pct": 78.3 }, ... } } }

Rate Limiting

All API responses include rate limit headers so you can track your usage.

API
25,000
requests per day
HeaderDescription
X-RateLimit-LimitDaily request quota for your tier
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix timestamp when limit resets

Error Codes

All errors return a standard JSON envelope with an error code and human-readable message.

StatusCodeDescription
400BAD_REQUESTInvalid parameters (e.g. unknown index ID)
401UNAUTHORIZEDMissing or invalid API key
403FORBIDDENAPI key does not have access to this endpoint
404NOT_FOUNDTicker or index not found
429RATE_LIMITEDDaily request quota exceeded
Example Error Response
{ "status": "error", "error": { "code": "UNAUTHORIZED", "message": "A valid API key is required. Contact team@getpennant.ai to get access." } }