SDKs
Official client libraries
Thin wrappers over the same HTTP API: batching, lease extension, backoff, and nothing else.
Updated 13 August 2026API v2.4.13 languages
What a client does
Every client is the same program in three languages: it leases a batch, hands you the bodies, and acks when your handler returns. Four things are handled below the call, and everything else is the HTTP API you already have.
| Retries429 and 503 | Backoff doubles from one second and stops at five minutes. Every other code surfaces to your handler immediately, because retrying will not help. |
|---|---|
| Lease extensionhalf-timeout | One extend call per half of the visibility timeout while a handler is still running. It stops on ack, nack or a thrown error. |
| Batchingmax 25 | One lease call per batch, long polling up to 20s, so an idle consumer holds a connection instead of spinning. |
| Idempotency24 hours | A publish retried after a timeout reuses its Idempotency-Key, so the message is stored once and you get the original id back. |
Note
The same consumer, three times
One queue, batches of 25, a 20 second long poll and an ack when the handler returns. Pick a language and the page follows it.
@halyard/node 2.4.1Node 20 and Bun 1.1
The lease iterator is an async generator, so the loop ends when you break out of it and the open lease is nacked on the way out rather than left to time out.
bun add @halyard/nodeimport { Halyard } from "@halyard/node";
const halyard = new Halyard({ key: process.env.HALYARD_KEY });
for await (const lease of halyard.queue("orders").leases({
max: 25,
wait: "20s"
})) {
for (const message of lease.messages) {
await fulfil(message.body);
}
await lease.ack();
}OpenAPI spec
halyard-openapi-2.4.1.jsonOpenAPI 3.1
The spec is generated from the same source as this reference, so it carries all nine endpoints, every parameter and every error code. It ships with each release; generate a client for anything the three libraries do not cover.
{
"openapi": "3.1.0",
"info": {"title": "Halyard", "version": "2.4.1"},
"servers": [{"url": "https://api.halyard.dev/v1"}],
"paths": {
"/queues/{queue}/messages": {
"post": {
"operationId": "publishMessages",
"security": [{"bearer": ["queues:write"]}]
}
}
}
}bunx @openapitools/openapi-generator-cli generate \
-i halyard-openapi-2.4.1.json \
-g rust -o ./halyard-rustpublished with every release