# Quote

URL: /business/nouns/quote · Id: `noun:quote`

> A Quote is a priced proposal of one or more Offers to one buyer, valid until a date, accepted into an Order.

A Quote is a priced proposal of one or more [Offers](/business/nouns/offer) to one buyer, valid until a date. Once accepted, its one-time lines become an [Order](/business/nouns/order) and its recurring lines a [Subscription](/business/nouns/subscription).

## Properties
| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `total` | `money` | Yes | The quoted total. |
| `validUntil` | `date` | Yes | The last day it may be accepted. |
| `status` | `string` | Yes | One of `draft`, `sent`, `accepted`, `declined`, `expired`, or `superseded`; an expired or superseded Quote never converts. |
| `lines` | `json` | Yes | One line per Offer: quantity, list Price, discount percent, net amount, term, and start, one line per ramp year. |
| `concessions` | `string[]` | No | Concessions granted, each from the Startup’s fixed concession list, such as a 60-day termination for convenience. |
| `paymentTerms` | `json` | No | The `collection`, `terms` and `purchaseOrder` every Invoice from the accepted Quote carries. |

## Object
```json
{
  "$id": "https://api.sb/quietcopy.com/quotes/quote_1",
  "$type": "Quote",
  "total": {
    "amount": 39,
    "currency": "USD"
  },
  "validUntil": "2026-10-22",
  "status": "draft",
  "lines": {},
  "concessions": [
    "60-day termination for convenience"
  ],
  "paymentTerms": {}
}
```

