Reporting Window Finder avatar

Reporting Window Finder

Pricing

from $5.10 / 1,000 company resolveds

Go to Apify Store
Reporting Window Finder

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

Mamba Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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 timing mode, you get its identity and a stated reason, never a guessed date.

💡 Why use this actor?

If you wantRead these fields
The next reporting datenext_event_date, next_event_type, next_event_period
To time outreach around itoutreach_window_open, outreach_window_close, window_status, days_to_event
To know how much to trust the dateconfidence_band, confidence_effective, next_event_source_rung
The reporting rhythmderived_cadence, cadence_confidence, cadence_observation_count
The fiscal calendarfiscal_year_end_mmdd, fiscal_year_end_month, is_non_calendar_fiscal_year
Company identitylegal_name, primary_ticker, isin, lei, cik, domain
Venue and classificationprimary_exchange_code, country_code, sector, security_type
To tell empty from brokenmatch_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:

FieldMeaning
matched_valueMatched Value
identity_basisIdentity Basis
domain_confidenceDomain Confidence
domain_sourceDomain Source
fields_limited_by_surfaceFields Limited By Surface
classification_schemeClassification Scheme
public_float_as_ofPublic Float As Of
returned_countReturned Count
source_tagSource Tag
noticeNotice
truncatedTruncated
period_startPeriod Start
period_endPeriod End
group_byGroup By
split_bySplit By
group_keyGroup
event_countEvents
company_countCompanies
estimated_shareEstimated Share
mean_confidenceMean Confidence
fiscal_year_end_sourceFiscal Year End Source
next_event_confidenceNext Event Confidence
next_event_source_nameNext Event Source Name
next_event_is_statutory_deadlineNext Event Is Statutory Deadline
window_lead_days_usedWindow Lead Days Used
window_lag_days_usedWindow Lag Days Used
skipped_nearer_eventSkipped Nearer
nearer_event_dateNearer Event Date
timing_disclaimerTiming Disclaimer
is_listedListed
listed_status_basisBasis
listed_status_checked_atListed Status Checked At
row_statusok 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_reasonWhy the row is partial or an error, in plain words. Null on an ok row. Always present, never a missing key.
billable_events_jsonThe 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

  1. Pick a mode. resolve for identity, timing for reporting dates and windows, universe to list companies matching a filter, season for aggregate reporting volume by week or month, qualify to test companies against filters.
  2. Give it identifiers: company_domains, tickers, isins, leis, ciks or company_names. Mix types freely in one run, up to 1,000 per run.
  3. For timing, set window_lead_days and window_lag_days. They default to 70 and 42, which opens the window ten weeks before the reporting date and closes it six weeks after.
  4. 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.

EventPrice
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.

