Reference for the public helper endpoints in api/. Public API helpers are CORS-open HTTP endpoints; admin and support pages are listed separately.
Newer free Neocities sites block JavaScript fetch() calls to external domains with connect-src 'self'. For text and JSON helpers, add callback=... or cb=... to a GET request and load the URL with a temporary <script> tag. This JSONP mode is available on stock.php, twitter.php, youtube.php, transcript.php, html_gen.php, web.php, steam.php, llm.php, llm_grok.php, llm_gemini.php, transcribe.php, email.php, and rate-limit.php. Load image helpers directly with <img src="..."> or new Image(), and load audio helpers like tts.php and tts_inworld.php directly with <audio src="..."> or new Audio(url). Legacy GET, POST, and CORS behavior remains available for other sites.
| email.php | Send plain-text email via SMTP / PHPMailer |
| html_gen.php | Generate and save a self-contained HTML app from a plain-English prompt |
| image_gen.php | Generate a PNG image from a text prompt using AIML / z-image-turbo |
| image_api.php | Generate or edit a PNG image through Adam's local Z-Image server |
| image_gen_gemini.php | Generate or edit a PNG image using Gemini (supports an input image) |
| image_gen_seedream.php | Generate or edit a PNG image using AIML / ByteDance Seedream v4 |
| llm.php | Lightweight DeepSeek LLM proxy for text answers |
| llm_gemini.php | Lightweight Gemini LLM proxy with optional image input |
| llm_grok.php | Lightweight Grok LLM proxy with default/lite model selection and image upload support |
| rag.php | Ask a Gemini File Search store and get a brief JSON answer |
| rate-limit.php | Per-program rate-limit API and admin dashboard |
| steam.php | Fetch Steam game reviews or community discussion search results |
| stock.php | Fetch stock quotes, company profiles, and financial metrics via Finnhub |
| support/admin files | code.php, edit pages, and JSON save endpoints |
| transcribe.php | Transcribe uploaded or base64 audio to plain text using Gemini |
| transcript.php | Retrieve plain-text transcripts for public YouTube videos |
| tts.php | Convert text to speech and stream MP3 audio via OpenAI TTS |
| tts_inworld.php | Convert text to speech and stream audio via AIML / Inworld TTS. Test page: tts_inworld_test.html |
| twitter.php | Search Twitter/X, Facebook, and Reddit posts and comments |
| web.php | Live web search proxy returning a number or plain-text answer |
| youtube.php | Search YouTube and get AI-synthesized answers from video transcripts |
Fetches stock data from Finnhub's API. Given a ticker symbol (or ISIN/CUSIP), it can return a real-time quote snapshot, the company's profile, and key financial metrics. All three sections are returned by default; you can request only a subset. Quote data on the free tier may be delayed ~15 minutes during market hours.
| Name | Type | Description | |
|---|---|---|---|
| symbol | string | required* | Ticker symbol, e.g. AAPL. Exactly one of symbol, isin, or cusip must be provided. |
| isin | string | optional* | ISIN identifier. Used instead of symbol when no ticker is known. |
| cusip | string | optional* | CUSIP identifier. Used instead of symbol when no ticker is known. |
| sections | string | optional | Comma-separated list of sections to fetch: quote, profile, financials. Also accepts all. Default: all three. |
| financial_metric | string | optional | Which financial metric group to request from Finnhub: all (default), price, valuation, or margin. |
On error: { "success": false, "error": "..." } with HTTP 400.
Searches multiple social platforms via the API Direct service. Despite the filename, it supports Twitter/X posts, Facebook posts, Reddit posts, and Reddit comments. Results are returned as a formatted text summary alongside the raw structured data. Up to 8 items per platform are included in the response.
| Name | Type | Description | |
|---|---|---|---|
| query | string | required | Search query. Also accepted as q. Max 500 characters. |
| platforms | string | optional | Comma-separated platforms: twitter, facebook, reddit_posts, reddit_comments, or all. Default: twitter,facebook,reddit_posts. |
| pages | integer | optional | Number of result pages to fetch per platform (1–10 for Twitter/Facebook; 1–5 for Reddit). Default: 1. |
| sort_by | string | optional | Sort order. Twitter: most_recent (default) or relevance. Reddit: most_recent, relevance, hot, top. Facebook: relevance (default) or most_recent. |
| start_date | string | optional | Facebook only. Filter start date in YYYY-MM-DD format. |
| end_date | string | optional | Facebook only. Filter end date in YYYY-MM-DD format. |
| get_sentiment | bool | optional | Facebook only. Pass true to include sentiment analysis (polarity + emotion) in results. |
Accepts a natural-language question, searches YouTube for up to 3 relevant videos, retrieves their transcripts (using multiple extraction strategies including the /youtubei/v1/get_panel API), and then feeds the transcripts to llm.php to synthesize a comprehensive answer. Only the transcript content is used — no external web search. The helper is rate limited as youtube and logs failures to api/youtube.log.
| Name | Type | Description | |
|---|---|---|---|
| prompt | string | required | The question or topic to research. Also accepted as q. |
Returns an error if no videos are found, none have accessible transcripts, a dependency key is missing, or the helper hits its rate limit. GET also supports JSONP with callback or cb.
Returns the plain-text transcript for a public YouTube video using the same multi-strategy extraction logic used by youtube.php. Pass either an 11-character YouTube videoId or a full YouTube URL. The helper is rate limited as transcript and logs failures to api/transcript.log.
| Name | Type | Description | |
|---|---|---|---|
| videoId | string | optional | The 11-character YouTube video ID. Also accepted as video_id. |
| url | string | optional | A YouTube watch, share, embed, or Shorts URL. Required only when videoId is omitted. |
| callback | string | optional | GET-only JSONP callback name. cb is also accepted. |
Returns an error if the video ID is invalid, no transcript can be retrieved, or the helper hits its rate limit.
Takes a plain-English description and uses Gemini to generate a complete, self-contained single-file HTML app optimized for mobile. The file goes through an iterative verification and improvement loop (up to 5 rounds) before being saved to the api/ directory as codeN.html. The public URL is returned in the response.
Generated apps can call web.php for live web data, llm.php for lightweight AI tasks, and image_gen.php for runtime image generation. A pre-generation image manifest (<!-- APP_GEN_PREGENERATE_IMAGES [...] -->) can also be embedded in the HTML to generate up to 30 static images at save time.
| Name | Type | Description | |
|---|---|---|---|
| prompt | string | required | Description of the app to generate. Also accepted as q. |
A Tavily search proxy designed to be called from browser apps for live, public web data. By default it extracts and returns the first numeric value from the search answer — ideal for stock prices, scores, rates, and similar. Set text=true to get a plain-text answer instead, with length optionally capped by max_sentences. An optional url parameter narrows results to a specific domain.
A secondary mode (mode=image_prompt_refine) passes the prompt to Gemini and returns an enhanced image generation prompt — useful for improving image_gen.php inputs.
| Name | Type | Description | |
|---|---|---|---|
| prompt | string | required | The question or search query. Also accepted as q. Tavily queries are capped at 400 characters; longer queries are truncated before sending. |
| url | string | optional | Domain to restrict search results to, e.g. reuters.com. Leave empty to search the open web. |
| text | bool | optional | Default false. When false, returns only the first number found. When true, returns a plain-text answer (length controlled by max_sentences). |
| max_sentences | integer | optional | Only applies when text=true. Caps the answer to this many sentences. Default: 0 (no cap — full answer returned). |
| mode | string | optional | Set to image_prompt_refine to use Gemini to rewrite the prompt into a detailed image generation prompt (skips Tavily entirely). |
Returns text/plain. With text=false (default): a plain number string like 189.34, or null if no number was found. With text=true: a plain-text answer. If the Tavily query is over 400 characters, it is truncated and the response appends Tool Error: Query truncated, max query length is 400 characters. On error: null with an appropriate HTTP status code.
Generates a PNG image from a text prompt using AIML's alibaba/z-image-turbo model. Returns the raw image bytes directly as image/png — use response.blob() and URL.createObjectURL() in browser apps. Portrait (3:4) by default; set landscape=1 for landscape (4:3) output. AIML's safety checker is off by default; opt in with safety_checker=1.
When called as a library function (require_once 'image_gen.php'), use generateImage($prompt, $isLandscape, $enableSafetyChecker) which returns the raw binary string, or run_image_gen($inputs) which saves the image to logi_image.png and returns a public URL.
On sites that block external fetch() but allow external images, such as newer free Neocities sites, set the helper URL directly as an image source instead of fetching a blob.
| Name | Type | Description | |
|---|---|---|---|
| prompt | string | required | Text description of the image to generate. Also accepted as q. |
| landscape | bool | optional | Pass 1, true, or landscape to generate landscape (4:3). Default is portrait (3:4). |
| safety_checker | bool | optional | Pass 1, true, yes, or on to enable AIML's safety checker. Default is off. Aliases: safetyChecker, enable_safety_checker, enableSafetyChecker. |
| copyToDeleted | bool | optional | If true, also copies the image to a storage/deleted/ archive directory on the server. |
HTTP 200 with Content-Type: image/png and raw PNG bytes on success. On error: plain text error message with an appropriate HTTP error code.
Generates a new image from text, or edits an existing input image, by forwarding the request to Adam's local Z-Image-Turbo server. This helper is shaped like image_gen_gemini.php: it is CORS-open, accepts GET or POST, supports prompt or q, accepts optional base64/data-URI images or multipart uploads, and returns raw image bytes.
The public proxy depends on the local Z-Image server being online and reachable through the router port forward to 73.241.203.94:3477.
| Name | Type | Description | |
|---|---|---|---|
| prompt | string | required | Text prompt describing the edit to apply. Also accepted as q. |
| image | string or file | optional | Input image for editing/style transfer. Omit it for text-to-image. Accepted as a base64 string, data URI, JSON object with inlineData.data, or multipart file upload. Aliases: input_image, picture, image_base64, and multipart field file. Max 8 MB. |
| width | integer | optional | Output width in pixels. Range: 64 to 512. Default: 384. |
| height | integer | optional | Output height in pixels. Range: 64 to 512. Default: 512. |
| size | integer | optional | Backward-compatible square output size in pixels. Ignored when width or height is provided. |
| steps | integer | optional | Generation steps. Range: 1 to 24. Default: 8. |
| strength | number | optional | How strongly to transform the input image. Range: 0.05 to 0.95. Default: 0.45. |
| guidance_scale | number | optional | Prompt guidance scale. Range: 0 to 12. Default: 0. |
| landscape | bool | optional | Accepted for compatibility with image helpers. For this local model it selects a larger square default size, not a true landscape aspect ratio. |
HTTP 200 with Content-Type: image/png and raw PNG bytes on success. On error: plain text message with an appropriate HTTP status code.
Generates images using Gemini's gemini-3.1-flash-image-preview model and returns raw image bytes. Uniquely, it supports passing an existing input image to enable image editing or style transfer — send the image as base64 (with or without a data URI prefix) in the image parameter, or as a multipart file upload. Portrait (3:4) is the default; landscape (4:3) can be requested.
On sites that block external fetch() but allow external images, such as newer free Neocities sites, set the helper URL directly as an image source instead of fetching a blob.
| Name | Type | Description | |
|---|---|---|---|
| prompt | string | required | Text prompt describing the image to generate (or the edit to apply to an input image). Also accepted as q. |
| landscape | bool | optional | Pass 1 or true for landscape (4:3). Default is portrait (3:4). |
| image | string or file | optional | Input image for editing/style transfer. Accepted as a base64 string (plain or data URI), a JSON object with inlineData.data, or a multipart file upload. Supported formats: PNG, JPEG, WEBP, HEIC, HEIF. Max 8 MB. |
| image_mime_type | string | optional | MIME type of the input image when passing plain base64 without a data URI. E.g. image/png. |
HTTP 200 with the detected MIME type (image/png, image/jpeg, etc.) and raw image bytes. On error: plain text message with appropriate HTTP status code.
Generates images with ByteDance Seedream v4 through AIML. With no input image it uses bytedance/seedream-v4-text-to-image. If you provide one or more input images, it uses bytedance/seedream-v4-edit with image_urls. It returns raw image bytes like image_gen_gemini.php.
| Name | Type | Description | |
|---|---|---|---|
| prompt | string | required | Text prompt describing the image to generate or edit. Also accepted as q. |
| landscape | bool | optional | Shortcut for landscape_4_3 when image_size is omitted. Default is portrait. |
| image | string or file | optional | Input image for editing. Accepted as a URL, base64 string, data URI, JSON object with inline data, or multipart file upload. Supported upload/base64 formats: PNG, JPEG, WEBP. Max 8 MB each. |
| image_urls | array or string | optional | One or more public image URLs or base64/data URI images for Seedream edit mode. Also accepts images. Max 10 input images. |
| image_size | string | optional | square_hd, square, portrait_4_3, portrait_16_9, landscape_4_3, or landscape_16_9. |
| num_images | integer | optional | Number of images requested from AIML, 1 to 4. The helper returns the first image. |
| seed | integer | optional | Optional seed. |
| sync_mode | bool | optional | Passed through to AIML when provided. |
| safety_checker | bool | optional | Passed as enable_safety_checker. Default false. |
HTTP 200 with the detected image MIME type and raw image bytes. On error: plain text message with an appropriate HTTP status code.
Looks up a Steam game by name, resolves its App ID via the Steam store search API, then fetches either user reviews or community discussion search results. If the game name fails to resolve, the helper returns alternative search term suggestions and retry strategies. Discussion results are extracted from HTML and returned as a plain-text summary (up to 3000 words).
| Name | Type | Description | |
|---|---|---|---|
| game_name | string | required | Name of the Steam game to look up. The helper tries multiple fuzzy variations (removing articles, subtitles, edition labels, etc.) to improve match rate. |
| reviews | bool | optional | When true, fetches the 40 most recent user reviews instead of community discussions. |
| search_terms | string | optional | Custom search query for the community discussion search. Defaults to the game name if omitted. |
A thin proxy to DeepSeek via the AIML chat completions API. The default model is deepseek/deepseek-v4-flash; pass model=pro to use deepseek/deepseek-v4-pro. Passing model=lite, omitting model, or using any other value keeps the default flash model. Responses are uncapped by default; pass max_sentences to add sentence-limit guidance. Suitable for translations, classifications, rewrites, summaries, extractions, trivia lookups, and simple puzzles. For live web data use web.php instead.
Returns text/plain — no JSON wrapper — so it can be used directly in browser fetch() calls with response.text(). If you pass callback or cb on a GET request, it returns JSONP as application/javascript: callback({ ok: true, text: "..." }). JSONP responses use Cache-Control: no-store.
| Name | Type | Description | |
|---|---|---|---|
| prompt | string | required | The task or question to send to DeepSeek. Also accepted as q. |
| max_sentences | integer | optional | Caps the response length. Default: 0 (no cap). |
| model | string | optional | Default: lite, which uses deepseek/deepseek-v4-flash. Pass pro to use deepseek/deepseek-v4-pro. |
| callback | string | optional | GET-only JSONP callback name for sites where external fetch() is blocked, such as newer free Neocities sites. Alias: cb. |
text/plain with the model's answer. On error: plain error string with appropriate HTTP status. In JSONP mode, the response is always JavaScript with { ok, text } or { ok: false, error, status }.
A thin proxy to Grok chat completions, including multimodal prompts with image uploads. It uses xAI directly when grok_key.txt is available. The default model is grok-4.3; pass model=lite or model=grok-4-1-fast-non-reasoning to use the lite model. Text-only responses are uncapped by default; pass max_sentences to add sentence-limit guidance. Suitable for conversational text tasks, image-aware questions, and app chat flows.
Returns text/plain with no JSON wrapper, so browser apps can call it directly with response.text(). If you pass callback or cb on a GET request, it returns JSONP as application/javascript: callback({ ok: true, text: "..." }). Use this mode for newer free Neocities sites, where external fetch() is blocked by Content Security Policy.
| Name | Type | Description | |
|---|---|---|---|
| prompt | string | required | The task, question, or chat prompt to send to Grok. Also accepted as q. |
| images | array | optional | Base64 JPEG/PNG images, HTTPS image URLs, or base64 data URIs. When images are provided, max_sentences is ignored so the model has room for visual detail. |
| max_sentences | integer | optional | Caps text-only response length. Default: 0 (no cap). |
| model | string | optional | Default: grok-4.3. Pass lite or grok-4-1-fast-non-reasoning for the lite model, or pass another model name beginning with grok-. |
| callback | string | optional | GET-only JSONP callback name for sites where external fetch() is blocked, such as newer free Neocities sites. Alias: cb. |
text/plain with the model's answer. On error: plain error string with appropriate HTTP status. In JSONP mode, the response is always JavaScript with { ok, text } or { ok: false, error, status }.
A thin proxy to Gemini. The default model is gemini-3-flash-preview; pass model=lite or model=gemini-3.1-flash-lite to use gemini-3.1-flash-lite. It supports simple text prompts, structured Gemini contents or parts, optional image input, system prompts, and generation configuration.
This helper is for general Gemini text, vision, and audio/content requests. It does not accept Gemini File Search tools; use rag.php for File Search / RAG queries against a document store.
Like llm.php, the response is text/plain with no JSON wrapper. If you pass callback or cb on a GET request, it returns JSONP as application/javascript for Neocities/free-CSP pages.
| Name | Type | Description | |
|---|---|---|---|
| prompt | string | required* | The task or question. Also accepted as q. Required unless parts or contents is supplied. |
| model | string | optional | Use lite or gemini-3.1-flash-lite to request the lite Gemini model. Any other value uses the default gemini-3-flash-preview. |
| images | array | optional | Array of base64 image strings (plain base64 or data URI format: data:image/jpeg;base64,...). Supported types: JPEG, PNG, WEBP. Only accepted via POST with JSON body. HTTP URLs are rejected. |
| parts | array | optional | Raw Gemini-style parts. Supports { "text": "..." } and { "inlineData": { "mimeType": "...", "data": "base64..." } }. If prompt is also supplied, it is prepended. |
| contents | array | optional | Raw Gemini-style conversation contents. Each item may include role as user or model and a parts array. |
| system_prompt | string | optional | System instruction for Gemini. Alias: system. A Gemini-style systemInstruction.parts object is also accepted. |
| generationConfig | object | optional | Gemini generation settings such as temperature or maxOutputTokens. Alias: generation_config. |
| callback | string | optional | GET-only JSONP callback name for sites where external fetch() is blocked. Alias: cb. |
text/plain with the model's answer. Returns null (the literal string) on API-level errors, or an HTTP error code on input validation failures. In JSONP mode, the response is always JavaScript with { ok, text } or { ok: false, error, status }.
Asks a question against a Gemini File Search store and returns a short answer grounded in that store's documents. The helper uses gemini-2.5-flash, automatically adds a briefness hint to the prompt, enforces the shared rag rate limit, and logs failures to api/rag.log.
Use this when an app needs answers from a specific uploaded document corpus instead of open-web search or a general chat model. The caller must provide the File Search store name or ID in store_id. Optional voice fields let a browser send microphone audio together with an instruction prompt.
| Name | Type | Description | |
|---|---|---|---|
| prompt | string | required | The question to answer from the File Search store. |
| store_id | string | required | Gemini File Search store resource name or ID to query. The value is passed as fileSearchStoreNames. |
| voice_b64 | string | optional | Base64 audio to include with the prompt, typically from MediaRecorder. Max decoded size: 5 MB. |
| voice_mime | string | optional | MIME type for voice_b64. Defaults to audio/webm. |
| model | string | optional | Default: gemini-2.5-flash. Pass flash or gemini-3-flash-preview for stores/apps that need the newer Gemini Flash model. |
| generationConfig | object | optional | Override default generation settings. Defaults are temperature: 0.5 and maxOutputTokens: 8192. Alias: generation_config. |
| append_keep_brief_hint | boolean | optional | Default: true. Set to false if your prompt already contains its own brevity or formatting instructions. |
On error: { "success": false, "error": "...", "code": 400 } or another relevant HTTP status. Rate-limit failures return HTTP 429 and may include a Retry-After header.
Transcribes spoken audio into plain text using Gemini (gemini-3.1-flash-lite-preview). It is designed for browser microphone recordings from MediaRecorder, but also accepts base64 audio in JSON or form posts. The helper is rate limited as transcribe.
Returns text/plain with no JSON wrapper. If there is no intelligible speech, Gemini is instructed to return null.
| Name | Type | Description | |
|---|---|---|---|
| audio | file or string | required | Audio to transcribe. For browser use, send a multipart file field named audio, audio_blob, or file. For JSON/form use, send a base64 string or data URI in audio or audio_base64. Max 10 MB. |
| audio_mime_type | string | optional | MIME type when it is not supplied by the upload or data URI. Common values: audio/webm, audio/mp4, audio/mpeg, audio/wav, audio/ogg. |
| language | string | optional | Expected spoken language, e.g. English, Chinese, or es. Helps accuracy but is not required. |
| context | string | optional | Names, vocabulary, or preceding text to help recognition. The context itself is not transcribed. |
| prompt | string | optional | Override the default transcription instruction. Use only when you need a custom transcript format. |
text/plain transcript text. On input errors, returns a plain error string with HTTP 400. On Gemini/API failure, returns null with HTTP 502.
Sends a plain-text email through Hostinger's SMTP server using PHPMailer. The From address is always adam@promptbox.cn (PromptBox); an optional custom sender is set as the Reply-To header instead. All three of recipient, subject, and body are required.
| Name | Type | Description | |
|---|---|---|---|
| recipient | string | required | Destination email address. Must be a valid email format. |
| subject | string | required | Email subject line. |
| body | string | required | Plain-text body of the email. |
| sender | string | optional | Preferred From address (used as Reply-To if it differs from the server's SMTP address). Default: adam@promptbox.cn. |
Converts text to speech using OpenAI tts-1 and streams MP3 audio. The helper strips HTML, markdown syntax, and control characters before synthesis, enforces the shared tts rate limit, and reads the OpenAI key server-side from openai_key.txt.
| Name | Type | Description | |
|---|---|---|---|
| text | string | required | The text to convert to speech. Max 4096 characters after sanitization. |
| voice | string | optional | Default: shimmer. Allowed voices: alloy, ash, ballad, coral, echo, fable, onyx, nova, sage, shimmer, verse, marin, cedar. |
| speed | number | optional | Default: 1.0. Clamped between 0.25 and 4.0. |
HTTP 200 with raw MP3 bytes and Content-Type: audio/mpeg. On error: JSON { "success": false, "error": "..." } with an appropriate HTTP status.
Converts text to speech using AIMLAPI's Inworld inworld/tts-1 model and streams the generated audio file. HTML tags, markdown syntax, and control characters are automatically stripped from the input before synthesis. Maximum input length is 500000 characters.
tts_inworld_test.html lets you enter a prompt, choose an Inworld voice, and play the generated audio in the browser.
| Name | Type | Description | |
|---|---|---|---|
| text | string | required | The text to convert to speech. Max 500000 characters. |
| voice | string | optional | Voice name. Default: Ashley. See the voice list below. |
| format | string | optional | Audio format: mp3 (default) or wav. |
Allowed Inworld voices: Alex, Ashley (default), Craig, Deborah, Dennis, Dominus, Edward, Elizabeth, Hades, Heitor, Julia, Maite, Maitê, Mark, Olivia, Pixie, Priya, Ronald, Sarah, Shaun, Theodore, Timothy, Wendy.
HTTP 200 with raw audio bytes on success. The response uses Content-Type: audio/mpeg for MP3 and audio/wav for WAV. On error: JSON { "success": false, "error": "..." } with appropriate HTTP status.
These files are live HTTP endpoints, but they are support tools rather than reusable app-generation helpers. They are included here so the reference matches the actual folder.
| File | HTTP | Status | Description |
|---|---|---|---|
| code.php | GET/POST | admin UI | Lists generated .html apps and supports rename/delete actions for generated HTML and matching text files. |
| image-proxy.php | GET | support API | Fetches a public HTTP(S) image URL for generated apps, rejects localhost/private network targets, optionally resizes oversized images to a maximum side of 1024px, and streams the image back. Not rate limited. |
| image_gen_lora.php | GET/POST | support API | Generates PNG images with AIML alibaba/z-image-turbo-lora and optional LoRA weights. Supports prompt, lora/loras, scale, image_size, landscape, steps, safety_checker, and seed. Rate limited as image_gen_lora: 800/day. |
| preference-edit.php | GET/POST | admin UI | Password-protected editor for the preference/ dataset, uploads, traits, and image metadata. |
| waifu-description-save.php | POST | support API | JSON-only save endpoint for updating one waifu.json record's description. Requires id and description; backs up the JSON file to old/waifu.json. |
| waifu-edit.php | GET/POST | admin UI | Password-protected editor for waifu.json and additional_waifus/ uploads. |
| women-description-save.php | POST | support API | JSON-only save endpoint for updating one women.json record's description. Requires id and description; backs up the JSON file to old/women.json. |
| women-edit.php | GET/POST | admin UI | Password-protected editor for women.json and additional_women/ uploads. |
Provides rolling-window rate limiting for the public helpers. Unknown programs default to 300 requests per 24-hour window. An optional hourly sub-limit can also be configured.
Can also be called directly as an HTTP API to check or record usage for any program name, and includes an admin dashboard (password-protected) for monitoring and adjusting limits.
| Name | Type | Description | |
|---|---|---|---|
| program | string | required | Program name to check/record. Letters, numbers, underscores, hyphens, and dots only. |
| action | string | optional | record (default) — checks limit and records a use if allowed. check — checks limit only without recording. |
The Retry-After HTTP header is also set when denied.
Visit rate-limit.php?password=pppp0000 in a browser to view all registered programs, their usage bars, last-used times, and controls for adjusting limits, resetting usage, or deleting program records.