bymundi API

Send a quote

POST/v1/quotes/{quoteId}/send

Publishes the quote's public page, as the quote editor's Send / Update link does: renders the agency's template with the quote as it is now and stores that snapshot at publicUrl, which you share with the customer (nothing is emailed). A first send moves the trip from nueva to propuesta_enviada. Re-sending an accepted or rejected quote refreshes its page and keeps its status. With ?dryRun=true, renders the page and returns its HTML without publishing — the quote editor's preview. A template with a Liquid error is a 422 naming it.

Permissions: quotes:write · Kind: write · Cost: 1 unit · Dry run: ?dryRun=true · MCP tool send_quote

Cannot be undone.

Path parameters

Field Type Required Description
quoteId uuid yes

Body

None.

Response 200

One of:

quote

Field Type Required Description
object "quote" yes
id uuid yes
tripId uuid yes
code string yes
name string yes
mode "package" | "per_item" yes
status "draft" | "sent" | "accepted" | "rejected" | "expired" | "superseded" yes
travelers integer yes
marginPct number yes
finalPriceOverride string | null yes
validUntil string | null yes
ctaUrl string | null yes
templateId string | null yes
packages object[] yes
packages[].id string yes
packages[].name string yes
lines object | object | object[] yes
totals object yes
totals.currency "EUR" yes
totals.net string yes
totals.marginAmount string yes
totals.total string yes
totals.finalPrice string yes
totals.perPax string yes
totals.finalMargin string yes
totals.packages object[] yes
totals.packages[].id string yes
totals.packages[].name string yes
totals.packages[].deltaNet string yes
totals.packages[].deltaPvp string yes
totals.packages[].lineIds string[] yes
textOverrides object yes
imageOverrides object yes
sentAt string | null yes
modifiedSinceSent boolean yes
acceptedAt string | null yes
acceptedVia "prospect_link" | "agent" | null yes
acceptedPackageId string | null yes
acceptedLineIds string[] yes
acceptance object | null yes What the customer typed when accepting on the quote page — personal data: present only for a key holding travelers:read, only on quote reads (a write's response carries null; read the quote), and every such read is audited.
acceptance.name string | null yes
acceptance.email string | null yes
acceptance.phone string | null yes
acceptance.message string | null yes
engagement object yes
engagement.views integer yes
engagement.uniqueSessions integer yes
engagement.activeSeconds integer yes
engagement.ctaClicks integer yes
engagement.maxScrollPct number yes
engagement.sectionsSeen integer yes
engagement.interactions integer yes
engagement.lastSeenAt string | null yes
engagement.lastCtaAt string | null yes
metadata object yes
appUrl string | null yes
publicUrl string | null yes
createdAt string yes
updatedAt string yes

quote_send_preview

Field Type Required Description
object "quote_send_preview" yes
quoteId uuid yes
htmlBytes integer yes
html string yes

Errors

Errors are problem details. Besides the refusals described above, any call like this one can return: