okuri

Native API

One listener (default :8080) serves three surfaces from the same router: SQS (covered in SQS compatibility), gRPC, and an HTTP/JSON mirror of the same calls. Native surfaces authenticate with bearer API keys; the SQS surface authenticates with SigV4. The two credential sets are separate and never derived from each other.

Authentication

Every gRPC and HTTP/JSON request carries a bearer key:

Authorization: Bearer <key>

Keys are 32 bytes in base64 and each is scoped to a namespace; see configuration for how they are provisioned. A key scoped to a different namespace is indistinguishable from one that was never configured.

gRPC

The service is okuri.api.v1.QueueService:

rpc purpose
SendMessage append a message, with optional delay and dedup id
ReceiveMessage lease up to a batch of messages, with optional long poll
AckMessage complete a delivery
NackMessage return a message early, with optional backoff
ChangeMessageVisibility extend or shorten an outstanding lease
RedriveQueue move dead letters back to the parent queue
PurgeQueue drop everything sent before now
GetQueueStats queue depth and related counters

The proto files live in the okuri-proto crate.

HTTP/JSON

The same calls as plain HTTP:

route purpose
POST /v1/queues/{queue}/messages send
POST /v1/queues/{queue}/messages:receive receive
POST /v1/messages:ack ack
POST /v1/messages:nack nack
POST /v1/messages:extend change visibility
POST /v1/queues/{queue}:redrive redrive the queue’s dead letters
POST /v1/queues/{queue}:purge purge
GET /v1/queues/{queue}/stats stats

Receipt handles

A receive hands back one receipt handle per message. The handle is opaque, signed with the fleet-wide receipt_handle_key, and bound to the node’s namespace. Because every node carries the same key, a handle issued by whichever node served the receive is honored by whichever node the load balancer sends the ack to, so sticky routing is not required.

Handles are what ack, nack, and visibility changes take. Do not parse or store them beyond the lease’s lifetime.

Queue management

The native API deliberately defines no queue-creation RPC today: create queues through the SQS surface’s CreateQueue, or through the Rust library when embedding okuri. okuri queue admin CLI commands are planned for 0.1.0.

Queue names everywhere are non-empty, at most 64 bytes, [a-z0-9_-] only, and the -dlq suffix is reserved for each queue’s dead-letter companion.