All documentsSchema · Version 2.0

Data dictionary

Every table and column, with conventions, identifiers and value lists.

Field guide for the Marketing stack, Hiring, Intent, Announcements-and-scale and Market-series products. Method: METHODOLOGY.md. Sourcing: SOURCING.md.

Conventions

  • Files are CSV, UTF-8, one header row (JSONL through the API). Lists and objects are JSON in a single cell.
  • Times are UTC, ISO 8601. day is a closed UTC day; week_start is the Monday of a Monday-to-Sunday UTC week.
  • Every file carries company_id (stable), company, and the identifiers of the listing when the company or its parent is listed: ticker, exchange (the venue code), mic (ISO 10383), isin, lei, figi (the share-class FIGI). Join across products on company_id; join to market data on isin, figi or ticker + mic. Identifiers come from OpenFIGI, GLEIF, Wikidata and the SEC ticker file (METHODOLOGY.md section 4.1); an ISIN or LEI whose check digit fails is never stored.
  • Daily and weekly rows are written once and never changed. reconstructed=true marks a period written more than seven days after it closed.
  • Only companies in the Fokals company index are delivered, and only those with a website read in English, on its homepage or in the English version it declares: a company with no such website is in no file, and a website with neither is in no file of websites (METHODOLOGY.md section 4.2). listed_securities keeps every listing; a listing of a company that is left out carries no company.

Marketing stack

company_technologies

One row per company website and technology seen on it in the period.

ColumnMeaning
domainThe company website.
technologyTechnology id (stable).
technology_name, technology_categoryReadable name and category.
technology_cataloguefokals when the signature is one Fokals writes and tests, open when it comes from the open-source catalogue (Methodology 5.1).
first_seen_at, last_seen_atFirst and latest reading that saw it.
missing_sinceSet while absent from recent readings but not yet counted as removed.
seen_viaViews that saw it: html (homepage), container (tag-manager container), network (browser read), header (response headers), dns (DNS records).
account_idsPublic account ids found with it (pixel ids, analytics properties, containers).

company_tech_events

Every change seen between two readings of a company website. A site's first reading writes none.

ColumnMeaning
observed_atReading that saw the change.
categorytechnology, technology_id (a new account id under a technology already there), dns, platform (commerce or content platform replaced), market, language, currency, app, social, page, promo.
keyWhat changed: a technology id, technology:account, a country code, a language code, a currency, ios:<id> or android:<package>, a social platform, a page key, announcement.
changeadded, removed or changed.
before, afterValues before and after (JSON).
technology_name, technology_categoryFor technology and DNS events.
technology_catalogueFor technology and DNS events: fokals or open, as in company_technologies.

company_site_facts

The latest reading of each company website in the period.

ColumnMeaning
last_read_atTime of the reading.
read_urlThe address read when it is not the homepage: the site's English version, declared by the homepage. Empty when the homepage itself was read.
home_languageThe language of the homepage when the site was read in its English version.
title, langPage title and declared language.
marketsCountry codes the site declares alternate versions for.
languagesLanguage codes of the page and its alternates.
currenciesCurrencies of prices marked up on the page.
social_accountsThe company's own accounts: {platform: handle}.
apps{ios: [app ids], android: [package names]}.
key_pages{key: url} for pricing, demo, free_trial, contact_sales, login, careers, investors, newsroom, partners, affiliate_program, store_locator, subscription, wholesale, gift_cards, blog, api_docs, status.
schema_typesStructured-data types marked up on the page.
latest_promotion{text, offers, discount} from the announcement bar.

Website labels (sites-v2)

