{"openapi":"3.1.0","info":{"title":"Everybooking REST API","version":"2.0.0","description":"A token-authenticated JSON API over your account's booking data. Every endpoint is scoped to one account, resolved from the subdomain you call and cross-checked against the token you present.\n\nFor AI agents needing the full platform surface — operations, voice, funnel authoring, bulk setup — the Everybooking MCP server exposes several hundred tools over the same data and the same permission model.","contact":{"name":"Everybooking","email":"info@everybooking.com"}},"servers":[{"url":"https://{subdomain}.everybooking.com","description":"Your account. The subdomain selects the tenant.","variables":{"subdomain":{"default":"your-subdomain"}}}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Send your API token as a bearer credential on every request. Tokens are created per account from Settings → API Tokens and carry the permissions of the user who minted them."}}},"security":[{"bearerAuth":[]}],"tags":[{"name":"Actions","description":"The things integrators ask for that are not records: is this available, what would it cost, send the invoice, record the payment."},{"name":"Email templates","description":"The reusable emails your funnels, drip sequences and automations send. Create one here, then reference it by id from a funnel button's send_email action."},{"name":"Bookings","description":"Bookings and invoices are the same record. Line items, payments and the payment schedule hang off a booking and are addressed through it."},{"name":"Customers","description":"The people and companies you sell to, plus the notes and tags you file against them."},{"name":"Catalog","description":"What you sell and how it is priced. Parameters are the options on a product (quantity, adults, nights) and carry the prices; a parameter assignment is what attaches one to a product."},{"name":"Payment configuration","description":"Deposit rules, payment types, and the quote and terms templates applied to invoices."},{"name":"Funnels","description":"Booking funnels and what customers submitted through them."},{"name":"Content","description":"Images and files, and the collections they belong to."},{"name":"Sales \u0026 support","description":"Deals in the pipeline and customer support tickets."},{"name":"Reporting \u0026 knowledge","description":"Saved reports, and the knowledge-base entries the AI answers questions from."}],"paths":{"/api/v2/availability/check":{"get":{"tags":["Actions"],"summary":"Check availability","description":"Whether a product is available over a date range, with the quantity free and the next available date when it is not.","operationId":"get_api_v2_availability_check","responses":{"200":{"description":"Availability verdict"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"resource_id","in":"query","required":true,"description":"Product id.","schema":{"type":"integer"}},{"name":"start_date","in":"query","required":false,"description":"YYYY-MM-DD.","schema":{"type":"string"}},{"name":"end_date","in":"query","required":false,"description":"YYYY-MM-DD.","schema":{"type":"string"}}]}},"/api/v2/availability/search":{"get":{"tags":["Actions"],"summary":"Search availability","description":"Find open windows for a product, or for the product behind a booking line.\n\nProvide resource_id or booking_item_id.","operationId":"get_api_v2_availability_search","responses":{"200":{"description":"Available windows"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"resource_id","in":"query","required":false,"description":"Product id.","schema":{"type":"integer"}},{"name":"booking_item_id","in":"query","required":false,"description":"Use the product on this booking line instead.","schema":{"type":"integer"}}]}},"/api/v2/quotes/build":{"post":{"tags":["Actions"],"summary":"Build a quote","description":"Price a set of lines and create the booking behind them — the same engine the funnels and the AI quote agent use, so a quote built here prices identically to one a customer builds.","operationId":"post_api_v2_quotes_build","responses":{"200":{"description":"The created booking with its totals"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lines":{"type":"array","description":"Line items to quote, each naming a product and its parameters."}},"required":["lines"]}}}}}},"/api/v2/bookings/{id}/send_invoice_email":{"post":{"tags":["Actions"],"summary":"Send the invoice","description":"Email the invoice for a booking to its contact, or to recipients you name.","operationId":"post_api_v2_bookings_id_send_invoice_email","responses":{"200":{"description":"Who it was sent to"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Booking id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"to":{"type":"string","description":"Override the recipient. Defaults to the booking contact."}}}}}}}},"/api/v2/bookings/{id}/record_payment":{"post":{"tags":["Actions"],"summary":"Record a payment","description":"Book a payment against an invoice. Bookkeeping only — this records money already taken, it does not charge a card.\n\nPaying more than the balance due is refused unless allow_overpayment is true.","operationId":"post_api_v2_bookings_id_record_payment","responses":{"200":{"description":"The created transaction"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Booking id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"number","description":"Amount received."},"payment_type":{"type":"string","description":"How it was paid."}},"required":["amount"]}}}}}},"/api/v1/email_templates":{"get":{"tags":["Email templates"],"summary":"List templates","description":"Every template on the account, newest-updated first.","operationId":"get_api_v1_email_templates","responses":{"200":{"description":"Array\u003cEmailTemplate\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}}},"post":{"tags":["Email templates"],"summary":"Create a template","description":"Body fields go under an `email_template` key. Pass `body` as PLAIN TEXT — blank lines separate paragraphs and markdown [label](url) becomes a link. The rich-text content and rendered HTML are built for you.\n\nMarkdown links are required when a URL contains a spaced Liquid token like {{ booking_uuid }} — a bare URL breaks on the whitespace.","operationId":"post_api_v1_email_templates","responses":{"200":{"description":"EmailTemplate"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Internal name — what the funnel editor's email-action picker displays."},"subject":{"type":"string","description":"Subject line. Liquid supported."},"body":{"type":"string","description":"Plain text or markdown. Liquid supported. Rendered to HTML for you."},"from":{"type":"string","description":"Sender address."},"to":{"type":"string","description":"Default recipient, usually a Liquid token like {{ customer.email }}."},"footer":{"type":"boolean","description":"Append the account footer. Default true."},"include_booking":{"type":"boolean","description":"Attach the booking invoice when sent. Default false."}},"required":["name","subject","body"]}}}}}},"/api/v1/email_templates/{id}":{"get":{"tags":["Email templates"],"summary":"Get a template","description":"One template with its drip sequences and tags.","operationId":"get_api_v1_email_templates_id_","responses":{"200":{"description":"EmailTemplate"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Template id.","schema":{"type":"integer"}}]},"patch":{"tags":["Email templates"],"summary":"Update a template","description":"Partial update. Send only the fields you are changing.","operationId":"patch_api_v1_email_templates_id_","responses":{"200":{"description":"EmailTemplate"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Template id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Internal name — what the funnel editor's email-action picker displays."},"subject":{"type":"string","description":"Subject line. Liquid supported."},"body":{"type":"string","description":"Plain text or markdown. Liquid supported. Rendered to HTML for you."},"from":{"type":"string","description":"Sender address."},"to":{"type":"string","description":"Default recipient, usually a Liquid token like {{ customer.email }}."},"footer":{"type":"boolean","description":"Append the account footer. Default true."},"include_booking":{"type":"boolean","description":"Attach the booking invoice when sent. Default false."}}}}}}},"delete":{"tags":["Email templates"],"summary":"Delete a template","description":"Removes the template and its drip sequences.","operationId":"delete_api_v1_email_templates_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Template id.","schema":{"type":"integer"}}]}},"/api/v2/bookings":{"get":{"tags":["Bookings"],"summary":"List bookings","description":"Every booking on the account.","operationId":"get_api_v2_bookings","responses":{"200":{"description":"Array\u003cBooking\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across customer_name, customer_email, customer_phone, booking_reference.","schema":{"type":"string"}}]},"post":{"tags":["Bookings"],"summary":"Create a booking","description":"Create a booking.","operationId":"post_api_v2_bookings","responses":{"200":{"description":"Booking"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status_id":{"type":"string","description":"Status identifier (e.g. draft, paid, pending)"},"customer_name":{"type":"string","description":"Customer full name"},"customer_email":{"type":"string","description":"Customer email address"},"customer_phone":{"type":"string","description":"Customer phone number"},"customer_company":{"type":"string","description":"Customer company / organization name"},"customer_address":{"type":"string","description":"Street address"},"customer_city":{"type":"string","description":"City"},"customer_region":{"type":"string","description":"State / province / region"},"customer_postal_zip":{"type":"string","description":"Postal / ZIP code"},"customer_country":{"type":"string","description":"Country (e.g. CA, US)"},"customer_id":{"type":"integer","description":"Customer record ID"},"organization_id":{"type":"integer","description":"Organization (DEPARTMENT, never an umbrella) this invoice is billed to"},"start_date":{"type":"string","description":"Start date (YYYY-MM-DD). On a booking WITH line items this MOVES the whole booking: every item shifts by the same day-offset and reprices at the new dates (comped/custom line prices are re-derived by the engine — re-apply overrides after a move)."},"end_date":{"type":"string","description":"End date (YYYY-MM-DD). Item-derived: it follows the items, which shift with start_date. To change stay LENGTH edit the item dates via update_booking_item."},"currency":{"type":"string","description":"Currency code (e.g. USD)"}}}}}}}},"/api/v2/bookings/{id}":{"get":{"tags":["Bookings"],"summary":"Get a booking","description":"One booking in full.","operationId":"get_api_v2_bookings_id_","responses":{"200":{"description":"Booking"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Bookings"],"summary":"Update a booking","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_bookings_id_","responses":{"200":{"description":"Booking"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status_id":{"type":"string","description":"Status identifier (e.g. draft, paid, pending)"},"customer_name":{"type":"string","description":"Customer full name"},"customer_email":{"type":"string","description":"Customer email address"},"customer_phone":{"type":"string","description":"Customer phone number"},"customer_company":{"type":"string","description":"Customer company / organization name"},"customer_address":{"type":"string","description":"Street address"},"customer_city":{"type":"string","description":"City"},"customer_region":{"type":"string","description":"State / province / region"},"customer_postal_zip":{"type":"string","description":"Postal / ZIP code"},"customer_country":{"type":"string","description":"Country (e.g. CA, US)"},"customer_id":{"type":"integer","description":"Customer record ID"},"organization_id":{"type":"integer","description":"Organization (DEPARTMENT, never an umbrella) this invoice is billed to"},"start_date":{"type":"string","description":"Start date (YYYY-MM-DD). On a booking WITH line items this MOVES the whole booking: every item shifts by the same day-offset and reprices at the new dates (comped/custom line prices are re-derived by the engine — re-apply overrides after a move)."},"end_date":{"type":"string","description":"End date (YYYY-MM-DD). Item-derived: it follows the items, which shift with start_date. To change stay LENGTH edit the item dates via update_booking_item."},"currency":{"type":"string","description":"Currency code (e.g. USD)"}}}}}}},"delete":{"tags":["Bookings"],"summary":"Delete a booking","description":"Delete a booking.","operationId":"delete_api_v2_bookings_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/bookings/{booking_id}/items":{"get":{"tags":["Bookings"],"summary":"List items","description":"Every item on the account. Scoped to the booking in the URL.","operationId":"get_api_v2_bookings_booking_id_items","responses":{"200":{"description":"Array\u003cBookingItem\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"booking_id","in":"path","required":true,"description":"The parent booking.","schema":{"type":"integer"}},{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}}]}},"/api/v2/bookings/{booking_id}/items/{id}":{"get":{"tags":["Bookings"],"summary":"Get a item","description":"One item in full.","operationId":"get_api_v2_bookings_booking_id_items_id_","responses":{"200":{"description":"BookingItem"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"booking_id","in":"path","required":true,"description":"The parent booking.","schema":{"type":"integer"}},{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Bookings"],"summary":"Update a item","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_bookings_booking_id_items_id_","responses":{"200":{"description":"BookingItem"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"booking_id","in":"path","required":true,"description":"The parent booking.","schema":{"type":"integer"}},{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status_id":{"type":"string","description":"Status identifier"},"start_date":{"type":"string","description":"Start date/time (ISO 8601)"},"end_date":{"type":"string","description":"End date/time (ISO 8601)"},"summary":{"type":"string","description":"Item summary"}}}}}}}},"/api/v2/bookings/{booking_id}/transactions":{"get":{"tags":["Bookings"],"summary":"List transactions","description":"Every transaction on the account. Scoped to the booking in the URL.","operationId":"get_api_v2_bookings_booking_id_transactions","responses":{"200":{"description":"Array\u003cTransaction\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"booking_id","in":"path","required":true,"description":"The parent booking.","schema":{"type":"integer"}},{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}}]}},"/api/v2/bookings/{booking_id}/transactions/{id}":{"get":{"tags":["Bookings"],"summary":"Get a transaction","description":"One transaction in full.","operationId":"get_api_v2_bookings_booking_id_transactions_id_","responses":{"200":{"description":"Transaction"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"booking_id","in":"path","required":true,"description":"The parent booking.","schema":{"type":"integer"}},{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Bookings"],"summary":"Update a transaction","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_bookings_booking_id_transactions_id_","responses":{"200":{"description":"Transaction"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"booking_id","in":"path","required":true,"description":"The parent booking.","schema":{"type":"integer"}},{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"Transaction status"},"payment_date":{"type":"string","description":"Payment date (ISO 8601)"}}}}}}}},"/api/v2/bookings/{booking_id}/schedule_payments":{"get":{"tags":["Bookings"],"summary":"List schedule payments","description":"Every schedule payment on the account. Scoped to the booking in the URL.","operationId":"get_api_v2_bookings_booking_id_schedule_payments","responses":{"200":{"description":"Array\u003cSchedulePayment\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"booking_id","in":"path","required":true,"description":"The parent booking.","schema":{"type":"integer"}},{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}}]}},"/api/v2/bookings/{booking_id}/schedule_payments/{id}":{"get":{"tags":["Bookings"],"summary":"Get a schedule payment","description":"One schedule payment in full.","operationId":"get_api_v2_bookings_booking_id_schedule_payments_id_","responses":{"200":{"description":"SchedulePayment"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"booking_id","in":"path","required":true,"description":"The parent booking.","schema":{"type":"integer"}},{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Bookings"],"summary":"Update a schedule payment","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_bookings_booking_id_schedule_payments_id_","responses":{"200":{"description":"SchedulePayment"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"booking_id","in":"path","required":true,"description":"The parent booking.","schema":{"type":"integer"}},{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"payment_date":{"type":"string","description":"Scheduled payment date (ISO 8601)"},"payment_amount":{"type":"number","description":"Amount to charge"},"payment_status":{"type":"string","description":"Payment status"},"status_id":{"type":"string","description":"Status identifier"},"retry_at":{"type":"string","description":"Next retry timestamp (ISO 8601)"},"notified":{"type":"boolean","description":"Whether customer has been notified"}}}}}}}},"/api/v2/statuses":{"get":{"tags":["Bookings"],"summary":"List statuses","description":"Every status on the account.","operationId":"get_api_v2_statuses","responses":{"200":{"description":"Array\u003cStatus\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across label, status_id.","schema":{"type":"string"}}]},"post":{"tags":["Bookings"],"summary":"Create a status","description":"Create a status.","operationId":"post_api_v2_statuses","responses":{"200":{"description":"Status"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string","description":"Display label"},"color":{"type":"string","description":"Hex color code"},"order":{"type":"integer","description":"Sort order"},"enabled":{"type":"boolean","description":"Whether this status is enabled"}}}}}}}},"/api/v2/statuses/{id}":{"get":{"tags":["Bookings"],"summary":"Get a status","description":"One status in full.","operationId":"get_api_v2_statuses_id_","responses":{"200":{"description":"Status"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Bookings"],"summary":"Update a status","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_statuses_id_","responses":{"200":{"description":"Status"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string","description":"Display label"},"color":{"type":"string","description":"Hex color code"},"order":{"type":"integer","description":"Sort order"},"enabled":{"type":"boolean","description":"Whether this status is enabled"}}}}}}},"delete":{"tags":["Bookings"],"summary":"Delete a status","description":"Delete a status.","operationId":"delete_api_v2_statuses_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/customers":{"get":{"tags":["Customers"],"summary":"List customers","description":"Every customer on the account.","operationId":"get_api_v2_customers","responses":{"200":{"description":"Array\u003cCustomer\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across email, first_name, last_name, phone.","schema":{"type":"string"}}]},"post":{"tags":["Customers"],"summary":"Create a customer","description":"Create a customer.","operationId":"post_api_v2_customers","responses":{"200":{"description":"Customer"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"Customer email (unique per account)"},"first_name":{"type":"string","description":"First name"},"last_name":{"type":"string","description":"Last name"},"phone":{"type":"string","description":"Phone number"},"address":{"type":"string","description":"Street address"},"city":{"type":"string","description":"City"},"postal_zip":{"type":"string","description":"Postal/ZIP code"},"region":{"type":"string","description":"State/Province/Region"},"country":{"type":"string","description":"Country"}},"required":["email"]}}}}}},"/api/v2/customers/{id}":{"get":{"tags":["Customers"],"summary":"Get a customer","description":"One customer in full.","operationId":"get_api_v2_customers_id_","responses":{"200":{"description":"Customer"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Customers"],"summary":"Update a customer","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_customers_id_","responses":{"200":{"description":"Customer"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"Customer email (unique per account)"},"first_name":{"type":"string","description":"First name"},"last_name":{"type":"string","description":"Last name"},"phone":{"type":"string","description":"Phone number"},"address":{"type":"string","description":"Street address"},"city":{"type":"string","description":"City"},"postal_zip":{"type":"string","description":"Postal/ZIP code"},"region":{"type":"string","description":"State/Province/Region"},"country":{"type":"string","description":"Country"}},"required":["email"]}}}}},"delete":{"tags":["Customers"],"summary":"Delete a customer","description":"Delete a customer.","operationId":"delete_api_v2_customers_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/customers/{customer_id}/addresses":{"get":{"tags":["Customers"],"summary":"List addresses","description":"Every address on the account. Scoped to the customer in the URL.","operationId":"get_api_v2_customers_customer_id_addresses","responses":{"200":{"description":"Array\u003cCustomerAddress\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"customer_id","in":"path","required":true,"description":"The parent customer.","schema":{"type":"integer"}},{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}}]},"post":{"tags":["Customers"],"summary":"Create a address","description":"Create a address. Scoped to the customer in the URL.","operationId":"post_api_v2_customers_customer_id_addresses","responses":{"200":{"description":"CustomerAddress"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"customer_id","in":"path","required":true,"description":"The parent customer.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"customer_id":{"type":"integer","description":"Customer record ID"},"address_type":{"type":"string","description":"Type: primary, billing, shipping"},"is_primary":{"type":"boolean","description":"Primary address flag"},"address":{"type":"string","description":"Street address"},"city":{"type":"string","description":"City"},"region":{"type":"string","description":"State/Province/Region"},"postal_zip":{"type":"string","description":"Postal/ZIP code"},"country":{"type":"string","description":"Country"},"phone":{"type":"string","description":"Phone number"},"business_organization":{"type":"string","description":"Business / org name"}},"required":["customer_id"]}}}}}},"/api/v2/customers/{customer_id}/addresses/{id}":{"get":{"tags":["Customers"],"summary":"Get a address","description":"One address in full.","operationId":"get_api_v2_customers_customer_id_addresses_id_","responses":{"200":{"description":"CustomerAddress"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"customer_id","in":"path","required":true,"description":"The parent customer.","schema":{"type":"integer"}},{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Customers"],"summary":"Update a address","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_customers_customer_id_addresses_id_","responses":{"200":{"description":"CustomerAddress"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"customer_id","in":"path","required":true,"description":"The parent customer.","schema":{"type":"integer"}},{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"customer_id":{"type":"integer","description":"Customer record ID"},"address_type":{"type":"string","description":"Type: primary, billing, shipping"},"is_primary":{"type":"boolean","description":"Primary address flag"},"address":{"type":"string","description":"Street address"},"city":{"type":"string","description":"City"},"region":{"type":"string","description":"State/Province/Region"},"postal_zip":{"type":"string","description":"Postal/ZIP code"},"country":{"type":"string","description":"Country"},"phone":{"type":"string","description":"Phone number"},"business_organization":{"type":"string","description":"Business / org name"}},"required":["customer_id"]}}}}},"delete":{"tags":["Customers"],"summary":"Delete a address","description":"Delete a address.","operationId":"delete_api_v2_customers_customer_id_addresses_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"customer_id","in":"path","required":true,"description":"The parent customer.","schema":{"type":"integer"}},{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/organizations":{"get":{"tags":["Customers"],"summary":"List organizations","description":"Every organization on the account.","operationId":"get_api_v2_organizations","responses":{"200":{"description":"Array\u003cOrganization\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across name, website.","schema":{"type":"string"}}]},"post":{"tags":["Customers"],"summary":"Create a organization","description":"Create a organization.","operationId":"post_api_v2_organizations","responses":{"200":{"description":"Organization"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Organization name"},"status":{"type":"string","description":"active or archived"},"domains":{"type":"array","description":"Email domains grouping contacts into this organization, e.g. [\"acme.com\"]"},"website":{"type":"string","description":"Organization website"}},"required":["name"]}}}}}},"/api/v2/organizations/{id}":{"get":{"tags":["Customers"],"summary":"Get a organization","description":"One organization in full.","operationId":"get_api_v2_organizations_id_","responses":{"200":{"description":"Organization"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Customers"],"summary":"Update a organization","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_organizations_id_","responses":{"200":{"description":"Organization"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Organization name"},"status":{"type":"string","description":"active or archived"},"domains":{"type":"array","description":"Email domains grouping contacts into this organization, e.g. [\"acme.com\"]"},"website":{"type":"string","description":"Organization website"}},"required":["name"]}}}}},"delete":{"tags":["Customers"],"summary":"Delete a organization","description":"Delete a organization.","operationId":"delete_api_v2_organizations_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/notes":{"get":{"tags":["Customers"],"summary":"List notes","description":"Every note on the account.","operationId":"get_api_v2_notes","responses":{"200":{"description":"Array\u003cNote\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across content.","schema":{"type":"string"}}]},"post":{"tags":["Customers"],"summary":"Create a note","description":"Create a note.","operationId":"post_api_v2_notes","responses":{"200":{"description":"Note"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"Note body"},"notable_type":{"type":"string","description":"Polymorphic parent class (e.g. Booking, Customer)"},"notable_id":{"type":"integer","description":"Polymorphic parent record ID"},"user_id":{"type":"integer","description":"User who authored the note"}},"required":["content","notable_type","notable_id","user_id"]}}}}}},"/api/v2/notes/{id}":{"get":{"tags":["Customers"],"summary":"Get a note","description":"One note in full.","operationId":"get_api_v2_notes_id_","responses":{"200":{"description":"Note"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Customers"],"summary":"Update a note","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_notes_id_","responses":{"200":{"description":"Note"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"Note body"},"notable_type":{"type":"string","description":"Polymorphic parent class (e.g. Booking, Customer)"},"notable_id":{"type":"integer","description":"Polymorphic parent record ID"},"user_id":{"type":"integer","description":"User who authored the note"}},"required":["content","notable_type","notable_id","user_id"]}}}}},"delete":{"tags":["Customers"],"summary":"Delete a note","description":"Delete a note.","operationId":"delete_api_v2_notes_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/tags":{"get":{"tags":["Customers"],"summary":"List tags","description":"Every tag on the account.","operationId":"get_api_v2_tags","responses":{"200":{"description":"Array\u003cTag\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across name.","schema":{"type":"string"}}]},"post":{"tags":["Customers"],"summary":"Create a tag","description":"Create a tag.","operationId":"post_api_v2_tags","responses":{"200":{"description":"Tag"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Tag name"}},"required":["name"]}}}}}},"/api/v2/tags/{id}":{"get":{"tags":["Customers"],"summary":"Get a tag","description":"One tag in full.","operationId":"get_api_v2_tags_id_","responses":{"200":{"description":"Tag"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Customers"],"summary":"Update a tag","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_tags_id_","responses":{"200":{"description":"Tag"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Tag name"}},"required":["name"]}}}}},"delete":{"tags":["Customers"],"summary":"Delete a tag","description":"Delete a tag.","operationId":"delete_api_v2_tags_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/products":{"get":{"tags":["Catalog"],"summary":"List products","description":"Every product on the account.","operationId":"get_api_v2_products","responses":{"200":{"description":"Array\u003cProduct\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across name, sku.","schema":{"type":"string"}}]},"post":{"tags":["Catalog"],"summary":"Create a product","description":"Create a product.","operationId":"post_api_v2_products","responses":{"200":{"description":"Product"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Product name"},"sku":{"type":"string","description":"SKU identifier"},"description":{"type":"string","description":"Full description"},"summary":{"type":"string","description":"Short summary"},"stock":{"type":"integer","description":"Available stock quantity"},"category_id":{"type":"integer","description":"Category ID"},"booking_unit":{"type":"string","description":"Booking unit type (Days, Nights, Timeslots, Unit, 1H, 30M)"},"archived":{"type":"boolean","description":"Whether the product is archived (soft-delete)"},"status":{"type":"string","description":"Calendar status: available, unavailable, or disabled"}},"required":["name"]}}}}}},"/api/v2/products/{id}":{"get":{"tags":["Catalog"],"summary":"Get a product","description":"One product in full.","operationId":"get_api_v2_products_id_","responses":{"200":{"description":"Product"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Catalog"],"summary":"Update a product","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_products_id_","responses":{"200":{"description":"Product"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Product name"},"sku":{"type":"string","description":"SKU identifier"},"description":{"type":"string","description":"Full description"},"summary":{"type":"string","description":"Short summary"},"stock":{"type":"integer","description":"Available stock quantity"},"category_id":{"type":"integer","description":"Category ID"},"booking_unit":{"type":"string","description":"Booking unit type (Days, Nights, Timeslots, Unit, 1H, 30M)"},"archived":{"type":"boolean","description":"Whether the product is archived (soft-delete)"},"status":{"type":"string","description":"Calendar status: available, unavailable, or disabled"}},"required":["name"]}}}}},"delete":{"tags":["Catalog"],"summary":"Delete a product","description":"Delete a product.","operationId":"delete_api_v2_products_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/products/{product_id}/parameter_assignments":{"get":{"tags":["Catalog"],"summary":"List parameter assignments","description":"Every parameter assignment on the account. Scoped to the product in the URL.","operationId":"get_api_v2_products_product_id_parameter_assignments","responses":{"200":{"description":"Array\u003cParameterAssignment\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"product_id","in":"path","required":true,"description":"The parent product.","schema":{"type":"integer"}},{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}}]},"post":{"tags":["Catalog"],"summary":"Create a parameter assignment","description":"Create a parameter assignment. Scoped to the product in the URL.","operationId":"post_api_v2_products_product_id_parameter_assignments","responses":{"200":{"description":"ParameterAssignment"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"product_id","in":"path","required":true,"description":"The parent product.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"resource_id":{"type":"integer","description":"Resource/Product ID"},"parameter_id":{"type":"integer","description":"Parameter ID"},"position":{"type":"integer","description":"Sort position"},"parent_id":{"type":"integer","description":"Parent parameter assignment ID (for nesting)"},"unique_items":{"type":"boolean","description":"Whether this controls unique inventory items"}},"required":["resource_id","parameter_id"]}}}}}},"/api/v2/products/{product_id}/parameter_assignments/{id}":{"get":{"tags":["Catalog"],"summary":"Get a parameter assignment","description":"One parameter assignment in full.","operationId":"get_api_v2_products_product_id_parameter_assignments_id_","responses":{"200":{"description":"ParameterAssignment"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"product_id","in":"path","required":true,"description":"The parent product.","schema":{"type":"integer"}},{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Catalog"],"summary":"Update a parameter assignment","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_products_product_id_parameter_assignments_id_","responses":{"200":{"description":"ParameterAssignment"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"product_id","in":"path","required":true,"description":"The parent product.","schema":{"type":"integer"}},{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"resource_id":{"type":"integer","description":"Resource/Product ID"},"parameter_id":{"type":"integer","description":"Parameter ID"},"position":{"type":"integer","description":"Sort position"},"parent_id":{"type":"integer","description":"Parent parameter assignment ID (for nesting)"},"unique_items":{"type":"boolean","description":"Whether this controls unique inventory items"}},"required":["resource_id","parameter_id"]}}}}},"delete":{"tags":["Catalog"],"summary":"Delete a parameter assignment","description":"Delete a parameter assignment.","operationId":"delete_api_v2_products_product_id_parameter_assignments_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"product_id","in":"path","required":true,"description":"The parent product.","schema":{"type":"integer"}},{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/categories":{"get":{"tags":["Catalog"],"summary":"List categories","description":"Every category on the account.","operationId":"get_api_v2_categories","responses":{"200":{"description":"Array\u003cCategory\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across name.","schema":{"type":"string"}}]},"post":{"tags":["Catalog"],"summary":"Create a category","description":"Create a category.","operationId":"post_api_v2_categories","responses":{"200":{"description":"Category"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Category name"},"description":{"type":"string","description":"Category description"},"pos":{"type":"integer","description":"Sort position"}},"required":["name"]}}}}}},"/api/v2/categories/{id}":{"get":{"tags":["Catalog"],"summary":"Get a category","description":"One category in full.","operationId":"get_api_v2_categories_id_","responses":{"200":{"description":"Category"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Catalog"],"summary":"Update a category","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_categories_id_","responses":{"200":{"description":"Category"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Category name"},"description":{"type":"string","description":"Category description"},"pos":{"type":"integer","description":"Sort position"}},"required":["name"]}}}}},"delete":{"tags":["Catalog"],"summary":"Delete a category","description":"Delete a category.","operationId":"delete_api_v2_categories_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/parameters":{"get":{"tags":["Catalog"],"summary":"List parameters","description":"Every parameter on the account.","operationId":"get_api_v2_parameters","responses":{"200":{"description":"Array\u003cParameter\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}}]},"post":{"tags":["Catalog"],"summary":"Create a parameter","description":"Create a parameter.","operationId":"post_api_v2_parameters","responses":{"200":{"description":"Parameter"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Parameter name"},"description":{"type":"string","description":"Parameter description"},"input_type":{"type":"string","description":"Input type (number, text, etc.)"},"default_value":{"type":"string","description":"Default value"},"required":{"type":"boolean","description":"Whether this parameter is required"},"pricing":{"type":"boolean","description":"Whether this parameter affects pricing"}},"required":["name"]}}}}}},"/api/v2/parameters/{id}":{"get":{"tags":["Catalog"],"summary":"Get a parameter","description":"One parameter in full.","operationId":"get_api_v2_parameters_id_","responses":{"200":{"description":"Parameter"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Catalog"],"summary":"Update a parameter","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_parameters_id_","responses":{"200":{"description":"Parameter"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Parameter name"},"description":{"type":"string","description":"Parameter description"},"input_type":{"type":"string","description":"Input type (number, text, etc.)"},"default_value":{"type":"string","description":"Default value"},"required":{"type":"boolean","description":"Whether this parameter is required"},"pricing":{"type":"boolean","description":"Whether this parameter affects pricing"}},"required":["name"]}}}}},"delete":{"tags":["Catalog"],"summary":"Delete a parameter","description":"Delete a parameter.","operationId":"delete_api_v2_parameters_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/fees":{"get":{"tags":["Catalog"],"summary":"List fees","description":"Every fee on the account.","operationId":"get_api_v2_fees","responses":{"200":{"description":"Array\u003cFee\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}}]},"post":{"tags":["Catalog"],"summary":"Create a fee","description":"Create a fee.","operationId":"post_api_v2_fees","responses":{"200":{"description":"Fee"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Fee name"},"amount":{"type":"number","description":"Fee amount"},"amount_type":{"type":"string","description":"Amount type (fixed or percentage)"},"account_number":{"type":"string","description":"Accounting reference number"},"apply_fee_to":{"type":"string","description":"What the fee applies to"},"default":{"type":"boolean","description":"Whether this is a default fee"}},"required":["name","amount"]}}}}}},"/api/v2/fees/{id}":{"get":{"tags":["Catalog"],"summary":"Get a fee","description":"One fee in full.","operationId":"get_api_v2_fees_id_","responses":{"200":{"description":"Fee"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Catalog"],"summary":"Update a fee","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_fees_id_","responses":{"200":{"description":"Fee"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Fee name"},"amount":{"type":"number","description":"Fee amount"},"amount_type":{"type":"string","description":"Amount type (fixed or percentage)"},"account_number":{"type":"string","description":"Accounting reference number"},"apply_fee_to":{"type":"string","description":"What the fee applies to"},"default":{"type":"boolean","description":"Whether this is a default fee"}},"required":["name","amount"]}}}}},"delete":{"tags":["Catalog"],"summary":"Delete a fee","description":"Delete a fee.","operationId":"delete_api_v2_fees_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/discounts":{"get":{"tags":["Catalog"],"summary":"List discounts","description":"Every discount on the account.","operationId":"get_api_v2_discounts","responses":{"200":{"description":"Array\u003cDiscount\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}}]},"post":{"tags":["Catalog"],"summary":"Create a discount","description":"Create a discount.","operationId":"post_api_v2_discounts","responses":{"200":{"description":"Discount"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Discount name"},"discount_code":{"type":"string","description":"Discount code (optional)"},"discount_type":{"type":"string","description":"Type of discount (e.g. percent, fixed)"},"enabled":{"type":"boolean","description":"Whether discount is active"},"dynamic_rate":{"type":"number","description":"Dynamic discount rate"},"start_date":{"type":"string","description":"Start date (YYYY-MM-DD)"},"end_date":{"type":"string","description":"End date (YYYY-MM-DD)"},"apply_to":{"type":"array","description":"Resource (product) ids the discount applies to. Required + must contain at least one id. Pass an empty array only when paired with rules."},"discount_amount":{"type":"object","description":"Hash payload like {\"type\":\"percent\",\"value\":10} or {\"type\":\"fixed\",\"value\":25}. Required."},"rules":{"type":"array","description":"Rule ids that gate this discount (optional)."}},"required":["name","apply_to","discount_amount"]}}}}}},"/api/v2/discounts/{id}":{"get":{"tags":["Catalog"],"summary":"Get a discount","description":"One discount in full.","operationId":"get_api_v2_discounts_id_","responses":{"200":{"description":"Discount"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Catalog"],"summary":"Update a discount","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_discounts_id_","responses":{"200":{"description":"Discount"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Discount name"},"discount_code":{"type":"string","description":"Discount code (optional)"},"discount_type":{"type":"string","description":"Type of discount (e.g. percent, fixed)"},"enabled":{"type":"boolean","description":"Whether discount is active"},"dynamic_rate":{"type":"number","description":"Dynamic discount rate"},"start_date":{"type":"string","description":"Start date (YYYY-MM-DD)"},"end_date":{"type":"string","description":"End date (YYYY-MM-DD)"},"apply_to":{"type":"array","description":"Resource (product) ids the discount applies to. Required + must contain at least one id. Pass an empty array only when paired with rules."},"discount_amount":{"type":"object","description":"Hash payload like {\"type\":\"percent\",\"value\":10} or {\"type\":\"fixed\",\"value\":25}. Required."},"rules":{"type":"array","description":"Rule ids that gate this discount (optional)."}},"required":["name","apply_to","discount_amount"]}}}}},"delete":{"tags":["Catalog"],"summary":"Delete a discount","description":"Delete a discount.","operationId":"delete_api_v2_discounts_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/gift_certificates":{"get":{"tags":["Catalog"],"summary":"List gift certificates","description":"Every gift certificate on the account.","operationId":"get_api_v2_gift_certificates","responses":{"200":{"description":"Array\u003cGiftCertificate\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}}]},"post":{"tags":["Catalog"],"summary":"Create a gift certificate","description":"Create a gift certificate.","operationId":"post_api_v2_gift_certificates","responses":{"200":{"description":"GiftCertificate"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Certificate name"},"sku":{"type":"string","description":"SKU code"},"description":{"type":"string","description":"Description"},"price":{"type":"number","description":"Price"},"balance":{"type":"number","description":"Current balance"},"to":{"type":"string","description":"Recipient name"},"from":{"type":"string","description":"Sender name"},"recipient_email":{"type":"string","description":"Recipient email"},"message":{"type":"string","description":"Gift message"},"expires":{"type":"boolean","description":"Whether the certificate expires"},"expiry_date":{"type":"string","description":"Expiry date (YYYY-MM-DD)"},"category_id":{"type":"integer","description":"Category ID"}},"required":["name"]}}}}}},"/api/v2/gift_certificates/{id}":{"get":{"tags":["Catalog"],"summary":"Get a gift certificate","description":"One gift certificate in full.","operationId":"get_api_v2_gift_certificates_id_","responses":{"200":{"description":"GiftCertificate"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Catalog"],"summary":"Update a gift certificate","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_gift_certificates_id_","responses":{"200":{"description":"GiftCertificate"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Certificate name"},"sku":{"type":"string","description":"SKU code"},"description":{"type":"string","description":"Description"},"price":{"type":"number","description":"Price"},"balance":{"type":"number","description":"Current balance"},"to":{"type":"string","description":"Recipient name"},"from":{"type":"string","description":"Sender name"},"recipient_email":{"type":"string","description":"Recipient email"},"message":{"type":"string","description":"Gift message"},"expires":{"type":"boolean","description":"Whether the certificate expires"},"expiry_date":{"type":"string","description":"Expiry date (YYYY-MM-DD)"},"category_id":{"type":"integer","description":"Category ID"}},"required":["name"]}}}}},"delete":{"tags":["Catalog"],"summary":"Delete a gift certificate","description":"Delete a gift certificate.","operationId":"delete_api_v2_gift_certificates_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/rules":{"get":{"tags":["Catalog"],"summary":"List rules","description":"Every rule on the account.","operationId":"get_api_v2_rules","responses":{"200":{"description":"Array\u003cRule\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across name.","schema":{"type":"string"}}]},"post":{"tags":["Catalog"],"summary":"Create a rule","description":"Create a rule.","operationId":"post_api_v2_rules","responses":{"200":{"description":"Rule"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Rule set name"},"enabled_rules":{"type":"object","description":"Map of rule key =\u003e enabled boolean (or rule config). The Truths system stores its toggles here."}},"required":["name"]}}}}}},"/api/v2/rules/{id}":{"get":{"tags":["Catalog"],"summary":"Get a rule","description":"One rule in full.","operationId":"get_api_v2_rules_id_","responses":{"200":{"description":"Rule"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Catalog"],"summary":"Update a rule","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_rules_id_","responses":{"200":{"description":"Rule"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Rule set name"},"enabled_rules":{"type":"object","description":"Map of rule key =\u003e enabled boolean (or rule config). The Truths system stores its toggles here."}},"required":["name"]}}}}},"delete":{"tags":["Catalog"],"summary":"Delete a rule","description":"Delete a rule.","operationId":"delete_api_v2_rules_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/product_events":{"get":{"tags":["Catalog"],"summary":"List product events","description":"Every product event on the account.","operationId":"get_api_v2_product_events","responses":{"200":{"description":"Array\u003cResourceEvent\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across name.","schema":{"type":"string"}}]},"post":{"tags":["Catalog"],"summary":"Create a product event","description":"Create a product event.","operationId":"post_api_v2_product_events","responses":{"200":{"description":"ResourceEvent"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Event name"},"event_type":{"type":"string","description":"Type: seasonal, special, or time"},"inventory_status":{"type":"string","description":"Inventory status: available, unavailable, or maintenance"},"start_date":{"type":"string","description":"Start date/time (ISO 8601)"},"end_date":{"type":"string","description":"End date/time (ISO 8601)"},"enabled":{"type":"boolean","description":"Whether the event is active"},"apply_to":{"type":"object","description":"Scope (exact semantics): {\"all\": true} = every product; {\"\u003ccategory_id\u003e\": []} = every product in that category, present and future; {\"\u003ccategory_id\u003e\": [\"\u003cresource_id\u003e\", ...]} = ONLY the listed products (resource ids as STRINGS). A non-empty list never means the whole category."},"applicable_times":{"type":"array","description":"Applicable time slots"},"recurrence":{"type":"object","description":"Recurrence configuration (JSON)"},"price_source":{"type":"object","description":"Price override configuration (JSON)"},"visible_on_calendar":{"type":"boolean","description":"Show on calendar"},"force_to_date":{"type":"boolean","description":"Force to specific date"},"rules_id":{"type":"integer","description":"Associated rule ID"},"weather_dependent":{"type":"boolean","description":"Tour: auto-flag if forecast is poor"},"weather_notice_hours":{"type":"integer","description":"Tour: hours before to notify on weather"},"lead_time_hours":{"type":"integer","description":"Coaching/Consulting/Tour: minimum hours of booking notice"},"cancellation_deadline_hours":{"type":"integer","description":"Hours before start when cancellation forfeits deposit"},"setup_buffer_minutes":{"type":"integer","description":"Events/Wedding: setup buffer in minutes"},"breakdown_buffer_minutes":{"type":"integer","description":"Events/Wedding: breakdown buffer in minutes"},"min_party_size":{"type":"integer","description":"Tour/Events: minimum party size"},"max_party_size":{"type":"integer","description":"Tour/Events: maximum party size"}},"required":["name"]}}}}}},"/api/v2/product_events/{id}":{"get":{"tags":["Catalog"],"summary":"Get a product event","description":"One product event in full.","operationId":"get_api_v2_product_events_id_","responses":{"200":{"description":"ResourceEvent"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Catalog"],"summary":"Update a product event","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_product_events_id_","responses":{"200":{"description":"ResourceEvent"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Event name"},"event_type":{"type":"string","description":"Type: seasonal, special, or time"},"inventory_status":{"type":"string","description":"Inventory status: available, unavailable, or maintenance"},"start_date":{"type":"string","description":"Start date/time (ISO 8601)"},"end_date":{"type":"string","description":"End date/time (ISO 8601)"},"enabled":{"type":"boolean","description":"Whether the event is active"},"apply_to":{"type":"object","description":"Scope (exact semantics): {\"all\": true} = every product; {\"\u003ccategory_id\u003e\": []} = every product in that category, present and future; {\"\u003ccategory_id\u003e\": [\"\u003cresource_id\u003e\", ...]} = ONLY the listed products (resource ids as STRINGS). A non-empty list never means the whole category."},"applicable_times":{"type":"array","description":"Applicable time slots"},"recurrence":{"type":"object","description":"Recurrence configuration (JSON)"},"price_source":{"type":"object","description":"Price override configuration (JSON)"},"visible_on_calendar":{"type":"boolean","description":"Show on calendar"},"force_to_date":{"type":"boolean","description":"Force to specific date"},"rules_id":{"type":"integer","description":"Associated rule ID"},"weather_dependent":{"type":"boolean","description":"Tour: auto-flag if forecast is poor"},"weather_notice_hours":{"type":"integer","description":"Tour: hours before to notify on weather"},"lead_time_hours":{"type":"integer","description":"Coaching/Consulting/Tour: minimum hours of booking notice"},"cancellation_deadline_hours":{"type":"integer","description":"Hours before start when cancellation forfeits deposit"},"setup_buffer_minutes":{"type":"integer","description":"Events/Wedding: setup buffer in minutes"},"breakdown_buffer_minutes":{"type":"integer","description":"Events/Wedding: breakdown buffer in minutes"},"min_party_size":{"type":"integer","description":"Tour/Events: minimum party size"},"max_party_size":{"type":"integer","description":"Tour/Events: maximum party size"}},"required":["name"]}}}}},"delete":{"tags":["Catalog"],"summary":"Delete a product event","description":"Delete a product event.","operationId":"delete_api_v2_product_events_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/deposit_settings":{"get":{"tags":["Payment configuration"],"summary":"List deposit settings","description":"Every deposit setting on the account.","operationId":"get_api_v2_deposit_settings","responses":{"200":{"description":"Array\u003cDepositSetting\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}}]},"post":{"tags":["Payment configuration"],"summary":"Create a deposit setting","description":"Create a deposit setting.","operationId":"post_api_v2_deposit_settings","responses":{"200":{"description":"DepositSetting"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Payment setting name"},"deposit_mode":{"type":"object","description":"Deposit mode configuration (JSON)"},"change_booking_status":{"type":"integer","description":"Status to change booking to after payment"},"schedule_payments":{"type":"boolean","description":"Enable scheduled payments"},"payment_frequency":{"type":"string","description":"Installment cadence. Use 'custom' together with `installments` for N equal payments."},"final_payment":{"type":"object","description":"Final payment configuration (JSON)"}},"required":["name"]}}}}}},"/api/v2/deposit_settings/{id}":{"get":{"tags":["Payment configuration"],"summary":"Get a deposit setting","description":"One deposit setting in full.","operationId":"get_api_v2_deposit_settings_id_","responses":{"200":{"description":"DepositSetting"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Payment configuration"],"summary":"Update a deposit setting","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_deposit_settings_id_","responses":{"200":{"description":"DepositSetting"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Payment setting name"},"deposit_mode":{"type":"object","description":"Deposit mode configuration (JSON)"},"change_booking_status":{"type":"integer","description":"Status to change booking to after payment"},"schedule_payments":{"type":"boolean","description":"Enable scheduled payments"},"payment_frequency":{"type":"string","description":"Installment cadence. Use 'custom' together with `installments` for N equal payments."},"final_payment":{"type":"object","description":"Final payment configuration (JSON)"}},"required":["name"]}}}}},"delete":{"tags":["Payment configuration"],"summary":"Delete a deposit setting","description":"Delete a deposit setting.","operationId":"delete_api_v2_deposit_settings_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/payment_types":{"get":{"tags":["Payment configuration"],"summary":"List payment types","description":"Every payment type on the account.","operationId":"get_api_v2_payment_types","responses":{"200":{"description":"Array\u003cPaymentType\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}}]}},"/api/v2/payment_types/{id}":{"get":{"tags":["Payment configuration"],"summary":"Get a payment type","description":"One payment type in full.","operationId":"get_api_v2_payment_types_id_","responses":{"200":{"description":"PaymentType"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"delete":{"tags":["Payment configuration"],"summary":"Delete a payment type","description":"Delete a payment type.","operationId":"delete_api_v2_payment_types_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/payment_methods":{"get":{"tags":["Payment configuration"],"summary":"List payment methods","description":"Every payment method on the account.","operationId":"get_api_v2_payment_methods","responses":{"200":{"description":"Array\u003cPaymentMethod\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across card_last4, name_on_card.","schema":{"type":"string"}}]}},"/api/v2/payment_methods/{id}":{"get":{"tags":["Payment configuration"],"summary":"Get a payment method","description":"One payment method in full.","operationId":"get_api_v2_payment_methods_id_","responses":{"200":{"description":"PaymentMethod"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/quote_templates":{"get":{"tags":["Payment configuration"],"summary":"List quote templates","description":"Every quote template on the account.","operationId":"get_api_v2_quote_templates","responses":{"200":{"description":"Array\u003cQuoteTemplate\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across name.","schema":{"type":"string"}}]},"post":{"tags":["Payment configuration"],"summary":"Create a quote template","description":"Create a quote template.","operationId":"post_api_v2_quote_templates","responses":{"200":{"description":"QuoteTemplate"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Template name"},"template_type":{"type":"string","description":"Template type (default: basic)"},"layout":{"type":"object","description":"Layout configuration (JSON)"},"data":{"type":"object","description":"Template data (JSON)"}},"required":["name"]}}}}}},"/api/v2/quote_templates/{id}":{"get":{"tags":["Payment configuration"],"summary":"Get a quote template","description":"One quote template in full.","operationId":"get_api_v2_quote_templates_id_","responses":{"200":{"description":"QuoteTemplate"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Payment configuration"],"summary":"Update a quote template","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_quote_templates_id_","responses":{"200":{"description":"QuoteTemplate"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Template name"},"template_type":{"type":"string","description":"Template type (default: basic)"},"layout":{"type":"object","description":"Layout configuration (JSON)"},"data":{"type":"object","description":"Template data (JSON)"}},"required":["name"]}}}}},"delete":{"tags":["Payment configuration"],"summary":"Delete a quote template","description":"Delete a quote template.","operationId":"delete_api_v2_quote_templates_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/terms_templates":{"get":{"tags":["Payment configuration"],"summary":"List terms templates","description":"Every terms template on the account.","operationId":"get_api_v2_terms_templates","responses":{"200":{"description":"Array\u003cTermsTemplate\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across name.","schema":{"type":"string"}}]},"post":{"tags":["Payment configuration"],"summary":"Create a terms template","description":"Create a terms template.","operationId":"post_api_v2_terms_templates","responses":{"200":{"description":"TermsTemplate"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Template label, e.g. 'Workforce Accommodation Agreement'"},"body":{"type":"string","description":"Contract / terms text (HTML or plain text)"},"archived":{"type":"boolean","description":"Archive without deleting"},"position":{"type":"integer","description":"Sort order"}},"required":["name"]}}}}}},"/api/v2/terms_templates/{id}":{"get":{"tags":["Payment configuration"],"summary":"Get a terms template","description":"One terms template in full.","operationId":"get_api_v2_terms_templates_id_","responses":{"200":{"description":"TermsTemplate"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Payment configuration"],"summary":"Update a terms template","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_terms_templates_id_","responses":{"200":{"description":"TermsTemplate"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Template label, e.g. 'Workforce Accommodation Agreement'"},"body":{"type":"string","description":"Contract / terms text (HTML or plain text)"},"archived":{"type":"boolean","description":"Archive without deleting"},"position":{"type":"integer","description":"Sort order"}},"required":["name"]}}}}},"delete":{"tags":["Payment configuration"],"summary":"Delete a terms template","description":"Delete a terms template.","operationId":"delete_api_v2_terms_templates_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/funnels":{"get":{"tags":["Funnels"],"summary":"List funnels","description":"Every funnel on the account.","operationId":"get_api_v2_funnels","responses":{"200":{"description":"Array\u003cFunnel\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across name, slug.","schema":{"type":"string"}}]}},"/api/v2/funnels/{id}":{"get":{"tags":["Funnels"],"summary":"Get a funnel","description":"One funnel in full.","operationId":"get_api_v2_funnels_id_","responses":{"200":{"description":"Funnel"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Funnels"],"summary":"Update a funnel","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_funnels_id_","responses":{"200":{"description":"Funnel"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Funnel name"},"description":{"type":"string","description":"Funnel description. Doubles as the AI-reading guidance any AI injects when reading this funnel's saved answers (e.g. 'the activity SKUs are auto-added options shown to every guest, NOT selections; focus on the event type, room + meal needs, and the stated biggest concern')."},"draft":{"type":"boolean","description":"Whether funnel is in draft mode"},"archived":{"type":"boolean","description":"Whether funnel is archived"},"template":{"type":"boolean","description":"Flag this funnel as a gallery FunnelTemplate (pair with template_slug)"},"template_slug":{"type":"string","description":"Unique slug for the template gallery page (/funnel-templates/\u003cslug\u003e). Required for the funnel to appear in the template API."}}}}}}}},"/api/v2/survey_responses":{"get":{"tags":["Funnels"],"summary":"List survey responses","description":"Every survey response on the account.","operationId":"get_api_v2_survey_responses","responses":{"200":{"description":"Array\u003cSurveyResponse\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}}]}},"/api/v2/survey_responses/{id}":{"get":{"tags":["Funnels"],"summary":"Get a survey response","description":"One survey response in full.","operationId":"get_api_v2_survey_responses_id_","responses":{"200":{"description":"SurveyResponse"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Funnels"],"summary":"Update a survey response","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_survey_responses_id_","responses":{"200":{"description":"SurveyResponse"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"Response status"}}}}}}}},"/api/v2/assets":{"get":{"tags":["Content"],"summary":"List assets","description":"Every asset on the account.","operationId":"get_api_v2_assets","responses":{"200":{"description":"Array\u003cAsset\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across name, description.","schema":{"type":"string"}}]}},"/api/v2/assets/{id}":{"get":{"tags":["Content"],"summary":"Get a asset","description":"One asset in full.","operationId":"get_api_v2_assets_id_","responses":{"200":{"description":"Asset"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Content"],"summary":"Update a asset","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_assets_id_","responses":{"200":{"description":"Asset"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Asset name"},"description":{"type":"string","description":"Asset description"},"weight":{"type":"integer","description":"Sort weight"}}}}}}}},"/api/v2/asset_collections":{"get":{"tags":["Content"],"summary":"List asset collections","description":"Every asset collection on the account.","operationId":"get_api_v2_asset_collections","responses":{"200":{"description":"Array\u003cAssetCollection\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across name.","schema":{"type":"string"}}]},"post":{"tags":["Content"],"summary":"Create a asset collection","description":"Create a asset collection.","operationId":"post_api_v2_asset_collections","responses":{"200":{"description":"AssetCollection"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Collection name"},"asset_ids":{"type":"array","description":"Array of Asset IDs in this collection"}},"required":["name"]}}}}}},"/api/v2/asset_collections/{id}":{"get":{"tags":["Content"],"summary":"Get a asset collection","description":"One asset collection in full.","operationId":"get_api_v2_asset_collections_id_","responses":{"200":{"description":"AssetCollection"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Content"],"summary":"Update a asset collection","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_asset_collections_id_","responses":{"200":{"description":"AssetCollection"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Collection name"},"asset_ids":{"type":"array","description":"Array of Asset IDs in this collection"}},"required":["name"]}}}}},"delete":{"tags":["Content"],"summary":"Delete a asset collection","description":"Delete a asset collection.","operationId":"delete_api_v2_asset_collections_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/deals":{"get":{"tags":["Sales \u0026 support"],"summary":"List deals","description":"Every deal on the account.","operationId":"get_api_v2_deals","responses":{"200":{"description":"Array\u003cDeal\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}}]}},"/api/v2/deals/{id}":{"get":{"tags":["Sales \u0026 support"],"summary":"Get a deal","description":"One deal in full.","operationId":"get_api_v2_deals_id_","responses":{"200":{"description":"Deal"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/support_tickets":{"get":{"tags":["Sales \u0026 support"],"summary":"List support tickets","description":"Every support ticket on the account.","operationId":"get_api_v2_support_tickets","responses":{"200":{"description":"Array\u003cSupportTicket\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across name, email, message.","schema":{"type":"string"}}]},"post":{"tags":["Sales \u0026 support"],"summary":"Create a support ticket","description":"Create a support ticket.","operationId":"post_api_v2_support_tickets","responses":{"200":{"description":"SupportTicket"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Submitter name"},"email":{"type":"string","description":"Submitter email"},"message":{"type":"string","description":"Ticket message body"},"status":{"type":"string","description":"Status: new, open, closed"},"url":{"type":"string","description":"Page URL where ticket was opened"},"metadata":{"type":"object","description":"Additional metadata (JSON)"}},"required":["name","email","message"]}}}}}},"/api/v2/support_tickets/{id}":{"get":{"tags":["Sales \u0026 support"],"summary":"Get a support ticket","description":"One support ticket in full.","operationId":"get_api_v2_support_tickets_id_","responses":{"200":{"description":"SupportTicket"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Sales \u0026 support"],"summary":"Update a support ticket","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_support_tickets_id_","responses":{"200":{"description":"SupportTicket"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Submitter name"},"email":{"type":"string","description":"Submitter email"},"message":{"type":"string","description":"Ticket message body"},"status":{"type":"string","description":"Status: new, open, closed"},"url":{"type":"string","description":"Page URL where ticket was opened"},"metadata":{"type":"object","description":"Additional metadata (JSON)"}},"required":["name","email","message"]}}}}},"delete":{"tags":["Sales \u0026 support"],"summary":"Delete a support ticket","description":"Delete a support ticket.","operationId":"delete_api_v2_support_tickets_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/reports":{"get":{"tags":["Reporting \u0026 knowledge"],"summary":"List reports","description":"Every report on the account.","operationId":"get_api_v2_reports","responses":{"200":{"description":"Array\u003cReport\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Matches across name, slug.","schema":{"type":"string"}}]},"post":{"tags":["Reporting \u0026 knowledge"],"summary":"Create a report","description":"Create a report.","operationId":"post_api_v2_reports","responses":{"200":{"description":"Report"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Report name"},"report_type":{"type":"string","description":"Report type identifier"},"slug":{"type":"string","description":"Slug (unique within account)"},"parameters":{"type":"object","description":"Report parameters (JSON)"},"expires_at":{"type":"string","description":"Expiration timestamp (ISO 8601)"}},"required":["name","report_type","slug"]}}}}}},"/api/v2/reports/{id}":{"get":{"tags":["Reporting \u0026 knowledge"],"summary":"Get a report","description":"One report in full.","operationId":"get_api_v2_reports_id_","responses":{"200":{"description":"Report"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Reporting \u0026 knowledge"],"summary":"Update a report","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_reports_id_","responses":{"200":{"description":"Report"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Report name"},"report_type":{"type":"string","description":"Report type identifier"},"slug":{"type":"string","description":"Slug (unique within account)"},"parameters":{"type":"object","description":"Report parameters (JSON)"},"expires_at":{"type":"string","description":"Expiration timestamp (ISO 8601)"}},"required":["name","report_type","slug"]}}}}},"delete":{"tags":["Reporting \u0026 knowledge"],"summary":"Delete a report","description":"Delete a report.","operationId":"delete_api_v2_reports_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}},"/api/v2/knowledge_base_entries":{"get":{"tags":["Reporting \u0026 knowledge"],"summary":"List knowledge base entries","description":"Every knowledge base entry on the account.","operationId":"get_api_v2_knowledge_base_entries","responses":{"200":{"description":"Array\u003cDatapoint\u003e"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"page","in":"query","required":false,"description":"Page number. Default 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Results per page. Default 25, max 100.","schema":{"type":"integer"}}]},"post":{"tags":["Reporting \u0026 knowledge"],"summary":"Create a knowledge base entry","description":"Create a knowledge base entry.","operationId":"post_api_v2_knowledge_base_entries","responses":{"200":{"description":"Datapoint"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"source_type":{"type":"string","description":"Source type: user, url, or category"},"source":{"type":"string","description":"Source identifier"},"content":{"type":"string","description":"Datapoint content"},"metadata":{"type":"object","description":"Additional metadata (JSON)"}},"required":["source_type","source","content"]}}}}}},"/api/v2/knowledge_base_entries/{id}":{"get":{"tags":["Reporting \u0026 knowledge"],"summary":"Get a knowledge base entry","description":"One knowledge base entry in full.","operationId":"get_api_v2_knowledge_base_entries_id_","responses":{"200":{"description":"Datapoint"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]},"patch":{"tags":["Reporting \u0026 knowledge"],"summary":"Update a knowledge base entry","description":"Partial update — send only the fields you are changing.","operationId":"patch_api_v2_knowledge_base_entries_id_","responses":{"200":{"description":"Datapoint"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"source_type":{"type":"string","description":"Source type: user, url, or category"},"source":{"type":"string","description":"Source identifier"},"content":{"type":"string","description":"Datapoint content"},"metadata":{"type":"object","description":"Additional metadata (JSON)"}},"required":["source_type","source","content"]}}}}},"delete":{"tags":["Reporting \u0026 knowledge"],"summary":"Delete a knowledge base entry","description":"Delete a knowledge base entry.","operationId":"delete_api_v2_knowledge_base_entries_id_","responses":{"200":{"description":"{ deleted: true }"},"401":{"description":"Missing or invalid API token"},"403":{"description":"Token does not match this account"},"404":{"description":"Not found"},"422":{"description":"Validation failed"}},"parameters":[{"name":"id","in":"path","required":true,"description":"Record id.","schema":{"type":"integer"}}]}}}}