Submit a BandSubmit a VenueSubmit a ShowBULK SHOW IMPORT (CSV)SUBMISSION API DOCS

Submission API

All three community submission types (bands, venues, shows) are available as a JSON API. The endpoints are identical to the web forms — POST the same fields as JSON and receive a JSON response. Submissions are reviewed by admins before going live.

Rate limiting is enforced by Cloudflare at the network level. Respect it — back off on 429.

POST /submit — Submit a Band

curl -X POST https://txmetalindex.com/submit \
  -H "Content-Type: application/json" \
  -d '{
    "name":           "Band Name",          // required
    "genres":         ["Thrash Metal"],     // required, array, must match taxonomy
    "city":           "Houston",
    "year_formed":    1987,
    "band_status":    "active",             // active | inactive | disbanded | hiatus
    "description":    "...",
    "bandcamp_url":   "https://...",
    "spotify_url":    "https://...",
    "instagram_url":  "https://...",
    "website_url":    "https://...",
    "image_url":      "https://...",
    "country_code":   "US",
    "state_code":     "TX",
    "submitted_by":   "Your Name",
    "submitted_email":"you@example.com"
  }'
// 200 OK
{ "ok": true, "message": "Band submission received and pending review." }

// 400 Bad Request
{ "errors": ["Band name is required.", "At least one genre is required."] }

POST /submit/venue — Submit a Venue

curl -X POST https://txmetalindex.com/submit/venue \
  -H "Content-Type: application/json" \
  -d '{
    "name":           "Venue Name",         // required
    "address_line1":  "123 Main St",        // required
    "city":           "Dallas",             // required
    "state_code":     "TX",
    "country_code":   "US",                 // required, 2-letter ISO
    "postal_code":    "75201",
    "description":    "...",               // required
    "parking_detail": "...",               // required
    "website_url":    "https://...",
    "submitted_by":   "Your Name",
    "submitted_email":"you@example.com"
  }'
// 200 OK
{ "ok": true, "message": "Venue submission received and pending review." }

// 400 Bad Request
{ "errors": ["Venue name is required.", "Description is required."] }

POST /submit/show — Submit a Show

The headlining band and venue must already be approved in the directory. Support acts will be linked when found. Look up IDs via the lookup endpoints below.

curl -X POST https://txmetalindex.com/submit/show \
  -H "Content-Type: application/json" \
  -d '{
    "band_ids":       ["42", "17", "88"],   // required, first ID = headliner (must be approved)
    "venue_id":       "7",                  // required, numeric ID from venue lookup
    "event_date":     "2026-06-15",         // required, YYYY-MM-DD
    "event_time":     "20:00",              // optional, HH:MM
    "ticket_url":     "https://...",        // optional
    "submitted_by":   "Your Name",
    "submitted_email":"you@example.com"
  }'
// 200 OK
{ "ok": true, "message": "Show submission received and pending review." }

// 400 Bad Request
{ "errors": ["A valid band is required.", "Event date is required."] }

Lookup Endpoints

Use these to resolve slugs or names to numeric IDs for show submissions.

GET /api/submit/band-lookup?q=iron+maiden
// Returns array of: { id, name, slug, city, state_code }

GET /api/submit/venue-lookup?q=house+of+blues
// Returns array of: { id, name, slug, city, state_code }