The labels each website carries in the dashboard and the data browser (site_state.labels, with label_version; sites-v1 until the site's next read). They are not yet a column of company_site_facts. Each label has its probability under probabilities; an empty choice or score means the model was not confident enough.

  • Choices: industry (21 industries), business_model (b2b, b2c, both), offering (physical_products, software_saas, services, marketplace, media_content, financial_products, healthcare, travel_hospitality, education, nonprofit_public, other), sales_motion (self_serve, sales_led, both, offline), price_tier (budget, mid_market, premium, luxury, not_stated), target_customer_size (consumers, smb, mid_market, enterprise, mixed), pricing_model (free, freemium, subscription, usage_based, one_time, quote_only, not_stated), geography_scope (local, national, multi_country, global), primary_persona (marketing, sales, engineering_it, finance_ops, hr_people, executives, consumers, clinicians, other), growth_stage (startup, scaleup, established, incumbent, unknown).
  • Scores (0–3, the most probable of four described levels): ecommerce_maturity, tech_sophistication, content_intensity.
  • Flags (true/false): sells_online, physical_locations, subscription, ai_product, sustainability, enterprise_focus, international, has_api, has_mobile_app, has_free_trial, has_demo_request, compliance_badges, has_partner_program, sells_to_government, regulated_industry.

sites-v1 rows carry the first five choices and the first seven flags only, with the same meanings.

Hiring

job_postings

One row per posting open at any time in the period. Descriptions are not delivered.

ColumnMeaning
posting_idStable id.
board_platformThe job board's system (greenhouse, lever, ashby, workday, recruitee, personio, jsonld for job markup on the company's own careers page).
urlThe public posting.
title, department, teamAs published.
locations[{city, region, country}].
countryFirst location's country (ISO 3166-1 alpha-2).
work_modeonsite, hybrid, remote or empty.
employment_typefull_time, part_time, contract, temporary, internship or empty.
posted_atPosting date as the board gives it.
first_seen_at, last_seen_at, closed_atWhen we first and last saw it, and when it was closed (absent from two complete reads at least 20 hours apart).
found_on_first_readAlready on the board at our first read of it: first_seen_at is not its opening date.
salary_min, salary_max, salary_currency, salary_periodPay as stated; period year, month, week, day or hour.
salary_usd_annual_min, salary_usd_annual_maxPay on one yearly US-dollar scale at the latest ECB reference rate; empty when outside 5,000–2,000,000.
experience_years_minMinimum years of experience asked for.
degreenone, bachelor, master, doctorate or empty.
visa_sponsorshipoffered, not_offered or empty.
languagesLanguages required (ISO 639-1).
technologiesSoftware named in the posting (catalogue ids); the company's own products are left out.
label_versionjobs-v2 (jobs-v1 for postings labelled before 23 September 2026 and not yet relabelled).
labels{job_function, seniority, remote_policy, contract_type, technical_depth, people_manager, ai_role, paid_media, selects_tools, international, new_initiative, urgent, team_build, replaces_vendor, budget_owner, tool_*}. An empty choice or score means the model was not confident enough. jobs-v1 rows carry the first two choices and the first six flags only.
sales_factsFor a posting that states them, what the employer says about the deal (JSON): ote and base as written ({min, max, currency, period}) with ote_usd and base_usd (yearly US-dollar midpoints), base_share (0.5 for a 50/50 split), uncapped, variable_pay, quota ({amount, currency, period}) and quota_usd, ramp_months, lead_source (inbound, outbound, mixed), inbound_share (percent), deal_size and deal_size_usd, sales_cycle_months. Empty when the posting states none. Advertised, not realised.
sales_labels, sales_label_versionFor a posting in a sales function, the sales-v1 labels below; empty otherwise.

job_function (26): software_engineering, hardware_engineering, data_analytics, data_science_ml, product_management, design, marketing_brand, marketing_performance, marketing_content_social, sales, sales_development, customer_success_support, operations, supply_chain_logistics, manufacturing_production, finance_accounting, legal_compliance, people_hr, it_security, research_science, healthcare_clinical, retail_store, hospitality_food, education_training, executive_leadership, other.

seniority (9): intern, entry, mid, senior, lead_principal, manager, director, vp, c_level.

remote_policy: remote, hybrid, onsite, unspecified. contract_type: permanent, contract, temporary, internship, unspecified.

technical_depth (0–3): 0 no technical skills required; 1 uses technical tools as a user; 2 builds, configures or administers technical systems; 3 designs or leads complex technical systems.

