# Quote Order

> Price an order without placing it.

Requires an API key with the `read` scope.

A quote never creates an order and never charges money, which is why it only needs the `read` scope. It checks every domain's live availability and rejects the order if one cannot be bought.

## Body Parameters

<ParamField body="redirectUrl" type="string" required>
  Where the new domains forward to. Must be a full `https://` address.
</ParamField>

<ParamField body="domains" type="array" required>
  1 to 100 domain objects, within the limit from [Get Managed Mailbox Config](/api-reference/managed-inboxes/get-config). Each has `name` (the domain), `platform` (`GOOGLE` or `MICROSOFT`) and `mailboxes`: 1 to 5 objects with `firstName`, `lastName` and `username` (lowercase letters, numbers, dots, dashes and underscores).
</ParamField>

## Response

<ResponseField name="data" type="object">
  The quote.

  <Expandable title="data">
    <ResponseField name="oneTimeCents" type="integer">One-time cost in US cents (domain registration).</ResponseField>
    <ResponseField name="monthlyCents" type="integer">Monthly cost in US cents (mailboxes).</ResponseField>
    <ResponseField name="registrationYears" type="integer">Years each domain is registered for.</ResponseField>
    <ResponseField name="domains" type="array">
      One line per domain.

      <Expandable title="domains">
        <ResponseField name="name" type="string">Domain.</ResponseField>
        <ResponseField name="platform" type="string">`GOOGLE` or `MICROSOFT`.</ResponseField>
        <ResponseField name="priceCents" type="integer">Registration price in US cents.</ResponseField>
        <ResponseField name="renewalPriceCents" type="integer">Renewal price in US cents.</ResponseField>
        <ResponseField name="mailboxCount" type="integer">Mailboxes on the domain.</ResponseField>
        <ResponseField name="monthlyCents" type="integer">Monthly cost for the domain's mailboxes in US cents.</ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
```bash cURL
curl -X POST "https://api.foxreach.io/api/v1/managed-inboxes/orders/quote" \
  -H "X-API-Key: otr_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "redirectUrl": "https://yourcompany.com",
    "domains": [
      {
        "name": "yourbrand-mail.com",
        "platform": "GOOGLE",
        "mailboxes": [{"firstName": "Jane", "lastName": "Doe", "username": "jane"}]
      }
    ]
  }'
```

```python Python SDK (beta)
from foxreach import FoxReach

client = FoxReach(api_key="otr_your_key")
quote = client.managed_inboxes.quote_order({
    "redirectUrl": "https://yourcompany.com",
    "domains": [{
        "name": "yourbrand-mail.com",
        "platform": "GOOGLE",
        "mailboxes": [{"firstName": "Jane", "lastName": "Doe", "username": "jane"}],
    }],
})
```

```typescript TypeScript SDK (beta)
import { FoxReach } from "foxreach";

const client = new FoxReach({ apiKey: "otr_your_key" });
const quote = await client.managedInboxes.quoteOrder({
  redirectUrl: "https://yourcompany.com",
  domains: [{
    name: "yourbrand-mail.com",
    platform: "GOOGLE",
    mailboxes: [{ firstName: "Jane", lastName: "Doe", username: "jane" }],
  }],
});
```
</RequestExample>

<ResponseExample>
```json
{
  "data": {
    "oneTimeCents": 1400,
    "monthlyCents": 400,
    "domains": [
      {
        "name": "yourbrand-mail.com",
        "platform": "GOOGLE",
        "priceCents": 1400,
        "renewalPriceCents": 1800,
        "mailboxCount": 1,
        "monthlyCents": 400
      }
    ],
    "registrationYears": 1
  }
}
```
</ResponseExample>

## Errors

| Status | Description |
|--------|-------------|
| `401` | Missing, invalid, revoked or expired API key |
| `403` | API key does not have the required scope: `read` |
| `400` | The order is not valid. The message says what to change, for example `Enter a full https:// address for your website, like https://yourcompany.com`, `{name} is listed twice`, `Add at least one mailbox on {name}`, `Up to 5 mailboxes per domain` or that a domain is unavailable |
| `404` | Not found while managed mailboxes are switched off on this environment (`{"detail": "Not found"}`) |
| `422` | The body does not match the shape above |
| `502` | `Domain check is unavailable right now. Try again in a minute.` when the registrar lookup fails |

<Note>
  There is no API route to place an order, buy a mailbox or cancel one. Managed mailboxes are ordered and paid for in the dashboard; the API reads them and quotes prices.
</Note>

## Rate Limit

- **100 requests per minute, per API key.** Fixed 60-second window.
- Every response includes `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` (unix epoch seconds).
- A `429` response includes a `Retry-After` header (seconds until the bucket resets).

For client-side patterns (`Retry-After`, exponential backoff, monitoring `X-RateLimit-Remaining`), see [Rate Limiting](/rate-limiting).
