Reporting Window Finder
Pricing
from $5.10 / 1,000 company resolveds
Reporting Window Finder
Finds when a public company reports. Give it a domain, ticker, ISIN, LEI or CIK and get back fiscal year end, reporting cadence, next reporting date, days to event, and the open and close of the outreach window, as one flat row per company built for Clay. Timing rows cover US companies only.
Pricing
from $5.10 / 1,000 company resolveds
Rating
0.0
(0)
Developer
Mamba Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
🧭 What can Reporting Window Finder do?
Give it a domain, ticker, ISIN, LEI or CIK and it tells you when that public company reports, and when to reach out around it. One flat row per company, built to drop into a Clay column.
Most tools tell you a company is public. This one tells you the fiscal year end, the reporting cadence, the next reporting date, how many days away it is, and the open and close of an outreach window you define yourself.
| 📦 What you get | ⚙️ Features and integrations |
|---|---|
🏢 49 identity fields in resolve, 52 in qualify, 51 in universe📅 80 fields in timing mode🎯 outreach_window_open and outreach_window_close, your lead and lag🧾 null never missing, every field always present | 🔑 Five identifier types: domain, ticker, ISIN, LEI, CIK 🇺🇸 Timing from SEC filing history, US companies 🧊 24 hour identity cache, timing never cached ⬇️ Export to JSON, CSV, Excel, HTML or XML |
Bought by outbound teams timing their sequences around earnings, by investor relations and finance researchers, and by anyone who needs a reporting calendar keyed to identifiers they already have.
🇺🇸 Timing rows cover US companies only. Identity, venue and classification resolve worldwide, across 10,646 publishable companies. The reporting dates come from US SEC filing history and exist for US companies alone. If you send a European or UK company to
timingmode, you get its identity and a stated reason, never a guessed date.
💡 Why use this actor?
| If you want | Read these fields |
|---|---|
| The next reporting date | next_event_date, next_event_type, next_event_period |
| To time outreach around it | outreach_window_open, outreach_window_close, window_status, days_to_event |
| To know how much to trust the date | confidence_band, confidence_effective, next_event_source_rung |
| The reporting rhythm | derived_cadence, cadence_confidence, cadence_observation_count |
| The fiscal calendar | fiscal_year_end_mmdd, fiscal_year_end_month, is_non_calendar_fiscal_year |
| Company identity | legal_name, primary_ticker, isin, lei, cik, domain |
| Venue and classification | primary_exchange_code, country_code, sector, security_type |
| To tell empty from broken | match_method, timing_unavailable_reason, domain_absent_reason |
📏 A predicted date is labeled as one
next_event_is_estimate and next_event_is_announced sit on every timing row. A date derived
from filing history is an estimate, and the actor says so on the row rather than in the
documentation. confidence_band and confidence_effective tell you how much history sat behind
it.
The bands sit at 0.80 and 0.50. At or above 0.80 is strong, 0.50 to 0.80 is moderate,
below 0.50 is weak. Confidence is computed on the weakest link in the chain: a date is only
as good as the cadence it was derived from, so confidence_effective is the minimum of the event
and cadence confidences, never an average. Because of that minimum, the 0.75 to 0.80 band is
empty by construction. A gap in the distribution is arithmetic, not missing data.
📋 What data does it extract?
Field counts are per mode, read from live runs and the row builders: resolve 49, qualify 52 with
its three verdict fields, universe 51, timing 80, and season 22, which are
aggregate rows rather than company rows. Within a mode every field is always present, row_status, error_reason and billable_events_json included (added 2026-10-05). A field with
nothing behind it is null, never absent, so a Clay column never shifts.
Identity and venue: company_id, legal_name, normalized_name, primary_ticker, isin,
lei, cik, domain, primary_exchange_code, country_code, currency, market_segment,
listing_count, all_exchange_codes, is_cross_listed, sector, security_type,
is_operating_company, is_foreign_private_issuer, is_us_registrant, is_blank_check,
is_depositary_receipt, public_float_usd, public_float_band, shares_outstanding.
Timing: fiscal_year_end_mmdd, derived_cadence, next_event_date, next_event_type,
next_event_period, next_event_is_estimate, next_event_is_announced, days_to_event,
outreach_window_open, outreach_window_close, window_status, constrained_period_open,
constrained_period_close, is_in_constrained_period, confidence_band,
timing_unavailable_reason.
Also on the rows, by mode:
| Field | Meaning |
|---|---|
matched_value | Matched Value |
identity_basis | Identity Basis |
domain_confidence | Domain Confidence |
domain_source | Domain Source |
fields_limited_by_surface | Fields Limited By Surface |
classification_scheme | Classification Scheme |
public_float_as_of | Public Float As Of |
returned_count | Returned Count |
source_tag | Source Tag |
notice | Notice |
truncated | Truncated |
period_start | Period Start |
period_end | Period End |
group_by | Group By |
split_by | Split By |
group_key | Group |
event_count | Events |
company_count | Companies |
estimated_share | Estimated Share |
mean_confidence | Mean Confidence |
fiscal_year_end_source | Fiscal Year End Source |
next_event_confidence | Next Event Confidence |
next_event_source_name | Next Event Source Name |
next_event_is_statutory_deadline | Next Event Is Statutory Deadline |
window_lead_days_used | Window Lead Days Used |
window_lag_days_used | Window Lag Days Used |
skipped_nearer_event | Skipped Nearer |
nearer_event_date | Nearer Event Date |
timing_disclaimer | Timing Disclaimer |
is_listed | Listed |
listed_status_basis | Basis |
listed_status_checked_at | Listed Status Checked At |
row_status | ok when the row was produced normally, partial when some of it could not be read, error when the row could not be produced. Always present. |
error_reason | Why the row is partial or an error, in plain words. Null on an ok row. Always present, never a missing key. |
billable_events_json | The pay per event charges this row caused, as a JSON array of {"event","count"}, for example [{"event":"company-checked","count":1}]. "[]" when the row was free. Lets you reconcile a run from the dataset alone. The once per run apify-actor-start charge is not on any row. |
| data_source | live when the row was read from the data source during your run, snapshot when the data source was down and the row came from the daily snapshot. Snapshot rows are not charged. |
| snapshot_row_count | On a snapshot row, how many companies the snapshot holds. Null on a live row. |
Provenance on every row: data_source, data_as_of, snapshot_built_at, snapshot_row_count,
contract_version, provenance_source, provenance_confidence, attribution, license,
source_surface.
🛠️ How to find a company's next reporting date
- Pick a mode.
resolvefor identity,timingfor reporting dates and windows,universeto list companies matching a filter,seasonfor aggregate reporting volume by week or month,qualifyto test companies against filters. - Give it identifiers:
company_domains,tickers,isins,leis,ciksorcompany_names. Mix types freely in one run, up to 1,000 per run. - For
timing, setwindow_lead_daysandwindow_lag_days. They default to 70 and 42, which opens the window ten weeks before the reporting date and closes it six weeks after. - Run it. Every input gets exactly one row back, in the same shape, whether it matched or not.
💵 How much does it cost?
Pay per event. You are charged for rows returned, not for rows you filtered out.
| Event | Price |
|---|---|
Company resolved (company-resolved), resolve, qualify and universe rows | $0.006 per row |
Timing row returned (timing-row-returned), timing rows | $0.012 per row |
Reporting season aggregate (season-aggregate), season rows | $0.05 per row |
Actor start (apify-actor-start), set by Apify | $0.00005 per run, per GB of memory |
Volume discounts of 5, 10 and 15 percent apply on the Apify Bronze, Silver and Gold plans.
A row that resolves nothing is still billed. An identifier that matches no public company
comes back with match_method set to no_match and every other field null. That is a real
answer, the actor made a real request to produce it, and a documented null is worth more than a
silent gap. If you do not want to pay for misses, filter your input before you send it.
Timing rows are billed per row and exist for US companies only. A non US company sent to
timing mode returns its identity and a timing_unavailable_reason, and is billed as a timing
row because the work was done.
Not charged: rows dropped by a filter you set, every row served from the snapshot and every
row nothing could answer (see "When the data source is down" below), and every row in a run that fails input
validation. A rejected input emits no rows and charges no row event. The platform's own
apify-actor-start event still applies, at one per run, because it is levied before the actor
validates anything.
The truncation notice is a row you are not charged for. When universe or season matches
more than your limit, one extra row comes back carrying total_matched and no company, so the
shortfall is visible rather than silent. It is not billed: a limit of 5 against a larger match
returns 6 rows and charges 5.
Free plan: No free plan monthly cap. Free Apify plan users run it at the same per row prices, limited only by their plan's monthly credit.
Stopping at your maximum charge: when a run reaches the maximum cost per run you set in Apify, it returns no further row, adds one free notice row saying so, and keeps every row already charged. To spend less, lower limit or max_days_to_event, or narrow the filters.
⌨️ Input
Every field on the Input tab, in the order the form shows them. Only mode and at least one
identifier (or a filter, in universe and season) are needed.
| Field | Type | Default | What it does |
|---|---|---|---|
mode | string | "resolve" | resolve returns identity and venue. qualify adds a listed status verdict. timing returns fiscal year end, reporting cadence, the next obligated event and your outreach window. universe builds a company list from filters. season returns reporting load per week or month. |
company_domain | string | none | A single bare domain, e.g. stripe.com. The Clay column shape. Used by resolve, qualify and timing. |
company_domains | array | none | Many domains at once. Used by resolve, qualify and timing. |
tickers | array | none | Exchange tickers, e.g. NWLG. Matched against the primary ticker and every venue listing. |
isins | array | none | 12 character ISINs. |
leis | array | none | 20 character Legal Entity Identifiers. |
ciks | array | none | SEC Central Index Keys, with or without leading zeros. |
company_names | array | none | Legal or trading names. Matched on a normalized name. Former names are not available: the alias table carries tickers and ISINs only. |
operating_companies_only | string | "false" | Drop funds, trusts and other non operating entities. Sent as a string for Clay compatibility. |
exclude_blank_checks | string | "false" | Drop pre deal SPACs. Separate from the operating company filter: a blank check shell is flagged as an operating company and passes every ordinary firmographic filter. |
listed_only | string | "false" | qualify mode. Keep only rows proven to be publicly listed. |
suppress_listed | string | "false" | qualify mode. Remove companies proven to be publicly listed, for anyone selling only into private companies. It removes what we can prove is listed; it does not warrant that the remainder is private. |
assume_unmatched_is_private | string | "false" | qualify mode. By default an unmatched company returns is_listed null, because a non match may mean the company is private OR that we do not hold its domain. Set true to opt into reading a non match as private, which sets is_listed false. |
foreign_private_issuer | string | "any" | Filter on foreign private issuer status. |
us_registrant_only | string | "false" | Keep only companies carrying an SEC CIK. |
exchange_codes | array | none | ISO 10383 MICs. 18 venues are covered. |
country_codes | array | none | ISO 3166-1 alpha-2, e.g. US, GB, FR. |
regions | array | none | Shorthand for a set of venues and countries: us, uk, eu. Widens an explicit exchange or country filter rather than replacing it. |
sectors | array | none | SEC SIC descriptions, e.g. Pharmaceutical Preparations. Populated on roughly 65 percent of the publishable universe. |
security_types | array | none | ordinary_shares, depositary_receipt, preferred_shares. |
public_float_bands | array | none | micro, small, mid, large, mega, unknown. Size runs on public float because market capitalization is not populated anywhere in this dataset. |
fiscal_year_end_months | array | none | Integers 1 to 12. Fiscal year end is effectively a United States field in this dataset. |
exclude_december_fiscal_year_end | string | "false" | Keep only companies whose fiscal year ends in a month other than December, the accounts whose budget cycle is out of phase with a calendar quarter. |
cadences | array | none | quarterly, semiannual, annual, unknown. |
min_cadence_confidence | string | "0" | 0 to 1. Rows whose cadence confidence falls below this return a null timing block with a stated reason rather than a guess. Quarterly cadence averages 0.94, annual 0.40, semiannual 0.21. |
event_types | array | none | full_year_results, half_year_results, quarterly_results, trading_update, annual_report_publication, sustainability_report_publication, agm, proxy_filing, capital_markets_day. |
window_lead_days | string | "70" | How many days before the event the outreach window opens. Default 70. |
window_lag_days | string | "42" | How many days before the event the outreach window closes. Default 42. Must be less than the lead. |
window_statuses | array | none | Keep only rows in these window states: open, not_yet, closed_passed, no_event. |
max_days_to_event | string | none | Drop rows whose next event is further away than this. A cost control. |
include_constrained_period | string | "true" | Emit the period in which a listed company is constrained in what it can announce, derived from the same window numbers. Useful for campaign and announcement timing. |
season_group_by | string | "week" | season mode. Bucket size. |
season_split_by | string | "none" | season mode. Optional second dimension. |
season_from | string | none | season mode. ISO date. Defaults to today. |
season_to | string | none | season mode. ISO date. Defaults to 180 days from today. |
min_provenance_confidence | string | "any" | Set to high to exclude rows whose source terms were never read. |
exclude_name_only_matches | string | "false" | Drop rows whose identity link rests on a name and country agreeing rather than on an identifier. Use this wherever a wrong identity link matters. |
exclude_share_alike | string | "false" | Drop rows derived from CC BY-SA sources, whose share alike condition may not suit a closed product. |
limit | string | "1000" | Maximum rows for universe and season. Truncation is always reported, never silent. |
Example input, timing mode for two US companies:
{"mode": "timing","tickers": ["TXG", "ADBE"],"window_lead_days": "70","window_lag_days": "42"}
📤 Output
One flat row per input, one JSON object per row, all fields always present.
{"matched_on": "ticker","matched_value": "TXG","legal_name": "10x Genomics, Inc.","primary_ticker": "TXG","cik": "0001770787","primary_exchange_code": "XNAS","country_code": "US","derived_cadence": "quarterly","next_event_type": "quarterly_results","next_event_date": "2026-11-03","next_event_is_estimate": true,"days_to_event": 77,"outreach_window_open": "2026-08-25","outreach_window_close": "2026-09-22","window_status": "not_yet","confidence_band": "strong","data_as_of": "2026-08-17","row_status": "ok","error_reason": null,"billable_events_json": "[{\"event\":\"timing-row-returned\",\"count\":1}]"}
💡 Tips
Read window_status before next_event_date. It is open, not_yet, closed_passed or
no_event against today, and it is the field you filter a Clay table on. no_event is the
state a company lands in when there is no reporting event to build a window from, which is
every non US company.
Set the window to your sales cycle. window_lead_days and window_lag_days are yours. A
long enterprise cycle wants a wider lead than the default 70 days.
Use universe mode to build the list, then timing to time it. universe returns every
company matching a filter, paging through the whole match rather than stopping at the first page.
When the data source is down
The actor reads one live data source, and every request to it is capped by the run's own timeout minus a 90 second reserve. If that source refuses the request, does not answer in time, or fails, the run switches to a snapshot of the same data and still succeeds:
- The snapshot is a copy of the same public data the live source serves, rebuilt once a day. Every
row served from it says
data_source: "snapshot"and carriessnapshot_built_at(when the copy was made) andsnapshot_row_count(how many companies it holds), so you can tell a live read from a snapshot read in any column. - Snapshot rows are not charged. Rows read live before the source went down keep their charge.
- The snapshot answers identity, qualification,
universeandseasonthe way the live source did on its build date. Two things are narrower: it does not match secondary ISINs or tickers that are only aliases, and it holds up to 8 upcoming reporting events per company. - The status message says the run used the snapshot and how many rows came from it.
If the snapshot cannot be read either:
- Each company you sent gets one row with
matched_onandmatched_valueset to your identifier,row_status: "error", and anerror_reasonthat starts withblocked:(the source refused),timed_out:(it did not answer in time), orerror:(it failed). Inuniverseandseasonmode there is one such row for the run. - None of these rows is charged, and the status message says how many there are.
- No company data is invented. Run it again later.
A blocked: row never means the company was not found. A real "not found" is a no_match row
with company fields null, and that one is a result.
⚠️ Known limits
Timing is US only. Reporting events come from SEC filing history. Non US companies resolve
fully for identity, venue and classification and return a stated
timing_unavailable_reason in timing mode. No date is invented for them.
Unknown cadence is refused, not guessed. 922 companies in the universe have no derivable
reporting cadence, because their filing history is too short or too irregular to support one. The
actor returns derived_cadence null with a reason instead of inventing a date. A wrong date that
looks right is worse than no date.
864 companies have no publishable representation and cannot be returned at all. They exist in the market and not in the redistributable surface this actor reads.
Dates are predicted, not announced. next_event_is_estimate is true for a predicted date and
next_event_is_announced is true only when the event is a confirmed one. Treat an estimate as an
estimate.
Identity is cached for 24 hours, timing never is. days_to_event, window_status and
is_in_constrained_period change every day by construction, so a cached window would be a wrong
window. There is no flag to turn timing caching on.
Attribution ships only where the result set requires it. The attribution and license
fields carry the acknowledgment a row's source requires, and the run level attribution list holds
only the strings the rows you actually received need. A result set with no rows from a given
source does not claim that source's acknowledgment.
❓ FAQ
Which identifier should I send? Whichever you already have. Ticker and CIK are the most
precise, domain is the most common in a GTM table, and name matching is the loosest. matched_on
tells you which one produced the row.
Can I send 5,000 companies? Send up to 1,000 identifiers per run. universe mode pages
through matches larger than that and returns the whole set.
What is the constrained period? The stretch before a reporting date when a company's investor
relations team is least available. constrained_period_open, constrained_period_close and
is_in_constrained_period mark it so you can avoid it or target it deliberately.
Why did a company I know is public come back no_match? Either the identifier does not
appear on the publishable surface, or the company is one of the 864 with no publishable
representation. match_method and domain_absent_reason say which.
How fresh is the data? data_source, data_as_of and snapshot_built_at ship on every row.
Read them rather than assuming. A snapshot row is at most about a day old.
🧩 Want other GTM data?
Every actor in the suite takes a domain or a company and returns one flat row, so they stack in the same Clay table without reshaping anything.
🛠️ Need something custom built for you or your team? Tell us what you are trying to find and we will build it. Talk to Mamba Labs.
🆘 Support
A company timed wrongly, or an identifier that should have matched? Open an issue on the Issues tab with the input and the rows, and we will look at it.
ℹ️ Sourcing and legal. Company identity, venue and classification come from openly published reference sources, and reporting events from US SEC filing history. Every row carries its
provenance_source,provenance_confidenceand, where the source requires one, itsattributionstring andlicense. The actor emits company identity, venue, classification and reporting dates. It holds no personal data and returns none. You are responsible for how you use the output.
Built by Mamba Labs.