Public API (v1)

Read-only JSON endpoints for embedding ClayShoot data on external sites. No API key required. CORS is enabled for all origins.

Envelope

{
  "data": {...},
  "meta": { "generated_at": "2026-01-01T00:00:00Z", "version": "v1" }
}

Pre-reveal shoots return results_revealed: false with empty leaderboards. Endpoints never return PII (email, phone, PIN hashes, tokens).

Endpoints

GET/api/public/v1/shoots

List published shoots (100 most recent).

GET/api/public/v1/shoots/{shootId}

Shoot summary.

GET/api/public/v1/shoots/{shootId}/leaderboard

Individual leaderboard, ordered by total hits.

GET/api/public/v1/shoots/{shootId}/teams

Team leaderboard, ordered by total hits.

GET/api/public/v1/openapi

OpenAPI 3.1 spec for machine-readable discovery.

GET/api/public/v1/_metrics

In-memory request counters, durations, and recent errors for lightweight monitoring.

Caching

Responses set Cache-Control: public, s-maxage=30, stale-while-revalidate=60. Poll no faster than every 10 seconds.

Example

curl https://clayshoot.app/api/public/v1/shoots

Live demo

A reference implementation consuming these endpoints lives at /embed — shoot summary, individual leaderboard, and team leaderboard, all fetched client-side.