RFC 9996
Media Types for Protocol Buffers
Media Types for Protocol Buffers ๐
okay bestie, this one is RFC 9996 and it's all about registering media types for Protocol Buffers (Protobuf) ๐ It's Informational (not a Standards Track spec), it's ISSN 2070-1721, and it's dated July 2026 ๐ธ The authors are M. Kucherawy (Ed.), W. Kumari, and R. Sloan from Google ๐ซถ The title block doesn't list anything it obsoletes or updates, so it's standing on its own โจ
Abstract โจ
this doc registers media types for Protobuf, which is a super common, extensible way to serialize structured data ๐ฆ
Status of This Memo ๐
this is not an Internet Standards Track spec, it's just published for info purposes ๐ It's still an IETF product that has consensus from the IETF community, got public review, and was approved by the IESG. Not every IESG-approved doc is a candidate for any level of Internet Standard, so check Section 2 of RFC 7841 if you're curious ๐
For the current status, errata, and how to give feedback, go to https://www.rfc-editor.org/info/rfc9996 โจ
Copyright Notice ๐
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved. ๐
This doc is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) as they stand on the publication date. Read those carefully because they spell out your rights and restrictions ๐ง Code Components pulled out of this doc have to include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions, and they come without warranty as described in the Revised BSD License ๐
Table of Contents ๐
1. Introduction
2. Key Words
3. Payload Description
4. Encoding Considerations
5. Versions
6. Security Considerations
7. IANA Considerations
7.1. Media Type: application/protobuf
7.2. Media Type: application/protobuf+json
8. References
8.1. Normative References
8.2. Informative References
Acknowledgments
Authors' Addresses
1. Introduction โจ
okay so Protobuf (also called "Protobuf") launched in 2008 as a free, open-source, platform-independent way to transport and store structured data ๐ง It's gotten super popular, and there are implementations in tons of languages: C++, C#, Dart, Go, Java, Kotlin, Objective-C, Python, JavaScript, Ruby, Swift, and probably more ๐ See [Protobuf] for more info.
Protobuf is made up of an interface definition language (IDL), wire encoding formats, and language-specific implementations (usually with a generated API). That's what lets clients and servers get deployed easily around one shared schema ๐ฅ Protobuf supports two wire formats for interchange: the one in [Binary], which is optimized for wire efficiency, and the one in [ProtoJSON], which maps the Protobuf schema onto a JSON structure ๐ฆ
Serialized objects sometimes travel inside media that use media types (see [RFC2045]) to label their payloads. So current and historical media types used for this purpose would really benefit from being registered ๐ซถ The IANA has registered two Protobuf media types, and you can find them in Section 7 ๐
2. Key Words ๐
okay so the BCP 14 key words are "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" ๐ They're interpreted as described in BCP 14 [RFC2119] [RFC8174], but only when, and only when, they show up in all capitals like that in this doc ๐
3. Payload Description ๐ง
the media types in this doc are only for transporting serialized objects ๐ If you transport the IDL and object definitions, they'd go with any appropriate text media type. Here are the three examples, and only the third one (the JSON one) would ever actually be used with these media types โจ
- An example of using the IDL to specify a "Person" object:
edition = "2023";
message Person {
string name = 1;
int32 id = 2;
string email = 3;
}
- An example of python code that uses code generated from the IDL definition above to create an instance of a "Person" object:
person = Person()
person.id = 1234
person.name = "John Doe"
person.email = "jdoe@example.com"
- An example of the above instance expressed in JSON:
{
"name": "John Doe",
"id": 1234,
"email": "jdoe@example.com"
}
4. Encoding Considerations ๐ธ
Protobuf supports the formats in [Binary] and [ProtoJSON] for interchange, and both are platform-independent ๐ If you've got binary forms that need to ride over non-binary transports, a base64 encoding (e.g., [RFC4648]) is recommended ๐
Both media types here have an optional "encoding" parameter that says which encoding format a payload uses ๐ฎ It's there for future extensibility. The valid values are "binary" and "json", and any other value MUST be treated as an error ๐ญ Check Section 7 for the defaults of each of the two registered types. Using "binary" with the JSON type, or "json" with the binary type, MUST be treated as an error too ๐
5. Versions ๐ฆ
so [Proto2] was the first public version of the Protobuf schema language ๐ Then came [Proto3], [Edition2023], and [Edition2024], and [Edition2024] is the current one as of writing โจ More editions of the IDL are expected later ๐
These versions are about how the schema of the IDL evolves, not the wire format ๐ซถ So a serialized object generated by any of them is compatible with any other. The media type registrations in Section 7 do support versioning of the wire format, in case it ever changes, but they don't refer to the IDL, which can evolve on its own timeline ๐
Heads up though: there may be semantic changes tied to the IDL version that change how otherwise compatible bits on the wire get interpreted ๐ For example, in Proto2, unknown enumeration values were treated as invalid, but in Proto3 they're retained ๐
Clients MUST reject payloads with an unsupported version number ๐ซ
โ part 1 of 2 โ ๐
7.2. Media Type: application/protobuf+json โจ
okay so this one is the JSON-flavoured sibling ๐ Here's the registration template, and I've kept every field and value exactly as written:
- Type name:
application - Subtype name:
protobuf+json - Required parameters:
charset, which must be set toutf-8(case-insensitive) - Optional parameters:
encoding: tells you which type of Protobuf encoding is in use. Forapplication/protobuf+jsonit'sjsonby default, meaning the format in [ProtoJSON]. At the time of writing, no other encoding can be used forapplication/protobuf+json, so this parameter is basically there for extensibility ๐version: tells you the version of the wire encoding specification (not the schema language), with a default of1. At the time of writing, no protobuf wire encodings are versioned, so this one is also for extensibility. Unversioned wire encodings should be treated as having version1๐
- Encoding considerations: Same as encoding considerations of
application/jsonas specified in [RFC8259], Section 11. - Security considerations: See Section 6 of RFC 9996. ๐
- Interoperability considerations: The Protobuf specification [Protobuf] includes versioning provisions to ensure backward compatibility when encountering payloads with unknown properties. ๐ซถ
- Published specification: [Protobuf]
- Applications that use this media type: Any application with a need to exchange or store structured objects across platforms or implementations.
- Fragment identifier considerations:
N/A - Additional information:
- Deprecated alias names for this type:
application/x-protobuf+json - Magic number(s):
N/A - File extension(s):
N/A - Macintosh file type code(s):
N/A
- Deprecated alias names for this type:
- Person & email address to contact for further information: Protobuf Team <protobuf-team@google.com>
- Intended usage: COMMON
- Restrictions on usage:
N/A - Author: Rob Sloan <rmsj@google.com>, Protobuf Team <protobuf-team@google.com>
- Change controller: IETF
8. References ๐
8.1. Normative References
- [Protobuf] Google, LLC, "Protocol Buffers",
https://protobuf.dev/. - [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies", RFC 2045, DOI 10.17487/RFC2045, November 1996,
<https://www.rfc-editor.org/info/rfc2045>. - [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>. - [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006,
<https://www.rfc-editor.org/info/rfc4648>. - [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type Specifications and Registration Procedures", BCP 13, RFC 6838, DOI 10.17487/RFC6838, January 2013,
<https://www.rfc-editor.org/info/rfc6838>. - [RFC6839] Hansen, T. and A. Melnikov, "Additional Media Type Structured Syntax Suffixes", RFC 6839, DOI 10.17487/RFC6839, January 2013,
<https://www.rfc-editor.org/info/rfc6839>. - [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017,
<https://www.rfc-editor.org/info/rfc8174>. - [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data Interchange Format", STD 90, RFC 8259, DOI 10.17487/RFC8259, December 2017,
<https://www.rfc-editor.org/info/rfc8259>.
8.2. Informative References
- [Any] "any.proto Schema Definition", commit 97921a5, 12 February 2026,
https://github.com/protocolbuffers/protobuf/blob/main/src/google/protobuf/any.proto. - [Binary] Google, LLC, "Protobuf Binary Wire Encoding Spec",
https://protobuf.dev/programming-guides/encoding. - [CORB] Chromium, "Cross-Origin Read Blocking for Web Developers",
https://www.chromium.org/Home/chromium-security/corb-for-developers. - [Edition2023] Google, LLC, "Protocol Buffers Edition 2023 Language Specification",
https://protobuf.dev/reference/protobuf/edition-2023-spec. - [Edition2024] Google, LLC, "Protocol Buffers Edition 2024 Language Specification",
https://protobuf.dev/reference/protobuf/edition-2024-spec. - [MIMESNIFF] WHATWG, "MIME Sniffing - MIME Type Groups", WHATWG Living Standard,
https://mimesniff.spec.whatwg.org/#mime-type-groups. Commit snapshot:https://mimesniff.spec.whatwg.org/commit-snapshots/67bde18bc4f75a5c5b5dfb1217161137ce385124/. - [Proto2] Google, LLC, "Protocol Buffers Language Specification (Proto2 Syntax)",
https://protobuf.dev/reference/protobuf/proto2-spec. - [Proto3] Google, LLC, "Protocol Buffers Language Specification (Proto3)",
https://protobuf.dev/reference/protobuf/proto3-spec. - [ProtoFeatures] Google, LLC, "Protobuf Feature Settings for Editions",
https://protobuf.dev/editions/features/. - [ProtoJSON] Google, LLC, "Protobuf JSON Wire Encoding Spec",
https://protobuf.dev/programming-guides/json. - [RFC8264] Saint-Andre, P. and M. Blanchet, "PRECIS Framework: Preparation, Enforcement, and Comparison of Internationalized Strings in Application Protocols", RFC 8264, DOI 10.17487/RFC8264, October 2017,
<https://www.rfc-editor.org/info/rfc8264>. - [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018,
<https://www.rfc-editor.org/info/rfc8446>. - [RFC9205] Nottingham, M., "Building Protocols with HTTP", BCP 56, RFC 9205, DOI 10.17487/RFC9205, June 2022,
<https://www.rfc-editor.org/info/rfc9205>. - [UniChars] Bray, T. and P. Hoffman, "Unicode Character Repertoire Subsets", RFC 9839, DOI 10.17487/RFC9839, August 2025,
<https://www.rfc-editor.org/info/rfc9839>.
Acknowledgments ๐ธ
Orie Steele provided valuable feedback to this work. Huge thanks, bestie ๐ง
Authors' Addresses ๐
- Murray S. Kucherawy (editor)
- Email: superuser@gmail.com
- Warren Kumari, Google
- Email: warren@kumari.net
- Rob Sloan, Google
- Email: varomodt@gmail.com
๐ฆ where this page comes from
- ietf: rfc9996 2026-07
- ๐ girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms