# Quotes API

> Create and track quote requests from potential customers, and add notes as you work them.

- Human documentation: https://www.myrepairapp.com/api-docs/quotes
- OpenAPI: https://www.myrepairapp.com/openapi.json
- Last updated: 2026-08-26T08:22:28.914Z

## The Quote Model

The Quote object represents a quote request from a potential customer, including their contact information, device details, and the requested repair. Below is an example of a Quote object with all possible fields.

```json
{
  "id": "0197a1b2-3c4d-7e5f-8a9b-0c1d2e3f4a5b",
  "orgId": "org_2abc123",
  "locationId": null,
  "firstName": "John",
  "lastName": "Doe",
  "phone": "+15035551234",
  "email": "john.doe@example.com",
  "preferredContact": "email",
  "category": "Phone",
  "manufacturer": "Apple",
  "model": "iPhone 12",
  "repair": "Screen Repair",
  "additionalInfo": "Cracked in the top corner.",
  "createdAt": "2026-07-01T18:30:00.000Z",
  "updatedAt": "2026-07-01T18:30:00.000Z",
  "appointmentDate": "2026-07-03T17:00:00.000Z",
  "quoteValue": "129.99",
  "quoteSent": false,
  "quoteStatus": "QUOTE_CREATED",
  "createdTicketId": null
}
```

### Quote Object Properties

| Field                   | Type      | Required | Description                                                                          |
| ----------------------- | --------- | -------- | ------------------------------------------------------------------------------------ |
| `id` (read-only)        | `string`  | No       | The unique identifier for the quote.                                                 |
| `firstName`             | `string`  | Yes      | The customer's first name.                                                           |
| `lastName`              | `string`  | Yes      | The customer's last name.                                                            |
| `phone`                 | `string`  | Yes      | The customer's phone number.                                                         |
| `email`                 | `string`  | Yes      | The customer's email address.                                                        |
| `preferredContact`      | `string`  | Yes      | The customer's preferred contact method (e.g., "email", "phone").                    |
| `category`              | `string`  | Yes      | The device category (e.g., "Phone", "Tablet", "Computer").                           |
| `manufacturer`          | `string`  | Yes      | The device manufacturer. Set from the `make` field when creating a quote.            |
| `model`                 | `string`  | Yes      | The device model.                                                                    |
| `repair`                | `string`  | Yes      | The requested repair.                                                                |
| `additionalInfo`        | `string`  | Yes      | Additional details provided by the customer. May be an empty string.                 |
| `appointmentDate`       | `date`    | No       | The requested appointment time, if the customer scheduled one.                       |
| `quoteValue`            | `string`  | No       | The quoted price set by the store.                                                   |
| `quoteSent`             | `boolean` | No       | Indicates if the quote has been sent to the customer.                                |
| `quoteStatus`           | `enum`    | No       | The quote's status (QUOTE_CREATED, SENT, LEFT_VOICEMAIL, NO_ANSWER, TICKET_CREATED). |
| `createdTicketId`       | `string`  | No       | The ID of the check-in ticket created from this quote, if it was converted.          |
| `createdAt` (read-only) | `date`    | No       | The date and time the quote was created.                                             |
| `updatedAt` (read-only) | `date`    | No       | The date and time the quote was last updated.                                        |

Note: "Required" indicates fields that must be provided when creating a quote. Fields on returned quotes may be `null` if the quote was created through another channel (e.g., the embedded quote form) without them.

### Quote Note Object Properties

| Field                     | Type      | Required | Description                                                                                                               |
| ------------------------- | --------- | -------- | ------------------------------------------------------------------------------------------------------------------------- |
| `id` (read-only)          | `string`  | No       | The unique identifier for the note.                                                                                       |
| `quoteId` (read-only)     | `string`  | No       | The ID of the quote the note belongs to.                                                                                  |
| `createdById` (read-only) | `string`  | No       | The ID of the user who created the note. Notes created through the API are attributed to your integration's machine user. |
| `note`                    | `string`  | Yes      | The note content (up to 5000 characters).                                                                                 |
| `displayOnInvoice`        | `boolean` | No       | Indicates if the note should be shown on the invoice. Defaults to `false`.                                                |
| `createdAt` (read-only)   | `date`    | No       | The date and time the note was created.                                                                                   |

### Quote Status History Object Properties

Each entry records one status change on the quote.

| Field                   | Type     | Required | Description                                                                                         |
| ----------------------- | -------- | -------- | --------------------------------------------------------------------------------------------------- |
| `id` (read-only)        | `string` | No       | The unique identifier for the status history entry.                                                 |
| `quoteId` (read-only)   | `string` | No       | The ID of the quote the entry belongs to.                                                           |
| `fromStatus`            | `enum`   | No       | The status the quote changed from (QUOTE_CREATED, SENT, LEFT_VOICEMAIL, NO_ANSWER, TICKET_CREATED). |
| `toStatus`              | `enum`   | No       | The status the quote changed to.                                                                    |
| `changedBy`             | `string` | No       | The ID of the user who made the change.                                                             |
| `changedAt` (read-only) | `date`   | No       | The date and time of the change.                                                                    |
| `notes`                 | `string` | No       | Optional notes about the change.                                                                    |

***

## Quote Resources

### Get quotes