Flags (true/false): people_manager, ai_role, paid_media, selects_tools, international, new_initiative, urgent (immediate start or urgent hire), team_build (one of several hires growing a team), replaces_vendor (brings agency or vendor work in-house), budget_owner.

Tool families (true when the posting names or requires the family's products): tool_salesforce, tool_hubspot, tool_google_ads, tool_meta_ads, tool_ga4, tool_adobe, tool_shopify, tool_sap, tool_workday, tool_snowflake, tool_databricks, tool_aws, tool_azure, tool_gcp, tool_figma.

Sales labels (sales-v1)

Read once more, by the same model, for every posting jobs-v2 puts in a sales function (and account-management titles filed under customer success, sales leaders filed under executives). Choices kept at probability 0.45 or above: role (sdr_bdr, account_executive, account_manager, sales_engineer, sales_leadership, sales_operations, partnerships_channel, other) and segment (smb, mid_market, enterprise, unspecified). Flags kept at 0.7 or above: quota_carrying, inbound_leads, outbound_prospecting, new_business, founding_sales. Probabilities are kept with the labels.

label_checks

Hand grading of the website and posting labels (not delivered; the source of the accuracy figures in METHODOLOGY.md section 6.5). One row per graded field.

ColumnMeaning
kindsite or posting.
subjectThe website domain, or the posting id.
versionThe label version graded (sites-v2, jobs-v2). Figures are per version.
fieldThe label field (industry, sells_online, job_function, tool_aws, ...).
model_valueThe label as the model gave it, as text.
verdictcorrect, wrong or unsure. Precision = correct / (correct + wrong).
correct_valueWhat the grader says it should be, when wrong.
checked_by, checked_atWho graded it and when.

company_hiring_daily

Per company and closed UTC day.

ColumnMeaning
open_postings, new_postings, closed_postingsOpen at the end of the day; seen opening that day (not first-read postings); closed that day.
by_function, by_seniority, by_country, by_work_modeOpen postings by label or field: {value: count}.
ai_postings, paid_media_postingsOpen postings with those flags.
tech_mentionsOpen postings naming each tool: {tool: count}.
median_salary_usdMedian of open postings' yearly US-dollar pay (midpoint of range).

company_sales_weekly

The sales organisation per company and closed week (Monday to Sunday UTC), from its own postings. Written once after the week closes. A sales posting is one labelled under sales-v1 with any role but other; a company has a row for a week in which it had one open, opened or closed.

ColumnMeaning
week_startThe Monday.
open_sales, new_sales, closed_salesSales postings open at the week's end; opened in the week (not first-read ones); closed in it.
open_allEvery posting open at the week's end, for the sales share.
by_role, by_segment, by_countryOpen sales postings by sales-v1 role and segment, and by country: {value: count}.
new_countriesCountries with the company's first sales posting this week, none before.
upmarketThe company's first enterprise-segment sales posting opened this week.
median_base_usd, median_ote_usdMedian advertised base pay and on-target earnings of open sales postings, yearly US dollars, by role. Base is the stated base, or a plain salary range when no OTE is stated.
toolsSales tools named in open sales postings: {tool: count}.
quota_statedOpen sales postings that state a quota or target.
inbound_shareMedian stated share of inbound pipeline, percent, when stated.

sales_pay_benchmarks

What employers advertise for sales roles, across companies, per closed week, role and country (ALL for every country together). Only groups of at least five postings.

ColumnMeaning
week_start, role, countryThe week, the sales-v1 role, the posting's country or ALL.
postingsOpen sales postings in the group with a stated base or OTE.
base_p25_usd, base_median_usd, base_p75_usdQuartiles of advertised base pay, yearly US dollars.
ote_p25_usd, ote_median_usd, ote_p75_usdQuartiles of advertised on-target earnings.

Intent

company_intent_weekly

Per company, topic and closed week, for topics scoring at least 5.

ColumnMeaning
topic, topic_label, topic_groupOne of 69 topics in nine groups.
intent_versionintent-v2.
score0–100, from the signals of the 90 days to the week's end, fading by half every 30 days.
surgeAt least 50 and at least double the company's own average for the topic over the previous twelve weeks.
signalsNumber of signals behind the score.
evidenceThe five strongest: [{date, kind, source, weight, detail}].

company_signals

Every dated signal behind the scores.

ColumnMeaning
observed_atWhen the action was seen (a posting's own date where it has one; a filing's date).
sourcesite, dns, careers, filing, news (an announcement; kind news_event, weight 1–3, detail = {title, url, events, from}).
kindFor example ad_platform_added, tech_added, tech_removed, tech_account_added, dns_verification_added, replatformed, market_added, language_added, currency_added, app_added, social_account_added, sales_motion_added, programme_added, investor_relations_added, careers_added, posting_tool, posting_paid_media, posting_selects_tools, posting_international, posting_ai, posting_new_initiative, posting_leadership, model_topic, funding.
topicsTopics the signal counts towards. A model_topic signal carries one to three.
weightIts strength before fading (0–5). model_topic weighs 2.
detailWhat was seen (technology, market, posting title, amount raised). For model_topic: {version, group, probability, probabilities, title, posting or domain}, version being signal-v2.

company_funding

SEC Form D notices by operating companies (pooled investment funds left out).

ColumnMeaning
accessionSEC accession number.
formD (new notice) or D/A (amendment).
filed_atFiling date.
issuer, cikIssuer's legal name and SEC id.
company_id, company, tickerSet when the issuer matches exactly one company in the index.
industryIndustry group as filed.
city, stateIssuer's principal place of business.
amount_offered, amount_soldUS dollars; empty when indefinite.
first_saleDate of first sale.
is_amendmentAn amendment to an earlier notice.
detailsEntity type, jurisdiction, year of incorporation, revenue range, exemptions, securities, whether the offering runs more than a year, business combination, minimum investment, amount remaining, number of investors, non-accredited investors, sales commissions and finders' fees.

Announcements and scale

company_news

One row per announcement a company made about itself: an item on its newsroom or press page, an entry in a feed its homepage declares, or (listed companies) a Form 8-K current report.

ColumnMeaning
atThe date the company published it (published_at); when the source gives none, when we first saw it.
company_id, company, tickerThe company that published it.
sourcerss, atom, page (the company's newsroom page) or sec_8k.
urlThe original announcement or filing document.
titleAs published (for an 8-K: the form and its item labels).
event_typesZero or more of product_launch, partnership, acquisition_made, acquired_or_merged, funding_round, leadership_change, layoffs_restructuring, expansion, incident, financial_results, award_or_recognition, regulatory_or_legal, other. Newsroom items: read by the model under news-v1; 8-Ks: from the item numbers.
itemsForm 8-K item numbers filed under (for example 2.01, 5.02, 9.01); empty otherwise.
accessionSEC accession number, for 8-Ks.
excerptAt most 1,200 characters of the announcement's own text (for an 8-K, the text under its items).
label_versionnews-v1 (model-read) or sec-items-v1 (mapped from item numbers).
roles, role_labels, role_versionFor a leadership change, the role concerned under roles-v1 (below); never the person.

News labels (news-v1): one choice, event_type (the list above, kept at probability 0.45 or above), and five flags kept at 0.7 or above: about_this_company (the item is about the company itself), executive_appointment, executive_departure, names_amount (a money amount is stated), mentions_hiring. Probabilities are kept with the labels. An item the model does not read as being about the company carries no event type.

Leadership roles (roles-v1): for an item whose event type is a leadership change (from the model or from Form 8-K item 5.02), the same model reads the company's own text once more for the role concerned, one of ceo, cfo, coo, cro_cso (revenue, sales or commercial leader), cmo, cto_cio_cpo, chro, general_counsel, board, other_executive, none, and the direction (appointed, departed, succession), with a multiple flag when more than one role changes. Choices are kept at 0.45 or above, the flag at 0.7. The person is not stored; roles holds the role id.

company_headcounts

Employee counts over time, from public statements. One row per company, date and source.

ColumnMeaning
as_ofThe date the count refers to: the annual report's period end, or the date Wikidata gives.
company_id, company, tickerThe company.
employeesThe count as stated.
sourcesec_10k (the annual report) or wikidata.
refThe filing's accession number, or the Wikidata item id.

traffic_ranks

The website's monthly traffic tier from the Chrome UX Report (Google), licensed CC BY 4.0; delivered with attribution.

ColumnMeaning
monthFirst day of the month the rank is for.
domain, company_id, companyThe website and its company.
rank_bucketThe smallest bucket the origin is in: 1000, 5000, 10000, 50000, 100000, 500000, 1000000, 5000000, 10000000, 50000000. Smaller is more traffic.
originThe origin the bucket came from (https://www.example.com), the best among the domain's variants.
attributionChrome UX Report (Google), CC BY 4.0.

listed_securities

Listed securities: one row per equity listing worldwide, keyed by FIGI, with the company it belongs to when one matches. Served by the API (/listed) and available as a file on request; the identifier columns of every other dataset come from it.

ColumnMeaning
figiThe listing's FIGI (stable, one per listing). A listing Wikidata asserts and OpenFIGI does not yet carries a wd: key in its place until a pass brings the FIGI.
share_class_figiThe FIGI shared by every listing of the same share class; the value carried as figi on the other datasets.
nameThe issuer's name as the source gives it.
ticker, exchangeThe ticker and OpenFIGI's venue code (US, LN, GR, JP ...).
micThe venue's ISO 10383 market identifier code, when known.
isin, leiThe security's ISIN and the issuer's LEI (through GLEIF's ISIN-to-LEI file), each only when its check digit is valid.
countryThe issuer's country, from its LEI record or Wikidata.
security_typeOpenFIGI's type: Common Stock, Depositary Receipt, REIT, Partnership Shares and the national certificate forms; never funds, ETPs, rights, warrants or preferred stock.
statusactive, or delisted once a listing has not been seen for 45 days after a full pass (the row is kept, so history joins stay intact).
company_id, companyThe company in the Fokals index this listing belongs to; empty until a match is made. The match is by ISIN, LEI, ticker on the same market, or name and country, in that order.

Market series

market_series

How an industry, a country, a size band or a market moved, computed weekly from the company tables (METHODOLOGY.md section 9). One row per metric, dimension, window and as-of date, written once. Rows over fewer than 20 companies (20 postings for pay and share metrics) are not written.

ColumnMeaning
as_ofThe Sunday the windows end (UTC, inclusive).
metricA metric family, or family:subject for families with subjects (tech_added:salesforce, seniority_share:senior, news_event:funding_round, intent_surge:crm).
family, subject, metric_name, unit, sourceThe catalogue's description of the metric, added on export and by the API.
dimension_kind, dimensionall; industry (the sites-v2 industry id); sector (the company's sector text); country (ISO 3166-1 alpha-2 headquarters country); size (1-10, 11-50, 51-200, 201-1000, 1001-5000, 5000+); market (an exchange code, for listings).
window_days7, 30, 180; 365 for headcount; traffic has 30 and 180 only.
countThe numerator: events, postings or companies in the window; for a median metric, the median itself.
cohortWhat the rate is over: companies or websites covered since before the window began (same-store), or postings for share and pay metrics. 0 for listings.
ratecount in the metric's unit: per_100_companies, per_100_sites, share_of_postings (0 to 1), share_of_companies (0 to 1), median_usd, median_pct; empty for count metrics.
previousThe same count over the window just before this one, on the same cohort.
growth(count − previous) / previous; empty when there was nothing before.
index100 at the series' first as-of date, then the rate relative to it.

Metric families (GET /api/v1/series/metrics gives the live catalogue with subject lists): hiring_new, hiring_closed, hiring_open, hiring_net, pay_median, seniority_share, work_mode_share, function_share, ai_role_share, sales_share, sales_segment_share, sales_lead_source_share, sales_ote_median, sales_base_median, tech_added, tech_removed, tech_prevalence, gtm_page_added, market_added, language_added, replatformed, news_event, intent_surge, traffic_up, traffic_down, headcount_change_median, listings_new, listings_delisted.