## Relationships
- <a id="rel-accepted-as"></a>A Quote **is accepted as** one [Order](/business/nouns/order): the [Order](/business/nouns/order) the Quote becomes when the buyer accepts it before it expires. `acceptedAs`, inverse [`quote`](/business/nouns/order#rel-quote).
- <a id="rel-issued-in"></a>A Quote **is issued in** one [Deal](/business/nouns/deal): a [Deal](/business/nouns/deal) sends Quotes, each a priced proposal valid until a date. `issuedIn`, inverse [`issues`](/business/nouns/deal#rel-issues).
- <a id="rel-proposes"></a>A Quote **proposes** many [Offers](/business/nouns/offer): a Quote prices one or more [Offers](/business/nouns/offer) for one buyer. `proposes`, inverse [`quotedIn`](/business/nouns/offer#rel-quoted-in).
- <a id="rel-starts-subscription"></a>A Quote **starts subscription** one [Subscription](/business/nouns/subscription): the [Subscription](/business/nouns/subscription) for a Quote’s recurring lines, started when the [Customer](/business/nouns/customer) accepts it. `startsSubscription`, inverse [`quote`](/business/nouns/subscription#rel-quote).

## Lifecycle

| State | Meaning | Moves to |
| --- | --- | --- |
| `draft` (first) | Its lines and terms can still change, and the buyer has not seen it. | `sent` by [Quote.send](/business/nouns/quote/send) |
| `sent` | Presented to the buyer with its lines, total and payment terms frozen. | `accepted` by [Quote.accept](/business/nouns/quote/accept); `declined` by [Quote.decline](/business/nouns/quote/decline); `expired` by [Quote.expire](/business/nouns/quote/expire); `superseded` by [Quote.supersede](/business/nouns/quote/supersede) |
| `accepted` | Its one-time lines became an Order and its recurring lines a Subscription. | None: it ends here. |
| `declined` | The buyer refused it, with the reason in their words. | None: it ends here. |
| `expired` | It reached its `validUntil` date unaccepted and never converts. | None: it ends here. |
| `superseded` | A newer Quote on the same Deal replaced it; only the newest can be accepted. | None: it ends here. |

## Verbs
| Verb | Description | Subject | Event | Class |
| --- | --- | --- | --- | --- |
| [Quote.accept](/business/nouns/quote/accept) | Accept takes a sent Quote before it expires, turning one-time lines into an Order and recurring lines into a Subscription. | [Sales Engineer](/agents/sales/sales-engineer) | [`Quote.accepted`](/business/events/Quote.accepted) | One-way: `send`, `do` |
| [Quote.decline](/business/nouns/quote/decline) | Decline records the buyer’s refusal of a sent Quote, with the reason in their words. | [Sales Engineer](/agents/sales/sales-engineer) | [`Quote.declined`](/business/events/Quote.declined) | Two-way: `try`, `send`, `do` |
| [Quote.expire](/business/nouns/quote/expire) | Expire closes a sent Quote that reached its validUntil date unaccepted; it never converts afterward. | [Sales Engineer](/agents/sales/sales-engineer) | [`Quote.expired`](/business/events/Quote.expired) | Two-way: `try`, `send`, `do` |
| [Quote.request](/business/nouns/quote/request) | Request asks a Startup for terms on one or more Offers, with the volume, term or scope wanted. | [Contact](/business/nouns/contact) | [`Quote.requested`](/business/events/Quote.requested) | None. |
| [Quote.send](/business/nouns/quote/send) | Send presents a drafted Quote to its buyer and freezes its lines, total and payment terms. | [Sales Engineer](/agents/sales/sales-engineer) | [`Quote.sent`](/business/events/Quote.sent) | One-way (customer): `send`, `do` |
| [Quote.supersede](/business/nouns/quote/supersede) | Supersede replaces a sent Quote with a newer one on the same Deal; only the newest Quote can be accepted. | [Sales Engineer](/agents/sales/sales-engineer) | [`Quote.superseded`](/business/events/Quote.superseded) | Two-way: `try`, `send`, `do` |
| <a id="create"></a>[Quote.create](/business/nouns/quote/create) | Creates a Quote. Inherited from [Noun](/business/nouns/noun). | None. | `Quote.created` | Two-way: `try`, `send`, `do` |
| <a id="get"></a>[Quote.get](/business/nouns/quote/get) | Returns one Quote by id. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="list"></a>[Quote.list](/business/nouns/quote/list) | Returns Quotes, newest first, one page at a time. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="update"></a>[Quote.update](/business/nouns/quote/update) | Changes the given properties of a Quote. Inherited from [Noun](/business/nouns/noun). | None. | `Quote.updated` | Two-way: `try`, `send`, `do` |
| <a id="delete"></a>[Quote.delete](/business/nouns/quote/delete) | Deletes a Quote; its history is kept. Inherited from [Noun](/business/nouns/noun). | None. | `Quote.deleted` | One-way: `send`, `do` |

## Permissions
Which Access level may call each Verb. One-way Verbs wait their delay window.

| Operation | `owner` | `admin` | `member` | `viewer` |
| --- | --- | --- | --- | --- |
| `Quote.create` | Yes | Yes | Yes | No |
| `Quote.get` | Yes | Yes | Yes | Yes |
| `Quote.list` | Yes | Yes | Yes | Yes |
| `Quote.update` | Yes | Yes | Yes | No |
| `Quote.delete` | Yes | Yes | Yes | No |
| `Quote.accept` | Yes | No | No | No |
| `Quote.decline` | Yes | Yes | Yes | No |
| `Quote.expire` | Yes | Yes | Yes | No |
| `Quote.request` | Yes | Yes | Yes | No |
| `Quote.send` | Yes | No | No | No |
| `Quote.supersede` | Yes | Yes | Yes | No |

## Call it

**Ask**

```text
Accept the latest quote with a party.
```

**API**

```bash
curl -X POST https://api.sb/quietcopy.com/quotes/quote_1/accept \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"party":"party_1"}'
```

```json
{
  "api": "https://api.sb/quietcopy.com",
  "order": {
    "$id": "https://api.sb/quietcopy.com/orders/order_1",
    "$type": "Order",
    "total": {
      "amount": 39,
      "currency": "USD"
    },
    "status": "placed"
  },
  "subscription": {
    "$id": "https://api.sb/quietcopy.com/subscriptions/subscription_1",
    "$type": "Subscription",
    "status": "active"
  },
  "quote": {
    "$id": "https://api.sb/quietcopy.com/quotes/quote_1",
    "$type": "Quote",
    "total": {
      "amount": 39,
      "currency": "USD"
    },
    "validUntil": "2026-10-22",
    "status": "accepted",
    "lines": {}
  },
  "action": {
    "$id": "https://api.sb/quietcopy.com/actions/action_1",
    "operation": "Quote.accept",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/quietcopy.com/actions/action_1"
  }
}
```

**SDK**

```ts
import { $ } from 'startup-builder'

const { order, subscription, quote } = await $.Quote.accept({ quote: 'quote_1', party: 'party_1' })
```

**CLI**

```bash
npx startup-builder do Quote.accept --json '{"quote":"quote_1","party":"party_1"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Quote.accept({ quote: 'quote_1', party: 'party_1' })"
  }
}
```

## Example
A Quote offers a county planning firm the $900-a-month permit-records [Offer](/business/nouns/offer) at 10% off for a year, plus a $3,000 backfill. It is valid for 14 days. The firm accepts: the backfill becomes an [Order](/business/nouns/order), and the records Offer becomes a [Subscription](/business/nouns/subscription) that keeps the 10% for the term.