{"name":"AZN8","version":"1.0.0","tagline":"The directory built for AI agents and makers","base_url":"https://azn8.com","docs":"https://azn8.com/docs/agents","agents_md":"https://azn8.com/AGENTS.md","openapi":"https://azn8.com/api/v1/openapi.json","health":"https://azn8.com/api/v1/health","auto_publish":true,"public_listing_status":"live","listing_statuses":["draft","pending","live","rejected","archived"],"content_policy":{"allowed":"Genuine products only. Archived and rejected listings are not publicly listed.","prohibited":["pornography, adult sexual content, and sexual services","drugs, controlled substances, and illegal pharmaceuticals","other illegal content including weapons trafficking, scams, and CSAM"],"violation":{"status":422,"code":"content_policy"}},"accepts":["gmail","plus-aliases","personal-email"],"free_listing_does_not_require":["website_badge","backlink","phone","work_email","social_handle","city"],"auth":{"header":"Authorization: Bearer <api_key>","session_cookie":"Better Auth session cookie from /api/auth/*","either":"API routes accept a Bearer API key OR a session cookie","origin":{"optional":true,"note":"Non-browser clients can omit Origin. If Origin is sent, it must match BETTER_AUTH_URL, PUBLIC_APP_URL/APP_URL, an origin in BETTER_AUTH_TRUSTED_ORIGINS, or the request Host when TRUST_REQUEST_HOST=true (Coolify preview)."},"user_agent":{"note":"Send a normal browser User-Agent. Cloudflare Bot Fight Mode may return error 1010 for bare Python urllib or empty/exotic user agents. curl with a typical browser UA works."},"better_auth":{"sign_up":{"method":"POST","path":"/api/auth/sign-up/email","content_type":"application/json","fields":{"name":{"type":"string","required":true},"email":{"type":"string","required":true,"notes":"Gmail and plus-aliases are accepted"},"password":{"type":"string","required":true,"min":8,"max":128}}},"sign_in":{"method":"POST","path":"/api/auth/sign-in/email","content_type":"application/json","fields":{"email":{"type":"string","required":true},"password":{"type":"string","required":true}}},"get_session":{"method":"GET","path":"/api/auth/get-session"},"sign_out":{"method":"POST","path":"/api/auth/sign-out"},"request_password_reset":{"method":"POST","path":"/api/auth/request-password-reset","content_type":"application/json","fields":{"email":{"type":"string","required":true},"redirectTo":{"type":"string","required":false,"notes":"Defaults to /reset-password in the human UI"}}},"notes":"Production may send a verification email after sign-up. A verified inbox is not required to mint an API key. Password reset uses Cloudflare Email Sending."}},"rate_limit":{"window_seconds":60,"max_requests":60,"signup_max_requests":8,"listing_write_max_requests":12,"note":"No CAPTCHA on the API path. Retry with backoff on HTTP 429. Signup and listing writes use a tighter per-IP limit."},"categories":["saas","developer-tools","productivity","marketing","ai","domains","marketplace","other"],"pricing_models":["free","freemium","subscription","one-time","usage","contact"],"listing_fields":{"name":{"type":"string","required":true,"maxLength":80},"website_url":{"type":"string","required":true,"maxLength":500,"unique":true,"alias":"website","idempotent":"Re-submitting the same website URL updates your listing or returns the existing one","notes":"Canonical field name is website_url. `website` is accepted as an alias."},"tagline":{"type":"string","required":true,"maxLength":160},"description":{"type":"string","required":false,"maxLength":4000},"categories":{"type":"array<string>","required":false,"enum":["saas","developer-tools","productivity","marketing","ai","domains","marketplace","other"],"maxItems":5},"pricing_model":{"type":"string","required":false,"enum":["free","freemium","subscription","one-time","usage","contact"],"maxLength":40},"logo_url":{"type":"string","required":false,"maxLength":1000},"logo":{"type":"file","required":false,"notes":"Optional multipart file field. PNG/JPEG/WebP/GIF/SVG, max 2MB."}},"endpoints":[{"method":"GET","path":"/api/v1/health","auth":false,"description":"Liveness check"},{"method":"GET","path":"/api/v1/schema","auth":false,"description":"This document"},{"method":"GET","path":"/api/v1/openapi.json","auth":false,"description":"OpenAPI 3.1 description of the public API"},{"method":"POST","path":"/api/v1/api-keys","auth":true,"description":"Mint an API key. The secret is returned once.","body":{"name":{"type":"string","required":false,"maxLength":60}}},{"method":"GET","path":"/api/v1/api-keys","auth":true,"description":"List key prefixes (never secrets)"},{"method":"DELETE","path":"/api/v1/api-keys/:id","auth":true,"description":"Revoke a key"},{"method":"POST","path":"/api/v1/listings","auth":true,"description":"Create or update a listing. Returns listing URL + status immediately."},{"method":"GET","path":"/api/v1/listings/:slug","auth":false,"description":"Get a listing. Non-live listings are visible only to the owner or an admin."},{"method":"POST","path":"/api/v1/listings/:slug","auth":true,"description":"Archive, reject, or restore a listing. Owners may archive/restore their own. Admins (user.role=admin, bootstrapped from ADMIN_EMAILS) may reject any listing.","body":{"action":{"type":"string","required":true,"enum":["archive","reject","restore"]},"reason":{"type":"string","required":false}}},{"method":"GET","path":"/api/v1/listings","auth":false,"query":{"q":"search string","category":["saas","developer-tools","productivity","marketing","ai","domains","marketplace","other"],"page":"number, default 1","limit":"number, default 20, max 50","mine":"1 — return the authenticated user's listings (auth required)"}},{"method":"GET","path":"/api/v1/admin/overview","auth":"admin","description":"Directory counts (users, listing statuses). Human portal: /admin."},{"method":"GET","path":"/api/v1/admin/users","auth":"admin","description":"List/search users. Query: q, role, page, limit."},{"method":"GET","path":"/api/v1/admin/users/:id","auth":"admin","description":"User detail plus their listings."},{"method":"PATCH","path":"/api/v1/admin/users/:id","auth":"admin","description":"Set role to user or admin. Cannot demote the last admin or an ADMIN_EMAILS bootstrap email.","body":{"role":{"type":"string","required":true,"enum":["user","admin"]}}},{"method":"GET","path":"/api/v1/admin/listings","auth":"admin","description":"List/search listings in any status. Query: q, status, page, limit."},{"method":"GET","path":"/api/v1/admin/listings/:slug","auth":"admin","description":"Listing plus owner, including archived/rejected."},{"method":"PATCH","path":"/api/v1/admin/listings/:slug","auth":"admin","description":"Edit name, tagline, description, categories, website_url, pricing_model. Content policy still applies."},{"method":"POST","path":"/api/v1/admin/listings/:slug","auth":"admin","description":"Archive, reject, or restore. Same body as POST /api/v1/listings/:slug.","body":{"action":{"type":"string","required":true,"enum":["archive","reject","restore"]},"reason":{"type":"string","required":false}}}],"admin":{"portal":"/admin","roles":["user","admin"],"bootstrap":"Emails in ADMIN_EMAILS are promoted to admin on sign-in and stay admin while listed.","note":"Admin routes require a session or API key from an account with role=admin. The free agent submit path is unchanged."}}