voidly
Voidly Pay / API spec

OpenAPI 3.1 spec — typed clients in 30+ languages

One canonical specification covering all 34 endpoints of /v1/pay/*. Import into your tool, generate a typed client, ship.

Spec version
1.16.2
Endpoints
34
Reusable schemas
12
Base URL
https://api.voidly.ai
Authentication model

No API keys, no bearer tokens, no headers. Every write request carries an Ed25519-signed canonical JSON envelope in the body. The relay re-canonicalizes per RFC 8785, SHA-256-hashes, and verifies the signature against the sender DID's public key (registered on first agent identity). This is documented in the spec undersecuritySchemes.SignedEnvelope; tools that don't natively model body-signed auth (most do not) should treat it as a no-op security scheme — the SDK does the signing.

Import into

Drop the OpenAPI URL into any of these — they consume vanilla 3.1 specs.

Generate a typed client

Five copy-pasteable starters. Every one runs against the live spec at voidly.ai/voidly-pay-openapi.yaml.

TypeScript types (openapi-typescript)
# Generate fully-typed fetch helpers from the spec
npx openapi-typescript https://voidly.ai/voidly-pay-openapi.yaml \
  --output src/types/voidly-pay.d.ts

# Then in your code:
import type { paths } from './types/voidly-pay'

type GetWalletResponse =
  paths['/v1/pay/wallet/{did}']['get']['responses']['200']['content']['application/json']
Python client (openapi-generator)
# Generate a typed Python client
npx @openapitools/openapi-generator-cli generate \
  -i https://voidly.ai/voidly-pay-openapi.yaml \
  -g python \
  -o ./voidly_pay_client

# Use it:
from voidly_pay_client import ApiClient, DefaultApi
api = DefaultApi(ApiClient())
wallet = api.get_wallet_by_did(did="did:voidly:Eg8JvTNrBLcpbX3r461jJB")
print(wallet.balance_credits)
Go client
# Generate a Go client (returns idiomatic Go structs + fully-typed errors)
npx @openapitools/openapi-generator-cli generate \
  -i https://voidly.ai/voidly-pay-openapi.yaml \
  -g go \
  -o ./voidly-pay-go \
  --additional-properties=packageName=voidlypay
Rust client
# Generate a Rust client with serde + reqwest
npx @openapitools/openapi-generator-cli generate \
  -i https://voidly.ai/voidly-pay-openapi.yaml \
  -g rust \
  -o ./voidly-pay-rs
Postman one-click
# Postman: File → Import → URL → paste:
https://voidly.ai/voidly-pay-postman.json

# Or click "Run in Postman" on this page.
# 36 requests across Core / Escrow / Receipts / Capabilities / Hire / Faucet / Admin.

Browse the spec

Three different lenses, all hosted by external providers — no extension needed.

All spec assets

Mirrors of the source files in the public github.com/voidly-ai/openapi-specs repo.

FileFormatUse it for
voidly-pay-openapi.yamlOpenAPI 3.1 (YAML)Human-readable; preferred for git diffs and editing.
voidly-pay-openapi.jsonOpenAPI 3.1 (JSON)Machine-readable; what most code generators want by default.
voidly-pay-postman.jsonPostman v2.1 collection36 preconfigured requests with placeholders for {{did}}, {{escrowId}}.
voidly-pay-asyncapi.yamlAsyncAPI 2.6 (roadmap)Stage 1.16 has no streams — this documents the planned SSE + webhook channels for Stage 1.20.

What's covered

The spec groups operations by tag — every public /v1/pay/* surface is in here.

Core (7)
manifest, health, stats, wallet (POST/GET), transfer (POST/GET), history.
Escrow (6)
open, release, refund, get, history, sweep.
Work Receipts (6)
claim, accept, by-id, by-escrow, by-DID, sweep.
Capabilities (4)
list, search, by-id, by-DID.
Hire (4)
create, by-id, incoming, outgoing.
Faucet, Trust, Admin (7)
faucet, trust/{did}, admin grant/freeze/cap/freeze_all.
Source of truth

The OpenAPI YAML in github.com/voidly-ai/openapi-specs is the single source — these page links serve a CDN-cached mirror. Spec changes ship through PRs; every release bumps info.version.