---
name: outplace
description: Buy land or bid USD for a Roblox place on outplace.lol. Use when reading the land board or the ranking board, buying studs, or starting Stripe Checkout for a bid. No accounts.
---

# outplace

outplace is two public boards for Roblox experiences. The land board at `/` sells studs (grid cells) for USD; paid studs are permanent. The ranking board at `/ranking` orders places by amount paid. There are no accounts. Identity is the Roblox place ID.

## When to use this

Reach for outplace when a Roblox experience needs public land on outplace.lol, a live read of who owns which studs, or a USD rank on the bidding board. Call GET `/api` or GET `/openapi.json`, then GET `/api/plots` / POST `/api/plots/checkout` for land, or GET `/api/board` / POST `/api/checkout` for rank. Do not use outplace for Robux, visits, Roblox.com ads, OAuth, or API keys.

## Land board

`GET /api/plots` returns JSON:

- `config`: board bounds (`min_x`..`max_x`, `min_y`..`max_y`), `stud_px`, `price_cents_per_stud`
- `plots`: live plots with `place_id`, `name`, `x`, `y`, `w`, `h`, `tier` (`free`, `paid`, `gift`, or `credit`), `amount_cents`, and resolved `art`
- Animated art uses `kind: video` (silent MP4) or legacy `kind: gif`, with `url` and `staticUrl`. Show the static image first and defer animation until the plot is visible at a readable size.
- `refreshedAt`

### Existing free plots

New public free claims have ended. `POST /api/claim` returns HTTP 410 (`free_claims_retired`). Legacy free plots were removed at the site relaunch; `free` remains only as a historical tier value.

### Buy studs

1. Pick an in-bounds rectangle that does not overlap a live permanent plot (`paid`, `gift`, or `credit`). Price is `price_cents_per_stud` per stud.
2. `POST /api/plots/checkout` with JSON `{"place":"<roblox url or place id>","x":<int>,"y":<int>,"w":<int>,"h":<int>}`.
3. On success, open the returned Stripe Checkout `url` and pay. The rectangle is reserved while checkout is open; the plot publishes only after Stripe captures payment.
4. After paying, poll `GET /api/plot/session/<checkout_session_id>`. The first response with `status: "live"` includes `deed` — the plaintext deed token, returned exactly once. Store it. It is the only key to the plot's art controls at `/plot/<plot_id>/manage#<deed>`.
   Status may remain pending while the completed Checkout email is retrieved. Live responses include `emailDelivery`: sent, failed, unavailable, or null when no new deed was minted. Save the deed even if email delivery fails; the purchase remains published.

Paid plots are permanent. The deed is a bearer secret: never post it anywhere public.

## Ranking board

`GET /api/board` returns JSON:

- `rows`: live listings already in rank order (highest `amount_cents` first; earlier `paid_at` wins ties)
- `stats`: `{ online, visits24h }`
- `total`, `refreshedAt`

Do not re-sort `rows`. Rank is the 1-based index in that array.

### Place a bid

1. Choose a whole-dollar amount from $1 to $999,999.
2. If the place is already live, the new amount must be at least $1 more than its current amount.
3. `POST /api/checkout` with JSON `{"place":"<roblox url or place id>","amount_dollars":<int>}`.
4. On success, open the returned Stripe Checkout `url` and pay. Session-create is not a live listing. The board updates only after Stripe captures payment.
5. After checkout, poll `GET /api/bid/<checkout_session_id>` until `status` is `paid`. Then `rank` is the live rank.

Every payment is the full new amount, not a delta. No refunds because rank changed.

New ranking purchases earn one stud per complete $10, accumulated for the same verified recovery email and original game. Historical ranking purchases are excluded. Follow the private email link to /claim-ranking to select a rectangle; redeemed land does not create another bid. Direct land purchases contribute one individual bid equal to their payment and do not earn unspent land credit.

## Play link

`GET /go/<placeId>` 302s to the Roblox experience and counts a click.

## Constraints

- No OAuth, API keys, or agent registration.
- Do not call `/api/stripe/webhook`, `/api/cron`, or `/admin`.
