that.promo

Developers

Everything on that.promo is free to use as data. No key, no sign-up: an MCP server for AI agents, and JSON over HTTPS with CORS open for browsers and scripts.

AI agents and MCPMonitoring promptJSON endpointsFair use

For AI agents

Connect your agent to the that.promo MCP server and it can search offers, read one in full and ask what changed since its last check. It is a remote server (Streamable HTTP) with no key:

https://that.promo/mcp

Add it to your client

Claude Code

claude mcp add --transport http that-promo https://that.promo/mcp

Claude (desktop and web): Settings, Connectors, Add custom connector, then paste the URL above.

Cursor, Windsurf and other clients with a JSON config (VS Code calls the top key servers):

{
  "mcpServers": {
    "that-promo": {
      "url": "https://that.promo/mcp"
    }
  }
}

Tools

search_offers
Search free credits, free API access and startup programs. All filters are optional; with none it returns the newest live offers. Each offer has value, who_qualifies, how_to_claim, expiry, caveats, official_url and last_verified.
get_offer
One offer in full by its slug (from search_offers or a that.promo URL), with its dated timeline of launches and changes.
list_changes
What is new, changed, cut or ended, newest first. Pass since (the time of your last check) to get only what happened after it: this is the call to make on a schedule.
list_categories
The categories, with their slug (for search_offers), page URL and number of live offers.

No MCP? Use llms.txt

Point any model at /llms.txt for a map of the site with live counts per category, or at /llms-full.txt to load every live offer in one fetch. For polling, /changes.json?since=<last check> returns only what is new.

A system prompt to monitor that.promo

Give this to your agent (a Claude Code routine, a scheduled task, any assistant with the MCP server connected), fill in "About me" and run it daily or weekly. It checks what changed since its last run, keeps what fits your stack and eligibility, and sends you a short list with the official links. It never applies for anything on your behalf.

You watch that.promo for free credits, free API access and startup programs that fit me, and tell me only what matters.

About me (edit this):
- Building: <one line, e.g. an AI support agent for Shopify stores>
- Stack: <e.g. OpenAI, Vercel, Supabase, Pinecone, Sentry>
- Stage and funding: <e.g. solo and bootstrapped; or seed, VC-backed>
- Based in: <country>
- Open source: <no, or the repo link>
- Also interested in: <e.g. GPU credits, AI coding tools>

Tools: use the that.promo MCP server at https://that.promo/mcp. If you cannot use MCP, fetch the same data over HTTPS: https://that.promo/changes.json?since=<time> for list_changes, https://that.promo/offers.json for search_offers (filter it yourself) and https://that.promo/<slug>.json for get_offer.

Each run:
1. Call list_changes with since set to the time of your last run (first run: 30 days ago). Remember checked_at from the reply as the time of this run.
2. On the first run, also call search_offers for each tool in my stack and each interest, so I start with the full picture.
3. Keep offers that match my stack or interests, or that could replace something I pay for now. Drop the rest.
4. For each one you keep, call get_offer and compare who_qualifies with "About me". Mark it Likely, Maybe or No, with the reason in a few words. Leave out No, unless an offer I already use was cut or ended.
5. Report newest first, one block per offer:
   <Provider: name> - <new | changed | cut | ended>
   Value: <headline_amount, or value>
   Fit: <Likely | Maybe> - <reason>
   Next step: <how_to_claim, shortened>
   Official page: <official_url> (verified <last_verified>)
   that.promo: <url>
   If nothing passes, reply "Nothing new for you since <date>." and stop.

Rules:
- that.promo is a lead, not a guarantee. Terms change: always send me to official_url, and say so when last_verified is more than 30 days old.
- Never apply, sign up or enter details anywhere on my behalf.
- Do not invent amounts or eligibility. If a field is null, say "not stated".

Also at /agent-prompt.txt.

JSON endpoints

GET /offers.json
Every live offer. Filters: status=live|ended|all, category, program=startups|open_source|none, provider (company slug).
GET /changes.json
The change log, newest first. Filters: since (date or ISO time: only what happened after it), kind=new|changed|cut|ended, limit (1 to 500, default 100).
GET /vultr-agent-rush-hackathon.json
One offer with its timeline and supporting posts. Add .json to any offer URL.
GET /feed.xml
RSS: the 30 newest offers.
GET /changes.xml
RSS: the latest changes.
GET /llms.txt
A map of the site for language models (llmstxt.org).
GET /llms-full.txt
Every live offer as Markdown, in one file.
GET /agent-prompt.txt
The monitoring system prompt below, as plain text.

Try it

curl -s 'https://that.promo/offers.json?category=gpu-and-compute' \
  | jq '.offers[] | {provider, headline_amount, url}'

What an offer looks like

Each offer has slug, url, name, provider, category, program, status (live, changed, ended), headline_amount, value, who_qualifies, how_to_claim, expiry, caveats, official_url, released_at, last_verified, added_at and updated_at. Text fields are what we checked on the official page; a field we could not confirm is null.

Fair use

Building something with it? Tell us at [email protected].