# Freeboard — instructions for AI agents This file exists so an AI coding assistant can list a website on Freeboard correctly, without guessing field names, endpoint behaviour, or valid values. Follow these steps exactly, in order. Do not invent parameters not listed here. ## What this is Freeboard is a free directory of pay-to-rank / leaderboard websites. Listing costs nothing. The only requirement is a real, crawlable link back to Freeboard somewhere on the site being submitted. There is no payment, no account, and no API key required for submission. ## Step 1 — Add the backlink to the target site Insert this exact HTML anywhere in the site's markup — a footer is the conventional place, but any page that is part of the normal site (not a staging or localhost copy) is acceptable: Listed on Freeboard Rules that matter, precisely: - Do NOT add rel="nofollow", rel="sponsored", or rel="ugc" to this link, in any combination or order. A link carrying any of those values will be found but will NOT verify — the submission will come back with status "pending" and reason "nofollow_only". rel="noopener" alone is fine and recommended; it does not block verification. - Use the anchor text shown above, or comparably plain brand-name text ("Freeboard", "Listed on Freeboard"). Do not use exact-match keyword anchor text (e.g. "best pay-to-rank sites") — this is a deliberate choice to keep the link exchange defensible under normal search-engine link policy, not an arbitrary style preference. Follow it. - The link must be live and publicly reachable at the URL that gets submitted in Step 2 — not merely committed to a repository, not behind authentication, not on a preview/staging domain. Deploy first, submit second. ## Step 2 — Submit for verification Send exactly this request: POST https://freeboard.lol/api/submit Content-Type: application/json { "url": "https://the-site-being-listed.com", "name": "The site's name", "description": "One line, plain text, 200 characters or fewer", "niche": "general" } `niche` must be exactly one of these five lowercase-hyphenated values — no others exist, and an unrecognised value silently falls back to "general" rather than erroring, so get this right rather than guessing: general | gaming-tech | saas-startups | creators-media | local-services No Authorization header, no API key, no cookies. This endpoint is public. ## Step 3 — Read the response and act on it The response is always JSON. Three shapes are possible: Success, verified immediately: { "ok": true, "status": "live" } Report this as: the site is now listed and live. Nothing further to do. Submitted but not yet verified: { "ok": true, "status": "pending", "message": "" } Report the `message` field to the user VERBATIM — it already states exactly what is wrong. Do not paraphrase it into something vaguer. The three possible messages, and the correct fix for each: - "We couldn't load that page..." → the URL is wrong, unreachable, or not yet deployed publicly. Fix: verify the URL resolves in a normal browser over the public internet, then resubmit. - "We couldn't find a link to us on that page..." → the backlink from Step 1 either isn't present, is on a different page than the one submitted, or hasn't been deployed yet. Fix: confirm the exact HTML from Step 1 is live at the submitted URL, then resubmit. - "...marked rel=\"nofollow\" (or sponsored/ugc), which doesn't count." → the link exists but has a disqualifying rel attribute. Fix: remove nofollow/sponsored/ugc from that anchor's rel attribute (rel="noopener" or no rel attribute at all are both fine), deploy, then resubmit. Rejected outright: { "error": "" }, HTTP status 400, 403, or 429 - 400 means a required field was missing or malformed — check `url` is a real domain and `name` is non-empty. - 403 means the host is blocked and will never be accepted; do not retry. - 429 means more than 5 submissions came from this network in the last 60 seconds; wait at least a minute before retrying. ## Step 4 — Resubmitting after fixing something There is no separate "recheck" endpoint. Submitting the same `url` again runs the exact same verification and, if the backlink is now found and valid, moves the listing to "live" immediately. There is no limit on how many times this can be retried. Do not fabricate a recheck mechanism that isn't described here — Step 2's request, repeated, is the entire mechanism. ## What NOT to do - Do not submit a URL that does not actually carry the backlink yet, on the assumption it can be added afterward — verification happens at submission time, not asynchronously later. - Do not add the nofollow/sponsored/ugc attribute "to be safe" or out of a general habit of nofollowing outbound links — doing so on this specific link defeats its only purpose and will be reported back as a failure. - Do not invent additional request fields (categories, tags, images, an API key) — the endpoint accepts exactly the four fields shown in Step 2 and ignores anything else silently.