{"openapi":"3.1.0","info":{"title":"Assignment Desk API","version":"1.0.0","description":"Assignment Desk provides a free public REST API for searching video production crew members, checking day rates, browsing equipment, and submitting shoot requests across 96+ US cities. All public endpoints require no authentication. The API returns JSON with a consistent { success, data, meta } envelope. Use this API to find and book camera operators, directors of photography, audio technicians, gaffers, and 25+ other crew roles nationwide.","contact":{"name":"Assignment Desk API Support","email":"adesk@assignmentdesk.com","url":"https://assignmentdesk.com/developers"},"license":{"name":"Proprietary","url":"https://assignmentdesk.com/terms"},"termsOfService":"https://assignmentdesk.com/terms","x-llm-description":"This API lets AI assistants search for video production crew by city and role, check market day rates, browse professional equipment, and submit crew booking requests. All read endpoints are free and require no API key."},"servers":[{"url":"https://assignmentdesk.com","description":"Production server"}],"tags":[{"name":"Crew","description":"Search and browse 4,200+ video production crew members by city, role, and name.","x-llm-hint":"Use these endpoints to find crew members for a video production shoot."},{"name":"Rates","description":"Aggregate day rate statistics from 36,000+ real crew assignments, broken down by role and city.","x-llm-hint":"Use these endpoints to answer questions about how much video crew costs in a specific city."},{"name":"Equipment","description":"Browse the professional equipment catalog with owner counts showing gear availability."},{"name":"Jobs","description":"Open crew positions (gigs) available for booking. Includes internal assignments and external job postings."},{"name":"Clients","description":"Enterprise and premium client portfolio — companies that book crew through Assignment Desk."},{"name":"Statistics","description":"Platform-wide aggregate statistics (total productions, crew network size, etc.)."},{"name":"Bookings","description":"Submit shoot requests and crew booking briefs.","x-llm-hint":"Use the POST /api/brief/onboard endpoint to book crew for a production."}],"paths":{"/api/public/crew":{"get":{"operationId":"searchCrew","summary":"Search crew directory","description":"Returns a paginated list of public video production crew members. Supports filtering by city, state, role/specialty, name search, and geo-radius. Results are sorted by best match (staff crew and highest-rated first) by default. Returns up to 500 results when unfiltered; filtered queries are uncapped.","tags":["Crew"],"x-llm-hint":"Use this to find crew in a specific city. Example: /api/public/crew?city=Chicago&role=Camera+Operator","parameters":[{"name":"city","in":"query","description":"Filter by city name (partial match, case-insensitive). Searches both primary and multi-market locations.","schema":{"type":"string"},"example":"Chicago"},{"name":"state","in":"query","description":"Filter by US state abbreviation or name (case-insensitive).","schema":{"type":"string"},"example":"IL"},{"name":"role","in":"query","description":"Filter by crew role/specialty. Expands to related roles in the same department family.","schema":{"type":"string"},"example":"Camera Operator"},{"name":"roles","in":"query","description":"Comma-separated list of roles for multi-select filtering. Takes precedence over 'role' param.","schema":{"type":"string"},"example":"Camera Operator,Director of Photography"},{"name":"search","in":"query","description":"Search by crew member first or last name (partial match).","schema":{"type":"string"},"example":"Smith"},{"name":"sort","in":"query","description":"Sort order for results.","schema":{"type":"string","enum":["best_match","name","rating","shoots","newest"],"default":"best_match"}},{"name":"lat","in":"query","description":"Latitude for geo-radius search. Must be used with 'lon'. Overrides city filter.","schema":{"type":"number","format":"float"},"example":41.8781},{"name":"lon","in":"query","description":"Longitude for geo-radius search. Must be used with 'lat'.","schema":{"type":"number","format":"float"},"example":-87.6298},{"name":"radius","in":"query","description":"Radius in miles for geo search (default 50). Used with lat/lon.","schema":{"type":"number","default":50}},{"name":"page","in":"query","description":"Page number (1-based).","schema":{"type":"integer","default":1,"minimum":1}},{"name":"limit","in":"query","description":"Results per page (max 100).","schema":{"type":"integer","default":24,"minimum":1,"maximum":100}}],"responses":{"200":{"description":"Paginated list of crew members.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrewListResponse"},"example":{"success":true,"data":[{"id":42,"slug":"john-smith-chicago-il","firstName":"John","lastName":"Smith","city":"Chicago","state":"IL","specialty":"Director of Photography","avatarUrl":"https://gototeam-wordpress-assets.s3.amazonaws.com/wp-content/uploads/2024/07/example.png","isGttMember":true,"ratingAvg":4.8,"ratingCount":32,"shootCount":150,"badges":["Staff","50+ Shoots"],"startingRate":650}],"meta":{"total":4200,"page":1,"limit":24,"totalPages":175}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/public/crew/{slug}":{"get":{"operationId":"getCrewProfile","summary":"Get crew member profile","description":"Returns the full public profile for a single crew member including equipment list, portfolio links, aggregate rating, shoot count, client list, rate card (Enhanced+ only), and production vehicles. Contact info (email, phone) is never returned — use the contact endpoint for that (requires auth).","tags":["Crew"],"x-llm-hint":"Use this to get detailed info about a specific crew member by their URL slug or numeric ID.","parameters":[{"name":"slug","in":"path","required":true,"description":"URL slug (e.g., 'john-smith-chicago-il') or numeric user ID.","schema":{"type":"string"},"example":"john-smith-chicago-il"}],"responses":{"200":{"description":"Full crew profile.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrewProfileResponse"},"example":{"success":true,"data":{"id":42,"slug":"john-smith-chicago-il","firstName":"John","lastName":"Smith","city":"Chicago","state":"IL","country":"US","specialty":"Director of Photography","avatarUrl":"https://example.com/headshot.png","bio":"Emmy award-winning DP with 15 years of broadcast experience...","isGttMember":true,"equipment":[{"name":"Sony FX9","category":"Camera","notes":null},{"name":"Sennheiser MKH 416","category":"Audio","notes":null}],"portfolios":[{"type":"reel","url":"https://vimeo.com/123456","title":"2025 Demo Reel"}],"ratingAvg":4.8,"ratingCount":32,"shootCount":150,"clients":[{"client_name":"ESPN","logo_url":"https://example.com/espn.png"},{"client_name":"CNN","logo_url":null}],"badges":["Staff","50+ Shoots"],"startingRate":650,"rateCard":[{"roleName":"Director of Photography","askingRate":650,"rateType":"day","notes":null}],"vehicles":[{"make":"Ford","model":"Transit","year":2023,"photoUrl":null}]}}}}},"404":{"description":"Crew member not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Crew member not found"}}}}}}}},"/api/public/crew/{slug}/rates":{"get":{"operationId":"getCrewRates","summary":"Get crew member rate card","description":"Returns the public rate card for a crew member. Only available for Enhanced and Elite tier members with public rates enabled. Basic tier members return an empty rate card.","tags":["Crew","Rates"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Crew member URL slug.","schema":{"type":"string"}}],"responses":{"200":{"description":"Crew rate card with crew rates and equipment rental rates.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrewRatesResponse"},"example":{"success":true,"data":{"crewRates":[{"roleName":"Director of Photography","askingRate":650,"rateType":"day","notes":null},{"roleName":"Camera Operator","askingRate":500,"rateType":"day","notes":"Includes basic kit"}],"equipmentRates":[{"equipmentName":"Sony FX9 Full Kit","equipmentCategory":"Camera","rentalRate":350,"rateType":"day","includesWithRole":"Director of Photography","notes":null}],"tierEligible":true}}}}},"404":{"description":"Crew member not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/public/crew/stats":{"get":{"operationId":"getCrewStats","summary":"Get crew directory statistics","description":"Returns aggregate statistics for the crew directory: total crew count, counts by city, counts by role/specialty, top cities, and top roles. Cached for 24 hours.","tags":["Crew","Statistics"],"x-llm-hint":"Use this to answer 'How many crew does Assignment Desk have?' or 'What cities have the most crew?'","responses":{"200":{"description":"Aggregate crew statistics.","content":{"application/json":{"example":{"success":true,"data":{"totalCrew":4200,"cityCount":96,"roleCount":24,"avgRating":4.6,"ratedCrewCount":1850,"topCities":[{"city":"New York","state":"NY","count":380},{"city":"Los Angeles","state":"CA","count":340},{"city":"Chicago","state":"IL","count":210}],"topRoles":[{"specialty":"Camera Operator","count":1200},{"specialty":"Director of Photography","count":850},{"specialty":"Audio Technician","count":420}]}}}}}}}},"/api/public/rates":{"get":{"operationId":"getAggregateRates","summary":"Get aggregate day rates by role","description":"Returns aggregate rate statistics computed from 36,000+ real billing records. Shows min, max, average, median, and percentiles for each crew role. Optionally filter by role and/or city. Only roles with 5+ data points are included.","tags":["Rates"],"x-llm-hint":"Use this to answer 'How much does a camera operator cost per day?' or 'What are DP rates in New York?'","parameters":[{"name":"role","in":"query","description":"Filter by exact role name.","schema":{"type":"string"},"example":"Director of Photography"},{"name":"city","in":"query","description":"Filter by shoot location city.","schema":{"type":"string"},"example":"New York"}],"responses":{"200":{"description":"Aggregate rate data grouped by role.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RatesResponse"},"example":{"success":true,"data":[{"role":"Director of Photography","min":350,"max":1500,"average":687.5,"median":650,"percentile25":500,"percentile75":850,"sampleSize":8420},{"role":"Camera Operator","min":250,"max":1200,"average":525,"median":500,"percentile25":400,"percentile75":650,"sampleSize":12350}]}}}}}}},"/api/public/rates/{role}":{"get":{"operationId":"getRatesByRole","summary":"Get city-by-city rates for a role","description":"Returns overall rate statistics plus a city-by-city breakdown for a specific crew role. The role parameter is a URL slug (e.g., 'director-of-photography'). Only cities with 3+ data points are included in the breakdown.","tags":["Rates"],"x-llm-hint":"Use this for detailed rate analysis by city for a specific role.","parameters":[{"name":"role","in":"path","required":true,"description":"Role slug (e.g., 'director-of-photography', 'camera-operator', 'audio-technician').","schema":{"type":"string"},"example":"director-of-photography"}],"responses":{"200":{"description":"Role-specific rate data with city breakdown.","content":{"application/json":{"example":{"success":true,"data":{"role":"Director of Photography","slug":"director-of-photography","overall":{"min":350,"max":1500,"average":687.5,"median":650,"percentile25":500,"percentile75":850,"sampleSize":8420},"cities":[{"city":"New York","state":"NY","min":500,"max":1500,"average":850,"median":800,"sampleSize":620},{"city":"Los Angeles","state":"CA","min":450,"max":1200,"average":750,"median":700,"sampleSize":540},{"city":"Chicago","state":"IL","min":400,"max":1000,"average":650,"median":625,"sampleSize":380}]}}}}},"404":{"description":"Unknown role slug.","content":{"application/json":{"example":{"success":false,"error":"Unknown role"}}}}}}},"/api/public/equipment":{"get":{"operationId":"searchEquipment","summary":"Search equipment catalog","description":"Returns equipment items from the catalog with owner counts showing how many crew members own each piece of gear. Useful for checking equipment availability in the network.","tags":["Equipment"],"parameters":[{"name":"category","in":"query","description":"Filter by equipment category (exact match).","schema":{"type":"string"},"example":"Camera"},{"name":"search","in":"query","description":"Search equipment by name (partial match, case-insensitive).","schema":{"type":"string"},"example":"Sony FX9"}],"responses":{"200":{"description":"List of equipment items with owner counts.","content":{"application/json":{"example":{"success":true,"data":[{"id":1,"name":"Sony FX9","category":"Camera","ownerCount":85},{"id":2,"name":"Sony FX6","category":"Camera","ownerCount":120},{"id":3,"name":"RED Komodo","category":"Camera","ownerCount":45}]}}}}}}},"/api/public/equipment/categories":{"get":{"operationId":"getEquipmentCategories","summary":"List equipment categories","description":"Returns all equipment categories with item counts and crew owner counts.","tags":["Equipment"],"responses":{"200":{"description":"List of equipment categories.","content":{"application/json":{"example":{"success":true,"data":[{"category":"Camera","slug":"camera","itemCount":85,"ownerCount":1200},{"category":"Audio","slug":"audio","itemCount":65,"ownerCount":980},{"category":"Lighting","slug":"lighting","itemCount":55,"ownerCount":750}]}}}}}}},"/api/public/clients":{"get":{"operationId":"listClients","summary":"List client portfolio","description":"Returns enterprise and premium tier clients. Only shows operational facts (name, shoot count, tier, industry, logo) — no billing or financial data is exposed.","tags":["Clients"],"responses":{"200":{"description":"List of enterprise/premium clients.","content":{"application/json":{"example":{"success":true,"data":[{"name":"ESPN","slug":"espn","shootCount":2400,"tier":"enterprise","industry":"Sports Media","logoUrl":"https://example.com/espn.png"},{"name":"CNN","slug":"cnn","shootCount":1800,"tier":"enterprise","industry":"News","logoUrl":"https://example.com/cnn.png"}],"meta":{"total":45}}}}}}}},"/api/public/stats":{"get":{"operationId":"getPlatformStats","summary":"Get platform statistics","description":"Returns aggregate platform statistics: total productions managed, crew assignments, network size, client companies, and demo reels. Cached for 5 minutes.","tags":["Statistics"],"x-llm-hint":"Use this to answer 'How big is Assignment Desk?' or 'How many productions has AD managed?'","responses":{"200":{"description":"Platform-wide statistics.","content":{"application/json":{"example":{"success":true,"data":{"totalProductions":38000,"totalCrewAssignments":62000,"crewNetworkSize":4200,"clientCompanies":850,"demoReels":320}}}}}}}},"/api/gigs":{"get":{"operationId":"listGigs","summary":"List open crew positions","description":"Returns open crew positions (gigs) from active shoots. Each gig represents an unfilled crew role on an upcoming production. Filter by position name or location.","tags":["Jobs"],"x-llm-hint":"Use this to find available video production jobs/gigs. Example: /api/gigs?position=camera&location=chicago","parameters":[{"name":"position","in":"query","description":"Filter by position/role name (partial match, case-insensitive).","schema":{"type":"string"},"example":"Camera Operator"},{"name":"location","in":"query","description":"Filter by city, state, or 'City, State' string (partial match).","schema":{"type":"string"},"example":"Chicago"}],"responses":{"200":{"description":"List of open gig positions.","content":{"application/json":{"example":{"gigs":[{"id":1234,"title":"Camera Operator","roleName":"Camera Operator","location":"Chicago, IL","city":"Chicago","state":"IL","startDate":"2026-04-15","endDate":"2026-04-15","status":"open","clientCompany":"ESPN","clientLogoUrl":"https://example.com/espn.png","shootName":"NBA Playoffs Coverage","shootType":null,"durationDays":1,"applicantCount":3,"shootId":567,"role_id":1234}],"total":25}}}}}}},"/api/brief/onboard":{"post":{"operationId":"submitShootRequest","summary":"Submit a shoot request","description":"Submits a production brief and creates a shoot request. This endpoint handles the full onboarding flow: creates a client user account (if new), creates a real shoot in the system, generates a magic link for account access, and sends notification emails. The caller is auto-logged in via a session cookie in the response.","tags":["Bookings"],"x-llm-hint":"Use this to book crew for a video production. Minimum required fields: contactName, contactEmail, location, date.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShootRequestBody"},"example":{"brief":{"contactName":"Jane Producer","contactEmail":"jane@productionco.com","contactPhone":"312-555-1234","contactCompany":"Production Co","date":"2026-05-15","location":"Chicago, IL","projectDescription":"Corporate interview shoot — 2 executives, 4 hours","serviceType":"Camera Crew","crewSize":3,"crewPositions":["Director of Photography","Audio Technician","Gaffer"],"cameraPreference":"Sony FX9 or similar","audioNeeds":"Wireless lav mics for 2 subjects","lightingNeeds":"3-point interview setup","deliverables":"Raw footage on SSD","deliveryTimeline":"Same day"},"source":"form","referralSource":"Google Search"}}}},"responses":{"201":{"description":"Shoot request created successfully.","content":{"application/json":{"example":{"success":true,"data":{"submissionId":456,"shootId":789,"userId":123,"needsPassword":true},"meta":{"timestamp":"2026-04-01T12:00:00.000Z"}}}}},"400":{"description":"Validation error — missing or invalid fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Invalid brief data","details":{"contactEmail":["Invalid email address"]}}}}}},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"ErrorResponse":{"type":"object","properties":{"success":{"type":"boolean","const":false},"error":{"type":"object","properties":{"code":{"type":"string","description":"Machine-readable error code"},"message":{"type":"string","description":"Human-readable error message"},"details":{"type":"object","description":"Field-level validation errors (optional)"}},"required":["message"]}},"required":["success","error"]},"CrewListResponse":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/CrewSummary"}},"meta":{"type":"object","properties":{"total":{"type":"integer","description":"Total matching crew"},"page":{"type":"integer"},"limit":{"type":"integer"},"totalPages":{"type":"integer"}}}}},"CrewSummary":{"type":"object","description":"Summary crew profile for directory listings.","properties":{"id":{"type":"integer"},"slug":{"type":"string","nullable":true},"firstName":{"type":"string"},"lastName":{"type":"string"},"city":{"type":"string","nullable":true},"state":{"type":"string","nullable":true},"specialty":{"type":"string","nullable":true,"description":"Primary role/specialty"},"avatarUrl":{"type":"string","nullable":true},"isGttMember":{"type":"boolean","description":"Whether crew is a W2 staff member"},"ratingAvg":{"type":"number","format":"float"},"ratingCount":{"type":"integer"},"shootCount":{"type":"integer"},"badges":{"type":"array","items":{"type":"string"}},"startingRate":{"type":"number","nullable":true,"description":"Lowest public day rate (Enhanced+ only)"}}},"CrewProfileResponse":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"id":{"type":"integer"},"slug":{"type":"string","nullable":true},"firstName":{"type":"string"},"lastName":{"type":"string"},"city":{"type":"string","nullable":true},"state":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"specialty":{"type":"string","nullable":true},"avatarUrl":{"type":"string","nullable":true},"bio":{"type":"string","nullable":true},"isGttMember":{"type":"boolean"},"equipment":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"category":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true}}}},"portfolios":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"title":{"type":"string","nullable":true}}}},"ratingAvg":{"type":"number"},"ratingCount":{"type":"integer"},"shootCount":{"type":"integer"},"clients":{"type":"array","items":{"type":"object","properties":{"client_name":{"type":"string"},"logo_url":{"type":"string","nullable":true}}}},"badges":{"type":"array","items":{"type":"string"}},"startingRate":{"type":"number","nullable":true},"rateCard":{"type":"array","items":{"type":"object","properties":{"roleName":{"type":"string"},"askingRate":{"type":"number"},"rateType":{"type":"string"},"notes":{"type":"string","nullable":true}}}},"vehicles":{"type":"array","items":{"type":"object","properties":{"make":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"year":{"type":"integer","nullable":true},"photoUrl":{"type":"string","nullable":true}}}}}}}},"CrewRatesResponse":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"crewRates":{"type":"array","items":{"type":"object","properties":{"roleName":{"type":"string"},"askingRate":{"type":"number"},"rateType":{"type":"string","enum":["day","half_day","hourly"]},"notes":{"type":"string","nullable":true}}}},"equipmentRates":{"type":"array","items":{"type":"object","properties":{"equipmentName":{"type":"string"},"equipmentCategory":{"type":"string","nullable":true},"rentalRate":{"type":"number"},"rateType":{"type":"string"},"includesWithRole":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true}}}},"tierEligible":{"type":"boolean"}}}}},"RatesResponse":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string"},"min":{"type":"number"},"max":{"type":"number"},"average":{"type":"number"},"median":{"type":"number"},"percentile25":{"type":"number"},"percentile75":{"type":"number"},"sampleSize":{"type":"integer"}}}}}},"ShootRequestBody":{"type":"object","required":["brief","source"],"properties":{"brief":{"type":"object","description":"Production brief details. contactName and contactEmail are required.","properties":{"contactName":{"type":"string","description":"Full name of the booking contact"},"contactEmail":{"type":"string","format":"email","description":"Email for account creation and notifications"},"contactPhone":{"type":"string","description":"Phone number (optional)"},"contactCompany":{"type":"string","description":"Company name (optional)"},"date":{"type":"string","description":"Shoot date(s) — ISO date or natural language (e.g., 'March 15-17, 2026')"},"location":{"type":"string","description":"City, State (e.g., 'Chicago, IL')"},"locationType":{"type":"string","enum":["indoor","outdoor","both","unknown"]},"projectDescription":{"type":"string","description":"What the shoot is about"},"clientCompany":{"type":"string","description":"Client or production company name"},"serviceType":{"type":"string","description":"Type of service needed (e.g., 'Camera Crew')"},"crewSize":{"type":"integer","minimum":1,"description":"Total crew members needed"},"crewPositions":{"type":"array","items":{"type":"string"},"description":"List of specific crew roles needed"},"cameraPreference":{"type":"string"},"audioNeeds":{"type":"string"},"lightingNeeds":{"type":"string"},"deliverables":{"type":"string"},"deliveryTimeline":{"type":"string"},"specialRequirements":{"type":"string"},"estimatedHours":{"type":"string"},"referralSource":{"type":"string"}},"required":["contactName","contactEmail"]},"source":{"type":"string","enum":["ai","form"],"description":"How the brief was submitted — 'ai' for AI chat, 'form' for manual form"},"referralSource":{"type":"string","description":"How the client found Assignment Desk"},"crewAssignments":{"type":"array","description":"Pre-selected crew assignments (optional)","items":{"type":"object","properties":{"roleName":{"type":"string"},"assignedUserId":{"type":"integer","nullable":true},"assignedName":{"type":"string","nullable":true}},"required":["roleName","assignedUserId"]}}}}}}}