Repo release 0.22.0 — this CLI release is cli-v0.21.0.
An agent-ready API surface: /v1 URLs, rate-limit headers on every response,
a fully described OpenAPI spec, and MCP capability discovery without auth.
Component versions cut alongside this release:
sdk-v0.15.1 (PyPI: hail-sdk==0.15.1), cli-v0.21.0 (Homebrew + GitHub Releases).
API versioning — /v1
- Every customer-facing route is now canonical under
/v1/<resource>, and
/v1is the only mount in the OpenAPI schema. The legacy unprefixed paths
still work but carryDeprecation: trueplus a successor-versionLink
header and are excluded from the schema. See
docs/public/versioning.md. - The regenerated spec and Go CLI client talk to
/v1.
Rate limiting
- Every customer response carries
RateLimit-Limit/RateLimit-Remaining/
RateLimit-Reset; exceeding the limit returns429withRetry-After.
Documented in the OpenAPI spec. Three public, self-credentialed routes
(Twilio webhook receivers, the RFC 8058 unsubscribe endpoint) are exempt so
they don't share a bucket with anonymous internet traffic.
OpenAPI descriptions
- Every schema-visible operation and every transitively-referenced schema
field (56 schemas) now has a real, accurate description.
MCP discovery
initializeandtools/listsucceed without a bearer token, so an agent
can see what Hail offers before authenticating. Every other method still
401s. A 64 KiB cap bounds the pre-auth body peek; a per-IP rate cap bounds
anonymous session creation.
Voicebot
- The AI-disclosure line and
first_messageare spoken as one turn. They
were two separate utterances with an awkward gap between them.
GET /email-domainsreportsdefault_from: nullwhen the hail-mail
address the org would mint is already claimed by another tenant. A pinned
HAIL_MAIL_FROMis one address per deployment, so the first org to send
takes it and every other org's send 409s — the preview promised an
address the send path refuses.- Every surface that mentions opens or clicks now says that open and click
tracking only works for emails with an HTML body: a plain-text-only email
still getssent/delivered/ bounce events, but neveropened/
clicked(the SES tracking pixel and link rewriting live in the HTML
part). Stated in the API schema descriptions, MCP tool docstrings, SDK
docstrings, CLI help, and docs/public/webhooks.md.
The website console shows matching notes in the email drawer and the
deliverability dashboard.
Docs
- Every docs page and every generated API reference page is also served as
plain markdown: append.mdto its URL./docs/llms.txtindexes every
guide and API operation;/docs/llms-full.txtconcatenates everything
into one file. The API markdown carries the same field descriptions as
the HTML pages. - Tagline refreshed everywhere to "Give your AI agent a voice, a real phone
number, and an inbox."
Internal
- Deploy prunes images older than two weeks on the production VM after a
successful rollout. Each deploy pulled:latestplussha-<commit>for
three services and removed nothing, until the disk filled and a deploy
died mid-pull. - Release tags: there is no umbrella
v<X.Y.Z>tag any more. GoReleaser strips
thecli-prefix, so that name already belongs to the CLI's release page; a
hand-made one madecli-v0.20.0publish its binaries onto a page whose tag
pointed at older code.release-cli.ymlnow fails when the stripped tag
already exists on another commit, and the runbook documents the rule.