Wordleverse Public API

A free, read-only JSON API for the Wordleverse catalog of Wordle-like games. No sign-up and no key needed.

GET/api/v1/games

Paginated list of games, with the same filters as the Games page. Filters accepting several values take repeated params (group[]=a&group[]=b) or a comma list (group=a,b); values in one filter are OR'd, different filters are AND'd.

ParameterDescription
qSearch title, description and URL.
languageLanguage codes (ISO 639-1 / 639-3), e.g. es, de,fr.
groupGroup slugs (game families, e.g. wordle).
topicTopic tag slugs.
platformPlatform tag slugs.
modePlay mode: daily, unlimited and/or completable (finite, can be finished). Modes are independent flags; any listed mode matches.
difficultyeasy, medium, hard (community ratings).
min_ratingMinimum overall rating (0–5).
after_idOnly games with an id greater than this.
sinceOnly games approved after this ISO 8601 time.
sortdefault (catalog order, or relevance when searching), title, newest, oldest, top.
page, per_pagePage number (from 1) and page size (default 24, max 100).
curl "https://wordleverse.net/api/v1/games?language=es&sort=newest&per_page=2"
{
  "data": [ { "id": 812, "slug": "palabra-del-dia", "title": "Palabra del Día", ... } ],
  "meta": { "page": 1, "per_page": 2, "total": 57, "last_page": 29, "sort": "newest" },
  "links": { "next": "https://wordleverse.net/api/v1/games?language=es&sort=newest&per_page=2&page=2", "prev": null }
}

GET/api/v1/games/{id|slug}

One game by numeric id or by its slug (the last part of its page URL, https://wordleverse.net/games/slug). Returns {"data": {game}}, or 404.

curl "https://wordleverse.net/api/v1/games/wordle"

GET/api/v1/games/new

Newly approved games, oldest first, for bots and feeds that announce new games. Poll it with a cursor:

ParameterDescription
since (required)A game id (games with a higher id), an ISO 8601 time (games approved after it), or now (no games, just the current cursor, to start fresh without the backlog).
limitMaximum games returned (default 50, max 100).

Pass the returned cursor as since on the next call. When more is true, call again right away.

curl "https://wordleverse.net/api/v1/games/new?since=810"

{
  "cursor": 812,
  "games": [ { "id": 811, ... }, { "id": 812, ... } ],
  "more": false
}

Game object

{
  "id": 812,
  "slug": "palabra-del-dia",
  "title": "Palabra del Día",
  "url": "https://wordleverse.net/games/palabra-del-dia",
  "play_url": "https://example.com/palabra/",
  "links": [
    {"type": "unlimited", "label": "Unlimited", "url": "https://example.com/palabra/unlimited"},
    {"type": "archive", "label": "Archive", "url": "https://example.com/palabra/archive"}
  ],
  "domain": "example.com",
  "description": "Guess the Spanish word of the day in six tries.",
  "languages": ["es"],
  "groups": ["wordle"],
  "topics": ["words"],
  "platforms": ["web"],
  "daily": true,
  "unlimited": true,
  "completable": false,
  "play_modes": ["daily", "unlimited"],
  "daily_start_date": "2021-06-19",
  "current_puzzle_number": 1958,
  "tags": ["Web", "Wordle", "Words"],
  "rating": 4.2,
  "link_status": "active",
  "credit": "jane_doe",
  "credit_url": null,
  "approved_at": "2026-10-22T18:04:11Z",
  "reddit": { "id": "1abcde", "subreddit": "wordleverse", "permalink": "https://www.reddit.com/r/wordleverse/comments/1abcde/" }
}

url is the game's page on Wordleverse; play_url is the game itself. links lists extra pages of the game in display order (each with type: one of daily, unlimited, archive, leaderboard, stats, practice, discord, other, and the app links app_store, play_store, windows_app, mac_app, web_app (install instructions for an installable web app); a display label; and url); it is empty for most games. link_status is active or down (our link checker could not reach it recently). credit is the public submitter credit shown on the site, reddit the Reddit post the game was found in (both may be null). rating is null until rated.

Rate limits & optional token

Anonymous requests are limited to 60 requests per minute per IP address. Every response carries X-RateLimit-Limit and X-RateLimit-Remaining; over the limit you get HTTP 429 with a Retry-After header (seconds).

Apps that need more can ask for a token ([email protected]) and send it as a Bearer token for a limit of 1000 requests per minute. The token is optional: it only raises the limit, every endpoint and all data work the same without it. An unknown token is ignored (you get the anonymous limit).

curl -H "Authorization: Bearer YOUR_TOKEN" "https://wordleverse.net/api/v1/games/new?since=now"

Please cache responses where you can (responses may be cached for up to a minute) and poll /games/new no more than once a minute.

Errors

Errors are JSON: 404 unknown game, 422 invalid parameter (e.g. a bad since) with an error message; 429 rate limit exceeded and unknown paths with a message.

{ "error": "since must be a game id, an ISO 8601 time, or \"now\"" }

POST/api/v1/results GET/api/v1/results

A personal results API for the helper extension, a signed-in session, a same-site guest, or Skorble (server-to-server). It is not part of the public catalog API above: results stay private to the caller, CORS stays GET-only for anonymous browsers, and a request without a principal is rejected (except a same-site POST, which may create a guest cookie and store the result there until you sign in).

Auth, first match: Authorization: Bearer wvu_... (personal / extension token from Settings or Connect extension); a short-lived guest results token Bearer wvg_... (Connect without signing in; results-only, refresh at POST /api/v1/extension/refresh, upgrades to a wvu_ token after you sign in); a configured Skorble ingest token Bearer wvs_... (server only, no Origin header, body or query must include the Qorble user_id); a signed-in Wordleverse session; or the wv_guest cookie on a same-site request.

POST fieldDescription
game_id or slug or urlThe published catalog game. url may be the game itself or a /games/{slug} page on this site.
raw_textRequired. The share text, stored byte-for-byte (max 2000 characters; the whole JSON body is capped at 16384 bytes).
played_onOptional YYYY-MM-DD. Defaults to today in played_tz (or the player's zone). Future dates more than one day ahead are rejected.
played_tzOptional IANA time zone used to compute the default date.
sourceOptional: paste, extension, api, or skorble. Default depends on the caller.
origin_hostOptional host the result was captured on.
puzzle_idOptional puzzle identifier (max 64). Combined with the parsed puzzle number for de-duplication.
user_idRequired for the Skorble ingest token only.

A new result returns 201 with {"status":"created","data":{...}}. The same owner, game, date and text (or the same puzzle) returns 200 with {"status":"duplicate","data":{...}} and does not insert a second row. The share text is parsed on intake (parser version rp2) and the parsed fields are stored so they can be reparsed later. GET /api/v1/results lists the caller's history (?game= / game_id / slug / url, ?from=, ?until=, page, per_page).

curl -X POST "https://wordleverse.net/api/v1/results" \
  -H "Authorization: Bearer wvu_..." -H "Content-Type: application/json" \
  -d '{"game_id":2,"raw_text":"Wordle 1,234 4/6","played_on":"2026-11-11","origin_host":"www.nytimes.com"}'

The API is provided as is and may change; breaking changes will get a new version prefix (/api/v2). Questions or ideas: r/wordleverse or Discord.