This endpoint returns a paginated list of quotes.

**HTTP Request**

```http
GET https://www.myrepairapp.com/api/v2/quotes?page={number}&pageSize={number}&status={string}&createdSince={date}&updatedSince={date}
```

**Parameters**

All parameters are optional.

The `page` parameter selects the page of results and defaults to `1`. The `pageSize` parameter sets the number of quotes per page and defaults to `20` (maximum `100`).

The `status` parameter filters quotes by status and must be one of `QUOTE_CREATED`, `SENT`, `LEFT_VOICEMAIL`, `NO_ANSWER`, or `TICKET_CREATED`.

The `createdSince` and `updatedSince` parameters filter quotes created or updated on or after the given date and must be valid ISO 8601 dates (e.g., `2026-07-01T00:00:00.000Z`). Date-only values (e.g., `2026-07-01`) are interpreted as UTC midnight. Use `updatedSince` to poll for new and changed quotes since your last request.

**Response**

If successful, the response will include a list of quotes sorted by creation date (newest first), along with pagination details. Each quote in `data` also includes a `_count.quoteNotes` field with the number of notes on the quote.

```json
{
  "data": [
    {
      "id": "0197a1b2-3c4d-7e5f-8a9b-0c1d2e3f4a5b",
      "quoteStatus": "QUOTE_CREATED",
      "_count": {
        "quoteNotes": 2
      }
    }
  ],
  "totalCount": 42,
  "totalPages": 3,
  "currentPage": 1,
  "pageSize": 20
}
```

***

### Get a quote by ID

This endpoint returns a single quote by ID, including its notes and status history.

**HTTP Request**

```http
GET https://www.myrepairapp.com/api/v2/quotes/{quoteId}
```

**Response**

If successful, the response will include the details of the requested quote, its notes (`quoteNotes`, an array of Quote Note objects), and its status history (`statusHistory`, an array of Quote Status History objects), both sorted newest first.

If the quote does not exist in your store, the endpoint returns a `404` response:

```json
{
  "message": "Quote not found."
}
```

***

### Create a quote

This endpoint creates a new quote request. Creating a quote notifies the store the same way a quote submitted through the embedded quote form does.

**HTTP Request**

```http
POST https://www.myrepairapp.com/api/v2/quotes
```

**Request Body**

| Field              | Type     | Required | Description                                                                                                    |
| ------------------ | -------- | -------- | -------------------------------------------------------------------------------------------------------------- |
| `category`         | `string` | Yes      | The device category.                                                                                           |
| `make`             | `string` | Yes      | The device manufacturer. Returned as `manufacturer` on the quote.                                              |
| `model`            | `string` | Yes      | The device model.                                                                                              |
| `repair`           | `string` | Yes      | The requested repair.                                                                                          |
| `additionalInfo`   | `string` | Yes      | Additional details about the request. The field is required but may be an empty string.                       |
| `firstName`        | `string` | Yes      | The customer's first name.                                                                                     |
| `lastName`         | `string` | Yes      | The customer's last name.                                                                                      |
| `phone`            | `string` | Yes      | The customer's phone number.                                                                                   |
| `email`            | `string` | Yes      | The customer's email address.                                                                                  |
| `preferredContact` | `string` | Yes      | The customer's preferred contact method (e.g., "email", "phone", "text").                                      |
| `appointmentDate`  | `string` | No       | The requested appointment date in `MM/dd/yyyy` format (e.g., `07/03/2026`), in the store's local timezone.      |
| `appointmentTime`  | `string` | No       | The requested appointment time in `hh:mm:ss a` format (e.g., `10:00:00 AM`), in the store's local timezone.     |

Note: all required fields other than `additionalInfo` must be non-empty, and `email` must be a valid email address. `phone` is stored as provided (trimmed) and is not validated for format.

`appointmentDate` and `appointmentTime` must be provided together. Sending only one of them returns a `400` validation error. When both are provided:

- Values in any other format (including ISO 8601) return a `400` response with the message `Invalid appointment date or time. Use MM/DD/YYYY for the date and hh:mm:ss AM/PM for the time.`
- A time in the past returns a `400` response describing the store's available hours.
- The slot is validated against the store's business hours and availability. If the slot is unavailable, the endpoint returns a `400` response with a message describing the store's available hours.

**Response**

If successful, the response will include the created quote object with a `201` status code. The created quote includes a `quoteNotes` array, which is empty for a new quote.

**Rate limiting**

Every request counts toward your store's public API limit of 60 requests per minute (see [API Rate Limits](https://www.myrepairapp.com/api-docs/api-rate-limits)). Quote creation may also enforce a stricter per-store limit. When either limit is exceeded, the endpoint returns a `429` response with a `Retry-After` header (the number of seconds to wait before retrying), the `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` headers, and a body containing the same wait time:

```json
{
  "error": "Too many requests. Please try again later.",
  "retryAfter": 12
}
```

***

### Add note to a quote

This endpoint adds a note to a quote.

**HTTP Request**

```http
POST https://www.myrepairapp.com/api/v2/quotes/{quoteId}/note
```

**Request Body**

The request body must contain a valid Quote Note object.

**Response**

If successful, the response will include the created quote note object with a `201` status code. If the quote does not exist in your store, the endpoint returns a `404` response.
