Base URL: https://iposignal.xyz. Every endpoint is a GET that returns JSON. This page is generated from the same definitions as the OpenAPI document.
Example responses are abridged. Fields may be null or absent when a filing does not state them, and new fields can be added at any time, so ignore fields you do not know.
Directory of the companies we hold SEC iXBRL financial statements for. Use it to find which tickers the financials endpoint can return. Free, no key needed.
Price: free, no key needed. MCP tool: lookup_companies_with_financials.
Parameter
In
Required
Description
q
query
No
Filter by ticker or company name (case-insensitive substring). Omit to list every company.
limit
query
No
Page size, 1 to 500. Default 200.
offset
query
No
Rows to skip. Pass the previous response's nextOffset to fetch the next page. Default 0.
Try it
GET /api/agent/companies?q=circle&limit=200&offset=0
Every field can be null or absent when the source does not state it. Fields not listed here can appear; ignore the ones you do not know.
Field
Type
Description
count
integer
Rows in this page.
total
integer
Rows matching the query across all pages.
offset
integer
Rows skipped before this page.
limit
integer
Page size you asked for.
nextOffset
integer
Pass as offset to get the next page. Null on the last page.
data
array of objects
Companies we hold SEC financial statements for, sorted by ticker.
data[].symbol
string
Ticker symbol the company trades under now, upper case, e.g. CRCL.
data[].company
string
Registrant name as filed with the SEC, e.g. Circle Internet Group, Inc.
data[].cik
string
SEC Central Index Key: the registrant's permanent SEC identifier, as a 10-digit string with leading zeros, e.g. 0001876042.
data[].latestPeriodEnd
string
End date of the most recent period we hold, YYYY-MM-DD. Shows how current the statements are.
data[].preIpoCount
integer
How many periods (annual and interim) we hold from before the listing, read from the registration statement. 0 when we hold none. The financials endpoint returns them as preIpoPeriods.
data[].postIpoCount
integer
How many periods we hold from the 10-K, 10-Q and 20-F reports filed after the listing. 0 for a company that has not reported as a public company yet. Returned as postIpoPeriods.
IPO snapshot by ticker
GET /api/agent/ipo/by-symbol/{symbol}
The full profile of one IPO: deal terms, price range and final offer price, market capitalisation, SEC registration and prospectus details, filing history, lifecycle timeline, borrow fee, and research where available.
Price: $0.01 per delivered call over x402, or one call from an API key's quota. MCP tool: get_ipo_snapshot.
Parameter
In
Required
Description
symbol
path
Yes
US ticker symbol. Case-insensitive. Tickers get reassigned, so a response may carry a symbolNote.
Try it
GET /api/agent/ipo/by-symbol/CRCL
$0.01 per call. Without a key this shows the sample response and sends nothing. Create a free key to get live data. The key stays in this browser tab.
Every field can be null or absent when the source does not state it. Fields not listed here can appear; ignore the ones you do not know.
Field
Type
Description
data.company
string
Registrant name as filed with the SEC, e.g. Circle Internet Group, Inc.
data.cik
string
SEC Central Index Key: the registrant's permanent SEC identifier, as a 10-digit string with leading zeros, e.g. 0001876042.
data.symbol
string
Ticker symbol the company trades under now, upper case, e.g. CRCL.
data.venue
string
Listing exchange: NASDAQ, NYSE, NYSEAMER (NYSE American) or OTC. Other venues verbatim.
data.updatedAt
string
When any part of this record last changed, ISO 8601.
data.ipoDetails
object
Deal facts for the IPO.
data.ipoDetails.date
string
First trading day, YYYY-MM-DD. For a deal that has not listed, the scheduled date.
data.ipoDetails.dateSource
string
Where date comes from: observed-trading (a trade we observed on that day) or scheduled (an exchange calendar).
data.ipoDetails.exchange
string
Listing exchange: NASDAQ, NYSE, NYSEAMER (NYSE American) or OTC. Other venues verbatim.
data.ipoDetails.shares
number
Shares offered in the deal. Not shares outstanding.
data.ipoDetails.priceRange
string
The filed price range as text, low to high, USD per share, e.g. $16.00-$18.00. Null once the final price is known.
data.ipoDetails.offerPrice
number
Final offer price, USD per share. Null until the deal has priced.
data.ipoDetails.marketCap
number
What the company was worth at the offer, USD: economic shares outstanding right after the offering × offer price. Not the amount raised (see offerSize).
data.ipoDetails.marketCapSource
string
Where marketCap comes from: sec (share count from the filing), qra-prospectus (the final prospectus), scoop (IPOScoop), override (checked by hand). Null when unknown.
data.ipoDetails.offerSize
number
Gross proceeds, USD: shares offered × offer price. What the deal raised, not what the company is worth.
data.ipoDetails.issuer
string
Issuer line when it differs from company. Currently never set.
data.registration
object
The registration statement the deal was sold on: the latest S-1, F-1 or S-11 (or amendment) filed on or before the listing date.
data.registration.form
string
SEC form type: S-1, S-1/A, F-1, F-1/A, S-11 or S-11/A.
data.registration.url
string
The statement's main document on sec.gov.
data.registration.filingDate
string
Date the statement was filed, YYYY-MM-DD.
data.registration.acceptedDate
string
Time EDGAR accepted the filing, ISO 8601.
data.registration.effectivenessDate
string
Date the SEC declared the statement effective, YYYY-MM-DD. Currently always null: no source we read carries it.
data.registration.status
string
Registration status. Currently always null: no source we read carries it.
data.filings
array of objects
The company's SEC filings we track (registration statements, amendments, 424B prospectuses, delisting notices), oldest first.
data.filings[].formType
string
SEC form type, e.g. S-1, S-1/A, 424B4, EFFECT, RW, 25-NSE.
data.filings[].filingDate
string
Filing date, YYYY-MM-DD.
data.filings[].acceptedDate
string
Time EDGAR accepted the filing, ISO 8601.
data.filings[].accessionNumber
string
SEC accession number, the filing's unique id, e.g. 0001193125-25-132755.
data.filings[].indexUrl
string
The filing's folder on sec.gov, listing every document in it.
data.filings[].documentUrl
string
The filing's main document on sec.gov, when we resolved it.
Latest indicative cost of borrowing the shares to sell short, from Interactive Brokers. Present once the stock trades and IBKR quotes it.
data.borrowFee.feeRate
number
Annual borrow fee in percent, IBKR's unit: 0.25 means 0.25% a year, 35 means 35% a year.
data.borrowFee.asOfDate
string
Date the rate was quoted, YYYY-MM-DD.
data.research
object
Research written by our AI pipeline from the prospectus: summary, competitors, board, risks and valuation work. Text, not filed figures: check a number against the filing before relying on it. Absent until the pipeline has run for the deal.
data.research.summary
string
Summary of the company and the deal.
data.research.competitors
array of strings
Named competitors.
data.research.keyRisks
array of strings
The main risks, one sentence each.
data.research.useOfProceeds
string
What the company says it will do with the money raised.
data.research.boardOfDirectors
array of objects
Directors named in the prospectus.
data.research.boardOfDirectors[].name
string
Director's name.
data.research.boardOfDirectors[].role
string
Role on the board, e.g. Chair, Independent Director.
data.research.boardOfDirectors[].background
string
Short background, when the prospectus gives one.
data.research.isInvestmentVehicle
boolean
True for a trust, fund, ETF or SPAC rather than an operating company.
data.research.interestLevel
string
Our read of how much attention the deal draws: High, Medium or Low.
data.research.analystSector
string
Sector we classify the company in.
data.research.analystSubsector
string
Subsector we classify the company in.
data.research.sources
array of strings
URLs the research cites.
data.freedom24News
object
News articles about the deal from Freedom24, when it covers the company.
data.freedom24News.articles
array of objects
Articles as Freedom24 publishes them: title, provider, date, URL and text.
data.freedom24News.lastSyncedAt
string
When we last fetched Freedom24's list for the company, ISO 8601.
data.sec
object
How the SEC classifies the company.
data.sec.category
string
SEC filer category, e.g. Non-accelerated filer, Emerging growth company.
data.sec.description
string
Industry from the company's SIC code, e.g. Services-Prepackaged Software.
data.symbolNote
object
Present only when the ticker you asked for has belonged to more than one company and the record served is not the current holder's. Absent on an ordinary lookup.
data.symbolNote.requestedSymbol
string
The ticker you asked for.
data.symbolNote.servedCik
string
CIK of the company whose record this response holds.
data.symbolNote.currentHolderCik
string
CIK of the company that holds the ticker today, when known.
data.symbolNote.currentHolderName
string
Name of the company that holds the ticker today, when known.
data.symbolNote.reason
string
Plain-language explanation of the mismatch.
Errors besides the common ones: 404. None is charged.
IPO snapshot by id
GET /api/agent/ipo/{id}
The same profile as the by-ticker endpoint, addressed by the IPOSignal company id that other responses return. Use it when a ticker is ambiguous or not yet assigned.
Price: $0.01 per delivered call over x402, or one call from an API key's quota. MCP tool: get_ipo_snapshot.
Parameter
In
Required
Description
id
path
Yes
IPOSignal company id, 24 hexadecimal characters.
Try it
GET /api/agent/ipo/
$0.01 per call. Without a key this shows the sample response and sends nothing. Create a free key to get live data. The key stays in this browser tab.
Every field can be null or absent when the source does not state it. Fields not listed here can appear; ignore the ones you do not know.
Field
Type
Description
data.company
string
Registrant name as filed with the SEC, e.g. Circle Internet Group, Inc.
data.cik
string
SEC Central Index Key: the registrant's permanent SEC identifier, as a 10-digit string with leading zeros, e.g. 0001876042.
data.symbol
string
Ticker symbol the company trades under now, upper case, e.g. CRCL.
data.venue
string
Listing exchange: NASDAQ, NYSE, NYSEAMER (NYSE American) or OTC. Other venues verbatim.
data.updatedAt
string
When any part of this record last changed, ISO 8601.
data.ipoDetails
object
Deal facts for the IPO.
data.ipoDetails.date
string
First trading day, YYYY-MM-DD. For a deal that has not listed, the scheduled date.
data.ipoDetails.dateSource
string
Where date comes from: observed-trading (a trade we observed on that day) or scheduled (an exchange calendar).
data.ipoDetails.exchange
string
Listing exchange: NASDAQ, NYSE, NYSEAMER (NYSE American) or OTC. Other venues verbatim.
data.ipoDetails.shares
number
Shares offered in the deal. Not shares outstanding.
data.ipoDetails.priceRange
string
The filed price range as text, low to high, USD per share, e.g. $16.00-$18.00. Null once the final price is known.
data.ipoDetails.offerPrice
number
Final offer price, USD per share. Null until the deal has priced.
data.ipoDetails.marketCap
number
What the company was worth at the offer, USD: economic shares outstanding right after the offering × offer price. Not the amount raised (see offerSize).
data.ipoDetails.marketCapSource
string
Where marketCap comes from: sec (share count from the filing), qra-prospectus (the final prospectus), scoop (IPOScoop), override (checked by hand). Null when unknown.
data.ipoDetails.offerSize
number
Gross proceeds, USD: shares offered × offer price. What the deal raised, not what the company is worth.
data.ipoDetails.issuer
string
Issuer line when it differs from company. Currently never set.
data.registration
object
The registration statement the deal was sold on: the latest S-1, F-1 or S-11 (or amendment) filed on or before the listing date.
data.registration.form
string
SEC form type: S-1, S-1/A, F-1, F-1/A, S-11 or S-11/A.
data.registration.url
string
The statement's main document on sec.gov.
data.registration.filingDate
string
Date the statement was filed, YYYY-MM-DD.
data.registration.acceptedDate
string
Time EDGAR accepted the filing, ISO 8601.
data.registration.effectivenessDate
string
Date the SEC declared the statement effective, YYYY-MM-DD. Currently always null: no source we read carries it.
data.registration.status
string
Registration status. Currently always null: no source we read carries it.
data.filings
array of objects
The company's SEC filings we track (registration statements, amendments, 424B prospectuses, delisting notices), oldest first.
data.filings[].formType
string
SEC form type, e.g. S-1, S-1/A, 424B4, EFFECT, RW, 25-NSE.
data.filings[].filingDate
string
Filing date, YYYY-MM-DD.
data.filings[].acceptedDate
string
Time EDGAR accepted the filing, ISO 8601.
data.filings[].accessionNumber
string
SEC accession number, the filing's unique id, e.g. 0001193125-25-132755.
data.filings[].indexUrl
string
The filing's folder on sec.gov, listing every document in it.
data.filings[].documentUrl
string
The filing's main document on sec.gov, when we resolved it.
Latest indicative cost of borrowing the shares to sell short, from Interactive Brokers. Present once the stock trades and IBKR quotes it.
data.borrowFee.feeRate
number
Annual borrow fee in percent, IBKR's unit: 0.25 means 0.25% a year, 35 means 35% a year.
data.borrowFee.asOfDate
string
Date the rate was quoted, YYYY-MM-DD.
data.research
object
Research written by our AI pipeline from the prospectus: summary, competitors, board, risks and valuation work. Text, not filed figures: check a number against the filing before relying on it. Absent until the pipeline has run for the deal.
data.research.summary
string
Summary of the company and the deal.
data.research.competitors
array of strings
Named competitors.
data.research.keyRisks
array of strings
The main risks, one sentence each.
data.research.useOfProceeds
string
What the company says it will do with the money raised.
data.research.boardOfDirectors
array of objects
Directors named in the prospectus.
data.research.boardOfDirectors[].name
string
Director's name.
data.research.boardOfDirectors[].role
string
Role on the board, e.g. Chair, Independent Director.
data.research.boardOfDirectors[].background
string
Short background, when the prospectus gives one.
data.research.isInvestmentVehicle
boolean
True for a trust, fund, ETF or SPAC rather than an operating company.
data.research.interestLevel
string
Our read of how much attention the deal draws: High, Medium or Low.
data.research.analystSector
string
Sector we classify the company in.
data.research.analystSubsector
string
Subsector we classify the company in.
data.research.sources
array of strings
URLs the research cites.
data.freedom24News
object
News articles about the deal from Freedom24, when it covers the company.
data.freedom24News.articles
array of objects
Articles as Freedom24 publishes them: title, provider, date, URL and text.
data.freedom24News.lastSyncedAt
string
When we last fetched Freedom24's list for the company, ISO 8601.
data.sec
object
How the SEC classifies the company.
data.sec.category
string
SEC filer category, e.g. Non-accelerated filer, Emerging growth company.
data.sec.description
string
Industry from the company's SIC code, e.g. Services-Prepackaged Software.
data.symbolNote
object
Present only when the ticker you asked for has belonged to more than one company and the record served is not the current holder's. Absent on an ordinary lookup.
data.symbolNote.requestedSymbol
string
The ticker you asked for.
data.symbolNote.servedCik
string
CIK of the company whose record this response holds.
data.symbolNote.currentHolderCik
string
CIK of the company that holds the ticker today, when known.
data.symbolNote.currentHolderName
string
Name of the company that holds the ticker today, when known.
data.symbolNote.reason
string
Plain-language explanation of the mismatch.
Errors besides the common ones: 404. None is charged.
Financial statements
GET /api/agent/financials/by-symbol/{symbol}
SEC iXBRL income statement, balance sheet and cash-flow line items for a company we cover, before and after its IPO, with margins, growth, leverage and return ratios per period. Interim periods carry annualised figures beside the reported ones.
Price: $0.01 per delivered call over x402, or one call from an API key's quota. MCP tool: get_company_financials.
Parameter
In
Required
Description
symbol
path
Yes
US ticker symbol. Case-insensitive. Tickers get reassigned, so a response may carry a symbolNote.
Try it
GET /api/agent/financials/by-symbol/CRCL
$0.01 per call. Without a key this shows the sample response and sends nothing. Create a free key to get live data. The key stays in this browser tab.
Every field can be null or absent when the source does not state it. Fields not listed here can appear; ignore the ones you do not know.
Field
Type
Description
data.company
string
Registrant name as filed with the SEC, e.g. Circle Internet Group, Inc.
data.symbol
string
Ticker symbol the company trades under now, upper case, e.g. CRCL.
data.cik
string
SEC Central Index Key: the registrant's permanent SEC identifier, as a 10-digit string with leading zeros, e.g. 0001876042.
data.fetchedAt
string
When we last read the statements from SEC, ISO 8601.
data.preIpoPeriods
array of objects
Periods reported in the registration statement, before the listing.
data.preIpoPeriods[].periodEndDate
string
Last day of the period, YYYY-MM-DD.
data.preIpoPeriods[].periodStartDate
string
First day of the period, YYYY-MM-DD. Absent for a balance-sheet-only period.
data.preIpoPeriods[].periodType
string
Annual, Quarterly, Semi-Annual, Nine Months Ended, Instant (a balance-sheet date with no income or cash-flow figures), or N-Day Period for any other length, e.g. 45-Day Period.
data.preIpoPeriods[].durationMonths
integer
Length of the period in whole months: 12 for a year, 3 for a quarter, 6 or 9 for year-to-date, 0 for an Instant.
data.preIpoPeriods[].currency
string
ISO 4217 currency the figures in metrics are in, e.g. USD, CNY. USD when absent.
data.preIpoPeriods[].fxToUsd
number
USD per one unit of currency. Multiply a figure by it to get USD. Absent for USD.
data.preIpoPeriods[].fxRateDate
string
Date the fxToUsd rate was taken, YYYY-MM-DD: the IPO date for pre-IPO periods, the period end for later ones.
data.preIpoPeriods[].metrics
map of name → number
Statement line items as filed, keyed by line name, in currency, whole units (not thousands). Only the lines the filing reports are present. Every key is listed under Line items.
data.preIpoPeriods[].annualizedMetrics
map of name → number
Interim periods only: the flow items in metrics scaled to twelve months, so a quarter compares with a year. Balance-sheet items are copied unchanged.
data.preIpoPeriods[].annualizationMethod
string
How annualizedMetrics was made: ttm (last full year + this year to date − last year to date) or scaled (× 12 ÷ durationMonths).
data.preIpoPeriods[].derived
map of name → number
Ratios computed from metrics, in percent: grossMarginPct, operatingMarginPct, netMarginPct, fcfMarginPct, revenueGrowthPct, debtToAssetsPct, equityRatioPct, returnOnEquityPct, returnOnAssetsPct, cashToAssetsPct. A ratio is absent when an input is missing.
data.postIpoPeriods
array of objects
Periods from the 10-K, 10-Q and 20-F reports filed after the listing.
data.postIpoPeriods[].periodEndDate
string
Last day of the period, YYYY-MM-DD.
data.postIpoPeriods[].periodStartDate
string
First day of the period, YYYY-MM-DD. Absent for a balance-sheet-only period.
data.postIpoPeriods[].periodType
string
Annual, Quarterly, Semi-Annual, Nine Months Ended, Instant (a balance-sheet date with no income or cash-flow figures), or N-Day Period for any other length, e.g. 45-Day Period.
data.postIpoPeriods[].durationMonths
integer
Length of the period in whole months: 12 for a year, 3 for a quarter, 6 or 9 for year-to-date, 0 for an Instant.
data.postIpoPeriods[].currency
string
ISO 4217 currency the figures in metrics are in, e.g. USD, CNY. USD when absent.
data.postIpoPeriods[].fxToUsd
number
USD per one unit of currency. Multiply a figure by it to get USD. Absent for USD.
data.postIpoPeriods[].fxRateDate
string
Date the fxToUsd rate was taken, YYYY-MM-DD: the IPO date for pre-IPO periods, the period end for later ones.
data.postIpoPeriods[].metrics
map of name → number
Statement line items as filed, keyed by line name, in currency, whole units (not thousands). Only the lines the filing reports are present. Every key is listed under Line items.
data.postIpoPeriods[].annualizedMetrics
map of name → number
Interim periods only: the flow items in metrics scaled to twelve months, so a quarter compares with a year. Balance-sheet items are copied unchanged.
data.postIpoPeriods[].annualizationMethod
string
How annualizedMetrics was made: ttm (last full year + this year to date − last year to date) or scaled (× 12 ÷ durationMonths).
data.postIpoPeriods[].derived
map of name → number
Ratios computed from metrics, in percent: grossMarginPct, operatingMarginPct, netMarginPct, fcfMarginPct, revenueGrowthPct, debtToAssetsPct, equityRatioPct, returnOnEquityPct, returnOnAssetsPct, cashToAssetsPct. A ratio is absent when an input is missing.
data.symbolNote
object
Present only when the ticker you asked for has belonged to more than one company and the record served is not the current holder's. Absent on an ordinary lookup.
data.symbolNote.requestedSymbol
string
The ticker you asked for.
data.symbolNote.servedCik
string
CIK of the company whose record this response holds.
data.symbolNote.currentHolderCik
string
CIK of the company that holds the ticker today, when known.
data.symbolNote.currentHolderName
string
Name of the company that holds the ticker today, when known.
data.symbolNote.reason
string
Plain-language explanation of the mismatch.
Line items
The keys metrics and annualizedMetrics can carry. A period has only the lines its filing reports. Each is read from the XBRL concepts listed.
revenue against the same-length period about one period earlier
debtToAssetsPct
totalLiabilities ÷ totalAssets
equityRatioPct
totalEquity ÷ totalAssets
returnOnEquityPct
netIncome ÷ totalEquity
returnOnAssetsPct
netIncome ÷ totalAssets
cashToAssetsPct
cashAndCashEquivalents ÷ totalAssets
Errors besides the common ones: 404. None is charged.
Live valuation metrics
GET /api/agent/company-metrics
Valuation metrics for any US-listed company, not only IPOs: trailing-twelve-month fundamentals from SEC XBRL company facts and the latest market close, giving P/E, P/S, EV/Revenue, EV/EBITDA, PEG, yields, net debt to EBITDA, margins and year-on-year growth. The response states how each figure is computed. Provide exactly one of symbol or name.
Price: $0.02 per delivered call over x402, or one call from an API key's quota. MCP tool: get_company_metrics.
Parameter
In
Required
Description
symbol
query
No
US ticker. Any ticker the SEC maps to a registrant.
name
query
No
Company name, for when the ticker is unknown. Resolves Nasdaq and NYSE listings only.
Try it
GET /api/agent/company-metrics?symbol=CRCL
$0.02 per call. Without a key this shows the sample response and sends nothing. Create a free key to get live data. The key stays in this browser tab.
Every field can be null or absent when the source does not state it. Fields not listed here can appear; ignore the ones you do not know.
Field
Type
Description
data.listing
object
The company the query resolved to.
data.listing.ticker
string
Ticker symbol the company trades under now, upper case, e.g. CRCL.
data.listing.name
string
Registrant name as filed with the SEC, e.g. Circle Internet Group, Inc.
data.listing.exchange
string
Listing exchange: NASDAQ, NYSE, NYSEAMER (NYSE American) or OTC. Other venues verbatim.
data.listing.cik
integer
SEC Central Index Key as a number, without leading zeros, e.g. 1876042.
data.priceClose
number
Latest daily closing price, USD per share.
data.fundamentalsTtm
object
Trailing-twelve-month figures from SEC XBRL company facts, USD: the last full year + this year to date − last year to date.
data.fundamentalsTtm.revenue
number
Revenue, USD.
data.fundamentalsTtm.netIncome
number
Net income, USD. Negative for a loss.
data.fundamentalsTtm.ebitda
number
Operating income + depreciation and amortization, USD.
data.fundamentalsTtm.freeCashFlow
number
Operating cash flow − capital expenditures, USD.
data.fundamentalsTtm.totalDebt
number
Debt at the latest balance sheet, USD: the combined debt figure when filed, else long-term debt + its current portion + short-term borrowings.
data.fundamentalsTtm.cash
number
Cash and cash equivalents at the latest balance sheet, USD.
data.fundamentalsTtm.sharesOutstanding
number
Shares outstanding used for marketCap. See sharesSource for which count it is.
data.fundamentalsTtm.sharesSource
object
Which share count sharesOutstanding is.
data.fundamentalsTtm.sharesSource.method
string
dei-total (the total on a 10-K or 10-Q cover), cover-per-class (the sum of the share classes on the cover) or weighted-average-basic (the EPS denominator, used only when no cover count exists).
data.fundamentalsTtm.sharesSource.asOf
string
Date the count is as of, YYYY-MM-DD.
data.fundamentalsTtm.sharesSource.accession
string
Accession number of the filing the count was read from.
data.fundamentalsTtm.sharesSource.classCount
integer
cover-per-class only: how many share classes were summed.
data.valuation
object
Multiples at priceClose. A multiple is null when its denominator is missing or not positive.
data.valuation.marketCap
number
priceClose × sharesOutstanding, USD.
data.valuation.enterpriseValue
number
marketCap + totalDebt − cash, USD. Null unless both debt and cash are reported: an unreported figure is unknown, not 0.
data.valuation.peRatio
number
Price to earnings: marketCap ÷ TTM net income. Null when net income is zero or negative.
data.valuation.priceToSalesRatio
number
marketCap ÷ TTM revenue.
data.valuation.evRevenueMultiple
number
enterpriseValue ÷ TTM revenue.
data.valuation.evEbitda
number
enterpriseValue ÷ TTM EBITDA. Null when EBITDA is zero or negative.
data.valuation.pegRatio
number
peRatio ÷ netIncomeGrowthPct. Null unless both are positive.
data.valuation.earningsYieldPct
number
TTM net income ÷ marketCap, percent.
data.valuation.salesYieldPct
number
TTM revenue ÷ marketCap, percent.
data.valuation.revenueEvYieldPct
number
TTM revenue ÷ enterpriseValue, percent.
data.valuation.ebitdaEvYieldPct
number
TTM EBITDA ÷ enterpriseValue, percent.
data.valuation.freeCashFlowEvYieldPct
number
TTM free cash flow ÷ enterpriseValue, percent. Negative for a company burning cash.
data.valuation.netDebtToEbitda
number
(totalDebt − cash) ÷ TTM EBITDA. Negative when cash exceeds debt; null unless both are reported.
data.profile
object
Margins over the trailing twelve months and growth over the last fiscal year, percent.
data.profile.grossMarginPct
number
Gross profit ÷ revenue.
data.profile.ebitdaMarginPct
number
EBITDA ÷ revenue.
data.profile.freeCashFlowMarginPct
number
Free cash flow ÷ revenue.
data.profile.revenueGrowthPct
number
Revenue in the latest fiscal year against the year before. Null when the earlier year is zero or negative.
data.profile.operatingIncomeGrowthPct
number
Operating income in the latest fiscal year against the year before. Null when the earlier year is zero or negative.
data.profile.netIncomeGrowthPct
number
Net income in the latest fiscal year against the year before. Null when the earlier year is zero or negative.
data.sources
object
Where each input came from, in words.
data.sources.fundamentals
string
Source and method of fundamentalsTtm.
data.sources.price
string
Source of priceClose.
data.sources.convention
string
How EBITDA, enterprise value and PEG are defined.
data.sources.shares
string
Which share count was used, from which filing, and what it assumes.
data.unavailable
object
Present instead of the figures when the company resolved but no market cap can be struck.
data.unavailable.reason
string
no-price (no recent close), no-share-count (no share count filed yet) or no-sec-facts (SEC company facts unreadable).
data.unavailable.detail
string
Plain-language explanation.
Errors besides the common ones: 400, 404. None is charged.
IPO market sentiment
GET /api/agent/ipo-sentiment
The IPOSignal sentiment score: a daily reading from -100 to +100 of how recent IPOs are being received, with its trend over the last N days.
Price: $0.01 per delivered call over x402, or one call from an API key's quota. MCP tool: get_ipo_sentiment.
Parameter
In
Required
Description
days
query
No
Trend window in days. Values outside 1 to 90 are clamped. Default 14.
Try it
GET /api/agent/ipo-sentiment?days=14
$0.01 per call. Without a key this shows the sample response and sends nothing. Create a free key to get live data. The key stays in this browser tab.
Every field can be null or absent when the source does not state it. Fields not listed here can appear; ignore the ones you do not know.
Field
Type
Description
data.current
object
The latest daily score.
data.current.date
string
Day the score is for, YYYY-MM-DD.
data.current.score
number
-100 (extremely bearish) to +100 (extremely bullish). Built from how recent IPOs traded in their first 30 days: the level over the last 30 days and its change against the last 60.
data.current.direction
string
bullish, bearish or neutral.
data.current.strength
string
weak, moderate or strong.
data.current.sampleSize
integer
How many recent IPOs the score is computed from.
data.current.reliable
boolean
False when sampleSize is below 5: too few IPOs to trust the score.
data.current.computedAt
string
When the score was computed, ISO 8601.
data.trend
array of objects
Daily scores for the window you asked for, newest first.
data.trend[].date
string
Day the score is for, YYYY-MM-DD.
data.trend[].score
number
-100 (extremely bearish) to +100 (extremely bullish). Built from how recent IPOs traded in their first 30 days: the level over the last 30 days and its change against the last 60.
data.trend[].direction
string
bullish, bearish or neutral.
data.trend[].strength
string
weak, moderate or strong.
data.trend[].sampleSize
integer
How many recent IPOs the score is computed from.
data.trend[].reliable
boolean
False when sampleSize is below 5: too few IPOs to trust the score.
data.trend[].computedAt
string
When the score was computed, ISO 8601.
data.summary
string
One sentence: the level, the direction over the last 7 days, and the sample size.
Errors besides the common ones: 404. None is charged.
Social sentiment for one IPO
GET /api/agent/social-sentiment
The aggregate X/Twitter reading for one IPO: a score from -1 to +1, a label, post tallies and a one-line summary. Taken once before listing and not refreshed: ageDays says how old it is, and reliable is false when too few posts back it. The posts themselves are not returned. Provide exactly one of symbol, cik or id.
Price: $0.01 per delivered call over x402, or one call from an API key's quota. MCP tool: get_ipo_social_sentiment.
Parameter
In
Required
Description
symbol
query
No
US ticker.
cik
query
No
SEC Central Index Key, with or without leading zeros.
id
query
No
IPOSignal company id.
Try it
GET /api/agent/social-sentiment?symbol=CRCL
$0.01 per call. Without a key this shows the sample response and sends nothing. Create a free key to get live data. The key stays in this browser tab.
Every field can be null or absent when the source does not state it. Fields not listed here can appear; ignore the ones you do not know.
Field
Type
Description
data.company
string
Registrant name as filed with the SEC, e.g. Circle Internet Group, Inc.
data.symbol
string
Ticker symbol the company trades under now, upper case, e.g. CRCL.
data.score
number
-1 (all posts bearish) to +1 (all posts bullish), across the posts read.
data.label
string
Bullish, Neutral or Bearish.
data.postCount
integer
How many posts on X the reading is based on.
data.positiveHits
integer
Posts scored positive.
data.negativeHits
integer
Posts scored negative.
data.summary
string
One-line summary of the conversation.
data.analyzedAt
string
When the posts were read, ISO 8601.
data.ageDays
integer
Whole days since analyzedAt. Readings are taken in the days before listing and not refreshed, so an old reading is the pre-IPO mood.
data.reliable
boolean
False when too few posts back the reading: one post can set the label.
data.symbolNote
object
Present only when the ticker you asked for has belonged to more than one company and the record served is not the current holder's. Absent on an ordinary lookup.
data.symbolNote.requestedSymbol
string
The ticker you asked for.
data.symbolNote.servedCik
string
CIK of the company whose record this response holds.
data.symbolNote.currentHolderCik
string
CIK of the company that holds the ticker today, when known.
data.symbolNote.currentHolderName
string
Name of the company that holds the ticker today, when known.
data.symbolNote.reason
string
Plain-language explanation of the mismatch.
Errors besides the common ones: 400, 404. None is charged.
IPO events calendar
GET /api/agent/ipo-events
Dated events across all US IPOs in a window: lock-up expiries with the lock-up length, quiet-period expiries, and listings with offer price, first-day open and close, first-day returns and lead managers. A window with no events is returned without charge.
Price: $0.02 per delivered call over x402, or one call from an API key's quota. MCP tool: get_ipo_events.
Parameter
In
Required
Description
from
query
No
Window start, YYYY-MM-DD. Defaults to today.
to
query
No
Window end, YYYY-MM-DD, inclusive and at most 366 days after from. Defaults to from + 30 days.
types
query
No
Comma-separated subset of lockup_expiry, quiet_period_expiry, listing. Defaults to all.
Try it
GET /api/agent/ipo-events?types=lockup_expiry%2Clisting
$0.02 per call. Without a key this shows the sample response and sends nothing. Create a free key to get live data. The key stays in this browser tab.