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 }