Protocol Buffer Validation for Go
488
stars
192
commits
Go
primary language
Sep 7, 2026
updated
Protovalidate is the semantic validation library for Protobuf. It provides standard annotations to validate common rules on messages and fields, as well as the ability to use CEL to write custom rules. It's the next generation of protoc-gen-validate.
With Protovalidate, you can annotate your Protobuf messages with both standard and custom validation rules:
syntax = "proto3";
package acme.user.v1;
import "buf/validate/validate.proto";
message User {
string id = 1 [(buf.validate.field).string.uuid = true];
uint32 age = 2 [(buf.validate.field).uint32.lte = 150]; // We can only hope.
string email = 3 [(buf.validate.field).string.email = true];
string first_name = 4 [(buf.validate.field).string.max_len = 64];
string last_name = 5 [(buf.validate.field).string.max_len = 64];
option (buf.validate.message).cel = {
id: "first_name_requires_last_name"
message: "last_name must be present if first_name is present"
expression: "!has(this.first_name) || has(this.last_name)"
};
}
Once you've added protovalidate-go to your project, validation is idiomatic Go:
if err = protovalidate.Validate(moneyTransfer); err != nil {
// Handle failure.
}
[!TIP] The easiest way to get started with Protovalidate for RPC APIs are the quickstarts in Buf's documentation. They're available for both Connect and gRPC.
To install the package, use go get from within your Go module:
go get buf.build/go/protovalidate
Comprehensive documentation for Protovalidate is available at protovalidate.com.
Highlights for Go developers include:
API documentation for Go is available on pkg.go.dev.
protovalidate-go provides native support for standard validation rule processing. They are enabled by default and are disabled by setting the ValidatorOption WithDisableNativeRules.
We continue to validate that the native rules and the CEL rules produce identical results. The compliance Makefile target has been updated to run twice,
once with the native rules enabled, and once with the CEL rules enabled.
Protovalidate isn't just for Go! You might be interested in sibling repositories for other languages:
protovalidate-java (Java)protovalidate-python (Python)protovalidate-cc (C++)protovalidate-es (TypeScript and JavaScript)Additionally, protovalidate's core repository provides:
protovalidate implementationsWe genuinely appreciate any help! If you'd like to contribute, check out these resources:
protovalidate implementationsprotovalidate-goOffered under the Apache 2 license.
Go
99.1%
Protocol Buffer Validation for Go
488
stars
192
commits
Go
primary language
Sep 7, 2026
updated
Protovalidate is the semantic validation library for Protobuf. It provides standard annotations to validate common rules on messages and fields, as well as the ability to use CEL to write custom rules. It's the next generation of protoc-gen-validate.
With Protovalidate, you can annotate your Protobuf messages with both standard and custom validation rules:
syntax = "proto3";
package acme.user.v1;
import "buf/validate/validate.proto";
message User {
string id = 1 [(buf.validate.field).string.uuid = true];
uint32 age = 2 [(buf.validate.field).uint32.lte = 150]; // We can only hope.
string email = 3 [(buf.validate.field).string.email = true];
string first_name = 4 [(buf.validate.field).string.max_len = 64];
string last_name = 5 [(buf.validate.field).string.max_len = 64];
option (buf.validate.message).cel = {
id: "first_name_requires_last_name"
message: "last_name must be present if first_name is present"
expression: "!has(this.first_name) || has(this.last_name)"
};
}
Once you've added protovalidate-go to your project, validation is idiomatic Go:
if err = protovalidate.Validate(moneyTransfer); err != nil {
// Handle failure.
}
[!TIP] The easiest way to get started with Protovalidate for RPC APIs are the quickstarts in Buf's documentation. They're available for both Connect and gRPC.
To install the package, use go get from within your Go module:
go get buf.build/go/protovalidate
Comprehensive documentation for Protovalidate is available at protovalidate.com.
Highlights for Go developers include:
API documentation for Go is available on pkg.go.dev.
protovalidate-go provides native support for standard validation rule processing. They are enabled by default and are disabled by setting the ValidatorOption WithDisableNativeRules.
We continue to validate that the native rules and the CEL rules produce identical results. The compliance Makefile target has been updated to run twice,
once with the native rules enabled, and once with the CEL rules enabled.
Protovalidate isn't just for Go! You might be interested in sibling repositories for other languages:
protovalidate-java (Java)protovalidate-python (Python)protovalidate-cc (C++)protovalidate-es (TypeScript and JavaScript)Additionally, protovalidate's core repository provides:
protovalidate implementationsWe genuinely appreciate any help! If you'd like to contribute, check out these resources:
protovalidate implementationsprotovalidate-goOffered under the Apache 2 license.
Go
99.1%