<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.36 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-wkumari-opsawg-json-geofeed-format-00" category="info" consensus="true" submissionType="IETF" updates="RFC8805" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title abbrev="JSON Geofeed Format">A JSON Format for Self-Published IP Geolocation Feeds</title>
    <seriesInfo name="Internet-Draft" value="draft-wkumari-opsawg-json-geofeed-format-00"/>
    <author fullname="Warren Kumari">
      <organization>Google LLC</organization>
      <address>
        <email>warren@kumari.net</email>
      </address>
    </author>
    <date year="2026" month="May" day="17"/>
    <area>Operations and Management</area>
    <workgroup>Operations and Management Area Working Group</workgroup>
    <keyword>geofeed</keyword>
    <keyword>geolocation</keyword>
    <keyword>ip geolocation</keyword>
    <keyword>json</keyword>
    <abstract>
      <?line 59?>

<t>This document defines a JavaScript Object Notation (JSON) format for
self-published IP geolocation feeds. It updates RFC 8805 by transitioning from
the current comma-separated values (CSV) format to a more expressive JSON
format, addressing the need for operational extensibility.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://wkumari.github.io/draft-wkumari-opsawg-json-geofeed-format/draft-wkumari-opsawg-json-geofeed-format.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-wkumari-opsawg-json-geofeed-format/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Operations and Management Area Working Group Working Group mailing list (<eref target="mailto:opsawg@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/opsawg/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/opsawg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/wkumari/draft-wkumari-opsawg-json-geofeed-format"/>.</t>
    </note>
  </front>
  <middle>
    <?line 67?>

<section anchor="introduction">
      <name>Introduction</name>
      <t><xref target="RFC8805"/> Section 2.1 defines a CSV-based format for network operators to
publish a mapping of IP address prefixes to simplified geolocation information.
While widely deployed, the authors of <xref target="RFC8805"/> acknowledged in Section 7that
the CSV format has "extremely limited extensibility" and that future work
should involve the development of a more expressive format, specifically
suggesting JSON (see<xref target="RFC8805"/>, Section 7. "Planned Future Work").</t>
      <t>Furthermore, <xref target="IAB-IP-GEO"/> identified several critical gaps in the existing
geofeed ecosystem, including:</t>
      <ul spacing="normal">
        <li>
          <t>The CSV format cannot adequately express varying levels of confidence in a
location mapping (<xref target="IAB-IP-GEO"/>, Section 4.2), nor can it map a prefix to
multiple locations (<xref target="IAB-IP-GEO"/>, Section 5.2) for example if the prefix is
used for Anycast.</t>
        </li>
        <li>
          <t>The current format lacks the ontology to clarify whether the geolocation
mapping refers to the physical location of the user, the location of network
infrastructure, a network egress point, or a regulatory jurisdiction
(<xref target="IAB-IP-GEO"/>, Section 3.3).</t>
        </li>
      </ul>
      <t>Note that <xref target="IAB-IP-GEO"/> also identified other, more architectural issues,
