# List quotes (`list_quotes`)

Lists the quote requests and custom-design submissions shoppers made through the connected Store customisers, with each submission id, its type, its submission number, the customiser and form it came from, and its creation date. Filters narrow it by type, customiser, form and UTC date range. Form responses, the design snapshot and any attached files are a separate per-submission read. It requires the quotes:read scope and has no side effects.

- Source URL: https://www.signcustomiser.com/help/mcp/tools/list_quotes/
- Markdown URL: https://www.signcustomiser.com/help/mcp/tools/list_quotes.md
- MCP endpoint: https://web.signcustomiser.com/mcp
- Required scope: `quotes:read`
- Behaviour: read

## Purpose

Count and locate shopper submissions, and obtain the ids get_quote takes, without pulling shopper free text into the answer.

## Annotations

| Hint | Value |
| --- | --- |
| readOnlyHint | true |
| destructiveHint | false |
| idempotentHint | true |
| openWorldHint | false |

## Prerequisites

- A merchant has connected this store and approved the quotes:read scope.

## Arguments

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `limit` | integer | no | How many submissions to return per page, between 1 and 100. Defaults to 20. |
| `cursor` | string | no | The opaque next_cursor value from the previous page, sent back with identical filters. |
| `filter` | object | no | Optional filters. An unknown filter is rejected, never ignored. |
| `filter.type` | string | no | Only submissions of this kind. Expected to grow: tolerate unknown values. One of: `quote`, `custom_design`. |
| `filter.customiser_id` | integer | no | Only submissions made through this customiser. |
| `filter.form_id` | integer | no | Only submissions of this form. |
| `filter.created_from` | string | no | Inclusive UTC start date, YYYY-MM-DD. |
| `filter.created_to` | string | no | Inclusive UTC end date, YYYY-MM-DD. |

## Result

Up to `limit` submission summaries plus the cursor for the next page. Deliberately narrower than the public API row, which returns each submission in full: responses, files and the design snapshot are get_quote.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `request_id` | string | yes |  |
| `store` | object | yes |  |
| `store.id` | integer | yes |  |
| `store.name` | string | yes |  |
| `quotes` | array of object | yes | The page of submission summaries. Responses, files and the design snapshot are get_quote. |
| `quotes[].id` | integer | yes |  |
| `quotes[].type` | string | yes | One of: `quote`, `custom_design`. |
| `quotes[].submission_number` | integer or null | no |  |
| `quotes[].customiser_id` | integer or null | no |  |
| `quotes[].form_id` | integer or null | no |  |
| `quotes[].created_at` | string or null | no |  |
| `pagination` | object | yes |  |
| `pagination.has_more` | boolean | yes |  |
| `pagination.next_cursor` | string or null | no |  |

## Error cases

| Code | Recovery |
| --- | --- |
| `insufficient_scope` | The connection was approved without quotes:read. |
| `invalid_cursor` | The cursor was altered or reused with different filters; restart with no cursor. |
| `invalid_parameter` | A date filter is not YYYY-MM-DD in UTC, or an id filter is out of range. |
| `unsupported_value` | A filter value is not one this API accepts; allowed_values lists the accepted set. |

## Example: Custom-design submissions from one customiser

Request:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_quotes",
    "arguments": {
      "limit": 1,
      "filter": {
        "type": "custom_design",
        "customiser_id": 42
      }
    }
  }
}
```

Response:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "structuredContent": {
      "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t",
      "store": {
        "id": 12,
        "name": "Demo Signs"
      },
      "quotes": [
        {
          "id": 8123,
          "type": "custom_design",
          "submission_number": 14,
          "customiser_id": 42,
          "form_id": 7,
          "created_at": "2026-07-19T01:00:00Z"
        }
      ],
      "pagination": {
        "has_more": false,
        "next_cursor": null
      }
    }
  }
}
```

## Example: A submission type that does not exist (error)

Request:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_quotes",
    "arguments": {
      "filter": {
        "type": "enquiry"
      }
    }
  }
}
```

Response:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "isError": true,
    "structuredContent": {
      "error": {
        "code": "invalid_parameter",
        "title": "Invalid query parameter",
        "detail": "The filter[type] value is not a supported submission type.",
        "recovery": "Correct the parameter named in parameter. Dates are YYYY-MM-DD in UTC and identifiers are integers between 1 and 2147483647.",
        "parameter": "filter[type]",
        "allowed_values": [
          "quote",
          "custom_design"
        ]
      }
    }
  }
}
```
