<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-wkumari-opsawg-json-geofeed-format-01" category="info" consensus="true" submissionType="IETF" updates="RFC8805" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.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-01"/>
    <author fullname="Warren Kumari">
      <organization>Google LLC</organization>
      <address>
        <email>warren@kumari.net</email>
      </address>
    </author>
    <date year="2026" month="August" day="28"/>
    <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 7 that
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 address 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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
h19I+f4Ho7ZZ7qw4AAA=

-->

</rfc>
