Joinways · Schema

Quote

The full quote header (`GET /quotes/{id}` as `quote`, `POST /quotes`, `PATCH /quotes/{id}`, the `data` of the `quote.*` webhooks).

Event ManagementSoftware-as-a-ServiceCRMVenue SoftwareMultilingual

Properties

Name Type Description
id string
event_id string
quote_number stringnull
title string
status object
client_visible boolean A draft already shown on the client page without being sent (« Montrer au client sans envoyer »): still `draft`, but the client can read and sign it. See `POST /quotes/{id}/client-visibility`.
currency string
total_excl_tax number
total_tax number
total_incl_tax number
is_signed booleannull
signed_at stringnull
signature_mode stringnull
signer_name stringnull
signer_email stringnull
is_invoiced booleannull
invoice_number stringnull
invoice_date stringnull
due_date stringnull
payment_date stringnull
is_reverse_charge booleannull
sent_at stringnull When the quote was sent (for a platform quote, when the platform transmitted it).
viewed_at stringnull
last_viewed_at stringnull
view_count integer
expires_at stringnull Validity end of the offer.
created_at string
author_id string
billing_profile_id stringnull
source string `joinways` = written in Joinways. `platform` = a booking platform's own document recorded in Joinways, mostly read from the platform's emails (quote transmitted, with its PDF), or imported once signed
source_platform stringnull Booking platform the document comes from (platform quote), or the one a Joinways quote was deposited to (e.g. Kactus).
external_reference stringnull The platform's own quote number (a platform that renumbers each revision gives each version its own). Unique per event.
platform_pushed_at stringnull When a Joinways quote was deposited on the platform (first deposit only).
superseded_by_quote_id stringnull Set when this quote was replaced: by a later version the booking platform sent, or by a signed amendment. A replaced quote keeps its status but never counts in the event's confirmed amount; only quote
superseded_at stringnull When the quote was replaced (null while it is live).
account_id string
totals_updated_at stringnull
discount_percent numbernull
discount_amount numbernull
invoiced_at stringnull
invoiced_by stringnull
invoice_pdf_path stringnull
invoice_snapshot objectnull
invoice_bill_to objectnull Who the invoices of this quote are addressed to, as last issued, when it is not the signatory (parents paying for a wedding, an agency): `party` (`kind` `client`, `company` with `companyId`, or `platf
payment_terms stringnull
cancellation_terms stringnull
postponement_terms stringnull
purchase_order stringnull
client_first_name stringnull
client_last_name stringnull
client_email stringnull
client_phone stringnull
client_is_individual booleannull
client_company_name stringnull
client_address stringnull
client_postal_code stringnull
client_city stringnull
client_state stringnull
client_country stringnull
client_vat_number stringnull
client_registration_number stringnull
client_purchase_order stringnull
parent_quote_id stringnull The quote this one amends (amendment).
amendment_sequence integer
platform_request_token stringnull
translations object
space_plan_snapshot objectarraynull
space_plan_snapshot_at stringnull
ai_generated boolean
ai_source_lead_id stringnull
ai_model stringnull
ai_confidence numbernull
ai_reasoning stringnull
ai_warnings array
ai_generated_at stringnull
document_lines arraynull Platform quotes only: the lines read out of the PDF the platform sent, read-only. They never count in the totals (the quote keeps one line carrying the printed amount). Null on a Joinways quote; empty
document_lines_status stringnull Where the reading of the platform PDF stands. Null = not asked (only won platform quotes are read automatically).
document_lines_extracted_at stringnull
rejected_with_event boolean
is_demo boolean
View JSON Schema on GitHub

JSON Schema

joinways-app-quote-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/joinways-app/json-schema/joinways-app-quote-schema.json",
  "title": "Quote",
  "description": "The full quote header (`GET /quotes/{id}` as `quote`, `POST /quotes`, `PATCH /quotes/{id}`, the `data` of the `quote.*` webhooks).",
  "x-generated": "2026-11-13",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/joinways-app-openapi.yml#/components/schemas/Quote",
  "allOf": [
    {
      "$ref": "#/$defs/QuoteSummary"
    },
    {
      "type": "object",
      "properties": {
        "account_id": {
          "type": "string",
          "format": "uuid"
        },
        "totals_updated_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "discount_percent": {
          "type": [
            "number",
            "null"
          ]
        },
        "discount_amount": {
          "type": [
            "number",
            "null"
          ]
        },
        "invoiced_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "invoiced_by": {
          "type": [
            "string",
            "null"
          ],
          "format": "uuid"
        },
        "invoice_pdf_path": {
          "type": [
            "string",
            "null"
          ]
        },
        "invoice_snapshot": {
          "type": [
            "object",
            "null"
          ],
          "additionalProperties": true
        },
        "invoice_bill_to": {
          "type": [
            "object",
            "null"
          ],
          "description": "Who the invoices of this quote are addressed to, as last issued, when it is not the signatory (parents paying for a wedding, an agency): `party` (`kind` `client`, `company` with `companyId`, or `platform` with `platformName`) and `identity` (`isIndividual`, `companyName`, `firstName`, `lastName`, `vatNumber`, `registrationNumber`, `address`, `postalCode`, `city`, `state`, `country`, `phone`, `purchaseOrder`). `null`: the `client_*` recipient. Read only; an accounting sync should prefer it to `client_*`.",
          "properties": {
            "party": {
              "type": "object",
              "additionalProperties": true
            },
            "identity": {
              "type": "object",
              "additionalProperties": true
            }
          }
        },
        "payment_terms": {
          "type": [
            "string",
            "null"
          ]
        },
        "cancellation_terms": {
          "type": [
            "string",
            "null"
          ]
        },
        "postponement_terms": {
          "type": [
            "string",
            "null"
          ]
        },
        "purchase_order": {
          "type": [
            "string",
            "null"
          ]
        },
        "client_first_name": {
          "type": [
            "string",
            "null"
          ]
        },
        "client_last_name": {
          "type": [
            "string",
            "null"
          ]
        },
        "client_email": {
          "type": [
            "string",
            "null"
          ]
        },
        "client_phone": {
          "type": [
            "string",
            "null"
          ]
        },
        "client_is_individual": {
          "type": [
            "boolean",
            "null"
          ]
        },
        "client_company_name": {
          "type": [
            "string",
            "null"
          ]
        },
        "client_address": {
          "type": [
            "string",
            "null"
          ]
        },
        "client_postal_code": {
          "type": [
            "string",
            "null"
          ]
        },
        "client_city": {
          "type": [
            "string",
            "null"
          ]
        },
        "client_state": {
          "type": [
            "string",
            "null"
          ]
        },
        "client_country": {
          "type": [
            "string",
            "null"
          ]
        },
        "client_vat_number": {
          "type": [
            "string",
            "null"
          ]
        },
        "client_registration_number": {
          "type": [
            "string",
            "null"
          ]
        },
        "client_purchase_order": {
          "type": [
            "string",
            "null"
          ]
        },
        "parent_quote_id": {
          "type": [
            "string",
            "null"
          ],
          "format": "uuid",
          "description": "The quote this one amends (amendment)."
        },
        "amendment_sequence": {
          "type": "integer"
        },
        "platform_request_token": {
          "type": [
            "string",
            "null"
          ]
        },
        "translations": {
          "type": "object",
          "additionalProperties": true
        },
        "space_plan_snapshot": {
          "type": [
            "object",
            "array",
            "null"
          ]
        },
        "space_plan_snapshot_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "ai_generated": {
          "type": "boolean"
        },
        "ai_source_lead_id": {
          "type": [
            "string",
            "null"
          ],
          "format": "uuid"
        },
        "ai_model": {
          "type": [
            "string",
            "null"
          ]
        },
        "ai_confidence": {
          "type": [
            "number",
            "null"
          ]
        },
        "ai_reasoning": {
          "type": [
            "string",
            "null"
          ]
        },
        "ai_warnings": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "ai_generated_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "document_lines": {
          "type": [
            "array",
            "null"
          ],
          "description": "Platform quotes only: the lines read out of the PDF the platform sent, read-only. They never count in the totals (the quote keeps one line carrying the printed amount). Null on a Joinways quote; empty until read (see `document_lines_status`).",
          "items": {
            "$ref": "#/$defs/QuoteDocumentLine"
          }
        },
        "document_lines_status": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "pending",
            "done",
            "failed",
            "no_pdf",
            "skipped",
            null
          ],
          "description": "Where the reading of the platform PDF stands. Null = not asked (only won platform quotes are read automatically)."
        },
        "document_lines_extracted_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "rejected_with_event": {
          "type": "boolean"
        },
        "is_demo": {
          "type": "boolean"
        }
      }
    }
  ],
  "$defs": {
    "QuoteDocumentLine": {
      "type": "object",
      "description": "One line printed on a platform quote PDF, as read. Every field but `id` and `title` may be null.",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid"
        },
        "title": {
          "type": "string"
        },
        "description": {
          "type": [
            "string",
            "null"
          ]
        },
        "section": {
          "type": [
            "string",
            "null"
          ],
          "description": "Heading printed above the line on the document."
        },
        "quantity": {
          "type": [
            "number",
            "null"
          ]
        },
        "unit": {
          "type": [
            "string",
            "null"
          ]
        },
        "day": {
          "type": [
            "string",
            "null"
          ],
          "format": "date",
          "description": "Event day the line belongs to, when the document says."
        },
        "amount_excl_tax": {
          "type": [
            "number",
            "null"
          ]
        },
        "amount_incl_tax": {
          "type": [
            "number",
            "null"
          ]
        },
        "is_option": {
          "type": "boolean"
        },
        "is_discount": {
          "type": "boolean"
        }
      }
    },
    "QuoteStatus": {
      "type": "string",
      "enum": [
        "draft",
        "pending",
        "accepted",
        "signed",
        "rejected",
        "invoiced",
        "paid",
        "cancelled"
      ],
      "description": "`draft` = not sent yet; `pending` = sent, awaiting the client; `accepted` / `signed` = client agreement (signed = signature recorded); `rejected` = refused; `invoiced` = at least one invoice issued (a deposit included); `paid` = fully settled; `cancelled` = withdrawn. accepted, signed, invoiced and paid are live contracts counted in the event's confirmed amount (unless replaced, see `superseded_by_quote_id`)."
    },
    "QuoteSummary": {
      "type": "object",
      "description": "A quote as listed (`GET /quotes`).",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid"
        },
        "event_id": {
          "type": "string",
          "format": "uuid"
        },
        "quote_number": {
          "type": [
            "string",
            "null"
          ]
        },
        "title": {
          "type": "string"
        },
        "status": {
          "$ref": "#/$defs/QuoteStatus"
        },
        "client_visible": {
          "type": "boolean",
          "description": "A draft already shown on the client page without being sent (« Montrer au client sans envoyer »): still `draft`, but the client can read and sign it. See `POST /quotes/{id}/client-visibility`."
        },
        "currency": {
          "type": "string"
        },
        "total_excl_tax": {
          "type": "number"
        },
        "total_tax": {
          "type": "number"
        },
        "total_incl_tax": {
          "type": "number"
        },
        "is_signed": {
          "type": [
            "boolean",
            "null"
          ]
        },
        "signed_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "signature_mode": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "manual",
            "public",
            null
          ]
        },
        "signer_name": {
          "type": [
            "string",
            "null"
          ]
        },
        "signer_email": {
          "type": [
            "string",
            "null"
          ]
        },
        "is_invoiced": {
          "type": [
            "boolean",
            "null"
          ]
        },
        "invoice_number": {
          "type": [
            "string",
            "null"
          ]
        },
        "invoice_date": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "due_date": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "payment_date": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "is_reverse_charge": {
          "type": [
            "boolean",
            "null"
          ]
        },
        "sent_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time",
          "description": "When the quote was sent (for a platform quote, when the platform transmitted it)."
        },
        "viewed_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "last_viewed_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "view_count": {
          "type": "integer"
        },
        "expires_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time",
          "description": "Validity end of the offer."
        },
        "created_at": {
          "type": "string",
          "format": "date-time"
        },
        "author_id": {
          "type": "string",
          "format": "uuid"
        },
        "billing_profile_id": {
          "type": [
            "string",
            "null"
          ],
          "format": "uuid"
        },
        "source": {
          "type": "string",
          "enum": [
            "joinways",
            "platform"
          ],
          "description": "`joinways` = written in Joinways. `platform` = a booking platform's own document recorded in Joinways, mostly read from the platform's emails (quote transmitted, with its PDF), or imported once signed. A platform quote is read-only: its amounts, discounts, currency and lines are never edited, it is never deleted nor duplicated, and its status only takes `accepted` or `rejected` through the API; its PDF is the platform's."
        },
        "source_platform": {
          "type": [
            "string",
            "null"
          ],
          "description": "Booking platform the document comes from (platform quote), or the one a Joinways quote was deposited to (e.g. Kactus)."
        },
        "external_reference": {
          "type": [
            "string",
            "null"
          ],
          "description": "The platform's own quote number (a platform that renumbers each revision gives each version its own). Unique per event."
        },
        "platform_pushed_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time",
          "description": "When a Joinways quote was deposited on the platform (first deposit only)."
        },
        "superseded_by_quote_id": {
          "type": [
            "string",
            "null"
          ],
          "format": "uuid",
          "description": "Set when this quote was replaced: by a later version the booking platform sent, or by a signed amendment. A replaced quote keeps its status but never counts in the event's confirmed amount; only quotes where this is null are live. Set by Joinways only."
        },
        "superseded_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time",
          "description": "When the quote was replaced (null while it is live)."
        }
      }
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/joinways-app-quote"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.