schema_version.
How to read a row: Field is where the value goes in the file. events[].title means the title of each gig in the events list, and events[].shifts[].seats means the seats of each shift on each gig. A Required field must be there. Leave out anything else you don’t have.
Every field on this page is Stable. While the version starts with 2., no field is removed, renamed or changed in a way that breaks a file that worked before; new fields only get added. See Stability and versioning. A field that isn’t on this page can’t be imported: check_import_file and the import reject it.
This page is built from the same source as the format the get_import_format tool returns, and a test fails if they ever disagree. Every example is checked with check_import_file on each change, so you can copy one as a starting point.
Top of the file
These sit at the top of the file, beside the lists below. Every list is optional, but a file needs at least one record, and a key that isn’t on this page is rejected.| Field | Type | Required | Status | Notes |
|---|---|---|---|---|
schema_version | string | Yes | Stable | 2.0, or any later 2.x. |
source.type | string | Stable | SPREADSHEET | PASTE | INGESTION | EXPORT | |
source.name | string | Stable | Operator-facing label (filename, paste label, etc.) | |
source.ingested_at | string | Stable | RFC3339 timestamp when the source was ingested | |
source.import_job_id | string | Stable | ||
source.requested_by_user_id | string | Stable | ||
member_options.auto_create_positions | boolean | Stable | Auto-create positions. | |
member_options.overwrite_position_rates | boolean | Stable | Overwrite position rates. |
Team members (members[])
People to add to the organization’s team, with their roles and positions.
| Field | Type | Required | Status | Notes |
|---|---|---|---|---|
members[].email | Yes | Stable | The person’s email address — also the claim key when they sign up via Clerk. | |
members[].role | string | Stable | Org role: Member (default), Admin, Finance, or Gig Coordinator. Matching ignores case, a Clerk org: prefix (org:admin is Admin) and runs of spaces, hyphens, underscores and dots. An Owner is invited as Admin when the email is new; an existing member keeps their current role. A misspelt role is corrected to the role it means, with a warning in validation and spreadsheet previews; text that matches no role is refused, never set to Member. One of Member, Admin, Finance, Gig Coordinator. | |
members[].first_name | string | Stable | First name. | |
members[].last_name | string | Stable | Last name. | |
members[].phone_number | phone | Stable | Stored on the temp member; carried over to the real User once they claim. | |
members[].notes | string | Stable | Free-form notes about this person — visible to org admins. | |
members[].metadata | object | Stable | Optional JSON map for arbitrary custom fields (employee ID, T-shirt size, etc.). Paste as JSON: {“employee_id”:“E-123”}. | |
members[].positions[].name | string | Stable | Position name. | |
members[].positions[].rating | integer 1–5 | Stable | Position rating. | |
members[].positions[].notes | string | Stable | Position notes. | |
members[].positions[].day_rate | decimal | Stable | Position day rate. | |
members[].positions[].default_day_rate | decimal | Stable | Position default day rate. |
Example: team members
A team member with a role and two positions.{
"schema_version": "2.0",
"source": {
"type": "PASTE",
"name": "team-roster"
},
"members": [
{
"email": "dana@example.com",
"first_name": "Dana",
"last_name": "Reyes",
"role": "Gig Coordinator",
"phone_number": "+15125550101",
"positions": [
{
"name": "FOH Engineer",
"rating": 5,
"day_rate": 450
},
{
"name": "Monitor Engineer",
"rating": 4
}
]
}
],
"member_options": {
"auto_create_positions": true
}
}
Clients (clients[])
Clients (customers) that projects and gigs are for. Give a record a ref (any short name, such as main-stage) so other records in the same file can point at it, and an external_id (its ID in your other system) so importing the file again updates that record instead of adding a copy.
| Field | Type | Required | Status | Notes |
|---|---|---|---|---|
clients[].ref | string | Stable | Name for this client inside the document, used by client_ref. | |
clients[].external_id | string | Stable | Stable id from your CRM. Strongly recommended — it is what makes a re-import update rather than duplicate. | |
clients[].name | string | Yes | Stable | Company or person who books you — also the dedup key within your organization. |
clients[].email | Stable | Client email. | ||
clients[].phone | phone | Stable | Client phone. | |
clients[].website | string | Stable | Website. | |
clients[].status | string | Stable | Status. | |
clients[].notes | string | Stable | Notes. | |
clients[].address | string | Stable | Address. | |
clients[].city | string | Stable | City. | |
clients[].state | string | Stable | State / region. | |
clients[].postal_code | string | Stable | Postal code. | |
clients[].country | string | Stable | Country. | |
clients[].contacts[].name | string | Stable | A person at this client. Several rows naming the same client build one customer with several contacts. | |
clients[].contacts[].email | Stable | Contact email. | ||
clients[].contacts[].phone | phone | Stable | Contact phone. | |
clients[].contacts[].title | string | Stable | Contact title. | |
clients[].contacts[].is_primary | boolean | Stable | Marks this person as the main point of contact for the client. | |
clients[].provenance | object | Stable | Where this client came from. Kept with the document; not written to the client. |
Example: clients
A client with a ref, an external ID and a primary contact.{
"schema_version": "2.0",
"source": {
"type": "PARTNER",
"name": "acme-booking-feed"
},
"clients": [
{
"ref": "riverside",
"external_id": "CRM-1042",
"name": "Riverside Events Collective",
"email": "bookings@riverside.example.com",
"city": "Austin",
"state": "TX",
"contacts": [
{
"name": "Jordan Lee",
"email": "jordan@riverside.example.com",
"is_primary": true
}
]
}
]
}
Venues (venues[])
Venues that gigs take place at. Give a record a ref (any short name, such as main-stage) so other records in the same file can point at it, and an external_id (its ID in your other system) so importing the file again updates that record instead of adding a copy.
| Field | Type | Required | Status | Notes |
|---|---|---|---|---|
venues[].ref | string | Stable | Name for this venue inside the document, used by venue_ref. | |
venues[].external_id | string | Stable | Stable id from your source system. Strongly recommended — it is what makes a re-import update rather than duplicate. | |
venues[].name | string | Yes | Stable | Name of the venue — also the dedup key within your organization. |
venues[].address | string | Stable | Street address. | |
venues[].city | string | Stable | City. | |
venues[].state | string | Stable | State / region. | |
venues[].postal_code | string | Stable | Postal code. | |
venues[].country | string | Stable | Country. | |
venues[].phone_number | phone | Stable | Phone. | |
venues[].website | string | Stable | Website. | |
venues[].latitude | decimal | Stable | Latitude. | |
venues[].longitude | decimal | Stable | Longitude. | |
venues[].place_id | string | Stable | When present this is the strongest possible match key for a venue. | |
venues[].notes | string | Stable | Notes. | |
venues[].dock | string | Stable | Loading dock. | |
venues[].elevator | string | Stable | Elevator. | |
venues[].parking | string | Stable | Parking. | |
venues[].load_in | string | Stable | Load-in. | |
venues[].load_out | string | Stable | Load-out. | |
venues[].access_code | string | Stable | Door/gate code. Stored privately on your organization, never on the shared venue record. | |
venues[].capacity | integer ≥ 0 | Stable | Capacity. | |
venues[].venue_type | string | Stable | Venue type. | |
venues[].stage_size | string | Stable | Stage size. | |
venues[].wifi | string | Stable | WiFi. | |
venues[].dressing_rooms | integer ≥ 0 | Stable | Dressing rooms. | |
venues[].green_room | boolean | Stable | Green room. | |
venues[].house_tech | list of strings | Stable | Comma-separated list — e.g. house PA, lighting desk, monitors. | |
venues[].restrictions | list of strings | Stable | Comma-separated list — curfews, noise limits, rigging limits. | |
venues[].amenities | list of strings | Stable | Comma-separated list. | |
venues[].contact_name | string | Stable | Contact name. | |
venues[].contact_role | string | Stable | Contact role. | |
venues[].contact_email | Stable | Contact email. | ||
venues[].provenance | object | Stable | Where this venue came from. Kept with the document; not written to the venue. |
Example: venues
A venue with its production details.{
"schema_version": "2.0",
"source": {
"type": "PARTNER",
"name": "acme-booking-feed"
},
"venues": [
{
"ref": "amphitheater",
"name": "Riverside Amphitheater",
"address": "100 River Rd",
"city": "Austin",
"state": "TX",
"postal_code": "78701",
"country": "US",
"capacity": 2500,
"dock": "Two dock doors on the north side",
"green_room": true,
"house_tech": [
"Stage manager",
"Lighting director"
],
"contact_name": "Sam Ortiz",
"contact_email": "production@amphitheater.example.com"
}
]
}
Inventory (inventory[])
Gear the organization owns.
| Field | Type | Required | Status | Notes |
|---|---|---|---|---|
inventory[].name | string | Yes | Stable | Name of the equipment/gear item. Rematch key when external_id is absent. |
inventory[].external_id | string | Stable | Stable identity for rematch. Spreadsheet id or Soundcheck record id. | |
inventory[].category | string | Stable | Operator-defined category (Audio, Lighting, Staging, etc.). | |
inventory[].quantity | integer ≥ 0 | Stable | Number of units owned (stock quantity). Defaults to 1. A serialized item’s quantity is the count of its units, so its row quantity is not used. | |
inventory[].tracking | string | Stable | bulk (identical units counted by quantity; the default) or serialized (one unit per serial number). | |
inventory[].status | string | Stable | Operator-defined status (Available, In Repair, Retired, etc.). | |
inventory[].condition | string | Stable | Physical condition (New, Good, Fair, Poor). | |
inventory[].location | string | Stable | Where the item is stored. A bulk row’s quantity is allocated at the active location with this name (matched case-insensitively, or created). | |
inventory[].replacement_cost | decimal | Stable | Cost to replace one unit (numeric). | |
inventory[].daily_rate | decimal | Stable | Rental price per unit per day (numeric). | |
inventory[].serial_number | string | Stable | Manufacturer serial number for this unit or unit group. On a serialized row each serial number creates one unit of the item. | |
inventory[].manufacturer | string | Stable | Make or brand. | |
inventory[].model | string | Stable | Model name or number. | |
inventory[].case_type | string | Stable | How the item travels (road case, soft case, rack, none). | |
inventory[].case_dimensions | string | Stable | Packed size as written in the source, units included. | |
inventory[].weight | string | Stable | Packed weight as written in the source, units included. | |
inventory[].notes | string | Stable | Notes. |
Example: inventory
A piece of gear with its count and value.{
"schema_version": "2.0",
"source": {
"type": "SPREADSHEET",
"name": "warehouse.csv"
},
"inventory": [
{
"name": "Shure SM58",
"external_id": "INV-0007",
"category": "Microphones",
"quantity": 12,
"manufacturer": "Shure",
"model": "SM58",
"location": "Shelf B2"
}
]
}
Acts (acts[])
Performing acts that run-of-show items can name. Give a record a ref (any short name, such as main-stage) so other records in the same file can point at it, and an external_id (its ID in your other system) so importing the file again updates that record instead of adding a copy.
| Field | Type | Required | Status | Notes |
|---|---|---|---|---|
acts[].ref | string | Stable | Name for this act inside the document, used by act_ref. | |
acts[].external_id | string | Stable | The act’s ID in the source system. | |
acts[].name | string | Yes | Stable | The act’s name. Acts match by name, ignoring case. |
acts[].is_external | boolean | Stable | True when the act is booked from outside the organization. | |
acts[].notes | string | Stable | Act notes. |
Example: acts
An outside act that a run-of-show cue can name by ref.{
"schema_version": "2.0",
"source": {
"type": "PASTE",
"name": "festival-lineup"
},
"acts": [
{
"ref": "headliner",
"name": "The Velvet Hours",
"is_external": true
}
]
}
Songs (songs[])
The repertoire.
| Field | Type | Required | Status | Notes |
|---|---|---|---|---|
songs[].title | string | Yes | Stable | Song title. Together with the artist this is the dedup key. |
songs[].artist | string | Stable | Recording artist. Two songs with the same title and different artists stay separate. | |
songs[].duration | integer ≥ 0 | Stable | Length of the song in whole seconds (251 for 4:11). A JSON document takes a number; mm:ss text is read only from a spreadsheet column. | |
songs[].key | string | Stable | Key. | |
songs[].tempo | integer ≥ 0 | Stable | Tempo (BPM). | |
songs[].notes | string | Stable | Notes. |
Example: songs
A song with its duration in seconds and tempo.{
"schema_version": "2.0",
"source": {
"type": "SPREADSHEET",
"name": "repertoire.csv"
},
"songs": [
{
"title": "September",
"artist": "Earth, Wind & Fire",
"duration": 215,
"key": "A",
"tempo": 126
}
]
}
Setlists (setlists[])
Setlists and their sets.
| Field | Type | Required | Status | Notes |
|---|---|---|---|---|
setlists[].title | string | Stable | Rows sharing a title become one setlist. Also the dedup key. | |
setlists[].is_template | boolean | Stable | Mark the setlist reusable rather than tied to one gig. | |
setlists[].sets[].name | string | Stable | Set name. | |
setlists[].sets[].title | string | Stable | Alias for the set name. Import rejects a set whose title differs from its name. | |
setlists[].sets[].order | integer ≥ 0 | Stable | Set order. | |
setlists[].sets[].songs[].title | string | Stable | Song title. | |
setlists[].sets[].songs[].artist | string | Stable | Song artist. | |
setlists[].sets[].songs[].duration | integer ≥ 0 | Stable | Length of the song in whole seconds (251 for 4:11). A JSON document takes a number; mm:ss text is read only from a spreadsheet column. | |
setlists[].sets[].songs[].key | string | Stable | Song key. | |
setlists[].sets[].songs[].tempo | integer ≥ 0 | Stable | Song tempo. | |
setlists[].sets[].songs[].notes | string | Stable | Song notes. |
Example: setlists
A setlist template with one set of two songs.{
"schema_version": "2.0",
"source": {
"type": "PASTE",
"name": "wedding-sets"
},
"setlists": [
{
"title": "Wedding reception",
"is_template": true,
"sets": [
{
"name": "First dance set",
"order": 1,
"songs": [
{
"title": "At Last",
"artist": "Etta James"
},
{
"title": "September",
"artist": "Earth, Wind & Fire",
"duration": 215
}
]
}
]
}
]
}
Projects (projects[])
Tours, festivals, residencies and other bodies of work that own gigs. A gig without a project gets its own one-gig project. Give a record a ref (any short name, such as main-stage) so other records in the same file can point at it, and an external_id (its ID in your other system) so importing the file again updates that record instead of adding a copy.
| Field | Type | Required | Status | Notes |
|---|---|---|---|---|
projects[].ref | string | Stable | Name for this project inside the document, used by project_ref and affiliated_project_refs. | |
projects[].external_id | string | Stable | The project’s ID in the source system. A re-import with the same ID updates the same project. | |
projects[].name | string | Yes | Stable | Project name. |
projects[].description | string | Stable | Project description. | |
projects[].status | string | Stable | One of PLANNING | CONFIRMED | COMPLETED | CANCELLED | ARCHIVED. Defaults to PLANNING. | |
projects[].client_ref | ref → clients[].ref | Stable | Project client. | |
projects[].start_date | YYYY-MM-DD | Stable | Project start date. | |
projects[].end_date | YYYY-MM-DD | Stable | Project end date. | |
projects[].hide_from_crew | boolean | Stable | Hide the project’s name and details from crew. |
Example: projects
A tour that owns gigs, linked to its client by ref.{
"schema_version": "2.0",
"source": {
"type": "PARTNER",
"name": "acme-booking-feed"
},
"clients": [
{
"ref": "riverside",
"name": "Riverside Events Collective"
}
],
"projects": [
{
"ref": "summer",
"external_id": "PRJ-2026-SUMMER",
"name": "Riverside Summer Series 2026",
"status": "CONFIRMED",
"client_ref": "riverside",
"start_date": "2026-06-01",
"end_date": "2026-08-31"
}
]
}
Gigs (events[])
Gigs, each with its days, run of show, shifts and crew. Give a record a ref (any short name, such as main-stage) so other records in the same file can point at it, and an external_id (its ID in your other system) so importing the file again updates that record instead of adding a copy.
Each events[].pack_items[] needs at least one of name or external_id.
| Field | Type | Required | Status | Notes |
|---|---|---|---|---|
events[].ref | string | Stable | Name for this gig inside the document. | |
events[].external_id | string | Stable | Stable identifier from the source system (e.g. operator’s gig ID). Strongly recommended — drives upsert vs insert on re-import. | |
events[].project_ref | ref → projects[].ref | Stable | The project that owns this gig. Without it the gig gets its own one-gig project. | |
events[].affiliated_project_refs | list of refs → projects[].ref | Stable | Other projects this gig is linked to without belonging to them. | |
events[].title | string | Yes | Stable | Name of the event/gig (e.g. ‘Acme Corp Holiday Party’). |
events[].event_date | YYYY-MM-DD | Yes | Stable | The calendar date the event takes place. |
events[].end_date | YYYY-MM-DD | Stable | Last calendar day of a multi-day gig. Omit for a one-day gig. | |
events[].event_type | string | Stable | Operator-defined category — Wedding, Corporate, Concert, Festival, etc. | |
events[].start_time | date-time | Stable | The gig’s start time: an RFC 3339 timestamp with an offset (2026-06-15T19:00:00-04:00) or a local date-time. A bare date is rejected. One-day gigs only; a multi-day gig puts its times on its days. | |
events[].end_time | date-time | Stable | The gig’s end time: an RFC 3339 timestamp with an offset (2026-06-15T19:00:00-04:00) or a local date-time. A bare date is rejected. One-day gigs only; a multi-day gig puts its times on its days. | |
events[].timezone | string | Stable | IANA zone for offset-less start/end walls (e.g. America/Chicago). Persisted on Event.timezone. | |
events[].status | string | Stable | ACTIVE | ARCHIVED | UNARCHIVED | DRAFT | TEMPLATE | COMPLETED | SETTLED | CANCELLED. Defaults to ACTIVE. | |
events[].default_performance_fee | decimal | Stable | Per-performer fee paid out by the event (numeric, e.g. 500.00). | |
events[].currency | string | Stable | ISO 4217 code; defaults to USD. | |
events[].payment_terms | string | Stable | Free-text e.g. ‘Net 30’, ‘On the day’, ‘COD’. | |
events[].notes | string | Stable | Notes visible to crew and clients. | |
events[].admin_notes | string | Stable | Internal-only notes. | |
events[].location | string | Stable | Full street address. Map here if there’s no separate venue column. | |
events[].location_name | string | Stable | Human-readable name of the room/space. | |
events[].latitude | decimal | Stable | Latitude. | |
events[].longitude | decimal | Stable | Longitude. | |
events[].place_id | string | Stable | Place ID. | |
events[].venue_ref | ref → venues[].ref | Stable | The gig’s venue. Use this or an inline venue object, not both. | |
events[].venue.name | string | Stable | Name of the venue. Use this when the source has a dedicated venue column. | |
events[].venue.external_id | string | Stable | Source-system identifier for this venue (e.g. CRM ID). Improves dedup. | |
events[].venue.address | string | Stable | Street address of the venue. | |
events[].venue.city | string | Stable | Venue city. | |
events[].venue.state | string | Stable | Venue state. | |
events[].venue.postal_code | string | Stable | Venue postal code. | |
events[].venue.country | string | Stable | Venue country. | |
events[].venue.phone_number | phone | Stable | Venue phone. | |
events[].venue.website | string | Stable | Venue website. | |
events[].venue.notes | string | Stable | Venue notes. | |
events[].venue.latitude | decimal | Stable | Venue latitude. | |
events[].venue.longitude | decimal | Stable | Venue longitude. | |
events[].venue.place_id | string | Stable | Venue place ID. | |
events[].client_ref | ref → clients[].ref | Stable | The gig’s client. Use this or an inline client object, not both. | |
events[].client.name | string | Stable | Client/buyer who books the event. | |
events[].client.email | Stable | Customer email. | ||
events[].client.phone | phone | Stable | Customer phone. | |
events[].client.external_id | string | Stable | Customer external ID. | |
events[].client.website | string | Stable | Customer website. | |
events[].client.notes | string | Stable | Customer notes. | |
events[].days[].date | YYYY-MM-DD | Yes | Stable | A calendar day of the gig, between event_date and end_date. |
events[].days[].phases | list of strings | Stable | What happens that day: any of PREP | LOAD_IN | REHEARSAL | SHOW | LOAD_OUT | RETURN | TRAVEL | DARK. | |
events[].days[].notes | string | Stable | Day notes. | |
events[].days[].run_of_show[].name | string | Yes | Stable | Cue. |
events[].days[].run_of_show[].start | string | Stable | Local time on that day as HH:MM (24-hour), in the gig’s timezone. | |
events[].days[].run_of_show[].end | string | Stable | Local time on that day as HH:MM (24-hour). An end before the start runs past midnight. | |
events[].days[].run_of_show[].days_later | integer 1–365 | Stable | How many calendar days after the listed day this cue’s times fall, for a cue after midnight. Leave out for a cue on the listed day. | |
events[].days[].run_of_show[].segment | string | Stable | Name of the segment this cue belongs to. Places a cue without a start time in its segment; a cue with a start time is placed by its time when this is left out. | |
events[].days[].run_of_show[].notes | string | Stable | Cue notes. | |
events[].days[].run_of_show[].act_ref | ref → acts[].ref | Stable | The act performing this cue. | |
events[].days[].run_of_show[].timing_mode | string | Stable | How the cue is timed: CLOCK | SEGUE | ON_CUE. ON_CUE needs a timing_label. | |
events[].days[].run_of_show[].timing_label | string | Stable | Text shown in place of a clock time for an ON_CUE cue, for example Upon cue during dinner. Up to 120 characters. | |
events[].days[].run_of_show[].duration_minutes | integer ≥ 0 | Stable | Minimum length of the cue in minutes. | |
events[].days[].run_of_show[].duration_max_minutes | integer 0–1440 | Stable | Longest the cue may run in minutes. Must be at least duration_minutes. | |
events[].days[].run_of_show[].tentative | boolean | Stable | True when the cue is not yet confirmed. | |
events[].days[].run_of_show[].playback_source | string | Stable | Where the cue’s audio plays from: LIVE | TRACK | DS_IPAD | OTHER. | |
events[].days[].run_of_show[].note_roles | list of strings | Stable | Who the cue’s note is for: any of SOUND | BAND_LEADER | PLANNER | MUSICIANS. | |
events[].days[].run_of_show[].instructions | string | Stable | Instructions for the people performing or running the cue. Up to 4000 characters. | |
events[].days[].run_of_show[].location | string | Stable | Where the cue happens. A cue with no location takes its segment’s location. | |
events[].days[].run_of_show[].ensemble | string | Stable | The ensemble performing the cue, for example the band’s name and headcount. | |
events[].days[].run_of_show[].speakers[].name | string | Yes | Stable | Who speaks during the cue, in order. |
events[].days[].run_of_show[].speakers[].relationship | string | Stable | How the speaker is related to the event, for example Parent of the groom. | |
events[].days[].run_of_show[].speakers[].minutes | integer 0–600 | Stable | How long the speaker talks, in minutes. | |
events[].days[].segments[].name | string | Yes | Stable | The segment’s name, for example Reception. A cue whose start falls inside the segment’s window is filed under it. |
events[].days[].segments[].start | string | Stable | Local time on that day as HH:MM (24-hour), in the gig’s timezone. | |
events[].days[].segments[].end | string | Stable | Local time on that day as HH:MM (24-hour). An end before the start runs past midnight. | |
events[].days[].segments[].days_later | integer 1–365 | Stable | How many calendar days after the listed day this segment’s times fall. Leave out for a segment on the listed day. | |
events[].days[].segments[].segment_kind | string | Stable | What the segment is: any of CEREMONY | COCKTAILS | RECEPTION | DINNER | DANCING | AFTER_PARTY | OTHER | SOUND_CHECK | LOAD_IN | REHEARSAL | DOORS | SHOW | INTERMISSION | LOAD_OUT. | |
events[].days[].segments[].booking_state | string | Stable | BOOKED when the org plays the segment, CONTEXT_ONLY when it is on the schedule but not booked by the org: any of BOOKED | CONTEXT_ONLY. | |
events[].days[].segments[].location | string | Stable | Where the segment happens. A cue with no location of its own takes it. | |
events[].days[].segments[].ensemble | string | Stable | The ensemble that plays the segment, for example the band’s name. | |
events[].days[].segments[].piece_count | integer 0–99 | Stable | How many instrumentalists play the segment, from 0 to 99. | |
events[].days[].segments[].vocal_count | integer 0–99 | Stable | How many vocalists sing in the segment, from 0 to 99. | |
events[].days[].segments[].gear_notes | string | Stable | Equipment the segment needs, for example music stands. | |
events[].shifts[].title | string | Stable | What the shift is called, in the source’s own words. Shown on the staffing board and used to match an org position when no separate role column is mapped. | |
events[].shifts[].position | string | Stable | Role to resolve against this org’s positions. Defaults to the shift name. An unmatched role still creates the shift — it just arrives unassigned for someone to map. | |
events[].shifts[].seats | integer ≥ 1 | Stable | How many people this shift needs. Defaults to 1. | |
events[].shifts[].call_start | date-time | Stable | Start of the call window. This decides which days the shift covers — a separate day count is not used, because sources routinely bill 1.5 days for a single-day call. | |
events[].shifts[].call_end | date-time | Stable | End of the call window. Absent, or on the same day as the start, makes a one-day shift. | |
events[].shifts[].fee | decimal | Stable | Per-person rate for the shift. Blank inherits the position default. | |
events[].shifts[].fee_type | string | Stable | FIXED (a day rate) or HOURLY. Defaults to FIXED. One of FIXED, HOURLY. | |
events[].shifts[].notes | string | Stable | What the shift is for. | |
events[].shifts[].external_id | string | Stable | Identifier from the source system, so a shift can be traced back to its line. | |
events[].shifts[].currency | string | Stable | ISO 4217 code of the shift and day rates. Blank uses the gig’s currency. | |
events[].shifts[].days[].date | YYYY-MM-DD | Yes | Stable | A working day of the shift. When a shift lists days, they decide which days it covers instead of the call window. |
events[].shifts[].days[].call_start | date-time | Stable | Start of the call on that day. Blank inherits no time. | |
events[].shifts[].days[].call_end | date-time | Stable | End of the call on that day. | |
events[].shifts[].days[].seats | integer ≥ 1 | Stable | How many people that day needs. Blank uses the shift’s seats. | |
events[].shifts[].days[].fee | decimal | Stable | Per-person rate for that day. Blank uses the shift rate. | |
events[].shifts[].crew[].first_name | string | Stable | Crew first name. | |
events[].shifts[].crew[].last_name | string | Stable | Crew last name. | |
events[].shifts[].crew[].email | Stable | Crew email. | ||
events[].shifts[].crew[].phone_number | phone | Stable | Crew phone. | |
events[].shifts[].crew[].performance_fee | decimal | Stable | Per-performer fee override (otherwise uses event default). | |
events[].shifts[].crew[].fee_notes | string | Stable | Member fee notes. | |
events[].shifts[].crew[].call_order | integer ≥ 0 | Stable | Member call order. | |
events[].pack_items[].name | string | Stable | Inventory item to pack for the gig, matched by name when no gear external ID is mapped. An item not in inventory yet is added to it. | |
events[].pack_items[].external_id | string | Stable | The inventory item external ID (spreadsheet id or Soundcheck record id), matched before the name. | |
events[].pack_items[].quantity | integer ≥ 1 | Stable | How many units pack out for the gig. Defaults to 1. | |
events[].pack_items[].notes | string | Stable | Packing note for this line. | |
events[].guest_count | integer ≥ 0 | Stable | Estimated guest count. A new gig takes it; an existing gig takes it only while its guest count is empty. | |
events[].honorees | list of strings | Stable | People the show honors (the couple, the guest of honor). Each name becomes a guest list entry marked Honoree. | |
events[].crew_requirements.dress_preset | string | Stable | The dress code, by the key or label of an org dress preset. Text that names no preset is kept as dress notes. | |
events[].crew_requirements.dress_notes | string | Stable | Extra dress instructions for this gig. | |
events[].crew_requirements.reminders | string | Stable | Reminders for the crew on this gig, one per line. The org standing reminders apply on top. | |
events[].contacts[].role | string | Stable | What the contact does on this show. | |
events[].contacts[].name | string | Stable | The person to reach. A contact needs a name or a company. | |
events[].contacts[].company | string | Stable | The vendor or company, for example the sound vendor. | |
events[].contacts[].phone | string | Stable | Phone number. | |
events[].contacts[].email | string | Stable | Email address. | |
events[].contacts[].notes | string | Stable | Anything else about the contact. | |
events[].band_leaders[].name | string | Stable | A band leader. A crew member on the gig with this name gets the leader role; anyone else becomes a show contact. | |
events[].band_leaders[].role | string | Stable | MD or music director, MC, or leader. | |
events[].venue_overrides.parking | string | Stable | Parking directions for this gig, overriding the venue parking notes. | |
events[].venue_overrides.load_in | string | Stable | Load-in directions or terrain for this gig, overriding the venue load-in notes. | |
events[].venue_overrides.green_room | string | Stable | Where the green room is for this gig, overriding the venue green room instructions. | |
events[].show_notes | list of strings | Stable | Venue notes for this show, such as shade or weather cover. | |
events[].stage_note | string | Stable | How the stage differs for this gig (size, risers, tech area). It goes on the booked stage, or into a show note when the gig has no single booked stage. | |
events[].links[].label | string | Stable | What the link is, for example the stage plot or load-in map. | |
events[].links[].url | string | Yes | Stable | An http or https link. |
events[].outside_gear[].name | string | Yes | Stable | Gear someone outside the org brings to the gig. |
events[].outside_gear[].quantity | integer ≥ 1 | Stable | How many; 1 when omitted. | |
events[].outside_gear[].provided_by | string | Yes | Stable | Who brings it: BAND, VENDOR or VENUE. One of BAND, VENDOR, VENUE. |
events[].outside_gear[].provider_name | string | Stable | The vendor, band or venue by name. | |
events[].outside_gear[].notes | string | Stable | Anything else about the gear. | |
events[].ledger_items[].external_id | string | Stable | The line’s ID in the source system. Without it, a line matches by type, description, amount and date. | |
events[].ledger_items[].type | string | Yes | Stable | One of INCOME | EXPENSE | PAYABLE | RECEIVABLE. |
events[].ledger_items[].description | string | Yes | Stable | Ledger line description. |
events[].ledger_items[].amount | decimal | Yes | Stable | A positive amount with at most two decimal places. The type says which way the money moves. |
events[].ledger_items[].currency | string | Stable | ISO 4217 code. Defaults to the gig’s currency. | |
events[].ledger_items[].date | YYYY-MM-DD | Stable | The business day of the line. Defaults to the gig’s first day. | |
events[].ledger_items[].status | string | Stable | One of UNPAID | PAID. Defaults to PAID for income and expense lines and UNPAID for payables and receivables. | |
events[].ledger_items[].counterparty_name | string | Stable | Who pays or is paid. | |
events[].ledger_items[].account_hint | string | Stable | Name of the organization’s ledger account. Without a match the line goes to the organization’s income or expense account. | |
events[].ledger_items[].notes | string | Stable | Ledger line notes. | |
events[].ledger_items[].provenance | object | Stable | Where this line came from. Kept with the document; not written to the line. | |
events[].provenance | object | Stable | Where this gig came from (source system, source file ids, fetch time). Kept with the document; not written to the gig. | |
events[].days[].run_of_show[].provenance | object | Stable | Where this cue came from. Kept with the document; not written to the cue. | |
events[].shifts[].crew[].provenance | object | Stable | Where this person came from. Kept with the document; not written to the invitation. |
Example: gigs
A one-day gig with an inline venue, a run of show, a staffed shift, a gear line and a deposit.{
"schema_version": "2.0",
"source": {
"type": "PARTNER",
"name": "acme-booking-feed"
},
"events": [
{
"ref": "gala",
"external_id": "BK-5531",
"title": "Hillcrest Foundation Gala",
"event_date": "2026-09-12",
"event_type": "Corporate",
"timezone": "America/Chicago",
"status": "DRAFT",
"currency": "USD",
"venue": {
"name": "Hillcrest Ballroom",
"city": "Dallas",
"state": "TX"
},
"days": [
{
"date": "2026-09-12",
"phases": [
"LOAD_IN",
"SHOW",
"LOAD_OUT"
],
"run_of_show": [
{
"name": "Load in",
"start": "14:00"
},
{
"name": "Doors",
"start": "18:00"
},
{
"name": "Band set",
"start": "21:00",
"end": "23:30"
},
{
"name": "Strike",
"start": "00:00",
"days_later": 1
}
]
}
],
"shifts": [
{
"title": "A1",
"position": "FOH Engineer",
"seats": 2,
"fee": 400,
"fee_type": "FIXED",
"crew": [
{
"first_name": "Dana",
"last_name": "Reyes",
"email": "dana@example.com"
}
]
}
],
"pack_items": [
{
"name": "Shure SM58",
"quantity": 6
}
],
"ledger_items": [
{
"type": "RECEIVABLE",
"description": "Deposit",
"amount": 2500,
"date": "2026-07-01",
"counterparty_name": "Hillcrest Foundation"
}
]
}
]
}
Leads (leads[])
Booking inquiries.
| Field | Type | Required | Status | Notes |
|---|---|---|---|---|
leads[].provenance | object | Stable | Where this lead came from. Kept with the document; not written to the lead. | |
leads[].event_ref | ref → events[].ref | Stable | The gig this inquiry is about, by its ref in this document. | |
leads[].name | string | Yes | Stable | Full name of the prospective client / deal contact. |
leads[].email | Yes | Stable | Client email — also the dedup key for the lead. | |
leads[].phone | phone | Stable | Client phone. | |
leads[].event_date | YYYY-MM-DD | Yes | Stable | The requested event date. |
leads[].event_type | string | Stable | Category of event — Wedding, Corporate, etc. | |
leads[].location | string | Stable | Event location / venue text. | |
leads[].latitude | decimal | Stable | Latitude. | |
leads[].longitude | decimal | Stable | Longitude. | |
leads[].deal_stage | string | Stable | HubSpot pipeline stage. Leads in/past the operator-selected ‘Quote Requested’ stage also become events. | |
leads[].budget | string | Stable | Budget range or amount — stored as free text. | |
leads[].message | string | Stable | Additional details about the request. | |
leads[].status | string | Stable | PENDING | COMPLETED. Defaults to PENDING. | |
leads[].external_id | string | Stable | Source deal identifier. Recommended — links the lead to its derived event. |
Example: leads
A booking inquiry.{
"schema_version": "2.0",
"source": {
"type": "PARTNER",
"name": "website-inquiries"
},
"leads": [
{
"external_id": "WEB-881",
"name": "Priya Shah",
"email": "priya@example.com",
"event_date": "2027-05-22",
"event_type": "Wedding",
"location": "Austin, TX",
"message": "Looking for a band and sound for 150 guests."
}
]
}