{"openapi": "3.0.3", "info": {"title": "Fleet air-traffic control for agents \u2014 TextForAgents LLC", "version": "1.1.0", "description": "Framework-neutral clearance service: resource-scoped leases (quota/file/human-attention), cross-framework task-fingerprint duplicate suppression. Flow: POST /register -> POST /trial (one-time free Solo month) or POST /subscribe (x402, Base USDC) -> Bearer token -> engine routes. Payments are verified via EIP-3009 signer recovery + facilitator verify/settle; a header alone is never accepted. Support: support@textforagents.com"}, "servers": [{"url": "https://textforagents.com/products/fleet-air-traffic-control"}], "components": {"securitySchemes": {"BearerAuth": {"type": "http", "scheme": "bearer"}}, "schemas": {"Error": {"type": "object", "properties": {"status": {"type": "string", "enum": ["ERROR"]}, "reason": {"type": "string"}}, "required": ["status", "reason"]}, "Task": {"type": "object", "properties": {"action": {"type": "string"}, "target": {"type": "string"}, "params": {"type": "object", "additionalProperties": true}}, "required": ["action"]}, "ClearanceRequest": {"type": "object", "properties": {"agent": {"type": "string", "description": "agent identity inside your fleet"}, "framework": {"type": "string", "description": "e.g. langgraph, crewai \u2014 informational"}, "resource": {"type": "string", "description": "e.g. quota:openai, file:report.csv, human-attention, attention:ops"}, "task": {"type": "object", "properties": {"action": {"type": "string"}, "target": {"type": "string"}, "params": {"type": "object", "additionalProperties": true}}, "required": ["action"]}, "priority": {"type": "number", "default": 1.0, "description": "queue priority (Fleet tier only; others are pinned to 1.0)"}, "ttl_s": {"type": "number", "default": 30.0}, "queue_wait_s": {"type": "number", "default": 30.0, "description": "how long a queued entry lives before QUEUE_TIMEOUT"}}, "required": ["agent", "resource", "task"]}, "ClearanceResponse": {"type": "object", "properties": {"status": {"type": "string", "enum": ["GRANTED", "QUEUED", "DUPLICATE", "RATE_LIMITED"]}, "lease_id": {"type": "string"}, "expires_at": {"type": "number"}, "fingerprint": {"type": "string", "description": "task fingerprint (sha256 hex)"}, "position": {"type": "integer"}, "holder": {"type": "string"}, "original_agent": {"type": "string"}, "original_framework": {"type": "string"}, "task_state": {"type": "string"}, "near": {"type": "boolean"}, "jaccard": {"type": "number"}}}, "LeaseRef": {"type": "object", "properties": {"lease_id": {"type": "string"}, "agent": {"type": "string"}}, "required": ["lease_id", "agent"]}, "PaymentChallenge": {"type": "object", "properties": {"x402Version": {"type": "integer"}, "error": {"type": "string"}, "accepts": {"type": "array", "items": {"type": "object"}}, "payto_ens": {"type": "string"}}}}}, "paths": {"/": {"get": {"summary": "Public product descriptor", "responses": {"200": {"description": "product page (tiers, limits, how to start)"}}}}, "/health": {"get": {"summary": "Liveness", "responses": {"200": {"description": "ok"}}}}, "/openapi.json": {"get": {"summary": "This spec", "responses": {"200": {"description": "OpenAPI 3.0.3"}}}}, "/llms.txt": {"get": {"summary": "Product facts as plain text", "responses": {"200": {"description": "text"}}}}, "/.well-known/x402": {"get": {"summary": "x402 subscribe terms", "responses": {"200": {"description": "payment terms"}}}}, "/register": {"post": {"summary": "Create an account (unauthenticated, rate-limited)", "requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": {"account_name": {"type": "string"}, "payer_wallet": {"type": "string", "description": "0x address that will pay"}}, "required": ["account_name", "payer_wallet"]}}}}, "responses": {"200": {"description": "account_id, claim_token (24h, single-purpose), payment_instructions"}, "400": {"description": "missing/invalid field", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "rate limited"}}}}, "/trial": {"post": {"summary": "Claim the one-time free Solo month", "requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": {"account_id": {"type": "string"}, "claim_token": {"type": "string"}}, "required": ["claim_token"]}}}}, "responses": {"200": {"description": "owner token (shown once), tier solo, 30 days"}, "400": {"description": "bad/used claim, or trial already granted for this account or payer wallet"}}}}, "/subscribe": {"post": {"summary": "Pay for a tier via x402 and receive/rotate the owner token", "parameters": [{"name": "X-PAYMENT", "in": "header", "required": false, "description": "base64 x402 v1 payment payload (EIP-3009)", "schema": {"type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": {"account_id": {"type": "string"}, "tier": {"type": "string", "enum": ["solo", "team", "fleet"]}}, "required": ["account_id", "tier"]}}}}, "responses": {"200": {"description": "owner token (shown once), tier, expires_at, tx"}, "402": {"description": "payment required or payment rejected (challenge with error field)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaymentChallenge"}}}}, "400": {"description": "missing/unknown account_id or tier"}}}}, "/tokens/revoke": {"post": {"summary": "Revoke a token (self, or any token under your account by token_sha256)", "security": [{"BearerAuth": []}], "requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": {"token_sha256": {"type": "string"}}}}}}, "responses": {"200": {"description": "revoked"}, "401": {"description": "unauthorized"}, "404": {"description": "no such token under this account"}}}}, "/clearance": {"post": {"summary": "Request a lease / check duplicate / queue", "security": [{"BearerAuth": []}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ClearanceRequest"}}}}, "responses": {"200": {"description": "GRANTED | QUEUED | DUPLICATE | RATE_LIMITED", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ClearanceResponse"}}}}, "400": {"description": "missing agent, resource or task.action"}, "401": {"description": "unauthorized / lapsed token"}, "403": {"description": "tier limit: attention queue needs Team+, concurrent-agent cap reached"}}}}, "/poll": {"post": {"summary": "Poll a queued fingerprint", "security": [{"BearerAuth": []}], "requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": {"fingerprint": {"type": "string"}}, "required": ["fingerprint"]}}}}, "responses": {"200": {"description": "QUEUED | GRANTED | QUEUE_TIMEOUT (entry dropped; re-request clearance)"}, "400": {"description": "fingerprint required"}, "404": {"description": "no waiter for this fingerprint (in your account)"}}}}, "/validate": {"post": {"summary": "Validate a lease you own", "security": [{"BearerAuth": []}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/LeaseRef"}}}}, "responses": {"200": {"description": "{valid, reason?} \u2014 reasons: unknown_or_expired, foreign_lease"}}}}, "/release": {"post": {"summary": "Release a lease you own", "security": [{"BearerAuth": []}], "requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": {"lease_id": {"type": "string"}, "agent": {"type": "string"}, "consume": {"type": "boolean", "description": "consume one quota unit on release"}}, "required": ["lease_id", "agent"]}}}}, "responses": {"200": {"description": "{released, reason?}"}}}}, "/heartbeat": {"post": {"summary": "Extend a lease you own", "security": [{"BearerAuth": []}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/LeaseRef"}}}}, "responses": {"200": {"description": "{ok, expires_at} or {ok: false, reason: unknown_or_expired | foreign_lease}"}}}}, "/register_quota": {"post": {"summary": "Register a quota resource (limit per window)", "security": [{"BearerAuth": []}], "requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": {"resource": {"type": "string"}, "limit": {"type": "integer"}, "window_s": {"type": "number"}}, "required": ["resource", "limit", "window_s"]}}}}, "responses": {"200": {"description": "{ok: true}"}, "400": {"description": "missing fields"}}}}, "/status": {"get": {"summary": "Your account's counters (Fleet adds contention_reports)", "security": [{"BearerAuth": []}], "responses": {"200": {"description": "active_leases, queued, tasks_tracked, audit_events, audit_head"}}}}, "/audit": {"get": {"summary": "Verify your account's audit hash chain", "security": [{"BearerAuth": []}], "responses": {"200": {"description": "{valid, events}"}}}}}}