bufbuild/protovalidate-go

Protocol Buffer Validation for Go

488

stars

192

commits

Go

primary language

Sep 7, 2026

updated

protovalidate.com
cel
common-expression-language
go
golang
protobuf
protocol-buffers

README

The Buf logo

protovalidate-go

CI Conformance Report Card GoDoc BSR

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.
}

Installation

[!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

Documentation

Comprehensive documentation for Protovalidate is available at protovalidate.com.

Highlights for Go developers include:

API documentation for Go is available on pkg.go.dev.

Native standard validation rules

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.

Additional languages and repositories

Protovalidate isn't just for Go! You might be interested in sibling repositories for other languages:

Additionally, protovalidate's core repository provides:

Contributing

We genuinely appreciate any help! If you'd like to contribute, check out these resources:

Offered under the Apache 2 license.

Contributors

dependabot[bot]

56 commits

rodaine

43 commits

pkwarren

16 commits

smaye81

12 commits

bufbuild/protovalidate-go

Protocol Buffer Validation for Go

488

stars

192

commits

Go

primary language

Sep 7, 2026

updated

protovalidate.com
cel
common-expression-language
go
golang
protobuf
protocol-buffers

README

The Buf logo

protovalidate-go

CI Conformance Report Card GoDoc BSR

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.
}

Installation

[!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

Documentation

Comprehensive documentation for Protovalidate is available at protovalidate.com.

Highlights for Go developers include:

API documentation for Go is available on pkg.go.dev.

Native standard validation rules

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.

Additional languages and repositories

Protovalidate isn't just for Go! You might be interested in sibling repositories for other languages:

Additionally, protovalidate's core repository provides:

Contributing

We genuinely appreciate any help! If you'd like to contribute, check out these resources:

Offered under the Apache 2 license.

Contributors

dependabot[bot]

56 commits

rodaine

43 commits

pkwarren

16 commits

smaye81

12 commits

Languages

Go

99.1%