crob.at

Pokémon team builder & PokePaste viewer

API Documentation

REST API for team storage, random generation, and authenticated Showdown helpers

Endpoints

GET /api/team/:slug

Retrieve a team by its slug.

Example:

curl https://crob.at/api/team/abc123
const response = await fetch('https://crob.at/api/team/abc123');
const data = await response.json();
console.log(data);
import requests

response = requests.get('https://crob.at/api/team/abc123')
data = response.json()
print(data)

Response:

{
  "slug": "abc123",
  "name": "My Team",
  "author": "username",
  "is_multi": false,
  "teams": [{"paste": "..."}]
}

POST /api/team

Create a new team.

Request:

{
  "name": "My Team Name",
  "author": "username",
  "teams": [{
    "paste": "Garchomp @ Choice Scarf\nAbility: Rough Skin\n..."
  }]
}

Example:

curl -X POST https://crob.at/api/team \
  -H "Content-Type: application/json" \
  -d '{"name": "My Team", "teams": [{"paste": "Garchomp @ Choice Scarf\n..."}]}'
const response = await fetch('https://crob.at/api/team', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    name: 'My Team',
    teams: [{paste: 'Garchomp @ Choice Scarf\n...'}]
  })
});

const {slug, url} = await response.json();
console.log(`Created: ${url}`);
import requests

response = requests.post('https://crob.at/api/team', json={
    'name': 'My Team',
    'teams': [{'paste': 'Garchomp @ Choice Scarf\n...'}]
})

data = response.json()
print(f"Created: {data['url']}")

Response:

{
  "slug": "abc123",
  "url": "https://crob.at/abc123"
}

GET /api/random-team/:format

Generate a random competitive team for a Smogon format. Returns the Showdown export plus rendered card HTML used by the site UI.

Example:

curl https://crob.at/api/random-team/gen9ou

Response:

{
  "teamText": "Gholdengo @ Leftovers\n...",
  "statsDate": "2026-03",
  "cardsHtml": "<div class=\"pokemon-grid\">...</div>"
}

GET /api/me

Return the currently authenticated crob.at user, if any. This endpoint is intended for same-origin session-aware UI.

Response:

{
  "user": {
    "username": "exampleuser"
  }
}

POST /api/showdown/assertion

Exchange the logged-in user's stored Showdown OAuth token for a challstr-specific assertion. Requires an authenticated crob.at session.

Request:

{
  "challstr": "12345|abcdefghijklmnopqrstuvwxyz"
}

Response:

{
  "username": "exampleuser",
  "assertion": "..."
}

Notes