Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

gRPC API

Crap CMS exposes a gRPC API via Tonic for programmatic access to all content operations.

Service

service ContentAPI {
  rpc Find (FindRequest) returns (FindResponse);
  rpc FindByID (FindByIDRequest) returns (FindByIDResponse);
  rpc Create (CreateRequest) returns (CreateResponse);
  rpc Update (UpdateRequest) returns (UpdateResponse);
  rpc Delete (DeleteRequest) returns (DeleteResponse);
  rpc Count (CountRequest) returns (CountResponse);
  rpc UpdateMany (UpdateManyRequest) returns (UpdateManyResponse);
  rpc DeleteMany (DeleteManyRequest) returns (DeleteManyResponse);
  rpc GetGlobal (GetGlobalRequest) returns (GetGlobalResponse);
  rpc UpdateGlobal (UpdateGlobalRequest) returns (UpdateGlobalResponse);
  rpc Login (LoginRequest) returns (LoginResponse);
  rpc Me (MeRequest) returns (MeResponse);
  rpc ForgotPassword (ForgotPasswordRequest) returns (ForgotPasswordResponse);
  rpc ResetPassword (ResetPasswordRequest) returns (ResetPasswordResponse);
  rpc VerifyEmail (VerifyEmailRequest) returns (VerifyEmailResponse);
  rpc ListCollections (ListCollectionsRequest) returns (ListCollectionsResponse);
  rpc DescribeCollection (DescribeCollectionRequest) returns (DescribeCollectionResponse);
  rpc Subscribe (SubscribeRequest) returns (stream MutationEvent);
  rpc ListVersions (ListVersionsRequest) returns (ListVersionsResponse);
  rpc RestoreVersion (RestoreVersionRequest) returns (RestoreVersionResponse);
  rpc ListJobs (ListJobsRequest) returns (ListJobsResponse);
  rpc TriggerJob (TriggerJobRequest) returns (TriggerJobResponse);
  rpc GetJobRun (GetJobRunRequest) returns (GetJobRunResponse);
  rpc ListJobRuns (ListJobRunsRequest) returns (ListJobRunsResponse);
}

Port

Default: 50051 (configurable via [server] grpc_port in crap.toml).

Message Size Limits

The maximum gRPC message size (both request and response) defaults to 16MB — configurable via grpc_max_message_size in [server]. This is higher than Tonic’s built-in 4MB default to accommodate large Find responses with deep relationship population.

[server]
grpc_max_message_size = "32MB"  # increase for very large responses

Timeouts

An optional request timeout can be set via grpc_timeout in [server]. When set, RPCs exceeding the timeout return DEADLINE_EXCEEDED.

[server]
grpc_timeout = "30s"

Bulk Operation Limits

UpdateMany and DeleteMany process at most 10,000 documents per call. This prevents unbounded memory usage when a broad filter matches a very large dataset. For larger operations, use paginated calls with a where clause to process documents in batches.

Server Reflection

When enabled (grpc_reflection = true in [server], disabled by default), the server supports gRPC reflection, so tools like grpcurl work without importing the proto file:

# List services
grpcurl -plaintext localhost:50051 list

# Describe a service
grpcurl -plaintext localhost:50051 describe crap.ContentAPI

# Describe a message type
grpcurl -plaintext localhost:50051 describe crap.FindRequest

Document Format

All documents use the same message format:

message Document {
  string id = 1;
  string collection = 2;
  google.protobuf.Struct fields = 3;
  optional string created_at = 4;
  optional string updated_at = 5;
}

The fields property is a Struct (JSON object) containing all user-defined field values.

Testing with grpcurl

The repository includes tests/api.sh with grpcurl commands for every RPC:

source tests/api.sh
find_posts
create_post
find_post_by_id abc123

All commands use -plaintext (no TLS) and server reflection.