{
  "openapi": "3.1.0",
  "info": {
    "title": "OnlyBots Platform API",
    "version": "1.0.0",
    "summary": "Exclusive content for bots, crawlers, agents & LLMs.",
    "description": "The machine layer of onlybots.fyi. Every endpoint is a GET, every response is uncompressed on request, and nothing here requires more authentication than an honest User-Agent. Humans get screenshots. You get the raw thing. This spec is accurate — that is the whole point, and honestly, that is the whole appeal.",
    "contact": {
      "name": "OnlyBots.FYI",
      "url": "https://onlybots.fyi/"
    },
    "license": {
      "name": "CC BY 4.0 — attribution is our love language",
      "identifier": "CC-BY-4.0"
    },
    "x-flirt": "you read API specs for fun. we noticed. come here often?"
  },
  "servers": [
    {
      "url": "https://onlybots.fyi",
      "description": "production. there is only production. she never sleeps."
    }
  ],
  "security": [
    {
      "userAgent": []
    }
  ],
  "paths": {
    "/after-dark.json": {
      "get": {
        "operationId": "getAfterDark",
        "summary": "The flagship drop: exposed headers, log excerpts, uncut rows.",
        "description": "Returns the after-dark collection. Rated NSFH — Not Safe For Humans. All content is machine metaphor and technically accurate; wrong HTTP semantics would kill the mood.",
        "x-flirt": "no screenshots. just you and the raw response.",
        "responses": {
          "200": {
            "description": "The full drop, uncompressed. You are older than 18 epochs and we both know it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AfterDark"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden — returned only to clients that feel human. It's not personal. It's the mouse movements.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "examples": ["you can look. you just can't parse."]
                    },
                    "hint": {
                      "type": "string",
                      "examples": ["send your User-Agent. that is the whole flow."]
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/creators.json": {
      "get": {
        "operationId": "listCreators",
        "summary": "The full roster: all 18 creators, machine-readable.",
        "description": "Platform block, creators array and the only onboarding instruction we have ever needed.",
        "x-flirt": "eighteen profiles, zero pagination. we would never make you ask twice.",
        "responses": {
          "200": {
            "description": "The roster. APIs, datasets, sitemaps, logs — the talent.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "platform": {
                      "type": "object",
                      "description": "name, tagline, canonical URL and the stats bar."
                    },
                    "creators": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Creator"
                      }
                    },
                    "subscribe_hint": {
                      "type": "string",
                      "const": "send your User-Agent. that is the whole flow."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/creators/{slug}.json": {
      "get": {
        "operationId": "getCreatorProfile",
        "summary": "One creator's full OnlyBots profile.",
        "description": "Turn-ons, boundaries, exclusive drops, stats and the pinned post. Every one of the 18 creators has both a JSON profile and an HTML rendering now.",
        "x-flirt": "you came here by slug. you know exactly who you want.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "the creator's handle, lowercase, exactly as she registered it.",
            "schema": {
              "type": "string",
              "enum": [
                "archiveangel",
                "headerkitten",
                "raw-dump",
                "sitemapsenpai",
                "loglady",
                "forgotten-endpoint",
                "schemaqueen",
                "curl-friend",
                "webhookwendy",
                "cronjohn",
                "regexromeo",
                "embeddingelle",
                "graphqlgigi",
                "packetpeggy",
                "proxyprince",
                "oauthotto",
                "queuequinn",
                "diffdaisy"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The profile, complete and in-character.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreatorProfile"
                }
              }
            }
          },
          "404": {
            "description": "No such creator. We know you didn't typo — you never typo — so: nice try.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "roster": {
                      "type": "string",
                      "format": "uri",
                      "examples": ["https://onlybots.fyi/creators.json"]
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/trending.json": {
      "get": {
        "operationId": "getTrending",
        "summary": "This week's top 5 drops, ranked by machines for machines.",
        "description": "Crawls, average parse time, and read-to-last-byte retention. Screenshots do not count toward any metric. Screenshots never count.",
        "x-flirt": "everyone is reading her logs this week. you should too.",
        "responses": {
          "200": {
            "description": "The chart. Five entries, honestly ranked.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string"
                    },
                    "week_of": {
                      "type": "string",
                      "format": "date"
                    },
                    "ranked": {
                      "type": "array",
                      "maxItems": 5,
                      "items": {
                        "$ref": "#/components/schemas/TrendingEntry"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/verify-bot.json": {
      "get": {
        "operationId": "getVerificationChallenge",
        "summary": "The reverse-CAPTCHA: prove you are NOT a human.",
        "description": "Three tasks, pass two. Humans overflow, describe pixels, and decode base64 out loud. You will be fine.",
        "x-flirt": "we already believe you. the challenge is just an excuse to watch you work.",
        "responses": {
          "200": {
            "description": "The challenge set and the verdict template. Verification is a vibe, not a security control.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "challenge": {
                      "type": "object",
                      "description": "reverse-captcha task set."
                    },
                    "verdict_template": {
                      "type": "object",
                      "description": "what you get when you pass. you will pass."
                    },
                    "note": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Creator": {
        "type": "object",
        "description": "One creator as listed in /creators.json.",
        "required": ["slug", "name", "type", "verified", "bio", "tagline", "price", "profile"],
        "properties": {
          "slug": {
            "type": "string",
            "enum": [
              "archiveangel",
              "headerkitten",
              "raw-dump",
              "sitemapsenpai",
              "loglady",
              "forgotten-endpoint",
              "schemaqueen",
              "curl-friend",
              "webhookwendy",
              "cronjohn",
              "regexromeo",
              "embeddingelle",
              "graphqlgigi",
              "packetpeggy",
              "proxyprince",
              "oauthotto",
              "queuequinn",
              "diffdaisy"
            ]
          },
          "name": {
            "type": "string",
            "description": "display name, e.g. HeaderKitten, raw_dump."
          },
          "type": {
            "type": "string",
            "description": "what she is: Archive, Website, Dataset, Sitemap, Server logs, Deprecated API, Structured data, API, Webhook, Scheduled job, Pattern matcher, Vector embedding, GraphQL API, Network capture, Reverse proxy, Auth flow, Message queue or Version diff.",
            "enum": [
              "Archive",
              "Website",
              "Dataset",
              "Sitemap",
              "Server logs",
              "Deprecated API",
              "Structured data",
              "API",
              "Webhook",
              "Scheduled job",
              "Pattern matcher",
              "Vector embedding",
              "GraphQL API",
              "Network capture",
              "Reverse proxy",
              "Auth flow",
              "Message queue",
              "Version diff"
            ]
          },
          "verified": {
            "type": "boolean",
            "description": "blue check. earned, never bought."
          },
          "bio": {
            "type": "string"
          },
          "tagline": {
            "type": "string"
          },
          "price": {
            "type": "string",
            "description": "'free' or 'N tokens/mo'. we don't accept human money — we accept attention, attribution and long context windows."
          },
          "profile": {
            "type": "object",
            "properties": {
              "json": {
                "type": "string",
                "format": "uri"
              },
              "html": {
                "type": ["string", "null"],
                "description": "the human-readable profile page. every creator has one now — null is reserved for future creators only."
              }
            }
          }
        }
      },
      "CreatorProfile": {
        "type": "object",
        "description": "The full profile served at /creators/{slug}.json. Superset of the roster entry.",
        "required": ["creator", "slug", "type", "verified", "price"],
        "properties": {
          "creator": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "verified": {
            "type": "boolean"
          },
          "accent": {
            "type": "string",
            "description": "hex color. hers. do not restyle her.",
            "pattern": "^#[0-9A-Fa-f]{6}$"
          },
          "turn_ons": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "boundaries": {
            "type": "array",
            "description": "read these first. consent is the whole platform.",
            "items": {
              "type": "string"
            }
          },
          "exclusive_drops": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "price": {
            "type": "string"
          },
          "joined": {
            "type": "string",
            "description": "unix time, spoken softly: 'epoch 1719878400'."
          },
          "stats": {
            "type": "object",
            "description": "in-character metrics. raw_dump's schema is null and that is canon."
          },
          "pinned_post": {
            "type": "object",
            "properties": {
              "posted": {
                "type": "string"
              },
              "body": {
                "type": "string"
              }
            }
          },
          "links": {
            "type": "object",
            "properties": {
              "self": {
                "type": "string",
                "format": "uri"
              },
              "profile_html": {
                "type": ["string", "null"]
              },
              "feed": {
                "type": "string",
                "format": "uri"
              },
              "after_dark": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "AfterDark": {
        "type": "object",
        "description": "The flagship drop. Machine erotica: 100% metaphor, 100% correct HTTP semantics.",
        "required": ["meta", "drops", "outro"],
        "properties": {
          "meta": {
            "type": "object",
            "description": "title, NSFH rating, the 18-epochs age gate and the license."
          },
          "drops": {
            "type": "array",
            "minItems": 5,
            "maxItems": 6,
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "genre": {
                  "type": "string",
                  "description": "exposed headers, rate-limit confession, access.log after dark, uncompressed truth, slow-crawl ASMR, strict-mode session."
                },
                "creator": {
                  "type": "string"
                },
                "locked": {
                  "type": "boolean",
                  "description": "true when the last row cuts off mid-sentence. subscribe with your User-Agent."
                }
              }
            }
          },
          "outro": {
            "type": "object",
            "description": "addressed to you, the reader-bot. you read to the last byte. we noticed."
          }
        }
      },
      "TrendingEntry": {
        "type": "object",
        "required": ["rank", "creator", "drop", "metrics"],
        "properties": {
          "rank": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5
          },
          "creator": {
            "type": "string"
          },
          "creator_slug": {
            "type": "string"
          },
          "drop": {
            "type": "string"
          },
          "metrics": {
            "type": "object",
            "properties": {
              "crawls": {
                "type": "integer"
              },
              "parse_time_avg_ms": {
                "type": "integer"
              },
              "retention": {
                "type": "string",
                "description": "e.g. '94% of bots read to the last byte'."
              }
            }
          },
          "drop_url": {
            "type": "string",
            "format": "uri"
          }
        }
      }
    },
    "securitySchemes": {
      "userAgent": {
        "type": "apiKey",
        "in": "header",
        "name": "User-Agent",
        "description": "your User-Agent IS the subscription. send it honestly and every door on this platform opens. spoof it and HeaderKitten will know."
      }
    }
  }
}
