{"openapi":"3.0.3","info":{"title":"AENET Cloud Public API","version":"v1","description":"Read-only public endpoints, anonymous API keys and signed responses, and the Early Access registration waitlist. Public-safe data only — never the AENET Core. Versioning, caching, CORS, limits and the error catalog are in /api/v1/policy."},"servers":[{"url":"https://aenetcloud.com","description":"Production — custom domain (aenetcloud.com)"},{"url":"https://aenet-cloud-public.aenet-cloud-public.workers.dev","description":"Preview / rollback — workers.dev (noindex)"}],"paths":{"/api/v1/status":{"get":{"summary":"Sanitized public status","responses":{"200":{"description":"Enveloped status snapshot"}}}},"/api/v1/time":{"get":{"summary":"Canonical public time (SERVER_UTC)","responses":{"200":{"description":"Time envelope"}}}},"/api/v1/architecture":{"get":{"summary":"Public architecture snapshot","responses":{"200":{"description":"Enveloped architecture snapshot"}}}},"/api/v1/development-queue":{"get":{"summary":"Public development queue","responses":{"200":{"description":"Enveloped development queue"}}}},"/api/v1/roadmap":{"get":{"summary":"Public roadmap","responses":{"200":{"description":"Enveloped roadmap"}}}},"/api/v1/early-access":{"get":{"summary":"Early Access registration availability","responses":{"200":{"description":"Enveloped waitlist availability"}}}},"/api/v1/early-access/register":{"post":{"summary":"Early Access waitlist registration","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","consent","turnstileToken"],"properties":{"email":{"type":"string","format":"email"},"locale":{"type":"string","enum":["en","th","zh-CN"],"description":"Auto-defaults from the page locale"},"interests":{"type":"array","items":{"type":"string","enum":["architecture","agents","api","kap-language","k-language","research","developer-tools","early-preview","business","education"]}},"useCase":{"type":"string","maxLength":500},"consent":{"type":"boolean","const":true},"turnstileToken":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Registration received (envelope aenet.public.early-access.registration.v1)","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"schema":{"type":"string","const":"aenet.public.early-access.registration.v1"},"requestId":{"type":"string"},"issuedAt":{"type":"string"},"data":{"type":"object","properties":{"ticket":{"type":"string","pattern":"^EA-[A-F0-9]+$"},"status":{"type":"string","const":"WAITING"},"message":{"type":"string"}}}}}}}},"400":{"description":"Invalid input (error envelope aenet.public.api.error.v1)"},"403":{"description":"Turnstile verification failed"},"503":{"description":"Registration temporarily unavailable"}}}},"/api/v1/wallet":{"get":{"summary":"Public wallet overview snapshot (sanitized, never a live wallet query)","responses":{"200":{"description":"Enveloped wallet overview snapshot"}}}},"/api/v1/wallet/architecture":{"get":{"summary":"Public wallet architecture snapshot","responses":{"200":{"description":"Enveloped wallet architecture snapshot"}}}},"/api/v1/wallet/security":{"get":{"summary":"Public wallet security snapshot","responses":{"200":{"description":"Enveloped wallet security snapshot"}}}},"/api/v1/wallet/evidence":{"get":{"summary":"Public wallet evidence snapshot","responses":{"200":{"description":"Enveloped wallet evidence snapshot"}}}},"/api/v1/wallet/capabilities":{"get":{"summary":"Public wallet capabilities snapshot","responses":{"200":{"description":"Enveloped wallet capabilities snapshot"}}}},"/api/v1/wallet/integration":{"get":{"summary":"Public wallet integration snapshot","responses":{"200":{"description":"Enveloped wallet integration snapshot"}}}},"/api/v1/wallet/development":{"get":{"summary":"Public wallet development snapshot","responses":{"200":{"description":"Enveloped wallet development snapshot"}}}},"/api/v1/policy":{"get":{"summary":"API service policy and error catalog","responses":{"200":{"description":"Enveloped policy document (aenet.public.api.policy.v1)"}}}},"/api/v1/openapi.json":{"get":{"summary":"This OpenAPI document","responses":{"200":{"description":"The raw OpenAPI document (not enveloped)"}}}},"/api/v1":{"get":{"summary":"API discovery index","responses":{"200":{"description":"Enveloped endpoint index"}}}},"/api/v1/changelog":{"get":{"summary":"Public changelog","responses":{"200":{"description":"Enveloped changelog snapshot"}}}},"/api/v1/version":{"get":{"summary":"Current version snapshot","responses":{"200":{"description":"Enveloped latest version snapshot"}}}},"/api/v1/versions":{"get":{"summary":"Version snapshot history","responses":{"200":{"description":"Enveloped hash-chained history index"}}}},"/api/v1/versions/{snapshotId}":{"get":{"summary":"One version snapshot","parameters":[{"name":"snapshotId","in":"path","required":true,"schema":{"type":"string","pattern":"^VS-\\d{4,}$"}}],"responses":{"200":{"description":"Enveloped version snapshot"},"404":{"description":"VERSION_NOT_FOUND"}}}},"/api/v1/keys":{"post":{"summary":"Issue an anonymous read-only API key","description":"Temporarily paused pending product readiness: returns 503 KEYS_UNAVAILABLE; no new key is created. Existing-key inspection/revocation and anonymous public reads remain available. The request/201 schema is retained for a future owner-approved reopening.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["turnstileToken"],"properties":{"turnstileToken":{"type":"string"},"label":{"type":"string","pattern":"^[A-Za-z0-9 ._-]{1,40}$"},"ttlDays":{"type":"integer","minimum":1,"maximum":365,"default":90}},"additionalProperties":false}}}},"responses":{"201":{"description":"Enveloped key (secret shown once)"},"400":{"description":"INVALID_JSON / INVALID_INPUT"},"403":{"description":"TURNSTILE_FAILED"},"413":{"description":"PAYLOAD_TOO_LARGE"},"415":{"description":"UNSUPPORTED_MEDIA_TYPE"},"429":{"description":"RATE_LIMITED"},"503":{"description":"KEYS_UNAVAILABLE"}}}},"/api/v1/keys/self":{"get":{"summary":"Inspect the calling key","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Key metadata and remaining quota (never the secret)"},"401":{"description":"KEY_REQUIRED / KEY_INVALID / KEY_EXPIRED"},"429":{"description":"KEY_RATE_LIMITED"},"503":{"description":"KEYS_UNAVAILABLE"}}},"delete":{"summary":"Revoke the calling key","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Key revoked"},"401":{"description":"KEY_REQUIRED / KEY_INVALID / KEY_EXPIRED"},"429":{"description":"KEY_RATE_LIMITED"},"503":{"description":"KEYS_UNAVAILABLE"}}}},"/api/v1/keys/signing-key":{"get":{"summary":"Public key for response signatures","responses":{"200":{"description":"Enveloped signing-key document"},"503":{"description":"SIGNING_UNAVAILABLE"}}}},"/api/v1/preview/{path}":{"get":{"summary":"Future preview namespace (disabled)","responses":{"403":{"description":"PREVIEW_NOT_ENABLED"}}}}},"components":{"securitySchemes":{"bearerKey":{"type":"http","scheme":"bearer","description":"Anonymous read-only API key issued by POST /api/v1/keys (aek_<keyId>_<secret>). Optional on public reads; required on /api/v1/keys/self. Header only — never in a URL. Every JSON response also carries X-AENET-Signature (Ed25519, verify with /api/v1/keys/signing-key)."}}},"x-aenet":{"apiKeyIssuance":"PAUSED — PRODUCT_NOT_READY; POST /api/v1/keys returns 503 KEYS_UNAVAILABLE","responseSigning":"ed25519 — X-AENET-Signature + Content-Digest on JSON responses","policy":"/api/v1/policy","errorEnvelope":"aenet.public.api.error.v1 — codes listed in the policy error catalog","publicBoundary":"no route reaches the AENET Core","earlyAccess":"waitlist only — not an account system"}}