overlay: 1.0.0
info:
title: API Evangelist enhancements for Handwrite IO Orders API
version: 1.0.0
x-generated: '2026-08-13'
x-method: generated
x-source: >-
Enhancements derived from https://documentation.handwrite.io/ and API Evangelist artifacts in
this repo. Applies to openapi/handwrite-io-orders-api-openapi.yml — the original spec is never mutated.
extends: openapi/handwrite-io-orders-api-openapi.yml
actions:
- target: $.info
update:
x-apievangelist-provider: handwrite-io
x-apievangelist-artifacts:
conventions: conventions/handwrite-io-conventions.yml
errors: errors/handwrite-io-problem-types.yml
rate-limits: rate-limits/handwrite-io-rate-limits.yml
lifecycle: lifecycle/handwrite-io-lifecycle.yml
authentication: authentication/handwrite-io-authentication.yml
sandbox: sandbox/handwrite-io-sandbox.yml
data-model: data-model/handwrite-io-data-model.yml
x-spec-provenance: >-
This OpenAPI is an API Evangelist derivation from Handwrite's published Slate
documentation (documentation.handwrite.io, source at github.com/handwriteio/API-Docs).
Handwrite does not publish an OpenAPI of their own — probed 2026-08-13.
- target: $.components.securitySchemes.ApiKeyAuth
update:
x-scheme-prefix: none
x-key-modes:
test: test_hw
live: live_hw
description: >-
Raw API key sent as the ENTIRE Authorization header value, with no "Bearer " prefix.
Keys are prefixed test_hw (not billed, no mail produced) or live_hw (billed, mails a
card). Content-Type must be application/json. Browser-side use is forbidden by the
provider. Create keys at https://app.handwrite.io/integrations/api
- target: $.components.responses.RateLimited
update:
x-rate-limit:
limit: 60
window: minute
scope: api-key
headers:
- X-RateLimit-Limit
- X-RateLimit-Remaining
- X-RateLimit-Reset
retry_after: false
error_code: rate_limit_exceeded
observed: '2026-08-13'
- target: $.paths['/order/{orderId}'].get
update:
x-agentic-access:
action-class: connected
consequence: read
subject: optional
token:
max-ttl: 3600
audit: none
x-observation-model: >-
Polling only. Handwrite publishes no webhooks, callbacks or event stream, so fulfillment
progress (processing -> written -> complete) can only be observed by re-fetching this
operation. Respect the 60 requests-per-minute key limit when polling.
x-no-list-endpoint: >-
There is no list-orders operation. Orders are addressable one at a time by id only, so a
client MUST persist every _id returned by POST /send or lose the ability to track it.
- target: $.components.schemas.Order
update:
x-provider-payload-divergence: >-
The provider's own documented response (documentation.handwrite.io/#get-an-order) uses
`to` where this schema says `recipient`, `createdAt` where this schema says `created_at`,
and returns `proofs` as an array of {job_type, image_url} objects (job_type is `card` or
`envelope`) rather than a single `proof_url`. The provider payload also carries an
`environment` field valued `live` or `test`, which this schema omits. The provider is
authoritative; see data-model/handwrite-io-data-model.yml.
x-status-semantics:
processing: order accepted, not yet written
written: written but not yet delivered
complete: has been mailed; proof images available
problem: rare — technical issue on Handwrite's end which they will resolve
cancelled: rare — Handwrite does not typically allow cancellations
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.