{
  "captured_at": "2026-09-14T08:03:09.590523+00:00",
  "cohort": {
    "company_count": 66,
    "first_created_at": "2026-08-31T12:52:04.784102+00:00",
    "last_created_at": "2026-08-31T12:52:07.521431+00:00",
    "slugs": [
      "airbnb",
      "applovin",
      "braze",
      "c1-green-chemicals",
      "cambrium",
      "candis",
      "cara-care",
      "caspar-health",
      "checktur-io",
      "constellr",
      "cube",
      "data4life",
      "dataguard",
      "decarbon1ze",
      "deliverect",
      "delivery-hero",
      "dunia",
      "ecopals",
      "elara-digital",
      "extreme-networks",
      "focused-energy",
      "gigs",
      "highsnobiety",
      "hilo-by-aktiia",
      "hubspot",
      "iceye",
      "kaiko-systems",
      "kranus-health",
      "lingoda",
      "malt",
      "miles-mobility",
      "motor-ai",
      "nilo",
      "nomos",
      "noxtua",
      "nuventura",
      "over99",
      "patient21",
      "pinterest",
      "planet-labs",
      "ppro",
      "project-q",
      "ratepay",
      "reddit",
      "rematiq",
      "reonic",
      "riot-games",
      "samedi",
      "scale-energy",
      "scout24",
      "sensmore",
      "sony-interactive-entertainment",
      "sosafe",
      "staffbase",
      "startup-insider",
      "swobbee",
      "theion",
      "too-good-to-go",
      "traide-ai",
      "travelcircus",
      "via",
      "vivira-health-lab",
      "voiio",
      "xsolla",
      "zalando",
      "zattoo"
    ]
  },
  "inventory": [
    {
      "in_batch": true,
      "roles": 455,
      "no_german": 272,
      "german_required": 182,
      "unknown_language": 1,
      "salary_disclosed": 28,
      "dated": 410,
      "predating_batch": 337,
      "median_posted_at": "2026-07-23T08:27:10+00:00"
    },
    {
      "in_batch": false,
      "roles": 2365,
      "no_german": 1289,
      "german_required": 1076,
      "unknown_language": 0,
      "salary_disclosed": 193,
      "dated": 2303,
      "predating_batch": 1889,
      "median_posted_at": "2026-07-21T00:00:00+00:00"
    }
  ],
  "daily_snapshots": [
    {
      "date": "2026-08-30",
      "berlin_active": 2342,
      "classified_roles": 2340,
      "german_none": 1274,
      "companies_active": 408,
      "recorded_at": "2026-08-30T16:55:27.864+00:00"
    },
    {
      "date": "2026-08-31",
      "berlin_active": 2838,
      "classified_roles": 2827,
      "german_none": 1565,
      "companies_active": 474,
      "recorded_at": "2026-08-31T16:55:26.913+00:00"
    }
  ],
  "source": {
    "tables": [
      "companies",
      "jobs",
      "job_count_daily"
    ],
    "method": "Read-only SQL; aggregate values captured in one statement.",
    "query": "with cohort as (\n select slug, created_at from companies\n where created_at >= timestamptz '2026-08-31 00:00:00+00'\n and created_at < timestamptz '2026-09-01 00:00:00+00'\n), inventory as (\n select j.*, c.slug is not null as in_batch\n from jobs j left join cohort c on c.slug=j.company_slug\n where j.status='active' and lower(j.location) like '%berlin%'\n), aggregates as (\n select in_batch, count(*) as roles,\n count(*) filter(where language_tier='none') as no_german,\n count(*) filter(where language_tier='required') as german_required,\n count(*) filter(where language_tier is null) as unknown_language,\n count(*) filter(where salary_min is not null or salary_max is not null) as salary_disclosed,\n count(*) filter(where posted_at is not null) as dated,\n count(*) filter(where posted_at < timestamptz '2026-08-31 00:00:00+00') as predating_batch,\n percentile_disc(0.5) within group(order by posted_at) as median_posted_at\n from inventory group by in_batch\n)\nselect json_build_object(\n 'captured_at',now(),\n 'cohort',(select json_build_object('company_count',count(*),'first_created_at',min(created_at),'last_created_at',max(created_at),'slugs',json_agg(slug order by slug)) from cohort),\n 'inventory',(select json_agg(aggregates order by in_batch desc) from aggregates),\n 'daily_snapshots',(select json_agg(s order by date) from (select date,berlin_active,classified_roles,german_none,companies_active,recorded_at from job_count_daily where date in ('2026-08-30','2026-08-31')) s)\n) as evidence;"
  },
  "definitions": {
    "cohort": "Companies created on 2026-08-31 UTC; exact slugs retained above.",
    "inventory": "jobs.status = active and lower(jobs.location) like '%berlin%'; no company-status filter, matching the daily job metrics.",
    "no_german_share": "no_german / (no_german + german_required) * 100; unknown language excluded and reported separately.",
    "salary_disclosure_share": "salary_disclosed / roles * 100; either salary_min or salary_max is non-null. Missing extracted amounts are not proof of employer omission.",
    "dated_share_predating_batch": "predating_batch / dated * 100; missing posted_at excluded.",
    "median_posted_at": "Discrete median over non-null ATS posting timestamps.",
    "daily_snapshots": "One row per UTC date, overwritten by subsequent snapshot writes; recorded_at identifies each saved reading.",
    "companies_active": "Active registry companies plus acquired companies with active Berlin listings; not a count of employers that opened a role that day."
  },
  "limitations": [
    "Current inventory is not historical batch inventory on August 31; surviving listings and later additions may differ.",
    "Whole-board daily changes cannot be attributed solely to this cohort.",
    "ATS dates may describe reposts or updates rather than original vacancy creation.",
    "Listings do not establish hires or hiring demand.",
    "Rerunning this query later changes current-inventory results; retained values are the dated evidence."
  ],
  "external_sources": [
    {
      "publisher": "Bundesagentur für Arbeit, Regionaldirektion Berlin-Brandenburg",
      "published": "2026-08-28",
      "accessed": "2026-09-14",
      "url": "https://www.arbeitsagentur.de/vor-ort/rd-bb/presse/2026-18-berlinbrandenburg-sommerpause-auf-dem-arbeitsmarkt-weckruf-fur-die-fachkraftesicherung",
      "period": "August 2026 reporting month",
      "berlin_newly_reported_positions": 5723,
      "month_over_month_percent": 10.2,
      "year_over_year_percent": 13.7,
      "scope": "Reported inflow across Berlin sectors; not comparable to a daily stock of startup listings."
    },
    {
      "publisher": "Cedefop",
      "title": "Assessing the representativeness of online job advertisements",
      "published": "2022-12",
      "accessed": "2026-09-14",
      "url": "https://www.cedefop.europa.eu/files/6217_en.pdf",
      "doi": "10.2801/807500",
      "locator": "Executive summary, printed page 4",
      "scope": "European coverage-bias research, not a current Berlin estimate or an audit of Pegel."
    },
    {
      "publisher": "IAB",
      "author": "Alexander Kubis",
      "published": "2026-06-08",
      "accessed": "2026-09-14",
      "url": "https://iab-forum.de/online-medien-sind-bei-der-personalsuche-auf-dem-vormarsch/",
      "period": "2025 recruitment-channel results",
      "own_website_used_percent": 70,
      "private_job_boards_used_percent": 57,
      "scope": "Germany; successful recruitment into social-insurance employment, excluding apprenticeships and marginal employment. Multiple channels possible; not application success rates.",
      "date_note": "Main article date and citation use June 8, 2026; the footer citation inconsistently says March 6. Main article date retained."
    }
  ]
}
