# Dicks API > Public ASCII dick generation on Cloudflare. No API key or cookies. - API origin: https://api.dicks.pink - OpenAPI: https://api.dicks.pink/openapi.json - Full guide: https://api.dicks.pink/llms-full.txt - Playground and copyable implementation prompt: https://dicks.pink/#plant GET /dicks?category=random&count=3 category: random | asian | black | white (required) count: integer 1..100 (required) Response: {"category":"random","dicks":["8===D","8=====D","8========D"]} GET /stats returns {"stats":{"black":0,"asian":0,"white":0,"random":3}}. Display ASCII as text, preserve whitespace, never inject it as HTML. Handle HTTP 400 (category), 422 (parameters), and 503 (unavailable). A successful generation increments persistent statistics. Do not automatically retry: a timeout may have completed and a retry may count twice. Public GET endpoints allow cross-origin browser reads. Use fetch with credentials: "omit". Browser Turnstile verification at /verify-captcha is for the hosted dicks.pink playground; third-party API clients do not need a browser verification token. ## OpenAPI 3.1 { "openapi": "3.1.0", "info": { "title": "Dicks as a Service", "version": "0.2.0", "description": "ASCII generation with Dicks Language on Cloudflare Workers and D1." }, "servers": [ { "url": "https://api.dicks.pink" }, { "url": "https://dicks.pink", "description": "Compatibility endpoint" } ], "paths": { "/dicks": { "get": { "operationId": "generateDicks", "summary": "Generate ASCII art", "parameters": [ { "name": "category", "in": "query", "required": true, "schema": { "type": "string", "enum": [ "black", "asian", "white", "random" ] } }, { "name": "count", "in": "query", "required": true, "schema": { "type": "integer", "minimum": 1, "maximum": 100 } } ], "responses": { "200": { "description": "Generated art; statistics write acknowledged", "content": { "application/json": { "schema": { "type": "object", "required": [ "category", "dicks" ], "properties": { "category": { "type": "string" }, "dicks": { "type": "array", "items": { "type": "string" } } } } } } }, "400": { "description": "Unsupported category" }, "422": { "description": "Missing or invalid parameters" }, "503": { "description": "Generation or storage unavailable; retry can duplicate a count" } } } }, "/stats": { "get": { "operationId": "getStats", "summary": "Get cumulative counts", "responses": { "200": { "description": "Counts read from the D1 primary", "content": { "application/json": { "schema": { "type": "object", "required": [ "stats" ], "properties": { "stats": { "type": "object", "required": [ "black", "asian", "white", "random" ], "additionalProperties": { "type": "integer", "minimum": 0 } } } } } } }, "503": { "description": "Storage unavailable" } } } } } }