including that physical location does not necessarily correspond to network
topologies, the lack of user consent mechanisms, the potential for privacy
violations, the need for different levels of precision (e.g. "get me to a close
datacenter" vs "the ambulance needs my physical address", etc).</t>
      <t>However, these issues, while very important, are orthogonal to the data format
and should be addressed through other mechanisms. This document simply tries to
improve the data format to better support the ecosystem as it currently exists,
while providing a framework for future extensions.</t>
      <t>Readers are strongly encouraged to read <xref target="IAB-IP-GEO"/>, the accompanying papers
from the IAB Workshop on IP Address Geolocation for a deeper understanding of
these architectural issues and the broader context of geolocation in the modern
internet. <xref target="KLINE-GEO"/> and <xref target="SZAMONEK-GEO"/> are particularly recommended to
understand the architecture, use-case and privacy considerations in the
original design.</t>
      <t>This document defines defines a new JSON-based format to address the
extensibility limitations of the current CSV format, while maintaining
compatibility with the core fields defined in <xref target="RFC8805"/>. It also introduces
new fields to address some of the gaps identified in <xref target="IAB-IP-GEO"/>.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="json-geofeed-format">
      <name>JSON Geofeed Format</name>
      <section anchor="metadata-section">
        <name>Metadata section</name>
        <t>A compliant geofeed <bcp14>MUST</bcp14> include a new section comprised of a JSON object
including certain fields which improve the operational usefulness of the
information within.</t>
        <t><bcp14>REQUIRED</bcp14> fields in this section include:</t>
        <ul spacing="normal">
          <li>
            <t><strong>last_updated</strong>: The time and date the feed was last generated, formatted as
an ISO 8601 date-time.</t>
          </li>
          <li>
            <t><strong>contact</strong>: An email addresss or URL (e.g., for a web form) for outreach
about the geofeed for operational or other issues.</t>
          </li>
          <li>
            <t><strong>update_frequency</strong>: The time, expressed either in a number of seconds or as
an ISO 8601 duration. E.g., 86400 (seconds) or P1D (ISO 8601) each represent
a daily interval.</t>
          </li>
        </ul>
        <t><bcp14>OPTIONAL</bcp14> fields in this section include:</t>
        <ul spacing="normal">
          <li>
            <t><strong>source</strong>: The type of entity generating the geofeed information. Values
include <tt>ISP</tt>, <tt>CDN</tt>, <tt>geo_provider</tt>, <tt>registry</tt>.</t>
          </li>
          <li>
            <t><strong>applicability_statement</strong>: A text field describing how the data is intended
to be used.</t>
          </li>
        </ul>
      </section>
      <section anchor="body-section">
        <name>Body section</name>
        <t>The JSON format for geolocation feeds builds upon the fields specified in RFC
8805: IP prefix, alpha2code, region, city.</t>
        <t>Note that, as <xref target="RFC8805"/> deprecated the use of the postal code field
(<xref target="RFC8805"/>, Section 2.1.1.5 - "Postal Code"), the JSON format does not
support it.</t>
        <t>A JSON geofeed <bcp14>MUST</bcp14> be an array of JSON objects.</t>
        <t>Each object <bcp14>MUST</bcp14> contain the following keys:</t>
        <ul spacing="normal">
          <li>
            <t><strong>ip_prefix</strong>: same semantics as defined in <xref target="RFC8805"/></t>
          </li>
          <li>
            <t><strong>alpha2code</strong>: same semantics as defined in <xref target="RFC8805"/></t>
          </li>
          <li>
            <t><strong>region</strong>: same semantics as defined in <xref target="RFC8805"/></t>
          </li>
          <li>
            <t><strong>city</strong>: same semantics as defined in <xref target="RFC8805"/></t>
          </li>
        </ul>
        <t>In addition, each object <bcp14>MUST</bcp14> contain:</t>
        <ul spacing="normal">
          <li>
            <t><strong>last_updated</strong>: A string indicating the timestamp of the last update to
that record, formatted as an ISO 8601 date-time. This field is critical for
consumers to assess the freshness of the data, given the dynamic nature of
IP address allocations and network changes.</t>
          </li>
        </ul>
        <t>Objects <bcp14>MAY</bcp14> contain the following optional keys:</t>
        <ul spacing="normal">
          <li>
            <t><strong>location_type</strong> (optional): A string indicating the nature of the location.</t>
          </li>
          <li>
            <t>Valid values include <tt>infrastructure</tt>, <tt>network_egress</tt>, <tt>organization</tt> and
  <tt>jurisdiction</tt>.</t>
          </li>
          <li>
            <t><strong>confidence</strong> (optional): A string expressing the certainty level of the
mapping (<xref target="IAB-IP-GEO"/>, Section 5.2). Valid values include <tt>high</tt>, <tt>medium</tt>,
and <tt>low</tt>.</t>
          </li>
        </ul>
        <t>Example JSON Geofeed Entry:</t>
        <artwork><![CDATA[
[
  {
    "ip_prefix": "192.0.2.0/24",
    "alpha2code": "US",
    "region": "US-AL",
    "city": "Alabaster",
    "location_type": "infrastructure",
    "confidence": "high",
    "last_updated": "2024-06-01T12:00:00Z"
  },
  {
    "ip_prefix": "198.51.100.0/24",
    "alpha2code": "CZ",
    "region": "CZ-PR",
    "city": "Praha",
    "location_type": "network_egress",
    "confidence": "medium",
    "last_updated": "2017-07-01T12:00:00Z"
  }
]

]]></artwork>
        <t>The <tt>location_type</tt> field allows publishers to clarify the context of the
geolocation mapping, while the <tt>confidence</tt> field provides a mechanism to
express the reliability of the data. The <tt>last_updated</tt> field helps consumers
assess the freshness of the information, which is crucial given the dynamic
nature of IP address allocations and network changes.</t>
        <t>{<strong>Editor note</strong>: Multiple people have suggested new fields
that should be added to the format, but we need to be careful about scope
creep. These are only some of the proposed fields, but any others such as
<tt>source</tt>, <tt>accuracy_radius</tt> and <tt>access_technology</tt> have also been discussed.
For example, <tt>access_technology</tt> would be used to indicate the type of network
access, such as <tt>wifi</tt>, <tt>cellular</tt>, or <tt>ethernet</tt>, and / or <tt>speed</tt>, <tt>jitter</tt>,
etc.</t>
        <t>I have intentionally kept the initial list the same as RFC8805, but added
<tt>last_updated</tt> as it was obviously needed, and  <tt>location_type</tt> and
<tt>confidence</tt> as examples.</t>
        <t>There will need to be careful discussion of other potential fields before they
are added to the format, and it is possible that there will need to be a
dedicated venue for such discussions. In addition, we might consider creating a
registry for these fields to ensure consistency and interoperability, and a
mechanism to provide "private" extensions.}</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>As noted in RFC 8805, self-publication of location data opens no new attack
vectors, but consumers must validate inputs from potentially hostile sources.</t>
      <t>The JSON format allows for greater specificity, which increases the necessity
for publishers to verify they have operational authority over the advertised
prefixes and to ensure the accuracy of the geolocation data. Consumers should
also be aware of the potential for stale data and consider the <tt>last_updated</tt>
field when making decisions based on geofeed information.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC8805">
          <front>
            <title>A Format for Self-Published IP Geolocation Feeds</title>
            <author fullname="E. Kline" initials="E." surname="Kline"/>
            <author fullname="K. Duleba" initials="K." surname="Duleba"/>
            <author fullname="Z. Szamonek" initials="Z." surname="Szamonek"/>
            <author fullname="S. Moser" initials="S." surname="Moser"/>
            <author fullname="W. Kumari" initials="W." surname="Kumari"/>
            <date month="August" year="2020"/>
            <abstract>
              <t>This document records a format whereby a network operator can publish a mapping of IP address prefixes to simplified geolocation information, colloquially termed a "geolocation feed". Interested parties can poll and parse these feeds to update or merge with other geolocation data sources and procedures. This format intentionally only allows specifying coarse-level location.</t>
              <t>Some technical organizations operating networks that move from one conference location to the next have already experimentally published small geolocation feeds.</t>
              <t>This document describes a currently deployed format. At least one consumer (Google) has incorporated these feeds into a geolocation data pipeline, and a significant number of ISPs are using it to inform them where their prefixes should be geolocated.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8805"/>
          <seriesInfo name="DOI" value="10.17487/RFC8805"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="IAB-IP-GEO">
          <front>
            <title>Report from the IAB Workshop on IP Address Geolocation</title>
            <author initials="J." surname="Iyengar" fullname="J. Iyengar">
              <organization/>
            </author>
            <author initials="J." surname="Livingood" fullname="J. Livingood">
              <organization/>
            </author>
            <author initials="T." surname="Pauly" fullname="T. Pauly">
              <organization/>
            </author>
            <date year="2026" month="April" day="08"/>
          </front>
        </reference>
        <reference anchor="KLINE-GEO" target="https://www.ietf.org/slides/slides-ipgeows-paper-anecdotal-history-of-rfc-00.pdf">
          <front>
            <title>Anecdotal History of RFC 8805</title>
            <author initials="E." surname="Kline" fullname="E. Kline">
              <organization/>
            </author>
            <date year="2025" month="November"/>
          </front>
        </reference>
        <reference anchor="SZAMONEK-GEO" target="https://www.ietf.org/slides/slides-ipgeows-paper-the-need-for-an-alternative-to-ip-based-geolocation-00.pdf">
          <front>
            <title>The Need for an Alternative to IP-Based Geolocation</title>
            <author initials="Z." surname="Szamonek" fullname="Z. Szamonek">
              <organization/>
            </author>
            <date year="2025" month="November"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 264?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank the participants of the IAB Workshop on IP
Address Geolocation for their valuable insights and feedback, which have
greatly informed the development of this document.</t>
      <t>In particular, the authors would like to thank the following individuals for
their contributions to the discussions that led to the development of this
document: Nimrod Levy, Jari Arkko, Brian Trammell, Erik Kline, Erik Nygren,
Geoff Huston, Jari Arkko, Jason Livingood, Joe Abley, Joe Clarke, Joel Jaeggli,
Jana Iyengar, Lee Howard, Robert Kisteleki, Tommy Pauly and Zoltan Szamonek.</t>
      <t>The authors would especially like to thank Tony Tauber for submitting useful
pull requests.</t>
    </section>
    <section numbered="false" anchor="appendix-a-example-conversion-script">
      <name>Appendix A: Example Conversion Script</name>
      <t>The following Python program (convert.py) demonstrates how to convert an RFC
8805 format CSV geofeed into the JSON format defined in this document. This
script reads from standard input and outputs the JSON to standard output.</t>
      <t>Note that this is a simple example script and does not include error handling,
validation, or support for all potential fields. It is intended for
illustrative purposes only.</t>
      <t>--- CODE BEGINS ---</t>
      <artwork><![CDATA[
import sys
import csv
import json
from datetime import datetime, timezone


def process_csv(input_stream):
    """
    This parses RFC8805 format CSV and returns a JSON formatted string.
    """
    # Get current time in UTC, formatted as ISO 8601
    current_time = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")

    json_records = []

    reader = csv.DictReader(
        input_stream, fieldnames=["ip_prefix", "alpha2code", "region", "city"]
    )

    for row in reader:
        # Skip comment lines
        if row["ip_prefix"].startswith("#"):
            continue

        # Construct the dictionary using the keys from the CSV header
        record = {
            "ip_prefix": row.get("ip_prefix", ""),
            "alpha2code": row.get("alpha2code", ""),
            "region": row.get("region", ""),
            "city": row.get("city", ""),
            "last_updated": current_time,
        }

        json_records.append(record)

    return json.dumps(json_records, indent=2)


if __name__ == "__main__":
    output = process_csv(sys.stdin)
    print(output)
]]></artwork>
      <t>--- CODE ENDS ---</t>
      <t>The following Python program (test_convert.py) includes unit tests for the
conversion script, demonstrating how to test the conversion of CSV input into
the expected JSON output.</t>
      <t>--- CODE BEGINS ---</t>
      <artwork><![CDATA[
import unittest
import io
import json
from convert import process_csv


class TestCSVParser(unittest.TestCase):

    # Examples from the RFC8805 document
    def test_standard_ipv4_parsing(self):
        csv_data = "192.0.2.5,US,US-AL,Alabaster,\n"
        # Simulate an input stream
        stream = io.StringIO(csv_data)

        result_json = process_csv(stream)
        data = json.loads(result_json)

        # Verify we got exactly one record
        self.assertEqual(len(data), 1)

        # Verify the dynamically parsed fields
        self.assertEqual(data[0]["ip_prefix"], "192.0.2.5")
        self.assertEqual(data[0]["alpha2code"], "US")
        self.assertEqual(data[0]["region"], "US-AL")
        self.assertEqual(data[0]["city"], "Alabaster")

        # Verify static/injected fields
        self.assertTrue("T" in data[0]["last_updated"])  # Quick check for date format

    def test_ipv6_and_empty_fields(self):
        csv_data = "2001:db8::1,US,,,\n"
        stream = io.StringIO(csv_data)

        result_json = process_csv(stream)
        data = json.loads(result_json)

        self.assertEqual(data[0]["ip_prefix"], "2001:db8::1")
        self.assertEqual(data[0]["alpha2code"], "US")
        # Ensure missing fields evaluate to empty strings
        self.assertEqual(data[0]["region"], "")
        self.assertEqual(data[0]["city"], "")

    def test_ignore_comment_records(self):
        csv_data = (
            "# IETF106 (Singapore) - November 2019 - Singapore, SG\n"
            "130.129.0.0/16,SG,SG-01,Singapore,"
        )
        stream = io.StringIO(csv_data)

        result_json = process_csv(stream)
        data = json.loads(result_json)

        # Data should contain only the non-comment record
        self.assertEqual(len(data), 1)

        # And the fields should be correctly parsed. 2 tests for the price of one!
        self.assertEqual(data[0]["ip_prefix"], "130.129.0.0/16")
        self.assertEqual(data[0]["alpha2code"], "SG")
        self.assertEqual(data[0]["region"], "SG-01")
        self.assertEqual(data[0]["city"], "Singapore")

    def test_empty_input(self):
        stream = io.StringIO("")
        result_json = process_csv(stream)
        data = json.loads(result_json)

        self.assertEqual(data, [])


if __name__ == "__main__":
    unittest.main()
]]></artwork>
      <t>--- CODE ENDS ---</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
O/xCyvc/A0ozy6w4AAA=

-->

</rfc>