FieldTypeDefaultWhat it does
modestring"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_domainstringnoneA single bare domain, e.g. stripe.com. The Clay column shape. Used by resolve, qualify and timing.
company_domainsarraynoneMany domains at once. Used by resolve, qualify and timing.
tickersarraynoneExchange tickers, e.g. NWLG. Matched against the primary ticker and every venue listing.
isinsarraynone12 character ISINs.
leisarraynone20 character Legal Entity Identifiers.
ciksarraynoneSEC Central Index Keys, with or without leading zeros.
company_namesarraynoneLegal or trading names. Matched on a normalized name. Former names are not available: the alias table carries tickers and ISINs only.
operating_companies_onlystring"false"Drop funds, trusts and other non operating entities. Sent as a string for Clay compatibility.
exclude_blank_checksstring"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_onlystring"false"qualify mode. Keep only rows proven to be publicly listed.
suppress_listedstring"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_privatestring"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_issuerstring"any"Filter on foreign private issuer status.
us_registrant_onlystring"false"Keep only companies carrying an SEC CIK.
exchange_codesarraynoneISO 10383 MICs. 18 venues are covered.
country_codesarraynoneISO 3166-1 alpha-2, e.g. US, GB, FR.
regionsarraynoneShorthand for a set of venues and countries: us, uk, eu. Widens an explicit exchange or country filter rather than replacing it.
sectorsarraynoneSEC SIC descriptions, e.g. Pharmaceutical Preparations. Populated on roughly 65 percent of the publishable universe.
security_typesarraynoneordinary_shares, depositary_receipt, preferred_shares.
public_float_bandsarraynonemicro, small, mid, large, mega, unknown. Size runs on public float because market capitalization is not populated anywhere in this dataset.
fiscal_year_end_monthsarraynoneIntegers 1 to 12. Fiscal year end is effectively a United States field in this dataset.
exclude_december_fiscal_year_endstring"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.
cadencesarraynonequarterly, semiannual, annual, unknown.
min_cadence_confidencestring"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_typesarraynonefull_year_results, half_year_results, quarterly_results, trading_update, annual_report_publication, sustainability_report_publication, agm, proxy_filing, capital_markets_day.
window_lead_daysstring"70"How many days before the event the outreach window opens. Default 70.
window_lag_daysstring"42"How many days before the event the outreach window closes. Default 42. Must be less than the lead.
window_statusesarraynoneKeep only rows in these window states: open, not_yet, closed_passed, no_event.
max_days_to_eventstringnoneDrop rows whose next event is further away than this. A cost control.
include_constrained_periodstring"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_bystring"week"season mode. Bucket size.
season_split_bystring"none"season mode. Optional second dimension.
season_fromstringnoneseason mode. ISO date. Defaults to today.
season_tostringnoneseason mode. ISO date. Defaults to 180 days from today.
min_provenance_confidencestring"any"Set to high to exclude rows whose source terms were never read.
exclude_name_only_matchesstring"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_alikestring"false"Drop rows derived from CC BY-SA sources, whose share alike condition may not suit a closed product.
limitstring"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 carries snapshot_built_at (when the copy was made) and snapshot_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, universe and season the 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_on and matched_value set to your identifier, row_status: "error", and an error_reason that starts with blocked: (the source refused), timed_out: (it did not answer in time), or error: (it failed). In universe and season mode 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?

🔔 Account Hiring Watch🕵️ Agent Accessibility Auditor
🤖 AI Tooling Detector📡 GTM Signals Aggregator
🚀 Prospect Engine📝 Publishing Frequency Tracker
🦋 Bluesky Brand Presence Mapper🔀 Career Change Signal Engine
⏩ Sequencer Lead Push🔄 Company Change Event Feed
📇 Company Contact Details Extractor🧭 Company Discovery List Builder
🏢 Company Firmographic Enricher🪪 Company Identity Resolver
🌐 Company Social Presence Mapper🏷️ Contact Classifier
📈 Influencer Change Monitor🔎 Influencer Finder
🧾 Influencer Lead List Builder👤 Influencer Profile Scraper
📬 Domain Deliverability Checker🔗 Domain to LinkedIn URL Resolver
🛒 Ecommerce Platform Profiler✉️ Work Email Waterfall
🎪 Event Presence Index⚖️ Expert Witness Directory
💵 Company Funding Record💰 Funding and Press Signal Scanner
🐙 GitHub Organization Signal Scanner🧑‍💼 GTM Hiring Signal Scraper
📋 Job Posting Monitor🧱 Tech Stack Signal Detector
🎯 ICP Fit Scorer🔑 Job Board Keyword Signal Scanner
🧳 Job Change Tracker🏛️ Legal Entity Resolver
📰 Link in Bio Scraper and Newsletter Detector💼 LinkedIn Company Page Mapper
💬 LinkedIn Post Tracker📢 Meta Ad Library Monitor
📸 Instagram Facebook Brand Presence Mapper🆕 New Hire Finder
📮 Outbound Stack Detector📄 Page Finder and Extractor
🧑 People Finder & Email Verifier📌 Pinterest Brand Presence Mapper
🏆 Government Contract Award Monitor👽 Reddit Brand Presence Mapper
⭐ Trustpilot Reputation Enricher🤝 Influencer Talent Agency Lookup
👥 Team Page People Extractor🎵 TikTok Brand Presence Mapper
📊 Website Traffic Rank Estimator🏅 Workplace Program Detector
✖️ X Brand Presence Mapper▶️ YouTube Channel Stats Extractor

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_confidence and, where the source requires one, its attribution string and license. 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.