Read and write your league data from your own software. The API covers leagues, seasons, categories, standings, matches, rosters and events.

No sandbox

An rk_live_ key acts on your organization’s real data. Start with a read key, which cannot change anything.

Server to server only

The API does not answer browsers: it allows no CORS origin. Never put your key in browser-side code.

Leagues plan required

Issuing a key requires your organization’s Leagues plan. You then create your key in the Integrations screen.See the Leagues plan

The essentials

Base URL
Every operation starts from https://gorally.games/v1.
Key
Send it in the Authorization: Bearer rk_live_… header, never in the URL.
Format
JSON requests and responses. An error returns error, code and request_id.
Tracing
Every response carries X-Request-Id. Include it when you write to us.

Guides

Connect your software step by step, from your first key to webhooks.

  • Quickstart

    Create a key in the Integrations screen, make your first call to the Rally Leagues API, then read a category’s standings with curl, JavaScript or Python.

  • Authentication and scopes

    Send your rk_live_ key in the Authorization header, pick the read, write, members:read and members:write scopes, then rotate or revoke your key safely.

  • Webhooks

    Receive your league events by webhook: the 20 event types, the Standard Webhooks signature to verify, delivery retries and catch-up through GET /v1/events.

  • Errors

    The Rally Leagues API error format, its 16 stable codes with their cause and what to do, and the X-Request-Id and Retry-After headers to read.

  • Idempotency

    Send an Idempotency-Key on every POST to retry a write without duplicates for 24 hours, and protect your PATCH requests with the expected revision.

  • Pagination

    Walk the Rally Leagues API lists with the after cursor, a limit from 25 to 100 and the list envelope with has_more, without skipping or repeating an item.

  • Limits

    Your key’s quota of 120 requests per minute and 3,000 per hour, the Retry-After header to honor, the 10-second limit and the 16 KiB body cap.

What the API does

Operations are grouped into four families.

  • Competition

    Leagues, seasons, categories, standings.

  • Results

    Matches and result entry.

  • Rosters

    Under members:* scopes only — the only surface that carries people's names.

  • Events

    The same feed as webhooks, readable and replayable.

Full reference

Every operation with its scope, parameters, schemas, examples and error codes.

The OpenAPI contract

The reference is generated from this OpenAPI 3.1 contract. It can be read without a key.

Generate a client

There is no official SDK yet. Generate a typed client from the contract instead.

TypeScript, with openapi-typescript and openapi-fetch

npx openapi-typescript https://gorally.games/v1/openapi.json -o rally.d.ts
npm install openapi-fetch
import createClient from 'openapi-fetch';
import type { paths } from './rally';

const rally = createClient<paths>({
  baseUrl: 'https://gorally.games/v1',
  headers: { Authorization: `Bearer ${process.env.RALLY_API_KEY}` },
});

const { data, error } = await rally.GET('/leagues');

Python, with openapi-python-client

pipx run openapi-python-client generate --url https://gorally.games/v1/openapi.json
import os
from rally_leagues_api_client import AuthenticatedClient
from rally_leagues_api_client.api.competition import lister_ligues

client = AuthenticatedClient(
    base_url="https://gorally.games/v1",
    token=os.environ["RALLY_API_KEY"],
)
ligues = lister_ligues.sync(client=client)