# List copilot profile templates

`GET https://api.morevoice.ai/v1/copilot_profiles/templates`

The built-in profiles you can start from (`template_id` on create).

Authenticate with a secret API key: `Authorization: Bearer $MOREVOICE_API_KEY`.

Operation ID: `copilot_profiles_list_templates`.

## Parameters

### Query parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `limit` | `integer` | no | How many objects to return, 1–100 (default 20). |
| `starting_after` | `string` | no | A cursor (`next_cursor`) or object ID: return the objects after it (older). |
| `ending_before` | `string` | no | A cursor or object ID: return the objects before it (newer). |

### Headers

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `MoreVoice-Version` | `string` | no | The API version to use for this request. Defaults to the version the API key is pinned to. |

## Responses

### 200 OK

OK Returns `CopilotProfileTemplateList`.

| Field | Type | Description |
| --- | --- | --- |
| `object` | `"list"` | — |
| `data` | `CopilotProfileTemplate[]` | — |
| `has_more` | `boolean` | Whether more objects follow in the requested direction. |
| `next_cursor` | `string \| null` | Pass as starting_after (or ending_before, when paging backwards) to continue; null on the last page. |
| `url` | `string` | The list's path. |

Example:

```json
{
  "data": [
    {
      "alerts": [
        {
          "key": "escalation",
          "kind": "escalation",
          "label": "Asks for a manager",
          "message": "Acknowledge and offer a solution.",
          "notify_supervisor": true,
          "phrases": [
            "manager"
          ],
          "severity": "critical",
          "threshold": 0
        }
      ],
      "coaching": {
        "monologue_seconds_max": 40,
        "silence_seconds_max": 7,
        "talk_ratio_max": 0.65,
        "wpm_max": 175,
        "wpm_min": 0
      },
      "company": "Acme",
      "compliance": {
        "forbidden_phrases": [
          {
            "instead": "In most cases",
            "phrase": "guaranteed",
            "reason": "No guarantees",
            "severity": "warn"
          }
        ],
        "required_disclosures": []
      },
      "description": "Opening, discovery, offer, objections and close.",
      "fields": [
        {
          "hint": "",
          "key": "budget",
          "label": "Monthly budget",
          "options": [],
          "pattern": "",
          "required": false,
          "type": "money"
        }
      ],
      "goal": "Book a demo or a clear next step.",
      "kb": {
        "document_ids": [],
        "links": [],
        "min_score": 0.35
      },
      "language": "en",
      "model": {
        "api": "chat",
        "deep_path": true,
        "fallback_model": "gpt-4.1-nano",
        "max_calls_per_minute": 12,
        "model": "gpt-4.1-mini",
        "objection_similarity": 0.72,
        "priority": true,
        "speculative": true,
        "temperature": 0.3
      },
      "name": "Outbound sales",
      "object": "copilot_profile_template",
      "objections": [
        {
          "examples": [
            "it costs too much"
          ],
          "follow_up": "What do you pay now?",
          "kb_query": "price list",
          "key": "price",
          "label": "Too expensive",
          "response": "Compare it with what downtime costs you today.",
          "triggers": [
            "too expensive"
          ]
        }
      ],
      "product": "Acme Cloud PBX",
      "qa_rubric": [
        {
          "description": "Asked open questions first.",
          "key": "discovery",
          "label": "Discovery",
          "weight": 60
        },
        {
          "description": "Agreed a dated next step.",
          "key": "close",
          "label": "Next step",
          "weight": 40
        }
      ],
      "script": {
        "flow_id": null,
        "version": "published"
      },
      "stages": [
        {
          "checklist": [
            {
              "ask": "",
              "key": "recorded",
              "label": "Say the call is recorded",
              "phrases": [
                "this call is recorded"
              ],
              "required": true
            }
          ],
          "goal": "Introduce yourself and ask for two minutes",
          "key": "opening",
          "label": "Opening"
        }
      ],
      "template_id": "sales-outbound",
      "tone": "Warm, confident, never pushy."
    }
  ],
  "has_more": false,
  "next_cursor": null,
  "object": "list",
  "url": "/v1/copilot_profiles/templates"
}
```

### 400 Bad Request

The request is invalid: a parameter is missing, malformed or unknown, or the version header is unknown. Returns `ErrorEnvelope`.

### 401 Unauthorized

No valid API key was sent. Returns `ErrorEnvelope`.

### 403 Forbidden

The key may not do this (a missing scope, a plan limit, or a compliance block). Returns `ErrorEnvelope`.

### 429 Too Many Requests

Too many requests, or no call capacity right now. Retry after the Retry-After delay. Returns `ErrorEnvelope`.

### 500 Internal Server Error

Something went wrong on MoreVoice's side. Retry with the same Idempotency-Key. Returns `ErrorEnvelope`.

## Code samples

**TypeScript**

```ts
import MoreVoice from "@morevoice/sdk";

const mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment

for await (const copilotProfile of mv.copilotProfiles.listTemplates()) {
	console.log(copilotProfile);
}
```

**Python**

```python
from morevoice import MoreVoice

client = MoreVoice()  # MOREVOICE_API_KEY from the environment

for copilot_profile in client.copilot_profiles.list_templates():
    print(copilot_profile)
```

**cURL**

```sh
curl https://api.morevoice.ai/v1/copilot_profiles/templates \
  -H "Authorization: Bearer $MOREVOICE_API_KEY"
```
