{
  "query": {
    "kind": "default",
    "from": "2026-10-01T16:55:02.375Z",
    "to": "2026-10-31T16:55:02.375Z",
    "filters": []
  },
  "count": 80,
  "occurrences": [
    {
      "contest_id": "sarl-equinox-6m-september",
      "name": "SARL Equinox 6m African DX Entity Challenge (September)",
      "start": "2026-09-16T00:01:00Z",
      "end": "2026-10-15T23:59:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 719.97,
      "modes": [
        "FT8/FT4"
      ],
      "submodes": [
        "FT8"
      ],
      "bands": [
        "6m"
      ],
      "bands_note": "",
      "sponsor": "SARL",
      "rules_url": "https://mysarl.org.za/wp-content/uploads/2025/11/2026-SARL-Equinox-6m-African-DX-Entity-Challenge-v1.1.pdf",
      "verified": true,
      "note": "A month-long challenge rather than a weekend contest, which is why it is the longest single occurrence in the catalog. 16 September to 15 October is 29 days. The two legs are separate records because their end offsets differ -- the March leg runs 30 days and the September leg 29 -- and one record carries one start/end pair. SARL's own calendar marks each leg with a start and an end event rather than one long block, and those markers confirm both instants.",
      "exchange": "Signal reports; contacts must be two-way point to point.",
      "country": "ZA",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-19",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "sarl-equinox-6m-september-20260916T0001@contestcal",
      "start_date": "2026-09-16",
      "mode_families": [
        "Digital",
        "FT8/FT4"
      ],
      "band_families": [
        "6m"
      ],
      "duration_bucket": "gte24"
    },
    {
      "contest_id": "sarl-80m-qso-party",
      "name": "SARL 80 m QSO Party",
      "start": "2026-10-01T17:00:00Z",
      "end": "2026-10-01T20:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 3,
      "modes": [
        "SSB"
      ],
      "submodes": [],
      "bands": [
        "80m"
      ],
      "bands_note": "Only 3 603-3 650 and 3 703-3 800 kHz may be used; 3 651-3 699 kHz is contest free.",
      "sponsor": "SARL",
      "rules_url": "https://mysarl.org.za/wp-content/uploads/2025/12/2026-SARL-Contest-Manual-Version-1.1-2025-12-15.pdf",
      "verified": true,
      "note": "Two legs on one record: both run 17:00-20:00 UTC on a first Thursday. A Thursday evening rather than a weekend, which is unusual enough to be worth stating. log_format and log_deadline_days are absent: this pass read each contest's Aim, Dates, Frequencies and Exchange sections and did not read its Log Sheets section, so neither is recorded rather than assumed from SARL's other contests.",
      "exchange": "Call sign, RS signal report and the operator's name.",
      "country": "ZA",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-19",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "sarl-80m-qso-party-20261001T1700@contestcal",
      "start_date": "2026-10-01",
      "mode_families": [
        "SSB"
      ],
      "band_families": [
        "80m"
      ],
      "duration_bucket": "2-12"
    },
    {
      "contest_id": "skcc-skse",
      "name": "SKCC Straight Key Sprint Europe (SKSE)",
      "start": "2026-10-01T19:00:00Z",
      "end": "2026-10-01T21:00:00Z",
      "start_wall": "2026-10-01T21:00:00",
      "end_wall": "2026-10-01T23:00:00",
      "local_rolling": false,
      "timezone": "Europe/Berlin",
      "duration_hours": 2,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "bands_note": "160 through 6 m excluding the WARC bands -- SKCC names 60, 30, 17 and 12 m as excluded.",
      "sponsor": "Straight Key Century Club",
      "rules_url": "https://www.skccgroup.com/operating_activities/skse/",
      "verified": true,
      "note": "SKCC PRINTS TWO UTC TIMES AND THE CONTEST HAS ONE LOCAL TIME. 2000Z from November to March and 1900Z from April to October are both 2100 in central Europe: CET is UTC+1 and CEST is UTC+2. So this is not a contest that changes its hour twice a year, it is a contest at nine in the evening that Europe's clocks move around, and it is recorded the way the sponsor means it -- `timezone: Europe/Berlin` with wall_clock times, exactly as the ARS Spartan Sprint is recorded in New York.\n\nTHAT READING IS TESTABLE AND IT PASSES ON THE MONTHS THAT DECIDE IT. Europe changes clocks on the last Sunday of March and of October, and the first Thursday of both months falls on the near side of the change: March is still CET and resolves to 2000Z, April is CEST and resolves to 1900Z, October is still CEST at 1900Z, November is CET at 2000Z. All four match SKCC's own table, which is what makes this one rule rather than two.\n\nEncoding it as two records split by month -- winter and summer -- would have produced two entries with the same name and hidden the reason. Encoding one UTC time would have been wrong for five months of the year.\n\nStraight keys, sideswipers and bugs only: no keyer, no keyboard. That is the club's whole premise rather than a category.\n\nThe fifteen-minute QRS extensions at each end are not in the window: they are an invitation to slow operators rather than part of the scored period.",
      "exchange": "RST, QTH, the operator's name and the SKCC number. Non-members send 'none' for the number.",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-23",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-10-08T21:00:00Z",
      "uid": "skcc-skse-20261001T1900@contestcal",
      "start_date": "2026-10-01",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "duration_bucket": "2-12"
    },
    {
      "contest_id": "nccc-ns-ft4",
      "name": "NCCC FT4 Sprint (FT4 NS)",
      "start": "2026-10-02T01:00:00Z",
      "end": "2026-10-02T01:30:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.5,
      "modes": [
        "FT8/FT4"
      ],
      "submodes": [
        "FT4"
      ],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "Northern California Contest Club (NCCC)",
      "rules_url": "https://www.ncccsprint.com/ft4ns.html",
      "verified": true,
      "note": "NCCC describes these as 'nominal rules' that may be modified on a weekly basis, and runs formal Ladder seasons interspersed with practice weeks. The 30-minute session slot itself is fixed.",
      "exchange": "Grid square (following NA VHF, WW Digi and ARRL IDC practice)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "nccc-ns-ft4-20261002T0100@contestcal",
      "start_date": "2026-10-02",
      "mode_families": [
        "Digital",
        "FT8/FT4"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "nccc-ns-rtty",
      "name": "NCCC RTTY Sprint (RTTY NS)",
      "start": "2026-10-02T01:45:00Z",
      "end": "2026-10-02T02:15:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.5,
      "modes": [
        "RTTY"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "bands_note": "",
      "sponsor": "Northern California Contest Club (NCCC)",
      "rules_url": "https://ncccsprint.com/rttyns.html",
      "verified": true,
      "note": "NCCC describes these as 'nominal rules' that may be modified on a weekly basis, and runs formal Ladder seasons interspersed with practice weeks. The 30-minute session slot itself is fixed.",
      "exchange": "Serial number + name + QTH (both callsigns required in the exchange)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "nccc-ns-rtty-20261002T0145@contestcal",
      "start_date": "2026-10-02",
      "mode_families": [
        "RTTY",
        "Digital"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "nccc-ns-cw",
      "name": "NCCC Sprint (NS)",
      "start": "2026-10-02T02:30:00Z",
      "end": "2026-10-02T03:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.5,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "bands_note": "",
      "sponsor": "Northern California Contest Club (NCCC)",
      "rules_url": "https://ncccsprint.com/rules.html",
      "verified": true,
      "note": "NCCC describes these as 'nominal rules' that may be modified on a weekly basis, and runs formal Ladder seasons interspersed with practice weeks. The 30-minute session slot itself is fixed.",
      "exchange": "Serial number + name + QTH (both callsigns required in the exchange)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "nccc-ns-cw-20261002T0230@contestcal",
      "start_date": "2026-10-02",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "k1usn-sst",
      "name": "K1USN Slow Speed Test (SST)",
      "start": "2026-10-02T20:00:00Z",
      "end": "2026-10-02T21:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "",
      "sponsor": "K1USN Radio Club",
      "rules_url": "https://www.k1usn.com/sst_rules.html",
      "verified": true,
      "note": "No formal log submission -- participants post scores to 3830scores.com.",
      "exchange": "Name + state/province/DX country",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "k1usn-sst-20261002T2000@contestcal",
      "start_date": "2026-10-02",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "ocdx-phone",
      "name": "Oceania DX Contest, Phone",
      "start": "2026-10-03T06:00:00Z",
      "end": "2026-10-04T06:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 24,
      "modes": [
        "SSB"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "160M, 80M, 40M, 20M, 15M and 10M (no WARC bands)",
      "sponsor": "Oceania DX Contest Committee",
      "rules_url": "https://www.oceaniadxcontest.com/rules",
      "verified": true,
      "note": "The log deadline is announced each year rather than set as an interval -- 25 October in 2026, 31 October in earlier years -- so this calendar does not compute one. country is 'OC' because the sponsor is a joint VK/ZL committee rather than a national society; see data/sources.md.",
      "exchange": "RS(T) and a progressive serial number starting at 001",
      "country": "OC",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-17",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "ocdx-phone-20261003T0600@contestcal",
      "start_date": "2026-10-03",
      "mode_families": [
        "SSB"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "gte24"
    },
    {
      "contest_id": "agcw-dtc",
      "name": "Deutscher Telegrafie Contest (DTC)",
      "start": "2026-10-03T07:00:00Z",
      "end": "2026-10-03T10:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 3,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "80m",
        "40m"
      ],
      "bands_note": "",
      "sponsor": "AGCW-DL / High Speed Club (HSC)",
      "rules_url": "https://www.agcw.de/contest/dtc/",
      "verified": true,
      "note": "Anchored on German Unity Day, a fixed calendar date, so it moves through the week rather than sitting on a weekend. 'Seit einigen Jahren' -- for some years now -- is AGCW hedging its own history, not the current rule.",
      "exchange": "German stations: RST + LDK (district vehicle registration code). All others: RST only.",
      "country": "DE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-12",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "Every QSO must involve a German station: 'Mindestens eine der an einem QSO beteiligten Stationen muss sich in Deutschland befinden.' Non-DL entrants can therefore work only DL stations.",
      "log_due": null,
      "uid": "agcw-dtc-20261003T0700@contestcal",
      "start_date": "2026-10-03",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "80m",
        "40m"
      ],
      "duration_bucket": "2-12"
    },
    {
      "contest_id": "erau-es-ll-kv",
      "name": "Estonian HF Cup (ES LL KV)",
      "start": "2026-10-03T07:00:00Z",
      "end": "2026-10-03T07:59:00Z",
      "start_wall": "2026-10-03T10:00:00",
      "end_wall": "2026-10-03T10:59:00",
      "local_rolling": false,
      "timezone": "Europe/Tallinn",
      "duration_hours": 0.98,
      "modes": [
        "CW",
        "SSB"
      ],
      "submodes": [],
      "bands": [
        "80m"
      ],
      "bands_note": "CW below 3600 kHz and SSB above it; 3530-3560 kHz and 3600-3650 kHz are recommended.",
      "sponsor": "ERAU",
      "rules_url": "https://www.erau.ee/images/LL/ES%20LL%20KV%20reeglid.pdf",
      "verified": true,
      "note": "SPONSOR-ANCHORED LOCAL TIME, and ERAU's own calendar proves the reading: 10:00-10:59 Estonian time is 08:00-08:59 UTC in winter (EET) and 07:00-07:59 in summer (EEST), which is exactly the split ERAU prints across the nine stages. The rules give no date rule at all -- 4.2 defers to the calendar plan -- so the dates are manual and taken from ERAU's published 2026 calendar. Eight of the nine are the first Saturday of their month; February's is the second. The log deadline is 'the Thursday of the following week', which is not a fixed number of days from the end of each stage, so it is recorded here rather than as log_deadline_days. Stages 4.3 also splits each hour into four periods; that is a scoring device inside one continuous hour.",
      "exchange": "RS(T) and a continuous serial number from 001.",
      "country": "EE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-19",
      "can_enter": false,
      "eligibility_scope": "entity_list",
      "eligibility_reason": "Entry limited to ES. K stations may be worked but cannot submit an entry.",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "erau-es-ll-kv-20261003T0700@contestcal",
      "start_date": "2026-10-03",
      "mode_families": [
        "CW",
        "SSB"
      ],
      "band_families": [
        "80m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "darc-hell",
      "name": "DARC Hell Contest",
      "start": "2026-10-03T16:00:00Z",
      "end": "2026-10-04T10:59:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 18.98,
      "modes": [
        "Digital"
      ],
      "submodes": [
        "Hell"
      ],
      "bands": [
        "80m",
        "40m"
      ],
      "bands_note": "80 m: 3.580-3.600 MHz; 40 m: 7.040-7.050 MHz.",
      "sponsor": "DARC",
      "rules_url": "https://www.darc.de/der-club/referate/conteste/hell-contest/ausschreibung/",
      "verified": true,
      "note": "THE RULE IS STATED AND THE TABLE AGREES: the first full weekend of October 2026 is the 3rd-4th, which is what DARC prints. So this is a recurrence rather than a date.\n\nFeld-Hell is a facsimile mode from the 1930s and has no token in this catalog's vocabulary, so the record is Digital with 'Hell' in submodes -- the same treatment PSK63 and FT4 get. Anyone filtering Digital finds it; nobody is told it is RTTY.",
      "exchange": "RST plus a serial number from 001.",
      "country": "DE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-23",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-10-11T10:59:00Z",
      "uid": "darc-hell-20261003T1600@contestcal",
      "start_date": "2026-10-03",
      "mode_families": [
        "Digital"
      ],
      "band_families": [
        "80m",
        "40m"
      ],
      "duration_bucket": "12-24"
    },
    {
      "contest_id": "uba-on-80-40-ssb",
      "name": "UBA ON Contest, 80m/40m SSB",
      "start": "2026-10-04T06:00:00Z",
      "end": "2026-10-04T10:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 4,
      "modes": [
        "SSB"
      ],
      "submodes": [],
      "bands": [
        "80m",
        "40m"
      ],
      "bands_note": "",
      "sponsor": "UBA",
      "rules_url": "https://www.uba.be/en/hf/contest-rules/on-contest",
      "verified": true,
      "note": "MANUAL, DELIBERATELY: UBA gives four dated legs and no recurrence rule -- the page identifies the event only as 'the 46th edition'. The 2026 legs fall on consecutive Sundays from the last Sunday of September, but UBA states no ordinal, so none is asserted here. log_deadline_days is exact: UBA prints a deadline date beside each leg and all four are the leg's date plus five days.",
      "exchange": "Stations in Belgium send RS(T) + a QSO number from 001 + their UBA section (non-members give XXX, the national club stations give UBA); stations outside Belgium send RS(T) + a QSO number from 001.",
      "country": "BE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-18",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-10-09T10:00:00Z",
      "uid": "uba-on-80-40-ssb-20261004T0600@contestcal",
      "start_date": "2026-10-04",
      "mode_families": [
        "SSB"
      ],
      "band_families": [
        "80m",
        "40m"
      ],
      "duration_bucket": "2-12"
    },
    {
      "contest_id": "awasa-valve-ssb-qso-party",
      "name": "AWA Valve SSB QSO Party",
      "start": "2026-10-04T13:00:00Z",
      "end": "2026-10-04T17:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 4,
      "modes": [
        "SSB"
      ],
      "submodes": [],
      "bands": [
        "80m",
        "40m"
      ],
      "bands_note": "40 m SSB 7 063-7 100 and 7 130-7 200 kHz, with 7 100-7 130 contest free; 80 m SSB 3 603-3 650 kHz, with 3 651-3 699 contest free.",
      "sponsor": "AWASA",
      "rules_url": "https://mysarl.org.za/wp-content/uploads/2025/12/2026-SARL-Contest-Manual-Version-1.1-2025-12-15.pdf",
      "verified": true,
      "note": "The exchange includes the RADIO you are using, and the four scoring classes are all-valve, hybrid, solid state pre-1970 and solid state post-1970 -- which is the point of the contest rather than a curiosity. No linear amplifiers, and the power limit bends for a rig that simply runs hotter than 100 W by design. Sourced from the SARL Contest Manual, which carries this contest's full rules and names its organising body -- the venue in which South African clubs publish their rules, not a listing of them. See data/sources.md, 'Nine South African clubs, one manual'.",
      "exchange": "Call sign, an RS report, a consecutive serial number starting at 001, and the type of radio used -- for example 'HT37 TX'.",
      "country": "ZA",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-19",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "awasa-valve-ssb-qso-party-20261004T1300@contestcal",
      "start_date": "2026-10-04",
      "mode_families": [
        "SSB"
      ],
      "band_families": [
        "80m",
        "40m"
      ],
      "duration_bucket": "2-12"
    },
    {
      "contest_id": "k1usn-sst",
      "name": "K1USN Slow Speed Test (SST)",
      "start": "2026-10-05T00:00:00Z",
      "end": "2026-10-05T01:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "",
      "sponsor": "K1USN Radio Club",
      "rules_url": "https://www.k1usn.com/sst_rules.html",
      "verified": true,
      "note": "No formal log submission -- participants post scores to 3830scores.com.",
      "exchange": "Name + state/province/DX country",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "k1usn-sst-20261005T0000@contestcal",
      "start_date": "2026-10-05",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "agcw-zap-merit",
      "name": "AGCW ZAP Merit Contest (ZMC)",
      "start": "2026-10-05T17:40:00Z",
      "end": "2026-10-05T18:30:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.83,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "80m"
      ],
      "bands_note": "",
      "sponsor": "AGCW-DL",
      "rules_url": "https://www.agcw.de/contest/tzap/",
      "verified": false,
      "note": "PARTLY UNVERIFIED. The recurrence (every Monday), the 1740 UTC pre-logging opening and the 1800 UTC telegram transmission are all quoted from AGCW. AGCW publishes NO closing time. The 1830 end stored here is a PLACEHOLDER so the record expands -- it is not a sponsor fact and must not be presented as one. Confirm the session length with the ZMC manager before shipping. Points accumulate over a calendar year; logs are due 31 January of the following year.",
      "exchange": "Callsign + date + time + RST (SWLs log RST of both stations in a QSO)",
      "country": "DE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-12",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "agcw-zap-merit-20261005T1740@contestcal",
      "start_date": "2026-10-05",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "80m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "rsgb-autumn-cw",
      "name": "RSGB 3.5 MHz Autumn Series, CW",
      "start": "2026-10-05T19:00:00Z",
      "end": "2026-10-05T20:30:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1.5,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "80m"
      ],
      "bands_note": "3510-3565 kHz at any speed, with 3565-3570 kHz reserved for 15 wpm maximum.",
      "sponsor": "RSGB Contest Committee",
      "rules_url": "https://www.rsgbcc.org/hf/rules/2026/rautumn.shtml",
      "verified": true,
      "note": "THE CLOCK MOVES IN NOVEMBER AND THE RECORD SAYS SO PER DATE. September and October run 1900-2030 UTC; November runs 2000-2130. Every leg of this series sits on one side or the other of that change, so a single stored time would put two of the three runnings on the calendar an hour wrong.\n\nThis is the first use of PER-DATE TIMES in a manual rule, a schema question NEEDS_A_HUMAN had been carrying since the REP FT4 series hit the same wall. The alternative was one record per clock time -- six records for a nine-leg series the sponsor treats as one -- or one record per leg, which is nine. Splitting by MODE is the split a reader actually wants, because the mode filter is what they reach for, and per-date times are what make that split possible without lying about an hour.\n\nMANUAL BECAUSE RSGB PUBLISHES DATES AND NO RULE for this series. The legs fall on Mondays, Wednesdays and Thursdays with no discernible ordinal, which is exactly the shape an ordinal must not be fitted to.\n\nNON-UK STATIONS MAY ENTER AS INDIVIDUALS -- RSGB states it outright, which is worth noting beside the AFS and Club Calls contests where entry really is UK&CD only.",
      "exchange": "RS(T) plus a serial number starting at 1 and incrementing by 1.",
      "country": "GB",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-23",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-10-08T20:30:00Z",
      "uid": "rsgb-autumn-cw-20261005T1900@contestcal",
      "start_date": "2026-10-05",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "80m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "ars-spartan-sprint",
      "name": "ARS Spartan Sprint",
      "start": "2026-10-06T00:00:00Z",
      "end": "2026-10-06T02:00:00Z",
      "start_wall": "2026-10-05T20:00:00",
      "end_wall": "2026-10-05T22:00:00",
      "local_rolling": false,
      "timezone": "America/New_York",
      "duration_hours": 2,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "",
      "sponsor": "Adventure Radio Society",
      "rules_url": "https://ars-qrp.com/Spartan_Sprint/Spartan_Sprint.html",
      "verified": true,
      "note": "CORRECTION (anchor): previously encoded as the first TUESDAY of the month. The sponsor's rule is the first MONDAY US local, which lands on Tuesday UTC -- and those are different dates whenever the 1st falls on a Tuesday (Sep and Dec 2026). SPONSOR-ANCHORED LOCAL TIME: ARS publishes no UTC time and states the event 'is always at these Local Times', so the UTC instant is what moves -- 0100Z Tuesday under EST, 0000Z Tuesday under EDT. Resolved through America/New_York rather than hardcoded, so DST is handled. ARS lists Eastern, Central, Mountain and Pacific times that are the same instant in every zone that observes DST; Arizona, which does not, is the one place the sponsor's own table is inconsistent.",
      "exchange": "RST + state/province + power output",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "ars-spartan-sprint-20261006T0000@contestcal",
      "start_date": "2026-10-06",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "2-12"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-07T13:00:00Z",
      "end": "2026-10-07T14:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261007T1300@contestcal",
      "start_date": "2026-10-07",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-07T19:00:00Z",
      "end": "2026-10-07T20:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261007T1900@contestcal",
      "start_date": "2026-10-07",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-08T03:00:00Z",
      "end": "2026-10-08T04:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261008T0300@contestcal",
      "start_date": "2026-10-08",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-08T07:00:00Z",
      "end": "2026-10-08T08:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261008T0700@contestcal",
      "start_date": "2026-10-08",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "nccc-ns-ft4",
      "name": "NCCC FT4 Sprint (FT4 NS)",
      "start": "2026-10-09T01:00:00Z",
      "end": "2026-10-09T01:30:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.5,
      "modes": [
        "FT8/FT4"
      ],
      "submodes": [
        "FT4"
      ],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "Northern California Contest Club (NCCC)",
      "rules_url": "https://www.ncccsprint.com/ft4ns.html",
      "verified": true,
      "note": "NCCC describes these as 'nominal rules' that may be modified on a weekly basis, and runs formal Ladder seasons interspersed with practice weeks. The 30-minute session slot itself is fixed.",
      "exchange": "Grid square (following NA VHF, WW Digi and ARRL IDC practice)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "nccc-ns-ft4-20261009T0100@contestcal",
      "start_date": "2026-10-09",
      "mode_families": [
        "Digital",
        "FT8/FT4"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "nccc-ns-rtty",
      "name": "NCCC RTTY Sprint (RTTY NS)",
      "start": "2026-10-09T01:45:00Z",
      "end": "2026-10-09T02:15:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.5,
      "modes": [
        "RTTY"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "bands_note": "",
      "sponsor": "Northern California Contest Club (NCCC)",
      "rules_url": "https://ncccsprint.com/rttyns.html",
      "verified": true,
      "note": "NCCC describes these as 'nominal rules' that may be modified on a weekly basis, and runs formal Ladder seasons interspersed with practice weeks. The 30-minute session slot itself is fixed.",
      "exchange": "Serial number + name + QTH (both callsigns required in the exchange)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "nccc-ns-rtty-20261009T0145@contestcal",
      "start_date": "2026-10-09",
      "mode_families": [
        "RTTY",
        "Digital"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "nccc-ns-cw",
      "name": "NCCC Sprint (NS)",
      "start": "2026-10-09T02:30:00Z",
      "end": "2026-10-09T03:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.5,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "bands_note": "",
      "sponsor": "Northern California Contest Club (NCCC)",
      "rules_url": "https://ncccsprint.com/rules.html",
      "verified": true,
      "note": "NCCC describes these as 'nominal rules' that may be modified on a weekly basis, and runs formal Ladder seasons interspersed with practice weeks. The 30-minute session slot itself is fixed.",
      "exchange": "Serial number + name + QTH (both callsigns required in the exchange)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "nccc-ns-cw-20261009T0230@contestcal",
      "start_date": "2026-10-09",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "k1usn-sst",
      "name": "K1USN Slow Speed Test (SST)",
      "start": "2026-10-09T20:00:00Z",
      "end": "2026-10-09T21:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "",
      "sponsor": "K1USN Radio Club",
      "rules_url": "https://www.k1usn.com/sst_rules.html",
      "verified": true,
      "note": "No formal log submission -- participants post scores to 3830scores.com.",
      "exchange": "Name + state/province/DX country",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "k1usn-sst-20261009T2000@contestcal",
      "start_date": "2026-10-09",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "tenten-day-sprint",
      "name": "10-10 International 10-10 Day Sprint",
      "start": "2026-10-10T00:01:00Z",
      "end": "2026-10-10T23:59:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 23.97,
      "modes": [
        "SSB",
        "CW",
        "Digital",
        "RTTY"
      ],
      "submodes": [],
      "bands": [
        "10m"
      ],
      "bands_note": "",
      "sponsor": "10-10 International Net",
      "rules_url": "https://www.ten-ten.org/index.php/activity/qso-party-rules",
      "verified": true,
      "note": "All modes, unlike the two phone-only QSO Parties. Chapter scores may not be assigned for the Sprint.",
      "exchange": "Call sign + name + 10-10 number + QTH (state, province or country). Record 0 if the other station has no 10-10 number.",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-12",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "Anyone may take part, but only members' logs are scored: 'logs will be accepted only from active members as of the date of the event ... Other logs received will be handled as check logs.'",
      "log_due": null,
      "uid": "tenten-day-sprint-20261010T0001@contestcal",
      "start_date": "2026-10-10",
      "mode_families": [
        "CW",
        "SSB",
        "RTTY",
        "Digital"
      ],
      "band_families": [
        "10m"
      ],
      "duration_bucket": "12-24"
    },
    {
      "contest_id": "ocdx-cw",
      "name": "Oceania DX Contest, CW",
      "start": "2026-10-10T06:00:00Z",
      "end": "2026-10-11T06:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 24,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "160M, 80M, 40M, 20M, 15M and 10M (no WARC bands)",
      "sponsor": "Oceania DX Contest Committee",
      "rules_url": "https://www.oceaniadxcontest.com/rules",
      "verified": true,
      "note": "The log deadline is announced each year rather than set as an interval -- 25 October in 2026, 31 October in earlier years -- so this calendar does not compute one. country is 'OC' because the sponsor is a joint VK/ZL committee rather than a national society; see data/sources.md.",
      "exchange": "RS(T) and a progressive serial number starting at 001",
      "country": "OC",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-17",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "ocdx-cw-20261010T0600@contestcal",
      "start_date": "2026-10-10",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "gte24"
    },
    {
      "contest_id": "jarl-acag",
      "name": "All Cities All Counties Contest (ACAG)",
      "start": "2026-10-10T12:00:00Z",
      "end": "2026-10-11T12:00:00Z",
      "start_wall": "2026-10-10T21:00:00",
      "end_wall": "2026-10-11T21:00:00",
      "local_rolling": false,
      "timezone": "Asia/Tokyo",
      "duration_hours": 24,
      "modes": [
        "CW",
        "SSB",
        "FM"
      ],
      "submodes": [
        "AM"
      ],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m",
        "2m",
        "70cm"
      ],
      "bands_note": "1.9 through 430 MHz. The phone all-band category excludes 14 MHz; CW may use it.",
      "sponsor": "JARL",
      "rules_url": "https://www.jarl.org/Japanese/1_Tanoshimo/1-1_Contest/acag_rules.html",
      "verified": true,
      "note": "THE ONLY RULE IN THE CATALOG ANCHORED ON A PUBLIC HOLIDAY AND COUNTED BACKWARDS. Japan's Sports Day is the second Monday of October, and JARL hangs the contest on the weekend before it -- 前々日 and 前日, two days before and one day before. It is encoded exactly that way, with negative day offsets from a Monday anchor, rather than as 'the second full weekend of October', which would be a different rule that happens to agree in some years. Encoded as wall_clock in Asia/Tokyo because that is how JARL states it -- 21時00分（JST） -- rather than converted to a fixed UTC time by hand. Japan has not observed daylight saving since 1952, so the two are identical in practice and will stay so; the record says what the sponsor said and lets the engine do the arithmetic. log_deadline_days is absent. JARL prints a dated deadline above the rules for the edition in hand -- ALL JA 2026 is '提出締切日 2026年5月6日（水）必着' -- and the numbered 規約 clauses that follow state the dates, eligibility, bands, categories and exchange but no submission span. All four of JARL's 2026 deadlines happen to fall exactly ten days after their contest ends, which is suggestive and is not a rule JARL wrote. The same reasoning already keeps a deadline off JARL's All Asian records.",
      "exchange": "RST, the city, county or ward number for where you are operating, and one letter for power. Tokyo's Toshima ward at high power sends 59 100116 H.",
      "country": "JP",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-19",
      "can_enter": false,
      "eligibility_scope": "entity_list",
      "eligibility_reason": "Entry limited to JA. K stations may be worked but cannot submit an entry.",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "jarl-acag-20261010T1200@contestcal",
      "start_date": "2026-10-10",
      "mode_families": [
        "CW",
        "SSB",
        "FM"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m",
        "VHF+"
      ],
      "duration_bucket": "gte24"
    },
    {
      "contest_id": "skcc-wes",
      "name": "SKCC Weekend Sprintathon (WES)",
      "start": "2026-10-10T12:00:00Z",
      "end": "2026-10-11T23:59:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 35.98,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "Straight Key Century Club",
      "rules_url": "https://www.skccgroup.com/operating_activities/weekend_sprintathon/",
      "verified": true,
      "note": "Older sources describe the anchor as 'the Saturday following the 6th', which differs from '2nd Saturday' in some months. SKCC's current page says 2nd Saturday; re-check if dates drift.",
      "exchange": "RST + state/province/country + name + SKCC number (C/T/S suffix for award holders)",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "skcc-wes-20261010T1200@contestcal",
      "start_date": "2026-10-10",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "duration_bucket": "gte24"
    },
    {
      "contest_id": "sac-ssb",
      "name": "Scandinavian Activity Contest, SSB",
      "start": "2026-10-10T12:00:00Z",
      "end": "2026-10-11T11:59:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 23.98,
      "modes": [
        "SSB"
      ],
      "submodes": [],
      "bands": [
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "3600-3650, 3700-3800, 7060-7100, 7130-7200, 14125-14300, 21151-21450, 28320-29000 kHz",
      "sponsor": "NRAU",
      "rules_url": "https://www.sactest.net/blog/rules/",
      "verified": true,
      "note": "FOUND BECAUSE A BLOCKED ORGANISATION STOPPED BEING ASKED WHAT ELSE IT RUNS. NRAU is recorded in this registry as blocked, correctly: nrau.net says its contest information is under revision and publishes no rules for NRAU-Baltic or the Nordic Activity Contests. But NRAU also organises this, its flagship, and it publishes complete rules at a domain of its own. SAC appeared nowhere in the registry at all until the 2026-08-21 gap audit.\n\nTHE PAGE IS HEADED 2023 AND THE RULE IS STATED AS STANDING. The recurrence sentences say 'each year', which is the form this catalog trusts -- the same form ARRL's generic calendar uses -- and they reproduce that page's own 2023 dates. Re-read when NRAU publishes a newer edition.",
      "exchange": "RS(T) plus a serial number starting at 001.",
      "country": "SE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-21",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-10-16T11:59:00Z",
      "uid": "sac-ssb-20261010T1200@contestcal",
      "start_date": "2026-10-10",
      "mode_families": [
        "SSB"
      ],
      "band_families": [
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "12-24"
    },
    {
      "contest_id": "podxs-160m-great-pumpkin",
      "name": "PODXS 070 Club 160M Great Pumpkin Sprint",
      "start": "2026-10-10T20:00:00Z",
      "end": "2026-10-11T19:59:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 23.98,
      "modes": [
        "Digital"
      ],
      "submodes": [
        "PSK31"
      ],
      "bands": [
        "160m"
      ],
      "bands_note": "",
      "sponsor": "PODXS 070 Club",
      "rules_url": "https://www.podxs070.com/o7o-club-sponsored-contests/160m-great-pumpkin-sprint",
      "verified": true,
      "note": "The rules page writes the close as '2000 UTC' while the club's contest calendar gives 'Ends 1959 UTC 11-Oct-2026'. Encoded as 1959, matching the calendar and the identical wording used for the 40 m and 80 m sprints. One minute; flagged rather than silently reconciled.",
      "exchange": "State/province/country (SPC)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-12",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-10-18T19:59:00Z",
      "uid": "podxs-160m-great-pumpkin-20261010T2000@contestcal",
      "start_date": "2026-10-10",
      "mode_families": [
        "Digital"
      ],
      "band_families": [
        "160m"
      ],
      "duration_bucket": "12-24"
    },
    {
      "contest_id": "uba-on-80-40-cw",
      "name": "UBA ON Contest, 80m/40m CW",
      "start": "2026-10-11T06:00:00Z",
      "end": "2026-10-11T10:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 4,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "80m",
        "40m"
      ],
      "bands_note": "",
      "sponsor": "UBA",
      "rules_url": "https://www.uba.be/en/hf/contest-rules/on-contest",
      "verified": true,
      "note": "MANUAL, DELIBERATELY: UBA gives four dated legs and no recurrence rule -- the page identifies the event only as 'the 46th edition'. The 2026 legs fall on consecutive Sundays from the last Sunday of September, but UBA states no ordinal, so none is asserted here. log_deadline_days is exact: UBA prints a deadline date beside each leg and all four are the leg's date plus five days.",
      "exchange": "Stations in Belgium send RS(T) + a QSO number from 001 + their UBA section (non-members give XXX, the national club stations give UBA); stations outside Belgium send RS(T) + a QSO number from 001.",
      "country": "BE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-18",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-10-16T10:00:00Z",
      "uid": "uba-on-80-40-cw-20261011T0600@contestcal",
      "start_date": "2026-10-11",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "80m",
        "40m"
      ],
      "duration_bucket": "2-12"
    },
    {
      "contest_id": "4sqrp-sss",
      "name": "4 States QRP Group Second Sunday Sprint (SSS)",
      "start": "2026-10-12T00:00:00Z",
      "end": "2026-10-12T02:00:00Z",
      "start_wall": "2026-10-11T19:00:00",
      "end_wall": "2026-10-11T21:00:00",
      "local_rolling": false,
      "timezone": "America/Chicago",
      "duration_hours": 2,
      "modes": [
        "CW",
        "SSB",
        "Digital"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "",
      "sponsor": "4 States QRP Group",
      "rules_url": "https://www.4sqrp.com/SSS/sss_rules_revised_02_2026.pdf",
      "verified": true,
      "note": "SPONSOR-ANCHORED LOCAL TIME. The anchor is the second SUNDAY and the sprint runs into Monday UTC. 4SQRP states the consequence itself: '7 PM until 9 PM central time (CST or CDT, whichever is in effect at the time). If you use UTC, that time changes when we switch from CST to CDT (or vice versa).' Resolved through America/Chicago, so it is 0100Z Monday in winter and 0000Z Monday in summer.",
      "exchange": "RST + state/province/country + 4SQRP member number (power if non-member)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "4sqrp-sss-20261012T0000@contestcal",
      "start_date": "2026-10-12",
      "mode_families": [
        "CW",
        "SSB",
        "Digital"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "2-12"
    },
    {
      "contest_id": "k1usn-sst",
      "name": "K1USN Slow Speed Test (SST)",
      "start": "2026-10-12T00:00:00Z",
      "end": "2026-10-12T01:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "",
      "sponsor": "K1USN Radio Club",
      "rules_url": "https://www.k1usn.com/sst_rules.html",
      "verified": true,
      "note": "No formal log submission -- participants post scores to 3830scores.com.",
      "exchange": "Name + state/province/DX country",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "k1usn-sst-20261012T0000@contestcal",
      "start_date": "2026-10-12",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "agcw-zap-merit",
      "name": "AGCW ZAP Merit Contest (ZMC)",
      "start": "2026-10-12T17:40:00Z",
      "end": "2026-10-12T18:30:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.83,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "80m"
      ],
      "bands_note": "",
      "sponsor": "AGCW-DL",
      "rules_url": "https://www.agcw.de/contest/tzap/",
      "verified": false,
      "note": "PARTLY UNVERIFIED. The recurrence (every Monday), the 1740 UTC pre-logging opening and the 1800 UTC telegram transmission are all quoted from AGCW. AGCW publishes NO closing time. The 1830 end stored here is a PLACEHOLDER so the record expands -- it is not a sponsor fact and must not be presented as one. Confirm the session length with the ZMC manager before shipping. Points accumulate over a calendar year; logs are due 31 January of the following year.",
      "exchange": "Callsign + date + time + RST (SWLs log RST of both stations in a QSO)",
      "country": "DE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-12",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "agcw-zap-merit-20261012T1740@contestcal",
      "start_date": "2026-10-12",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "80m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "darc-rtty-kurzcontest",
      "name": "DARC RTTY-Kurzcontest",
      "start": "2026-10-13T18:00:00Z",
      "end": "2026-10-13T19:29:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1.48,
      "modes": [
        "RTTY"
      ],
      "submodes": [
        "RTTY 45.45 baud"
      ],
      "bands": [
        "80m",
        "40m"
      ],
      "bands_note": "",
      "sponsor": "DARC",
      "rules_url": "https://www.darc.de/der-club/referate/conteste/rtty-kurz/rtty-rules/",
      "verified": true,
      "note": "Four legs a year, one record, offset one month from the FT4 contest: RTTY takes the first month of each quarter and FT4 the second, both on the second Tuesday.",
      "exchange": "RST + DOK; German non-members send 'NM'. Stations outside Germany send RST + serial from 001.",
      "country": "DE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-18",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-10-20T19:29:00Z",
      "uid": "darc-rtty-kurzcontest-20261013T1800@contestcal",
      "start_date": "2026-10-13",
      "mode_families": [
        "RTTY",
        "Digital"
      ],
      "band_families": [
        "80m",
        "40m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "early-morning-coffee-qso-party",
      "name": "Early Morning Coffee QSO Party",
      "start": "2026-10-14T04:00:00Z",
      "end": "2026-10-14T05:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "SSB"
      ],
      "submodes": [],
      "bands": [
        "80m",
        "40m"
      ],
      "bands_note": "80 m: 3 603-3 650 and 3 703-3 800 kHz, with 3 651-3 699 kHz contest free. 40 m: 7 063-7 100 and 7 130-7 200 kHz, with 7 100-7 130 kHz contest free.",
      "sponsor": "Bo Karoo Amateur Radio Club",
      "rules_url": "https://mysarl.org.za/wp-content/uploads/2025/12/2026-SARL-Contest-Manual-Version-1.1-2025-12-15.pdf",
      "verified": true,
      "note": "An hour at 0400 UTC, which is 0600 local -- the earliest start of any contest in this catalog, and the point of it. Two months a year rather than monthly, which is what monthly_nth_weekday's `months` field carries. SOURCED FROM THE SARL CONTEST MANUAL, WHICH IS NOT AN AGGREGATOR. The manual carries this contest's FULL rules -- aim, dates, exchange, frequencies, scoring, log sheets -- and names its organising club, rather than summarising a calendar entry. It is the venue in which South African clubs publish their contest rules, the way DARC's Ausschreibungen or UBA's rules pages are, so it is a primary source for these contests and not a third-party listing. The distinction that matters: an aggregator republishes rules it found elsewhere, and this is where the rules appear.",
      "exchange": "Your call sign, an RS report, your grid square, your age category and your name.",
      "country": "ZA",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-19",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "early-morning-coffee-qso-party-20261014T0400@contestcal",
      "start_date": "2026-10-14",
      "mode_families": [
        "SSB"
      ],
      "band_families": [
        "80m",
        "40m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-14T13:00:00Z",
      "end": "2026-10-14T14:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261014T1300@contestcal",
      "start_date": "2026-10-14",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-14T19:00:00Z",
      "end": "2026-10-14T20:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261014T1900@contestcal",
      "start_date": "2026-10-14",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "rsgb-autumn-data",
      "name": "RSGB 3.5 MHz Autumn Series, Data",
      "start": "2026-10-14T19:00:00Z",
      "end": "2026-10-14T20:30:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1.5,
      "modes": [
        "RTTY",
        "Digital"
      ],
      "submodes": [
        "PSK63"
      ],
      "bands": [
        "80m"
      ],
      "bands_note": "PSK63 3580-3590 kHz; RTTY 3590-3620 kHz.",
      "sponsor": "RSGB Contest Committee",
      "rules_url": "https://www.rsgbcc.org/hf/rules/2026/rautumn.shtml",
      "verified": true,
      "note": "THE CLOCK MOVES IN NOVEMBER AND THE RECORD SAYS SO PER DATE. September and October run 1900-2030 UTC; November runs 2000-2130. Every leg of this series sits on one side or the other of that change, so a single stored time would put two of the three runnings on the calendar an hour wrong.\n\nThis is the first use of PER-DATE TIMES in a manual rule, a schema question NEEDS_A_HUMAN had been carrying since the REP FT4 series hit the same wall. The alternative was one record per clock time -- six records for a nine-leg series the sponsor treats as one -- or one record per leg, which is nine. Splitting by MODE is the split a reader actually wants, because the mode filter is what they reach for, and per-date times are what make that split possible without lying about an hour.\n\nMANUAL BECAUSE RSGB PUBLISHES DATES AND NO RULE for this series. The legs fall on Mondays, Wednesdays and Thursdays with no discernible ordinal, which is exactly the shape an ordinal must not be fitted to.\n\nNON-UK STATIONS MAY ENTER AS INDIVIDUALS -- RSGB states it outright, which is worth noting beside the AFS and Club Calls contests where entry really is UK&CD only.",
      "exchange": "RS(T) plus a serial number starting at 1 and incrementing by 1.",
      "country": "GB",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-23",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-10-17T20:30:00Z",
      "uid": "rsgb-autumn-data-20261014T1900@contestcal",
      "start_date": "2026-10-14",
      "mode_families": [
        "RTTY",
        "Digital"
      ],
      "band_families": [
        "80m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-15T03:00:00Z",
      "end": "2026-10-15T04:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261015T0300@contestcal",
      "start_date": "2026-10-15",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-15T07:00:00Z",
      "end": "2026-10-15T08:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261015T0700@contestcal",
      "start_date": "2026-10-15",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "nccc-ns-ft4",
      "name": "NCCC FT4 Sprint (FT4 NS)",
      "start": "2026-10-16T01:00:00Z",
      "end": "2026-10-16T01:30:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.5,
      "modes": [
        "FT8/FT4"
      ],
      "submodes": [
        "FT4"
      ],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "Northern California Contest Club (NCCC)",
      "rules_url": "https://www.ncccsprint.com/ft4ns.html",
      "verified": true,
      "note": "NCCC describes these as 'nominal rules' that may be modified on a weekly basis, and runs formal Ladder seasons interspersed with practice weeks. The 30-minute session slot itself is fixed.",
      "exchange": "Grid square (following NA VHF, WW Digi and ARRL IDC practice)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "nccc-ns-ft4-20261016T0100@contestcal",
      "start_date": "2026-10-16",
      "mode_families": [
        "Digital",
        "FT8/FT4"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "nccc-ns-rtty",
      "name": "NCCC RTTY Sprint (RTTY NS)",
      "start": "2026-10-16T01:45:00Z",
      "end": "2026-10-16T02:15:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.5,
      "modes": [
        "RTTY"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "bands_note": "",
      "sponsor": "Northern California Contest Club (NCCC)",
      "rules_url": "https://ncccsprint.com/rttyns.html",
      "verified": true,
      "note": "NCCC describes these as 'nominal rules' that may be modified on a weekly basis, and runs formal Ladder seasons interspersed with practice weeks. The 30-minute session slot itself is fixed.",
      "exchange": "Serial number + name + QTH (both callsigns required in the exchange)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "nccc-ns-rtty-20261016T0145@contestcal",
      "start_date": "2026-10-16",
      "mode_families": [
        "RTTY",
        "Digital"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "nccc-ns-cw",
      "name": "NCCC Sprint (NS)",
      "start": "2026-10-16T02:30:00Z",
      "end": "2026-10-16T03:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.5,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "bands_note": "",
      "sponsor": "Northern California Contest Club (NCCC)",
      "rules_url": "https://ncccsprint.com/rules.html",
      "verified": true,
      "note": "NCCC describes these as 'nominal rules' that may be modified on a weekly basis, and runs formal Ladder seasons interspersed with practice weeks. The 30-minute session slot itself is fixed.",
      "exchange": "Serial number + name + QTH (both callsigns required in the exchange)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "nccc-ns-cw-20261016T0230@contestcal",
      "start_date": "2026-10-16",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "k1usn-sst",
      "name": "K1USN Slow Speed Test (SST)",
      "start": "2026-10-16T20:00:00Z",
      "end": "2026-10-16T21:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "",
      "sponsor": "K1USN Radio Club",
      "rules_url": "https://www.k1usn.com/sst_rules.html",
      "verified": true,
      "note": "No formal log submission -- participants post scores to 3830scores.com.",
      "exchange": "Name + state/province/DX country",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "k1usn-sst-20261016T2000@contestcal",
      "start_date": "2026-10-16",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "jarl-ww-rtty",
      "name": "JARL World Wide RTTY Contest",
      "start": "2026-10-17T00:00:00Z",
      "end": "2026-10-19T00:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 48,
      "modes": [
        "RTTY"
      ],
      "submodes": [
        "Baudot"
      ],
      "bands": [
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "3.5, 7, 14, 21 and 28 MHz",
      "sponsor": "JARL",
      "rules_url": "https://www.jarl.org/English/4_Library/A-4-3_Contests/rtty_rules_en.html",
      "verified": true,
      "note": "",
      "exchange": "RST and the operator's age; 01 (or 00 or 99) may be sent instead. Multi-operator stations send the average age of the operators.",
      "country": "JP",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-17",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-10-29T00:00:00Z",
      "uid": "jarl-ww-rtty-20261017T0000@contestcal",
      "start_date": "2026-10-17",
      "mode_families": [
        "RTTY",
        "Digital"
      ],
      "band_families": [
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "gte24"
    },
    {
      "contest_id": "darc-ausbildungscontest",
      "name": "DARC Ausbildungscontest",
      "start": "2026-10-17T12:00:00Z",
      "end": "2026-10-17T14:29:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 2.48,
      "modes": [
        "SSB",
        "CW"
      ],
      "submodes": [],
      "bands": [
        "80m",
        "40m"
      ],
      "bands_note": "",
      "sponsor": "DARC",
      "rules_url": "https://www.darc.de/der-club/referate/conteste/ausbildungscontest/ac-ausschreibung/",
      "verified": true,
      "note": "A TRAINING CONTEST, AND THE CATEGORIES ARE THE POINT: newcomers on training callsigns are placed against each other rather than against experienced stations, and everyone else is there to give them contacts.\n\nMANUAL BECAUSE DARC STATES NO RECURRENCE for it. 17 October 2026 is the third Saturday, which is the kind of coincidence that invites an ordinal, and one date cannot support one. A second year's table settles it.",
      "exchange": "RS(T) and the sender's DOK for DARC and VFDB members; German non-members send RS(T) and 'NM'; stations outside Germany send RS(T) and a serial from 001.",
      "country": "DE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-23",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "darc-ausbildungscontest-20261017T1200@contestcal",
      "start_date": "2026-10-17",
      "mode_families": [
        "CW",
        "SSB"
      ],
      "band_families": [
        "80m",
        "40m"
      ],
      "duration_bucket": "2-12"
    },
    {
      "contest_id": "stew-perry",
      "name": "Stew Perry Topband Challenge",
      "start": "2026-10-17T15:00:00Z",
      "end": "2026-10-18T14:59:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 23.98,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m"
      ],
      "bands_note": "160 metres only.",
      "sponsor": "Boring Amateur Radio Club",
      "rules_url": "https://www.kkn.net/stew/stew_rules.html",
      "verified": false,
      "note": "MANUAL, BECAUSE THE CLUB PUBLISHES DATES AND NOT A RULE. All four 2026 runnings fall on a Saturday, but no single ordinal describes them -- March's is the second Saturday, June's the third, October's the third and December's the fourth. The record holds exactly what the club published and produces nothing for 2027 until somebody reads their next list, which is the same treatment the NCJ Sprints get and for the same reason.\n\nMarked unverified because ONE year's dates cannot confirm a pattern that does not exist. It becomes verified when a second year's list is read and the record still only claims what was printed.\n\nThe grid-square exchange is the point of the contest: scoring is by distance, so a short haul into a rare square can outscore a long one.",
      "exchange": "A four-character grid square, for example CN85.",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-21",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-11-01T14:59:00Z",
      "uid": "stew-perry-20261017T1500@contestcal",
      "start_date": "2026-10-17",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m"
      ],
      "duration_bucket": "12-24"
    },
    {
      "contest_id": "darc-wag",
      "name": "Worked All Germany Contest (WAG)",
      "start": "2026-10-17T15:00:00Z",
      "end": "2026-10-18T14:59:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 23.98,
      "modes": [
        "SSB",
        "CW"
      ],
      "submodes": [],
      "bands": [
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "",
      "sponsor": "DARC",
      "rules_url": "https://www.darc.de/der-club/referate/conteste/wag-contest/regeln/",
      "verified": true,
      "note": "DARC's English-language pages call this 'this contest on the third weekend of October'; the Ausschreibung says 'drittes volles Wochenende', and the full-weekend reading is what is encoded. DARC's printed deadline is a German local-time instant -- 25.10.26, 23.59 ME(S)Z -- while the stored interval lands on the same date at the contest's own end time.",
      "exchange": "German stations send RS(T) + their DOK, or 'NM' if they are not a DARC or VFDB member. Stations outside Germany send RS(T) + serial number.",
      "country": "DE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-18",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-10-25T14:59:00Z",
      "uid": "darc-wag-20261017T1500@contestcal",
      "start_date": "2026-10-17",
      "mode_families": [
        "CW",
        "SSB"
      ],
      "band_families": [
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "12-24"
    },
    {
      "contest_id": "uba-on-2m",
      "name": "UBA ON Contest, 2m",
      "start": "2026-10-18T07:00:00Z",
      "end": "2026-10-18T10:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 3,
      "modes": [
        "SSB",
        "CW"
      ],
      "submodes": [],
      "bands": [
        "2m"
      ],
      "bands_note": "",
      "sponsor": "UBA",
      "rules_url": "https://www.uba.be/en/hf/contest-rules/on-contest",
      "verified": true,
      "note": "MANUAL, DELIBERATELY: UBA gives four dated legs and no recurrence rule -- the page identifies the event only as 'the 46th edition'. The 2026 legs fall on consecutive Sundays from the last Sunday of September, but UBA states no ordinal, so none is asserted here. log_deadline_days is exact: UBA prints a deadline date beside each leg and all four are the leg's date plus five days.",
      "exchange": "Stations in Belgium send RS(T) + a QSO number from 001 + their UBA section (non-members give XXX, the national club stations give UBA); stations outside Belgium send RS(T) + a QSO number from 001.",
      "country": "BE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-18",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-10-23T10:00:00Z",
      "uid": "uba-on-2m-20261018T0700@contestcal",
      "start_date": "2026-10-18",
      "mode_families": [
        "CW",
        "SSB"
      ],
      "band_families": [
        "VHF+"
      ],
      "duration_bucket": "2-12"
    },
    {
      "contest_id": "k1usn-sst",
      "name": "K1USN Slow Speed Test (SST)",
      "start": "2026-10-19T00:00:00Z",
      "end": "2026-10-19T01:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "",
      "sponsor": "K1USN Radio Club",
      "rules_url": "https://www.k1usn.com/sst_rules.html",
      "verified": true,
      "note": "No formal log submission -- participants post scores to 3830scores.com.",
      "exchange": "Name + state/province/DX country",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "k1usn-sst-20261019T0000@contestcal",
      "start_date": "2026-10-19",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "agcw-zap-merit",
      "name": "AGCW ZAP Merit Contest (ZMC)",
      "start": "2026-10-19T17:40:00Z",
      "end": "2026-10-19T18:30:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.83,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "80m"
      ],
      "bands_note": "",
      "sponsor": "AGCW-DL",
      "rules_url": "https://www.agcw.de/contest/tzap/",
      "verified": false,
      "note": "PARTLY UNVERIFIED. The recurrence (every Monday), the 1740 UTC pre-logging opening and the 1800 UTC telegram transmission are all quoted from AGCW. AGCW publishes NO closing time. The 1830 end stored here is a PLACEHOLDER so the record expands -- it is not a sponsor fact and must not be presented as one. Confirm the session length with the ZMC manager before shipping. Points accumulate over a calendar year; logs are due 31 January of the following year.",
      "exchange": "Callsign + date + time + RST (SWLs log RST of both stations in a QSO)",
      "country": "DE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-12",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "agcw-zap-merit-20261019T1740@contestcal",
      "start_date": "2026-10-19",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "80m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-21T13:00:00Z",
      "end": "2026-10-21T14:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261021T1300@contestcal",
      "start_date": "2026-10-21",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "sarl-club-80m",
      "name": "SARL Wednesday 80 m Club Contest",
      "start": "2026-10-21T17:00:00Z",
      "end": "2026-10-21T18:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "SSB",
        "CW",
        "RTTY"
      ],
      "submodes": [],
      "bands": [
        "80m"
      ],
      "bands_note": "Phone 3 603-3 650 and 3 703-3 800 kHz; CW 3 510-3 560 kHz; RTTY 3 580-3 600 kHz. The segment 3 651-3 700 kHz is contest free.",
      "sponsor": "SARL",
      "rules_url": "https://mysarl.org.za/wp-content/uploads/2025/12/2026-SARL-Contest-Manual-Version-1.1-2025-12-15.pdf",
      "verified": true,
      "note": "A club championship rather than an individual contest: operators' scores are added into a club total. The month list is SARL's own -- these run in four months of the year, not every month -- which is what monthly_nth_weekday's `months` field exists for. log_format and log_deadline_days are absent: this pass read each contest's Aim, Dates, Frequencies and Exchange sections and did not read its Log Sheets section, so neither is recorded rather than assumed from SARL's other contests.\n\nPROVENANCE RESTORED 2026-08-23. This record carried verified: true with an EMPTY source_note -- one of three the 2026-08-21 rule audit found, and a stricter defect than the thin ARRL notes beside them: an empty string is not weak evidence, it is none, and there was nothing in the record to check a rule against. The rule, the times, the bands and the exchange were all correct; only the evidence for them was missing. Re-read from the manual and quoted above, and SARL's own printed 2026 dates reproduce it.",
      "exchange": "Your name, your Abbreviated Club Callsign and your 4-character grid square (for example KG30).",
      "country": "ZA",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-23",
      "can_enter": false,
      "eligibility_scope": "entity_list",
      "eligibility_reason": "Entry limited to ZS. K stations may be worked but cannot submit an entry.",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "sarl-club-80m-20261021T1700@contestcal",
      "start_date": "2026-10-21",
      "mode_families": [
        "CW",
        "SSB",
        "RTTY",
        "Digital"
      ],
      "band_families": [
        "80m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "agcw-sta",
      "name": "AGCW Schlackertastenabend (STA)",
      "start": "2026-10-21T19:00:00Z",
      "end": "2026-10-21T20:30:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1.5,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "80m",
        "40m"
      ],
      "bands_note": "",
      "sponsor": "AGCW-DL",
      "rules_url": "https://www.agcw.de/contest/sta/",
      "verified": true,
      "note": "AGCW's own 'nächster Termin: 21. Okt. 2026' is the independent check on the October leg -- the third Wednesday of October 2026 is indeed the 21st.",
      "exchange": "RST + running QSO number from 001 per year + type of bug used",
      "country": "DE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-12",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "agcw-sta-20261021T1900@contestcal",
      "start_date": "2026-10-21",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "80m",
        "40m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-21T19:00:00Z",
      "end": "2026-10-21T20:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261021T1900@contestcal",
      "start_date": "2026-10-21",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "irts-80m-counties",
      "name": "IRTS 80m Counties Contest",
      "start": "2026-10-21T20:00:00Z",
      "end": "2026-10-21T21:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW",
        "SSB"
      ],
      "submodes": [],
      "bands": [
        "80m"
      ],
      "bands_note": "CW 3510-3560 kHz; SSB 3600-3650 and 3700-3775 kHz.",
      "sponsor": "IRTS",
      "rules_url": "https://www.irts.ie/cgi/st.cgi?r_hfcrules.html",
      "verified": true,
      "note": "THIS RECORD WAS WRONG IN EVERY FIELD THAT MATTERED AND IS REWRITTEN. It was carried as the third Sunday of June, 1300-1500 UTC, with NO source_note at all -- a stub whose rule, month, weekday, hour and duration were all invented. IRTS runs it three times a year for ONE HOUR each: 1 January, 18 March and 21 October in 2026. Nothing about the old record survived contact with the sponsor's own calendar.\n\nIt was flagged `verified: false` throughout, which is the only reason it was not a lie -- and it is exactly why the registry entry said 'that record is unverified; source it'. An unverified record is a promise to come back, and this is what coming back found.\n\nMANUAL, AND THE NEW YEAR ROUND KEEPS ITS OWN HOUR. The January running is at 1700 UTC and the other two at 2000, so the record's default is 2000 and 1 January carries an override. There is no ordinal to derive: a fixed New Year's Day round and two Wednesday evenings in March and October are not one pattern.",
      "exchange": "EI and GI stations send a signal report, a serial number starting at 001 and their county. Everyone else sends the report and serial only.",
      "country": "IE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-23",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "irts-80m-counties-20261021T2000@contestcal",
      "start_date": "2026-10-21",
      "mode_families": [
        "CW",
        "SSB"
      ],
      "band_families": [
        "80m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-22T03:00:00Z",
      "end": "2026-10-22T04:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261022T0300@contestcal",
      "start_date": "2026-10-22",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-22T07:00:00Z",
      "end": "2026-10-22T08:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261022T0700@contestcal",
      "start_date": "2026-10-22",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "rsgb-autumn-ssb",
      "name": "RSGB 3.5 MHz Autumn Series, SSB",
      "start": "2026-10-22T19:00:00Z",
      "end": "2026-10-22T20:30:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1.5,
      "modes": [
        "SSB"
      ],
      "submodes": [],
      "bands": [
        "80m"
      ],
      "bands_note": "3600-3775 kHz.",
      "sponsor": "RSGB Contest Committee",
      "rules_url": "https://www.rsgbcc.org/hf/rules/2026/rautumn.shtml",
      "verified": true,
      "note": "THE CLOCK MOVES IN NOVEMBER AND THE RECORD SAYS SO PER DATE. September and October run 1900-2030 UTC; November runs 2000-2130. Every leg of this series sits on one side or the other of that change, so a single stored time would put two of the three runnings on the calendar an hour wrong.\n\nThis is the first use of PER-DATE TIMES in a manual rule, a schema question NEEDS_A_HUMAN had been carrying since the REP FT4 series hit the same wall. The alternative was one record per clock time -- six records for a nine-leg series the sponsor treats as one -- or one record per leg, which is nine. Splitting by MODE is the split a reader actually wants, because the mode filter is what they reach for, and per-date times are what make that split possible without lying about an hour.\n\nMANUAL BECAUSE RSGB PUBLISHES DATES AND NO RULE for this series. The legs fall on Mondays, Wednesdays and Thursdays with no discernible ordinal, which is exactly the shape an ordinal must not be fitted to.\n\nNON-UK STATIONS MAY ENTER AS INDIVIDUALS -- RSGB states it outright, which is worth noting beside the AFS and Club Calls contests where entry really is UK&CD only.",
      "exchange": "RS(T) plus a serial number starting at 1 and incrementing by 1.",
      "country": "GB",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-23",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-10-25T20:30:00Z",
      "uid": "rsgb-autumn-ssb-20261022T1900@contestcal",
      "start_date": "2026-10-22",
      "mode_families": [
        "SSB"
      ],
      "band_families": [
        "80m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "nccc-ns-ft4",
      "name": "NCCC FT4 Sprint (FT4 NS)",
      "start": "2026-10-23T01:00:00Z",
      "end": "2026-10-23T01:30:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.5,
      "modes": [
        "FT8/FT4"
      ],
      "submodes": [
        "FT4"
      ],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "Northern California Contest Club (NCCC)",
      "rules_url": "https://www.ncccsprint.com/ft4ns.html",
      "verified": true,
      "note": "NCCC describes these as 'nominal rules' that may be modified on a weekly basis, and runs formal Ladder seasons interspersed with practice weeks. The 30-minute session slot itself is fixed.",
      "exchange": "Grid square (following NA VHF, WW Digi and ARRL IDC practice)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "nccc-ns-ft4-20261023T0100@contestcal",
      "start_date": "2026-10-23",
      "mode_families": [
        "Digital",
        "FT8/FT4"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "nccc-ns-rtty",
      "name": "NCCC RTTY Sprint (RTTY NS)",
      "start": "2026-10-23T01:45:00Z",
      "end": "2026-10-23T02:15:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.5,
      "modes": [
        "RTTY"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "bands_note": "",
      "sponsor": "Northern California Contest Club (NCCC)",
      "rules_url": "https://ncccsprint.com/rttyns.html",
      "verified": true,
      "note": "NCCC describes these as 'nominal rules' that may be modified on a weekly basis, and runs formal Ladder seasons interspersed with practice weeks. The 30-minute session slot itself is fixed.",
      "exchange": "Serial number + name + QTH (both callsigns required in the exchange)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "nccc-ns-rtty-20261023T0145@contestcal",
      "start_date": "2026-10-23",
      "mode_families": [
        "RTTY",
        "Digital"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "nccc-ns-cw",
      "name": "NCCC Sprint (NS)",
      "start": "2026-10-23T02:30:00Z",
      "end": "2026-10-23T03:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.5,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "bands_note": "",
      "sponsor": "Northern California Contest Club (NCCC)",
      "rules_url": "https://ncccsprint.com/rules.html",
      "verified": true,
      "note": "NCCC describes these as 'nominal rules' that may be modified on a weekly basis, and runs formal Ladder seasons interspersed with practice weeks. The 30-minute session slot itself is fixed.",
      "exchange": "Serial number + name + QTH (both callsigns required in the exchange)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "nccc-ns-cw-20261023T0230@contestcal",
      "start_date": "2026-10-23",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "k1usn-sst",
      "name": "K1USN Slow Speed Test (SST)",
      "start": "2026-10-23T20:00:00Z",
      "end": "2026-10-23T21:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "",
      "sponsor": "K1USN Radio Club",
      "rules_url": "https://www.k1usn.com/sst_rules.html",
      "verified": true,
      "note": "No formal log submission -- participants post scores to 3830scores.com.",
      "exchange": "Name + state/province/DX country",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "k1usn-sst-20261023T2000@contestcal",
      "start_date": "2026-10-23",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "cq-ww-ssb",
      "name": "CQ Worldwide DX Contest, SSB",
      "start": "2026-10-24T00:00:00Z",
      "end": "2026-10-25T23:59:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 47.98,
      "modes": [
        "SSB"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "Six bands only: 1.8, 3.5, 7, 14, 21 and 28 MHz",
      "sponsor": "CQ Magazine",
      "rules_url": "https://cqww.com/rules.htm",
      "verified": true,
      "note": "CQ has not published 2026 CQ WW rules: cqww.com/rules.htm still serves the 2025 rules and cqww.com/rules/2026_rules_cqww.pdf is a 404. log_deadline_days is the 5 days those 2025 rules state; CQ WPX, CQ WPX RTTY and CQ WW RTTY all moved to 48 hours for 2026, so recheck this when the 2026 rules appear.",
      "exchange": "RS report plus CQ Zone number of the station location",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-16",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-10-30T23:59:00Z",
      "uid": "cq-ww-ssb-20261024T0000@contestcal",
      "start_date": "2026-10-24",
      "mode_families": [
        "SSB"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "gte24"
    },
    {
      "contest_id": "k1usn-sst",
      "name": "K1USN Slow Speed Test (SST)",
      "start": "2026-10-26T00:00:00Z",
      "end": "2026-10-26T01:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "",
      "sponsor": "K1USN Radio Club",
      "rules_url": "https://www.k1usn.com/sst_rules.html",
      "verified": true,
      "note": "No formal log submission -- participants post scores to 3830scores.com.",
      "exchange": "Name + state/province/DX country",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "k1usn-sst-20261026T0000@contestcal",
      "start_date": "2026-10-26",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "agcw-zap-merit",
      "name": "AGCW ZAP Merit Contest (ZMC)",
      "start": "2026-10-26T17:40:00Z",
      "end": "2026-10-26T18:30:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.83,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "80m"
      ],
      "bands_note": "",
      "sponsor": "AGCW-DL",
      "rules_url": "https://www.agcw.de/contest/tzap/",
      "verified": false,
      "note": "PARTLY UNVERIFIED. The recurrence (every Monday), the 1740 UTC pre-logging opening and the 1800 UTC telegram transmission are all quoted from AGCW. AGCW publishes NO closing time. The 1830 end stored here is a PLACEHOLDER so the record expands -- it is not a sponsor fact and must not be presented as one. Confirm the session length with the ZMC manager before shipping. Points accumulate over a calendar year; logs are due 31 January of the following year.",
      "exchange": "Callsign + date + time + RST (SWLs log RST of both stations in a QSO)",
      "country": "DE",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-12",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "agcw-zap-merit-20261026T1740@contestcal",
      "start_date": "2026-10-26",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "80m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "rsgb-ft4-series",
      "name": "RSGB FT4 Contest Series",
      "start": "2026-10-26T20:00:00Z",
      "end": "2026-10-26T22:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 2,
      "modes": [
        "FT8/FT4"
      ],
      "submodes": [
        "FT4"
      ],
      "bands": [
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "80, 40, 20, 15 and 10 m.",
      "sponsor": "RSGB Contest Committee",
      "rules_url": "https://www.rsgbcc.org/hf/rules/2026/r80m_ft4.shtml",
      "verified": true,
      "note": "TWELVE MONDAY EVENINGS AND THE CLOCK SHIFTS FOR THE SUMMER: January to March and October to December run 2000-2200 UTC, April to September run 1900-2100. Six legs each way, so the record's default is the winter clock and the summer legs carry their own -- the third contest to need per-date times, after the Autumn Series and the 80m Club Championship.\n\nMANUAL BECAUSE THE DATES ARE NOT ON THE RULES PAGE and follow no ordinal: they are Mondays, but the third Monday in January, the fourth in February, the third in March. RSGB publishes them on its CGI calendar and this record holds what that prints.\n\nNot the same contest as the FT4 International Activity Day in April, which is 24 hours and has its own rules page.",
      "exchange": "A signal report. A serial number is not required.",
      "country": "GB",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-23",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-10-27T22:00:00Z",
      "uid": "rsgb-ft4-series-20261026T2000@contestcal",
      "start_date": "2026-10-26",
      "mode_families": [
        "Digital",
        "FT8/FT4"
      ],
      "band_families": [
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "2-12"
    },
    {
      "contest_id": "skcc-sks",
      "name": "SKCC Straight Key Sprint (SKS)",
      "start": "2026-10-28T00:00:00Z",
      "end": "2026-10-28T02:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 2,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "bands_note": "Suggested frequencies, one per band",
      "sponsor": "Straight Key Century Club",
      "rules_url": "https://www.skccgroup.com/operating_activities/weekday_sprint/",
      "verified": true,
      "note": "",
      "exchange": "RST + QTH + name + SKCC number",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "skcc-sks-20261028T0000@contestcal",
      "start_date": "2026-10-28",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "duration_bucket": "2-12"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-28T13:00:00Z",
      "end": "2026-10-28T14:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261028T1300@contestcal",
      "start_date": "2026-10-28",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-28T19:00:00Z",
      "end": "2026-10-28T20:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261028T1900@contestcal",
      "start_date": "2026-10-28",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-29T03:00:00Z",
      "end": "2026-10-29T04:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261029T0300@contestcal",
      "start_date": "2026-10-29",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "cwops-cwt",
      "name": "CWops Test (CWT)",
      "start": "2026-10-29T07:00:00Z",
      "end": "2026-10-29T08:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "CWops",
      "rules_url": "https://cwops.org/cwops-tests/",
      "verified": true,
      "note": "",
      "exchange": "Members: name + CWops number. Non-members: name + state/province/DX prefix.",
      "country": "INTL",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "cwops-cwt-20261029T0700@contestcal",
      "start_date": "2026-10-29",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "30m",
        "20m",
        "17m",
        "15m",
        "12m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "nccc-ns-ft4",
      "name": "NCCC FT4 Sprint (FT4 NS)",
      "start": "2026-10-30T01:00:00Z",
      "end": "2026-10-30T01:30:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.5,
      "modes": [
        "FT8/FT4"
      ],
      "submodes": [
        "FT4"
      ],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "bands_note": "",
      "sponsor": "Northern California Contest Club (NCCC)",
      "rules_url": "https://www.ncccsprint.com/ft4ns.html",
      "verified": true,
      "note": "NCCC describes these as 'nominal rules' that may be modified on a weekly basis, and runs formal Ladder seasons interspersed with practice weeks. The 30-minute session slot itself is fixed.",
      "exchange": "Grid square (following NA VHF, WW Digi and ARRL IDC practice)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "nccc-ns-ft4-20261030T0100@contestcal",
      "start_date": "2026-10-30",
      "mode_families": [
        "Digital",
        "FT8/FT4"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m",
        "6m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "nccc-ns-rtty",
      "name": "NCCC RTTY Sprint (RTTY NS)",
      "start": "2026-10-30T01:45:00Z",
      "end": "2026-10-30T02:15:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.5,
      "modes": [
        "RTTY"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "bands_note": "",
      "sponsor": "Northern California Contest Club (NCCC)",
      "rules_url": "https://ncccsprint.com/rttyns.html",
      "verified": true,
      "note": "NCCC describes these as 'nominal rules' that may be modified on a weekly basis, and runs formal Ladder seasons interspersed with practice weeks. The 30-minute session slot itself is fixed.",
      "exchange": "Serial number + name + QTH (both callsigns required in the exchange)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "nccc-ns-rtty-20261030T0145@contestcal",
      "start_date": "2026-10-30",
      "mode_families": [
        "RTTY",
        "Digital"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "nccc-ns-cw",
      "name": "NCCC Sprint (NS)",
      "start": "2026-10-30T02:30:00Z",
      "end": "2026-10-30T03:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 0.5,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "bands_note": "",
      "sponsor": "Northern California Contest Club (NCCC)",
      "rules_url": "https://ncccsprint.com/rules.html",
      "verified": true,
      "note": "NCCC describes these as 'nominal rules' that may be modified on a weekly basis, and runs formal Ladder seasons interspersed with practice weeks. The 30-minute session slot itself is fixed.",
      "exchange": "Serial number + name + QTH (both callsigns required in the exchange)",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "nccc-ns-cw-20261030T0230@contestcal",
      "start_date": "2026-10-30",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "k1usn-sst",
      "name": "K1USN Slow Speed Test (SST)",
      "start": "2026-10-30T20:00:00Z",
      "end": "2026-10-30T21:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 1,
      "modes": [
        "CW"
      ],
      "submodes": [],
      "bands": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "",
      "sponsor": "K1USN Radio Club",
      "rules_url": "https://www.k1usn.com/sst_rules.html",
      "verified": true,
      "note": "No formal log submission -- participants post scores to 3830scores.com.",
      "exchange": "Name + state/province/DX country",
      "country": "US",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-11",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "k1usn-sst-20261030T2000@contestcal",
      "start_date": "2026-10-30",
      "mode_families": [
        "CW"
      ],
      "band_families": [
        "160m",
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "lt2"
    },
    {
      "contest_id": "sarl-vhf-uhf-fm",
      "name": "SARL VHF/UHF FM Mode Contest",
      "start": "2026-10-31T10:00:00Z",
      "end": "2026-10-31T13:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 3,
      "modes": [
        "FM"
      ],
      "submodes": [],
      "bands": [
        "6m",
        "2m",
        "70cm"
      ],
      "bands_note": "FM mode on the 6m, 2m and 70cm bands.",
      "sponsor": "SARL",
      "rules_url": "https://mysarl.org.za/wp-content/uploads/2025/12/2026-SARL-Contest-Manual-Version-1.1-2025-12-15.pdf",
      "verified": true,
      "note": "THE RECORD THAT PUT FM IN THE MODE VOCABULARY. This contest is FM ONLY, and until 2026-08-19 this catalog had no FM token -- it used SSB as a general phone token, which was serviceable while every phone contest also allowed SSB. Recording an FM-only contest as SSB would have stated something SARL does not permit, which is precisely the overstatement the mode rules exist to prevent, so FM was added to CATALOG_MODES in both engines and to the filter families instead. Ten records that had been carrying FM in submodes moved it into modes in the same commit.\n\nTwo legs on one record: both run 10:00-13:00 UTC and differ only in their anchor, and the anchors are different SHAPES -- the second Saturday of June and the LAST Saturday of October -- which a composite holds without trouble.\n\nSARL explains the timing: 'The dates are three weeks after the RAE Radio Amateur Examination', which is why the contest is aimed at newly licensed amateurs. That is context rather than a rule; the ordinals are what is encoded.\n\nNo log deadline was read in this pass, so none is recorded.",
      "exchange": "A signal report and your full six-character Maidenhead locator. When working a mobile station the contesting station must obtain its grid position.",
      "country": "ZA",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-19",
      "can_enter": false,
      "eligibility_scope": "entity_list",
      "eligibility_reason": "Entry limited to ZS, V5, A2, Z2, C9, 7P, 3DA. K stations may be worked but cannot submit an entry.",
      "works": "everyone",
      "practical": "",
      "log_due": null,
      "uid": "sarl-vhf-uhf-fm-20261031T1000@contestcal",
      "start_date": "2026-10-31",
      "mode_families": [
        "FM"
      ],
      "band_families": [
        "6m",
        "VHF+"
      ],
      "duration_bucket": "2-12"
    },
    {
      "contest_id": "ukei-dx-ssb",
      "name": "UK/EI DX Contest, SSB",
      "start": "2026-10-31T12:00:00Z",
      "end": "2026-11-01T12:00:00Z",
      "start_wall": null,
      "end_wall": null,
      "local_rolling": false,
      "timezone": "",
      "duration_hours": 24,
      "modes": [
        "SSB"
      ],
      "submodes": [],
      "bands": [
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "bands_note": "3.5, 7, 14, 21 and 28 MHz.",
      "sponsor": "UK/EI Contest Club",
      "rules_url": "https://www.ukeicc.com/dx-contest-rules.php",
      "verified": true,
      "note": "MANUAL, AND THE SSB LEG IS WHY BOTH ARE. UKEICC publishes three years of dates and states no recurrence anywhere: CW on 26 Apr 2025, 25 Apr 2026 and 24 Apr 2027; SSB on 1 Nov 2025, 31 Oct 2026 and 23 Oct 2027.\n\nThe CW dates happen to be the last Saturday of April in all three years. The SSB dates fit nothing at all -- the FIRST Saturday of November, then the FIFTH Saturday of October, then the FOURTH -- not even the same month twice running. So this organiser demonstrably does not schedule by ordinal, which is the strongest possible argument against fitting one to the CW leg because three years happen to agree. Both legs hold exactly the dates UKEICC printed and produce nothing for 2028 until it publishes them.\n\nFOUND THROUGH RSGB'S HF CHAMPIONSHIP TABLE, which lists the eleven contests that count towards it. That page is an award over other contests rather than a contest itself -- the same call already made about the WIA Contest Champion -- but it is an excellent index of what RSGB's season actually contains, and both UK/EI legs were on it.",
      "exchange": "RS(T) and a serial number from 1. Stations in the UK and Ireland add their two-character UK/EI District Code.",
      "country": "GB",
      "rules_url_archived": "",
      "rules_url_checked": "2026-08-23",
      "can_enter": true,
      "eligibility_scope": "worldwide",
      "eligibility_reason": "",
      "works": "everyone",
      "practical": "",
      "log_due": "2026-11-02T12:00:00Z",
      "uid": "ukei-dx-ssb-20261031T1200@contestcal",
      "start_date": "2026-10-31",
      "mode_families": [
        "SSB"
      ],
      "band_families": [
        "80m",
        "40m",
        "20m",
        "15m",
        "10m"
      ],
      "duration_bucket": "gte24"
    }
  ]
}