Skip to content

Quote sales

Big-ticket items such as grooming vans, trailers and mobile grooming units are not sold through the cart. A builder publishes a quote ad, a buyer asks for a quote, the builder answers with a priced quote and a deposit, and the buyer accepts it and pays the deposit through United Pet Club. The rest of the price is paid to the builder directly.

A quote ad is an ordinary Marketplace offer with two markers. Read it with the public offer read:

GET /api/marketplace/v1/offers/{offerId}
Host: api.unitedpetclub.com
{
"id": "0192f2c4-…",
"statusCode": "ACTIVE",
"pricingModeCode": "QUOTE_REQUIRED",
"isQuoteAd": true
}

(Other offer fields omitted.)

  • pricingModeCode: "QUOTE_REQUIRED" means there is no price to show and no buy button (Quote requests › Priced by quote).
  • isQuoteAd: true means the offer takes quote requests with a deposit. Show a Request a quote action instead of a price. A QUOTE_REQUIRED offer that is not an ad does not take quote requests from buyers.
  • A paused, suspended or ended ad is not returned by the public read (404). Treat that as “no longer advertised”.

Quote ads are published by businesses that build mobile units (business type Manufacturer with the Mobile Unit Builder specialty). On www they sit in the store category Grooming Vans & Mobile Units (https://www.unitedpetclub.com/en-US/store/mobile-units).

Send the buyer to their account with the offer:

https://account.unitedpetclub.com/{locale}/account/quotes/new?offer={offerId}

They sign in if needed, write what they need, and the request goes to the builder. They follow the quote, accept it and pay the deposit under Account → Quotes (/account/quotes).

All routes ride the gateway under /api/price/v1.

StepRouteWhoBody
AskPOST quotes/requestsbuyer{ "offerId": "…", "message": "8 m van, two tubs, left-hand drive" }
Price and sendPOST quotes/{quoteId}/sendseller{ "lines": [{ "description", "quantity", "unitPriceMinorUnits" }], "totalMinorUnits"?, "depositMinorUnits"?, "validUntilUtc"?, "termsText"?, "note"? }
RevisePOST quotes/{quoteId}/reviseseller{ "newTotalMinorUnits"?, "depositMinorUnits"?, "validUntilUtc"?, "termsText"?, "reason"?, "note"? }
WithdrawPOST quotes/{quoteId}/withdrawseller{ "reason"? }
AcceptPOST quotes/{quoteId}/acceptbuyer{ "revisionNumber": 2, "acceptanceSignature"? }
DeclinePOST quotes/{quoteId}/rejectbuyer{ "reason"? }
ReadGET quotes/{quoteId}either party—

Rules worth knowing before you render anything:

  • One open request per buyer and ad. Asking again returns the open quote with 200; a new one is 201.
  • Amounts are minor units in the ad’s currency (500000 = 5,000.00). The total defaults to the sum of the lines.
  • The deposit is between 0 and the total. The validity is one hour to 180 days ahead (default 30 days).
  • Only on a live ad. A quote is sent or revised only while its quote ad is active, and a quote with a deposit only once the seller’s payout account is ready to receive payouts.
  • Accept names the revision the buyer read. If the seller revised since, accept answers Price_PriceQuote_VL_Revision_RJ (409): show the new revision and ask again. A buyer never signs a price they did not see.
  • An accepted quote is final. It cannot be revised or withdrawn; a price change after acceptance means a full refund and a new quote.

With a deposit, accepting opens a card checkout for the deposit only, valid for about an hour. The deal is confirmed when the deposit is paid. If the buyer does not pay in time, the quote goes back to Sent (or Expired if its validity has passed) and they can accept again. A deposit that arrives after the checkout ran out is refunded in full automatically. With no deposit, accepting confirms the deal at once.

The deposit is part of the price: the buyer pays the balance to the builder directly, outside United Pet Club. It is not a protected deposit held until delivery (Protected animal deposits are a different product for animal listings).

The buyer pays only the quote’s price. The seller pays, under three names:

FeeAmount
Commission1.25 % of the total accepted quote (before taxes the seller collects), taken out of the deposit; whatever the deposit does not cover is charged to the seller’s card on file
Platform Processing Feecard processing on the deposit, at the published rate
Stripe Payout FeesStripe’s payout cost at cost, on the payout of the deposit

Each active quote ad also costs the seller an insertion fee of US$50 a month (per ad, billed monthly in advance; GST/HST added for Canadian sellers). United Pet Club can waive it for a seller. Refunding the whole deposit refunds the Commission; a partial refund keeps it.

GET quotes/{quoteId} returns the quote with its current revision, lines, totalMinorUnits, depositMinorUnits, validUntilUtc, termsText, and the deal fields:

statusMeaning
REQUESTEDthe buyer asked; the seller has not priced it
SENT / REVISEDpriced and open to accept; currentRevisionNumber is the one to accept
ACCEPTINGthe buyer accepted; the deposit checkout is open (acceptanceExpiresAtUtc)
ACCEPTEDthe deal is confirmed (deposit paid, or no deposit)
REJECTED, WITHDRAWN, EXPIREDclosed
FieldMeaning
depositStatusNONE, NOT_DUE, AWAITING_PAYMENT, PAID, PARTIALLY_REFUNDED, REFUNDED
depositRefundedMinorUnitsthe deposit refunded so far
acceptedRevisionNumberthe revision the deal was made on
activity[]{ code, occurredAtUtc, amountMinorUnits, currencyCode, reasonCode }, oldest first

Activity codes: DEPOSIT_CHECKOUT_OPENED, SALE_CONFIRMED, DEPOSIT_PARTIALLY_REFUNDED, DEPOSIT_REFUNDED, LATE_DEPOSIT_REFUNDED (a payment that came too late was refunded; it is not the deal’s deposit), COMMISSION_REVERSED (United Pet Club cancelled the deal and returned the seller’s Commission). Ignore codes you do not know: more may be added.

There is no webhook for quotes. Both parties get e-mail and in-app notices from United Pet Club at each step (request, quote sent or revised, expiring soon, expired, withdrawn, deposit due, deal confirmed, deposit refunded, deal cancelled by United Pet Club). An integration that shows a quote polls GET quotes/{quoteId}, within the rate limits.

Refusals carry a platform response code (Errors):

CodeHTTPWhen
Price_PriceQuote_VL_Offer_RJ409the offer is not an active quote ad
Price_PriceQuote_VL_OwnOffer_RJ409the buyer runs the ad’s storefront
Price_PriceQuote_HD_Offer_FL503the ad could not be checked; retry shortly
Price_PriceQuote_VL_Deposit_RJ400the deposit is below 0 or above the total
Price_PriceQuote_VL_Validity_RJ400the validity is not between one hour and 180 days ahead
Price_PriceQuote_VL_Revision_RJ409the quote was revised since the buyer read it
Price_PriceQuote_VL_Expired_RJ409the quote has expired
Price_PriceQuote_VL_State_RJ409the quote’s state does not allow this (e.g. revising an accepted quote)
Price_PriceQuote_UP_State_RJ409the quote is not pending (e.g. declining one being paid)
Price_PriceQuote_VL_AdInactive_RJ409sending or revising a quote on an ad that is paused, suspended or ended
Price_PriceQuote_VL_PayoutReadiness_RJ409a quote with a deposit from a seller whose payout account is not set up
Price_PriceQuote_HD_PayoutReadiness_FL503the payout account could not be checked; retry shortly