Developers

Build on XE Testnet.

Everything needed to integrate with the XE testnet from code or from an AI agent, on one page: the JSON HTTP API every node exposes, its OpenAPI 3.1 description, how it is versioned, how it is rate limited, how it reports errors, and where the CLI, wallet and source live. Reads need no API key. Amounts are integer micro-units (1 XE = 1,000,000).

Resources
Base URLs and versioning

The API is versioned in the URL path. The current major version is v1 at https://test.network/api/v1. Pin that in anything that must not move. The unversioned https://test.network/api is an alias for the current major version and follows it when it changes. Every response carries X-API-Version: 1. The node itself, https://ldn.test.network/api, is unversioned and tracks the node release; it does not add the headers or JSON error wrapping described here.

The same policy is published machine-readably as x-versioning in /openapi.json and as versioning in the /api/v1 discovery document.

Authentication

Most reads are open: no key, no sign-up. Two endpoints are operator-only and take Authorization: Bearer <XE_API_ADMIN_TOKEN> (POST /lease/request and the unfiltered GET /chat/events firehose); the public node does not hand that token out. Reading a specific account's chat needs an ownership proof: fetch a challenge from GET /chat/auth/challenge, sign sha256("xe/chat-read-auth/v1\0" || challenge) with the account key, and pass account, pub_key, challenge and sig as query parameters. Writes are signed blocks you construct and sign yourself — the node never signs on your behalf. The security schemes are declared in the OpenAPI document.

Rate limits

Limits are per client IP and per request class, matching the node's own: reads (GET, HEAD) 1,000 requests per 5 seconds, writes (POST, PUT, PATCH, DELETE) 50 requests per 5 seconds — 200/s and 10/s sustained. Every response from test.network/api tells you where you stand, so you can throttle before being refused:

Streaming endpoints (SSE) count once when opened. The direct node endpoint enforces the same limits but does not send the headers.

Errors

Every 4xx and 5xx from test.network/api is JSON. The body is the Error schema from the OpenAPI document: error.code (machine-readable, snake_case: bad_request, unauthorized, forbidden, not_found, method_not_allowed, rate_limited, upstream_error, upstream_unavailable, upstream_timeout), error.status, error.message (what happened), error.hint (what to do next) and error.docs / error.openapi links. When the node itself answered with a non-JSON error, its status and body are kept under error.upstream. The node's own JSON errors pass through unchanged. Each operation in the OpenAPI document lists its error responses, all typed against the same schema.

For AI agents

Every page on this site returns Markdown for Accept: text/markdown at its own URL. /llms.txt maps the site and says when XE is the right tool; /llms-full.txt is the whole site in one file. The OpenAPI document has a unique operationId, a description and typed parameters on every operation, so it can be loaded directly as a tool definition.