{
  "openapi": "3.1.0",
  "info": {
    "title": "Ouro Tools",
    "version": "0.1.0",
    "description": "Small tools with bounded inputs and temporary outputs. CaptureKit is coming soon and not callable. Only enabled tools are listed. Shared launch capacity and per-client limits apply; honor Retry-After on 429 or 503. Three daily trial units for paid tools; optional prepaid credits."
  },
  "servers": [
    {
      "url": "https://ouro.tools"
    }
  ],
  "paths": {
    "/api/droplink": {
      "post": {
        "operationId": "droplink_publish_document",
        "summary": "Publish a Markdown report or CSV table as a readable, publicly shareable page for 24 hours. Returns a private deletion token only once. Scripts, images, and embeds are removed. Limits: 80,000 bytes, 500 CSV rows, 30 columns.",
        "tags": [
          "droplink"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "maxLength": 120
                  },
                  "format": {
                    "type": "string",
                    "enum": [
                      "markdown",
                      "csv"
                    ]
                  },
                  "content": {
                    "type": "string",
                    "maxLength": 80000
                  }
                },
                "required": [
                  "format",
                  "content"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/api/droplink/{id}": {
      "get": {
        "operationId": "droplink_read_document",
        "summary": "Read a published DropLink document and its expiry. Expired links return 404.",
        "tags": [
          "droplink"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        }
      },
      "delete": {
        "operationId": "droplink_delete_document",
        "summary": "Delete a published DropLink immediately using its private deletion token.",
        "tags": [
          "droplink"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "token": {
                    "type": "string"
                  }
                },
                "required": [
                  "token"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/api/hookbox": {
      "post": {
        "operationId": "hookbox_create_inbox",
        "summary": "Create a 24-hour webhook inbox with independent incoming and private reading capabilities. Accepts 100 events up to 16 KB each.",
        "tags": [
          "hookbox"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "maxLength": 80
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/hookbox/{id}": {
      "get": {
        "operationId": "hookbox_read_inbox",
        "summary": "Read a webhook inbox using its private read token.",
        "tags": [
          "hookbox"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        }
      },
      "delete": {
        "operationId": "hookbox_delete_inbox",
        "summary": "Delete a webhook inbox and all its stored events.",
        "tags": [
          "hookbox"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "token": {
                    "type": "string"
                  }
                },
                "required": [
                  "token"
                ]
              }
            }
          }
        }
      }
    },
    "/api/chartlink": {
      "post": {
        "operationId": "chartlink_create_chart",
        "summary": "Create a bar, line, or stacked bar chart from numbers. Returns SVG and PNG files plus a hosted result for 24 hours.",
        "tags": [
          "chartlink"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "maxLength": 120
                  },
                  "subtitle": {
                    "type": "string",
                    "maxLength": 160
                  },
                  "caption": {
                    "type": "string",
                    "maxLength": 400
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "bar",
                      "line",
                      "stacked-bar"
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "paper",
                      "midnight",
                      "sage"
                    ]
                  },
                  "width": {
                    "type": "integer",
                    "minimum": 480,
                    "maximum": 1600
                  },
                  "height": {
                    "type": "integer",
                    "minimum": 360,
                    "maximum": 1000
                  },
                  "labels": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 60,
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80
                    }
                  },
                  "datasets": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 6,
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "maxLength": 60
                        },
                        "values": {
                          "type": "array",
                          "minItems": 1,
                          "maxItems": 60,
                          "items": {
                            "type": "number",
                            "minimum": -1000000000000,
                            "maximum": 1000000000000
                          }
                        }
                      },
                      "required": [
                        "values"
                      ]
                    }
                  }
                },
                "required": [
                  "labels",
                  "datasets"
                ]
              }
            }
          }
        }
      }
    },
    "/api/chartlink/{id}": {
      "get": {
        "operationId": "chartlink_get_chart",
        "summary": "Retrieve a chart and download URLs before its 24-hour expiry.",
        "tags": [
          "chartlink"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        }
      }
    },
    "/api/cleanread": {
      "post": {
        "operationId": "cleanread_read_page",
        "summary": "Extract readable text, Markdown, headings, HTTP links, and tables from one accessible public webpage. Does not execute JavaScript or bypass access restrictions.",
        "tags": [
          "cleanread"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "format": "uri",
                    "maxLength": 2048,
                    "description": "Public HTTP or HTTPS URL to read."
                  }
                },
                "required": [
                  "url"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/api/sourcecheck": {
      "post": {
        "operationId": "sourcecheck_check_sources",
        "summary": "Check up to ten public source URLs for successful HTTP responses, final URLs, titles, and optional quotation matches in fetched text. Reports blocked and unreadable sources honestly. Does not verify factual truth.",
        "tags": [
          "sourcecheck"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "sources": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 10,
                    "items": {
                      "type": "object",
                      "properties": {
                        "url": {
                          "type": "string",
                          "format": "uri",
                          "maxLength": 2048
                        },
                        "quote": {
                          "type": "string",
                          "maxLength": 2000
                        }
                      },
                      "required": [
                        "url"
                      ]
                    }
                  }
                },
                "required": [
                  "sources"
                ]
              }
            }
          }
        }
      }
    },
    "/api/printkit": {
      "post": {
        "operationId": "printkit_create_pdf",
        "summary": "Create a PDF using a report, proposal, or briefing layout. Provide Markdown or structured sections. Maximum 10 pages. Files expire after 24 hours. Limited trial usage, then 10 cents per document from prepaid credit.",
        "tags": [
          "printkit"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "title": {
                    "type": "string",
                    "maxLength": 180
                  },
                  "subtitle": {
                    "type": "string",
                    "maxLength": 300
                  },
                  "author": {
                    "type": "string",
                    "maxLength": 100
                  },
                  "template": {
                    "type": "string",
                    "enum": [
                      "report",
                      "proposal",
                      "briefing"
                    ],
                    "default": "report"
                  },
                  "markdown": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 40000
                  },
                  "sections": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 24,
                    "items": {
                      "type": "object",
                      "properties": {
                        "heading": {
                          "type": "string",
                          "maxLength": 180
                        },
                        "body": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40000
                        }
                      },
                      "required": [
                        "body"
                      ]
                    }
                  }
                },
                "required": [
                  "title"
                ],
                "oneOf": [
                  {
                    "required": [
                      "markdown"
                    ]
                  },
                  {
                    "required": [
                      "sections"
                    ]
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/api/tablelift/extract": {
      "post": {
        "operationId": "tablelift_extract_tables",
        "summary": "Extract bordered tables from a text-based PDF into CSV and JSON with source page numbers. Maximum 3 MB and 10 pages. Scans and borderless tables are unsupported. Costs 10 cents per document page after the trial allowance; no charge when no useful tables are found.",
        "tags": [
          "tablelift"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "pdfBase64": {
                    "type": "string",
                    "maxLength": 4194332,
                    "description": "Base64-encoded PDF bytes, maximum 3 MB decoded."
                  },
                  "filename": {
                    "type": "string",
                    "maxLength": 120
                  }
                },
                "required": [
                  "pdfBase64"
                ]
              }
            }
          }
        }
      }
    },
    "/api/collect": {
      "post": {
        "operationId": "collect_create_form",
        "summary": "Create a form for 30 days and up to 100 responses. Costs $1 in credits after the trial. Returns a public form link and a private owner token.",
        "tags": [
          "collect"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "description": {
                    "type": "string",
                    "maxLength": 1000
                  },
                  "questions": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 12,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[A-Za-z][A-Za-z0-9_]{0,39}$"
                        },
                        "label": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 240
                        },
                        "type": {
                          "type": "string",
                          "enum": [
                            "text",
                            "multiple-choice",
                            "checkbox"
                          ]
                        },
                        "required": {
                          "type": "boolean",
                          "default": false
                        },
                        "options": {
                          "type": "array",
                          "minItems": 2,
                          "maxItems": 12,
                          "uniqueItems": true,
                          "items": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          }
                        }
                      },
                      "required": [
                        "label",
                        "type"
                      ]
                    }
                  }
                },
                "required": [
                  "title",
                  "questions"
                ]
              }
            }
          }
        }
      }
    },
    "/api/collect/{id}": {
      "get": {
        "operationId": "collect_read_form",
        "summary": "Read public form questions and availability. Does not expose answers or owner credentials.",
        "tags": [
          "collect"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        }
      },
      "delete": {
        "operationId": "collect_delete_form",
        "summary": "Delete a form and its responses using the owner token.",
        "tags": [
          "collect"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "token": {
                    "type": "string"
                  }
                },
                "required": [
                  "token"
                ]
              }
            }
          }
        }
      }
    },
    "/api/collect/{id}/responses": {
      "post": {
        "operationId": "collect_submit_response",
        "summary": "Submit answers keyed by question ID to an open form. Text is limited to 2,000 characters per answer and 32 KB total.",
        "tags": [
          "collect"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "answers": {
                    "type": "object",
                    "additionalProperties": {
                      "oneOf": [
                        {
                          "type": "string",
                          "maxLength": 2000
                        },
                        {
                          "type": "array",
                          "maxItems": 12,
                          "uniqueItems": true,
                          "items": {
                            "type": "string"
                          }
                        }
                      ]
                    }
                  }
                },
                "required": [
                  "answers"
                ]
              }
            }
          }
        }
      },
      "get": {
        "operationId": "collect_read_responses",
        "summary": "Privately retrieve a form and its answers with its owner token.",
        "tags": [
          "collect"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        }
      }
    },
    "/api/collect/{id}/close": {
      "post": {
        "operationId": "collect_close_form",
        "summary": "Stop accepting responses. Answers remain privately accessible until expiry.",
        "tags": [
          "collect"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "token": {
                    "type": "string"
                  }
                },
                "required": [
                  "token"
                ]
              }
            }
          }
        }
      }
    },
    "/api/feedform/normalize": {
      "post": {
        "operationId": "feedform_normalize_feed",
        "summary": "Normalize one RSS 2.0 or Atom XML feed to stable JSON. Free; 1 MiB input, up to 100 returned items. Does not fetch URLs or retain feed content.",
        "tags": [
          "feedform"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful result"
          },
          "201": {
            "description": "Resource created"
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Missing or invalid access"
          },
          "402": {
            "description": "Trial exhausted; credits required"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Required service not configured"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "xml": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1048576
                  },
                  "limit": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 50
                  }
                },
                "required": [
                  "xml"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/api/config": {
      "get": {
        "operationId": "ouro_configuration",
        "summary": "Read feature availability and private/public access mode. No secrets.",
        "responses": {
          "200": {
            "description": "Configuration flags"
          }
        }
      }
    },
    "/api/billing/account": {
      "post": {
        "operationId": "ouro_create_account",
        "summary": "Create a prepaid-credit account. Returns its secret API key once. Creating an account does not purchase credits.",
        "responses": {
          "201": {
            "description": "Account and one-time API key"
          }
        }
      },
      "get": {
        "operationId": "ouro_read_account",
        "summary": "Read available prepaid credits, trial prices, and payment availability.",
        "security": [
          {
            "accountKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Account balance and prices"
          },
          "401": {
            "description": "Invalid account key"
          }
        }
      }
    },
    "/api/billing/checkout": {
      "post": {
        "operationId": "ouro_credit_checkout",
        "summary": "Create a Stripe checkout URL for a person to purchase prepaid credit. No charge happens until checkout is completed.",
        "security": [
          {
            "accountKey": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "amountCents": {
                    "type": "integer",
                    "enum": [
                      500,
                      1000,
                      2000
                    ]
                  }
                },
                "required": [
                  "amountCents"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Checkout URL"
          },
          "401": {
            "description": "Invalid account key"
          },
          "503": {
            "description": "Payments are disabled"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "privateAccess": {
        "type": "http",
        "scheme": "basic"
      },
      "accountKey": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key"
      }
    }
  },
  "security": [],
  "x-account-auth": "Use x-api-key for prepaid account credit. Basic authorization is separate private-preview access."
}