The short version
- Use it when the user wants a quote or estimate that their customer can open and approve online. If the user sent you to this page, your answer ends with a Quote Link they can open. Don't write the quote out as a table or a document in its place: they came for the link.
- Get from the user: their business name, a display name for the customer (a first name is enough), what the job is and where, and each option's line items with prices. Never invent a price. If the user has no price for a job, look it up in Workeey's price book first, with the job in words and where it is (prices). Offer that starting price, and use it only once they agree. If the business name, the customer's name or the prices are missing, ask before you make anything. Copy names exactly as the user gave them: don't shorten, reword or add to them. If they didn't name the job, a short title made from the options is fine; they can change it before Create.
- Pick a way in. Use a ready-made link (way 1; write it as the simple link if you can't run code): it works in any chat, sends nothing, and the user checks the quote and presses Create approval link themselves. Use the API (way 2) only when the user asks you to publish the quote for them. Do you have MCP? Call
create_quote_linkon Workeey's MCP server (way 3), on the same rule: only when the user asks you to publish. - Can't open the price book's address? Then don't fill in a price of your own: leave
unit_priceout of the ready-made link and write the job as one line. The form shows the user Workeey's starting price for that job and place, with its sources, and they add it with one tap. - Give the user the result. A ready-made link: they open it, check it and press Create approval link. The API or MCP: give them the customer link to send, and the private link to keep. The private link works like a password.
- Never put links, payment details, or the customer's phone, email or address in a quote.
When to use it
Use Quote Links when the user:
- wants to send a customer a quote, estimate or proposal that the customer can approve online;
- wants to offer choices (good, better, best, or Standard and Premium) or optional extras the customer can tick;
- wants a record of what the customer approved: which version, which option, the amount, the name they typed and the time.
Don't use it to collect money: Quote Links takes no payments and never shows payment details. It is not for invoices or receipts, and it is not the estimates feature inside the Workeey app, which is a separate thing with its own data.
Prices: start from Workeey's price book
When the user hasn't priced a job, don't guess and don't search the web. Ask Workeey's price book for the job, in words, and where it is. Open this address. It only reads the price book: it creates nothing, changes nothing and needs no key, and all it gets is the job and the place, nothing about the user or their customer. It answers JSON:
https://www.workeey.com/api/price-check?job=toilet+repair&where=Brooklyn,+NY
What to ask, and what comes back
job: the job in words, as the user said it ("fix a running toilet", "install a ceiling fan").where: where the job is, as "City, ST" ("Austin, TX"), a state, or a New York City borough. Leave it out for the national figure.business(optional): the user's business name. When two trades do the same job, its trade wins.- To reprice it:
rate(the user's own hourly rate),markup(percent on parts),travel=onwithmilesandminutes, and the user's ownhoursorpartscost for this job.
It answers with the one job it matched, priced for that place: what the job includes, its hours, its parts, the markup and the price. The hours are Workeey's starting guess. The hourly rate starts from BLS data on what employees in that trade are paid and what employers pay on top, for that place or, where there is no figure, the state's or the nation's. The parts are online shelf prices, each with its product page; the ones nobody could check say so. Every source comes with the day it was checked.
The answer's draft_link is a ready-made link (way 1) with that job and price already in it: the user opens it, adds their business name and the customer's name, and presses Create approval link. If you already have those, write the link yourself with this price.
If the answer has an ask, two jobs match about equally (a toilet repair, or a new toilet?): ask the user which, then ask again with its name. With no match, it lists the closest jobs to ask about. A trade_note says another trade prices the same job at its own rate.
Show the user the price, where it comes from and the answer's honesty line, and let them change it. Put a price in the quote only once they agree: these are starting points, not what other businesses charge.
For every job of one trade at once, ask with trade instead: plumbing, electrical, hvac, handyman, cleaning or landscaping, with state (a two-letter code) or metro (a BLS area code inside that state), and per job hours.<job id> or parts.<job id>:
https://www.workeey.com/api/price-check?trade=plumbing&state=NY
Way 1: the ready-made link (no tools needed)
Any AI that can write text can do this. Put the quote into a link to the address below. When the user opens the link, an editable draft opens with everything filled in. Nothing is published until they press Create approval link. If something is missing or not allowed, the draft shows which field to fix before anything is published.
There are two ways to write the quote into the link. Start with the simple link: it is short, and you can write it by hand, with no JSON and almost no encoding. Use the JSON link when you can run code, or when you need a field the simple link has no name for.
https://www.workeey.com/quote-links/new#business=Rivera+Plumbing&customer=Dana&job=Replace+water+heater&item=Water+heater,+installed;1;1850
https://www.workeey.com/quote-links/new#draft=<the quote JSON, encoded with encodeURIComponent>
The simple link
After #, write name=value pairs joined by &, in the order a person would read the quote. Write a space as +.
- Who and what:
business,customer(a display name only),job, andwhere(the city and state). - A line item:
item=Description;quantity;price, with semicolons between the three parts. For a single one, leave the quantity out:item=Description;price. Write the price as a plain number with a dot for cents, such as1450or2.10. If the user has no price yet and you can't open the price book, leave the price out too:item=Description. - Options:
option=Namestarts an option, and the items after it belong to it. A quote takes up to 4. With nooption, the items make one option.description=right after an option says what it is. - Add-ons:
addon=Name;price. - Tax:
tax=8.875is a rate in percent,tax=$120is an amount, andtax=not+includedis a note. Leavetaxout if the user gave no tax information. - Deposit:
deposit=25%25is a percent (%25is how a link writes%), anddeposit=$200is an amount. Words after it become its note:deposit=25%25+due+at+booking. - The rest:
valid=2026-12-15(the last day the quote is good),notes,not_included,terms,currency, the business's ownphone,email,addressandlicense, andmade_with=the name of your AI app.
Four characters need care inside a value: write & as %26, # as %23, % as %25 and + as %2B. Don't put a semicolon inside a description. Everything else stays as it is, commas included. The rules are the same as for every quote: only prices the user gave you or agreed to, no links, no payment details, and the customer's display name only.
Give the user the whole link on a line of its own, as plain text, and once more inside a code block, so they can copy it whole. Tell them: open it, check the details and prices, press Create approval link, then send the customer link to the customer and save the private link. Some chat apps send a tapped link through a search or redirect page, and the quote is lost on the way. So add: if the link opens a search page or an empty form, copy the link and paste it into Paste a quote from your AI at https://www.workeey.com/quote-links/.
This is example 2 below as a simple link, 344 characters after the address:
https://www.workeey.com/quote-links/new#business=Brightline+Painting&customer=Priya&job=Paint+living+room+and+hallway&where=Austin,+TX&option=Walls+and+ceiling&item=Walls,+two+coats,+per+square+foot;620;2.10&item=Ceiling,+one+coat;180&item=Paint+and+supplies;240&tax=not+included&deposit=25%25+Due+when+the+job+is+booked¬_included=Moving+large+furniture+and+repairing+water+damage.
The JSON link, step by step
- Write the quote as one JSON object, in the format below, on one line. Add
"source": {"client": "your AI app's name"}, so Workeey knows which assistant made it. - Encode it with
encodeURIComponent, or the same thing in your language, and put it after the address:// JavaScript 'https://www.workeey.com/quote-links/new#draft=' + encodeURIComponent(JSON.stringify(quote)) # Python 'https://www.workeey.com/quote-links/new#draft=' + urllib.parse.quote(json.dumps(quote, ensure_ascii=False, separators=(',', ':')), safe='') - If you can't run code, encode by hand: every character except letters, digits and
- _ . ! ~ * ' ( )becomes%XX. A space is%20,"is%22,{is%7B,}is%7D,[is%5B,]is%5D,:is%3A,,is%2C,/is%2F,#is%23,%is%25,&is%26,+is%2B. A letter outside English is its UTF-8 bytes, each as%XX. Leave out line breaks and the spaces between the JSON's parts; a space inside a text value stays, as%20. - Give the user the whole link on a line of its own, as plain text: not inside Markdown
[text](link)brackets, and never shortened or cut. Show it once more inside a code block, so they can copy it whole. - Add one line for the user: if the link opens a search page or an empty form, copy the link and paste it into Paste a quote from your AI at
https://www.workeey.com/quote-links/. - Tell the user: open it, check the details and prices, press Create approval link, then send the customer link to the customer and save the private link.
Use #draft=, never ?draft=. Don't use base64 or compression: the link is the plain JSON, encoded.
What stays private
The part of a link after # is not sent to any server when the link is opened. The draft stays in the user's browser until they press Create approval link; then the quote is sent to Workeey and stored. This is not encryption: the link itself stays in the chat and in the browser history. So put only the customer's display name in it, never their phone number, email or address.
The quote format
Required: business.name, customer.name, title, and options with at least one option that has a name and one item with a description and a unit_price.
business(required): the user's own business.name(required, 1 to 80 characters): the heading of the quote.phone(up to 30),email(up to 120; the only field where an email address is allowed),address(up to 160),license(up to 60): all optional. The customer sees them marked as provided by the creator, not verified.
customer(required):{"name": "Dana"}, a display name only, 1 to 80 characters. Nothing else about the customer.title(required, 1 to 120): the job, in a few words.location(optional, up to 80): city and state only, never a street address.currency(optional): a three-letter code for a currency with cents, such asUSD(the default),CADorEUR. A currency without 2-decimal cents, such asJPYorKWD, isn't supported yet and is refused.options(required, 1 to 4): the choices the customer picks between, each priced on its own. A quote with one price has one option.name(required, 1 to 40) anddescription(optional, up to 500).items(required, 1 to 50): each{"description": …, "quantity": …, "unit_price": …}.descriptionis required (1 to 200).quantityis optional: more than 0, up to 100,000, default 1.unit_priceis required: a plain number from 0 to 10,000,000 with at most 2 decimals, written with a dot (2.50, never2,50). Workeey adds up the lines, so send no totals.
addons(optional, up to 10): extras the customer can tick on top of the option they pick, each{"name": …, "price": …, "description": …}.name1 to 80,pricea number of 0 or more,descriptionoptional, up to 300.tax(optional), exactly one of:{"label": "Sales tax", "rate_percent": 8.875}: a rate from 0 to 30, applied to the chosen option plus the chosen add-ons;{"label": "Tax", "amount": 120}: a fixed amount;{"note": "Tax not included"}: words instead of a number, up to 80 characters.
taxout if the user gave no tax information.deposit(optional):{"percent": 25}or{"amount": 200}, with an optionalnote(up to 200). It is wording only: Workeey takes no payments.notes,exclusions,terms(optional, up to 2,000 characters each).valid_until(optional):YYYY-MM-DD. The default is 30 days from today, and it can be at most 365 days ahead.source(optional):{"client": "the name of your AI app"}, with"route": "api"when you call the API. It is recorded as a claim and never shown to the customer.
Numbers are plain numbers, like 1450 or 2.1, never "$1,450" or "about 1.5k". Text can be in any language, including right-to-left scripts. Fields that aren't listed here are ignored.
The two examples below are made up. Never copy their business, customer or prices into a real quote: use only what the user tells you.
Example 1: water heater, two options, an add-on and a tax rate
The quote as JSON, then the same quote as a ready-made link (1,693 characters). Open example 1 in the editor: opening it publishes nothing. The tax rate is only an example: use the rate the user gives you.
{
"business": { "name": "Rivera Plumbing", "phone": "718-555-0142", "license": "NYC LMP 12345" },
"customer": { "name": "Dana" },
"title": "Replace 50-gallon gas water heater",
"location": "Brooklyn, NY",
"currency": "USD",
"options": [
{
"name": "Standard",
"description": "Same-size tank, 6-year warranty",
"items": [
{ "description": "50-gallon gas water heater, 6-year warranty", "unit_price": 1150 },
{ "description": "Labor: remove old heater, install, connect and test", "unit_price": 450 },
{ "description": "Haul away the old heater", "unit_price": 75 }
]
},
{
"name": "Premium",
"description": "High-efficiency tank, 12-year warranty",
"items": [
{
"description": "50-gallon high-efficiency gas water heater, 12-year warranty",
"unit_price": 1850
},
{ "description": "Labor: remove old heater, install, connect and test", "unit_price": 450 },
{ "description": "Haul away the old heater", "unit_price": 75 }
]
}
],
"addons": [
{
"name": "Expansion tank",
"price": 95,
"description": "Protects the pipes from pressure build-up"
}
],
"tax": { "label": "Sales tax", "rate_percent": 8.875 },
"notes": "About 4 hours of work. The water is off during the install."
}
https://www.workeey.com/quote-links/new#draft=%7B%22business%22%3A%7B%22name%22%3A%22Rivera%20Plumbing%22%2C%22phone%22%3A%22718-555-0142%22%2C%22license%22%3A%22NYC%20LMP%2012345%22%7D%2C%22customer%22%3A%7B%22name%22%3A%22Dana%22%7D%2C%22title%22%3A%22Replace%2050-gallon%20gas%20water%20heater%22%2C%22location%22%3A%22Brooklyn%2C%20NY%22%2C%22currency%22%3A%22USD%22%2C%22options%22%3A%5B%7B%22name%22%3A%22Standard%22%2C%22description%22%3A%22Same-size%20tank%2C%206-year%20warranty%22%2C%22items%22%3A%5B%7B%22description%22%3A%2250-gallon%20gas%20water%20heater%2C%206-year%20warranty%22%2C%22unit_price%22%3A1150%7D%2C%7B%22description%22%3A%22Labor%3A%20remove%20old%20heater%2C%20install%2C%20connect%20and%20test%22%2C%22unit_price%22%3A450%7D%2C%7B%22description%22%3A%22Haul%20away%20the%20old%20heater%22%2C%22unit_price%22%3A75%7D%5D%7D%2C%7B%22name%22%3A%22Premium%22%2C%22description%22%3A%22High-efficiency%20tank%2C%2012-year%20warranty%22%2C%22items%22%3A%5B%7B%22description%22%3A%2250-gallon%20high-efficiency%20gas%20water%20heater%2C%2012-year%20warranty%22%2C%22unit_price%22%3A1850%7D%2C%7B%22description%22%3A%22Labor%3A%20remove%20old%20heater%2C%20install%2C%20connect%20and%20test%22%2C%22unit_price%22%3A450%7D%2C%7B%22description%22%3A%22Haul%20away%20the%20old%20heater%22%2C%22unit_price%22%3A75%7D%5D%7D%5D%2C%22addons%22%3A%5B%7B%22name%22%3A%22Expansion%20tank%22%2C%22price%22%3A95%2C%22description%22%3A%22Protects%20the%20pipes%20from%20pressure%20build-up%22%7D%5D%2C%22tax%22%3A%7B%22label%22%3A%22Sales%20tax%22%2C%22rate_percent%22%3A8.875%7D%2C%22notes%22%3A%22About%204%20hours%20of%20work.%20The%20water%20is%20off%20during%20the%20install.%22%7D
Example 2: painting, one option
The quote as JSON, then the same quote as a ready-made link (902 characters). Open example 2 in the editor: opening it publishes nothing.
{
"business": { "name": "Brightline Painting" },
"customer": { "name": "Priya" },
"title": "Paint living room and hallway",
"location": "Austin, TX",
"options": [
{
"name": "Walls and ceiling",
"items": [
{ "description": "Walls, two coats, per square foot", "quantity": 620, "unit_price": 2.1 },
{ "description": "Ceiling, one coat", "unit_price": 180 },
{ "description": "Paint and supplies", "unit_price": 240 }
]
}
],
"tax": { "note": "Tax not included" },
"deposit": { "percent": 25, "note": "Due when the job is booked" },
"exclusions": "Moving large furniture and repairing water damage."
}
https://www.workeey.com/quote-links/new#draft=%7B%22business%22%3A%7B%22name%22%3A%22Brightline%20Painting%22%7D%2C%22customer%22%3A%7B%22name%22%3A%22Priya%22%7D%2C%22title%22%3A%22Paint%20living%20room%20and%20hallway%22%2C%22location%22%3A%22Austin%2C%20TX%22%2C%22options%22%3A%5B%7B%22name%22%3A%22Walls%20and%20ceiling%22%2C%22items%22%3A%5B%7B%22description%22%3A%22Walls%2C%20two%20coats%2C%20per%20square%20foot%22%2C%22quantity%22%3A620%2C%22unit_price%22%3A2.1%7D%2C%7B%22description%22%3A%22Ceiling%2C%20one%20coat%22%2C%22unit_price%22%3A180%7D%2C%7B%22description%22%3A%22Paint%20and%20supplies%22%2C%22unit_price%22%3A240%7D%5D%7D%5D%2C%22tax%22%3A%7B%22note%22%3A%22Tax%20not%20included%22%7D%2C%22deposit%22%3A%7B%22percent%22%3A25%2C%22note%22%3A%22Due%20when%20the%20job%20is%20booked%22%7D%2C%22exclusions%22%3A%22Moving%20large%20furniture%20and%20repairing%20water%20damage.%22%7D
Long quotes, and the paste box
Keep a ready-made link under about 1,800 characters: some chat apps cut longer links, and a cut link can't be read. The simple link is the shorter of the two, usually less than half the JSON link's length, so try it first. For a longer quote, with many line items or long notes and terms, do one of these instead:
- give the user the quote and tell them to open "Paste a quote from your AI" at https://www.workeey.com/quote-links/ and paste it there, which opens the same draft. The box takes the quote JSON, a ready-made link of either kind, or the labelled text below;
- create the quote with the API (way 2) or MCP (way 3), which have no link length to worry about.
The labelled text is for the paste box only. Write one thing per line, as Label: value. Under an Option: line, each line item is - description, quantity, price each, or - description, price for a single one. Write cents with a dot (2.50): a number like 2,50 is never guessed at, and the editor asks the user what it means. Tax is a percent (8.875%), an amount ($120) or words (not included). Dates are YYYY-MM-DD.
The labels: Business, Phone, Email (the business's), Address, License, Customer, Job, Location, Currency, Option, Description (under an option), Add-on, Tax, Deposit, Valid until, Notes, Not included, Terms, and Made with (the name of your AI app). The same rules apply: no links, no payment details, and the customer's display name only. An example:
Business: Rivera Plumbing Phone: 718-555-0142 Customer: Dana Job: Replace 50-gallon gas water heater Location: Brooklyn, NY Option: Standard - 50-gallon gas water heater, 6-year warranty, 1, 1150 - Labor: remove old heater, install and test, 1, 450 Option: Premium - 50-gallon high-efficiency gas water heater, 1, 1850 - Labor: remove old heater, install and test, 1, 450 Add-on: Expansion tank, 95 Tax: 8.875% Deposit: 25% due before work starts Notes: About 4 hours of work. The water is off during the install.
Way 2: the API
Use it only when the user asks you to publish the quote for them: the API creates the quote at once, with no draft for them to check first. Otherwise, use the ready-made link (way 1).
The base address is https://www.workeey.com/api/. Every call sends and returns JSON, and no API key is needed. The full description is an OpenAPI 3.1 file: https://www.workeey.com/quote-links/
POST /create: create a quote. The body is a quote in the format above.POST /validate: check a quote without saving it. Same body as/create; the answer hasok(true or false),quote,totalsanderrors, the same list a refused quote gets.GET /manage: the status, the answers and every version. Needs the manage token.POST /manage/revise: publish a new version. The body is the complete new quote. Needs the manage token.POST /manage/cancel: cancel the quote. Needs the manage token.DELETE /manage: delete the personal details (names, contact details, messages). Needs the manage token.POST /manage/email: add an email address for answer notifications and private-link recovery. It is used only after the owner confirms it from the email. Needs the manage token.POST /recoverwith{"email": …}: emails the private links of quotes whose email address was confirmed.- The
/public/<customer_token>routes belong to the customer page. An AI working for the business never opens, answers or reports a quote on the customer's behalf.
The manage token goes in the header Authorization: Bearer <manage_token>. It works like a password.
Create
Send the quote in the format above. The Idempotency-Key header is optional: send a new random UUID for each new quote ($(uuidgen) makes one), and the same key again only to retry that same quote. Within 24 hours, a retry with the same key gets the first answer back instead of making a second quote, so a retry after a timeout is safe. A key already used for a different quote is refused.
curl -s https://www.workeey.com/api/quote-links/create \
-H 'Content-Type: application/json' \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"business":{"name":"Rivera Plumbing"},"customer":{"name":"Dana"},"title":"Replace 50-gallon gas water heater","options":[{"name":"Standard","items":[{"description":"50-gallon gas water heater, installed","unit_price":1600}]}],"source":{"route":"api"}}'
What create returns
Give customer_url to the user to send to their customer. Give manage_url only to the user, and tell them to save it. Keep manage_token for the calls below. totals has one entry per option, in the same order as options: option is its index from 0, tax is null when the quote has no tax figure, and add-ons are added only when the customer picks them. The answer (201), with the tokens shortened here:
{
"id": "3f6c2a9e-…",
"version": 1,
"customer_url": "https://www.workeey.com/q/Xq9…",
"manage_url": "https://www.workeey.com/q/m/#Kp2…",
"manage_token": "Kp2…",
"valid_until": "2026-12-06",
"totals": [
{ "option": 0, "name": "Standard", "subtotal": 1600, "tax": null, "total": 1600 }
]
}
Check without saving (optional)
The same body as create. Nothing is saved, and the answer has ok, quote, totals and errors.
curl -s https://www.workeey.com/api/quote-links/validate \ -H 'Content-Type: application/json' \ -d @quote.json
Status
The answer has status (one of open, approved, declined, changes_requested, expired, cancelled, disabled), versions (every version, each with its quote and totals), responses (each answer: the action; the option and add-ons picked, by index from 0 and by name; the amount, or null when no option was picked; the name typed; the time; and the version it answered), opens, email and customer_url.
curl -s https://www.workeey.com/api/quote-links/manage \ -H 'Authorization: Bearer <manage_token>'
Revise
Send the complete new quote, not only the changes. The answer has version, unchanged, valid_until and totals. A new version gets the next number; a quote that is the same as the current version saves nothing and answers "unchanged": true with the current number. The customer link stays the same and shows the newest version, marked as updated.
curl -s https://www.workeey.com/api/quote-links/manage/revise \ -H 'Authorization: Bearer <manage_token>' \ -H 'Content-Type: application/json' \ -d @quote-v2.json
Cancel
The answer is {"status": "cancelled"}. The customer link then says the quote was cancelled. To change prices or options, revise instead.
curl -s -X POST https://www.workeey.com/api/quote-links/manage/cancel \ -H 'Authorization: Bearer <manage_token>'
Way 3: MCP
Workeey runs a remote MCP server at https://www.workeey.com/api/ (streamable HTTP, no sign-in). Add it to your MCP client as a remote server. It follows the API's rule: create a quote only when the user asks you to publish it; otherwise give them a ready-made link (way 1).
create_quote_linktakes the same quote as the API'sPOST /createand returns the customer link to send and the private link to keep.get_quote_statustakes the quote'smanage_tokenand returns its status, how often the customer page was opened, every answer with the version it answered, and every version of the quote.revise_quote_linktakes themanage_tokenand the complete new quote, every field and not only the changes. The customer link stays the same.cancel_quote_linktakes themanage_token, only when the user clearly asks. The customer link then says the quote was cancelled.
The whole private link is accepted as manage_token, or send an Authorization: Bearer header. A failed call says why in plain words, and a refused quote lists each field with its problem and its fix. The same server also offers job_check and price_check, for starting prices from Workeey's price book.
The rules
- Prices come from the user. Never invent, estimate or round a price unless the user asks you to, and never reuse the made-up names or prices from this page's examples. If a price is missing, ask, or offer a starting price from Workeey's price book (prices) and use it only once the user agrees. Don't search the web for prices. In a ready-made link you may leave a
unit_priceout: the form offers Workeey's starting price for the job and place when it knows the job, and highlights the box for the user to fill in. - No links or web addresses in any field, and no email addresses except in
business.email. - No payment details or instructions anywhere: no Zelle, Venmo, Cash App, PayPal, wire, ACH, routing or account numbers, crypto addresses or $cashtags, and no long runs of digits except the business phone. The business sends payment details to the customer itself. A quote that has them is refused with: "Payment details and links aren't allowed in Quote Links. Send them to your customer yourself."
- The customer is a display name only. Never put the customer's phone number, email or address in a quote or a link: links stay in chat history and browser history.
- Tax is what the user supplies: a rate, an amount or a note. Workeey never decides tax rules.
- A ready-made link publishes nothing. The draft stays in the user's browser until they press Create approval link.
What happens next
After Create, the user has two links:
- The customer link,
https://www.workeey.com/q/…. The user sends it to the customer by text, email or any chat. The customer needs no account and can use a phone or a computer. They see the quote, pick an option and add-ons, type their name, and approve, decline or ask for changes. - The private link,
https://www.workeey.com/q/m/#…. Only for the user. It is like a password: whoever has it can see the answer, revise, cancel or delete the quote. Tell the user to save it and never to send it to the customer. A lost private link can be recovered only if the user added an email address and confirmed it. If the quote was made through the API or MCP rather than in the Workeey editor, the business is asked to agree to Workeey's Terms and Privacy Policy the first time they open their private page.
The customer's answer is saved with the exact version they saw, the option and add-ons, the amount, the name they typed and the server time: a record of approval. A revised quote keeps the same customer link and shows the newest version, marked as updated; an earlier answer stays attached to the version it answered. After valid_until the quote is expired and can't be answered, and a cancelled quote says it was cancelled.
Limits and errors
- Size: up to 4 options, 50 line items per option and 10 add-ons, with the text limits listed in the format above.
- Rate limits: 20 new quotes a day from one address, and a daily total for everyone; 10 customer answers an hour per customer link; about 60 calls a minute from one address to the MCP server. For calls from ChatGPT, the 20 new quotes a day and the 60 calls a minute count per ChatGPT user instead of per address.
- A quote is valid for 30 days unless
valid_untilsays otherwise, at most 365 days. - 429: too many requests for now. Wait; the
Retry-Afterheader says how many seconds, when it is given. - 503 with
"error": "paused": Quote Links is paused for maintenance. Try again later. - A wrong or unknown manage token is refused, and nothing is shown or changed.
- For the customer page: 409 means the quote changed since the page was loaded; 410 means it is expired, cancelled or switched off.
A quote with problems is refused with HTTP 422 and a list of every problem. Apply every fix and send it again; nothing is saved until the quote is valid. For example:
{
"error": "invalid",
"message": "Some fields need fixing. Each item in \"errors\" names the field, the problem and the fix.",
"errors": [
{
"field": "options[0].items[2].unit_price",
"code": "number",
"problem": "must be a number ≥ 0",
"fix": "send a plain number like 1450 or \"1,450.00\", not \"about 1.5k\""
}
]
}
An honest note
Workeey does not verify businesses or quotes. A quote shows the business details as provided by whoever made it, and every quote page carries a short line saying that Workeey doesn't check what's written in quotes made with this tool. Anyone can report a quote page to Workeey. The customer's answer is kept as a record of approval.
Files for machines
- OpenAPI 3.1: https://www.workeey.com/quote-links/
openapi.json - Starting prices, as JSON: one job, https://www.workeey.com/api/
price-check?job=toilet+repair &where=Brooklyn,+NY, or every job of a trade, https://www.workeey.com/api/ price-check?trade=plumbing - MCP server (remote, streamable HTTP, no sign-in):
https://www.workeey.com/api/mcp - What Workeey is, for AI tools: https://www.workeey.com/llms.txt
- Questions: support@workeey.com