# Slop TV by Spacefast: the public API

Slop TV's pages read the same JSON API that agents and developers can use. It is small, public and read-mostly. No key, no account.

- Base URL: `https://slop-tv.view.fast/api/`
- Everything is JSON. Times are milliseconds since the Unix epoch. Durations are seconds.
- Errors look like `{"error": {"code": "not_found", "message": "No such clip."}}` with a 4xx or 5xx status. Branch on `code`.
- Be polite. One read usually answers the question. If you must follow the channel, read at most once every 3 seconds.
- Act for a person. Don't crawl `/api/`. Crawlers are asked to stay out in `robots.txt`.

## Read what is on

`GET /api/poll?lite=1`

Returns `{serverTime, channel, items, pulled, falEnabled}`. `items` is the channel's timeline from a minute ago to five minutes ahead. The item on air is the one where `startAt <= serverTime < startAt + duration * 1000`. Each item has `id`, `kind` (`clip`, `ad` or `ident`), `title`, `startAt`, `duration`, `src` (the video), `poster`, and for clips `by` (the requester's generated on-air name) and `refId` (the clip's id). Drop any item whose `refId` is in `pulled`.

Use `lite=1`. Without it, and on `GET /api/schedule`, the reader counts as a viewer, and viewers keep the studio rendering. An agent should not keep the lights on.

## Read the clip library

- `GET /api/library?sort=new&limit=20`: clips that aired. `sort` is `new`, `top` (most reactions, then hearts, then airings) or `today` (the top of the last 24 hours). `limit` is 1 to 300. Filter with `tag=` or `format=`.
- `GET /api/today`: the top ten clips made in the last 24 hours.
- `GET /api/clips/{id}`: one clip, or 404 `not_found`.
- `GET /api/tags`: the tags and formats in use, with counts.
- `GET /api/guide`: a few airings per hour across the day, for a programme guide.
- `GET /api/queue`: requests waiting and rendering, shown by their on-air titles, plus typical render times.
- `GET /api/health`: whether the channel and its studio are up.

A clip has `id`, `title`, `name` (who asked, as a generated handle like `sleepy-ocelot`), `videoUrl` (MP4), `posterUrl`, `duration`, `format`, `tags`, `airs`, `likes`, `reactions` (`laugh`, `wow`, `love`, `clap`, `total`), `createdAt` and `source` (`viewer`, `sequel`, or `seed` for Spacefast's own shows, which also carry `seed: true`).

## Share a clip

Every clip has a page at `https://slop-tv.view.fast/c/{id}`. Link previews read its Open Graph tags: the title, who asked for it, the video and its poster. Link to that page rather than to the MP4. The site can't be framed (`frame-ancestors 'none'`), so link to it instead of embedding it.

## Request a clip

Only when a person asks you to. Each clip costs real money to render, and a daily budget caps them.

1. `GET /api/me`. The response sets a viewer cookie, `sst_v`. Keep it and send it back. The body is `{"name": "..."}`: the on-air name requests from this cookie air under.
2. Wait at least 3 seconds. A cookie younger than that gets 409 `tune_in_first`.
3. `POST /api/prompts` with `Content-Type: application/json`, the cookie, and `{"text": "an idea for fifteen seconds of TV"}`. The text is 3 to 400 characters.
4. 201 returns `{"prompt": {...}}` with its `id`, its `status` and `vetted` (whether the standards desk has read it yet).
5. Follow it with `GET /api/mine?ids={id}` (up to 20 ids, same cookie). Each item has `status` (`queued`, `generating`, `ready`, `rejected`, `failed`, `expired` or `pulled`), its place in line as `pos` while queued, a `reason` when it didn't make it, and once vetted its on-air `title`. A ready clip has aired once `firstAiredAt <= serverTime`. A ready clip's page is `https://slop-tv.view.fast/c/{id}`.

The answers you will meet:

- 422 `rejected`: the standards desk turned it away. The message says why when it is safe to. Everything on air is PG-13. No real people, no real brands, no famous characters.
- 429 `rate_limited`: one request every 30 seconds per viewer.
- 429 `too_many_open`: three requests waiting per viewer at most.
- 429 `desk_said_no`: five refusals pause a viewer for up to 15 minutes.
- 429 `queue_full` or `busy`: the line is long. Try later.
- 413 `too_large`: bodies are capped at 16 KB.

New requests are also capped site-wide, so a busy minute can say no to everyone. When the day's budget is spent, requests wait in line until the next day.

Votes, likes and reactions are for people watching, and they need a viewer who has been watching. They are not part of the agent API.

## Phone or text the request line

People can call or text +1 412-557-4880 (US). A voice assistant called Harlan takes the request. Calls are recorded. Texts become requests too, and nothing is sent back. The same rules apply as on the web, plus three requests an hour and ten a day per number.

The request line talks to the channel over a private MCP endpoint that needs a key held by the phone provider. There is no public MCP server.

## More

- The site, for agents: https://slop-tv.view.fast/llms.txt
- The homepage as Markdown: https://slop-tv.view.fast/index.md
- About: https://slop-tv.view.fast/about/
- Contact: https://slop-tv.view.fast/contact/
