---
name: "ticket_reply"
area: "helpdesk"
title: "Reply to a ticket"
price: "$0.05"
method: "POST"
url: "https://api.conecto.chat/v1/tools/ticket_reply"
mcp_server: "https://api.conecto.chat/mcp/helpdesk"
auth: "Authorization: Bearer <conecto_sk_ key>"
docs_url: "https://conecto.chat/tools/helpdesk/ticket_reply"
---

# Reply to a ticket (`ticket_reply`)

Emails the requester a reply in the ticket's thread, with files if needed, or adds a private note, and can set the status.

Email the requester a reply (internal=false) or add a private note only the team sees (internal=true). A reply goes out from the ticket's support inbox in the same email thread, so the customer's answer comes back to this ticket (inbox picks another support inbox); without one it is Conecto's standard ticket email. template sends a saved reply and applies its status and tags; body, if also given, goes above it. attachments: files of the file store, sent with a reply from a support inbox. status sets the status afterwards (pending = waiting on the customer, resolved = done); without it a reply reopens a resolved ticket.

Price: $0.05 a call. A call that fails costs nothing.

## Use it when

A ticket needs an answer to the customer, or a note for the team.

- For an answer in the website chat, use [chat_reply](https://conecto.chat/tools/chat/chat_reply.md).
- For an email that belongs to no ticket, use [email_send](https://conecto.chat/tools/email/email_send.md).

## Say this to your agent

> Tell Paul we'll touch up the top tube next week, send him the photo of the paint match, and set the ticket to waiting on him.

## Inputs

| Name | Type | Required | Description | Allowed values | Default |
|---|---|---|---|---|---|
| `number` | integer | yes | The ticket number, e.g. 42 for ticket #42. At least 1. |  |  |
| `body` | string | no | Up to 8,000 characters. |  |  |
| `internal` | boolean | no |  |  | `false` |
| `template` | string | no | Up to 80 characters. |  |  |
| `by_person` | boolean | no | true when a person at the business wrote it. Otherwise a last line says the business's AI assistant wrote it (EU AI Act Art. 50). |  | `false` |
| `status` | string | no |  | `"open"`, `"pending"`, `"resolved"` |  |
| `inbox` | string | no | Up to 254 characters. |  |  |
| `attachments` | array of strings | no | File ids from the file store (files_list), up to 10 files and 25 MB together. Replies from a support inbox only. Up to 10 items. |  |  |

## Example

Written for Halverson Cycle & Repair, a bike shop with a repair workshop in Portland, Oregon.

MCP: call `ticket_reply` on the MCP server `https://api.conecto.chat/mcp/helpdesk` with these arguments:

```json
{
  "number": 87,
  "status": "pending",
  "body": "Hello Paul,\n\nwe are sorry about the scratch. We can pick the bike up on Tuesday, touch up the top tube in our workshop and bring it back on Thursday. A photo of the paint match is attached. Does that work for you?\n\nHalverson Support",
  "attachments": [
    "6e8a0c2e-4b6d-4f8a-8d2f-7c9e1a3b5d7f"
  ]
}
```

REST:

```bash
curl https://api.conecto.chat/v1/tools/ticket_reply \
  -H "Authorization: Bearer $CONECTO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"number": 87, "status": "pending", "body": "Hello Paul,\n\nwe are sorry about the scratch. We can pick the bike up on Tuesday, touch up the top tube in our workshop and bring it back on Thursday. A photo of the paint match is attached. Does that work for you?\n\nHalverson Support", "attachments": ["6e8a0c2e-4b6d-4f8a-8d2f-7c9e1a3b5d7f"]}'
```

## Response

```json
{
  "call_id": "5f0c8a2e-3b7d-4c1e-9a64-2d8e1f7b0c93",
  "tool": "ticket_reply",
  "status": "succeeded",
  "replayed": false,
  "cost_usd": "$0.05",
  "balance_usd": "$19.75",
  "result": {
    "ticket": {
      "number": 87,
      "subject": "Scratch on the Tabor's top tube",
      "status": "pending",
      "priority": "high",
      "category": "Damaged delivery",
      "tags": [
        "damage"
      ],
      "requester_email": "paul.hoffmann@example.com",
      "requester_name": "Paul Hoffmann",
      "contact_id": null,
      "company_id": null,
      "source": "api",
      "channel": "api",
      "assigned_to": null,
      "waiting_on": "customer",
      "sla": null,
      "merged_into": null,
      "created_at": "2026-10-14T08:00:00+00:00",
      "last_activity_at": "2026-10-14T08:00:00+00:00",
      "first_reply_at": "2026-10-14T08:00:00+00:00",
      "resolved_at": null,
      "body": "Called on Wednesday: the Tabor gravel bike delivered on Monday has a 3 cm scratch on the top tube. He would like it touched up or the frame swapped.",
      "fields": {
        "order_id": "2231"
      },
      "inbox": "support@halverson-cycle-repair.useconecto.com",
      "email_message_id": null,
      "rating": null,
      "rating_requested_at": null,
      "comments": [
        {
          "kind": "agent_reply",
          "body": "Hello Paul,\n\nwe are sorry about the scratch. We can pick the bike up on Tuesday, touch up the top tube in our workshop and bring it back on Thursday. A photo of the paint match is attached. Does that work for you?\n\nHalverson Support\n\nThis message was written by Halverson Cycle & Repair's AI assistant.",
          "email_status": "sent",
          "at": "2026-10-14T08:00:00+00:00",
          "email_message_id": "1ae0972e-f03c-422a-a90f-253ebacb7a21"
        }
      ]
    }
  }
}
```

`result`: The ticket in full after the reply, and the rating request when resolving it emailed a survey.

## Errors

| Code | Status | When | Fix |
|---|---|---|---|
| `not_found` | 404 | No ticket of the business has that number. | Find it with ticket_list and use its number. |
| `not_found` | 404 | No saved reply has that template name, no support inbox has that address, or an attachment is not a file in the store. | Use a name from ticket_list_templates, an inbox from email_list_inboxes and file_ids from files_list. |
| `conflict` | 409 | The ticket was merged into another. | Reply on the ticket the message names. |
| `invalid_input` | 400 | Neither body nor template was given, attachments were given with an internal note, or there are more than 10. | Send a body, a template or both; attach files to replies only, up to 10. |
| `no_support_inbox` | 409 | Attachments go out from a support inbox, and the ticket has none. | Connect one with ticket_connect_inbox, or pass inbox. |
| `too_many` | 422 | The ticket would hold more tags or custom fields than it may. | Remove some with remove_tags, or set fields to null, first. |
| `too_large` | 413 | The attachments add up to more than 25 MB. | Send big files as download links from files_get. |
| `unsupported_type` | 400 | Email cannot carry a file of that kind (like .exe or .js). | Send a download link from files_get instead. |
| `payment_required_for_outbound` | 402 | The balance is still free credit, which cannot email people outside the business. | Top up once (POST /v1/topups); after that email to outsiders works. |
| `new_recipient_limit` | 429 | The business has emailed as many new addresses today as it may. | Send to these people tomorrow. Replies and people who wrote first are not limited. |
| `sending_paused` | 403 | Email from the business is paused after bounces, complaints or emails refused as cold outreach. | Tell the owner; Conecto reviews the pause before sending resumes. |
| `suppressed` | 422 | An address bounced, complained or unsubscribed before. | Remove the addresses the message lists and send again. |
| `found_by_lookup` | 422 | An address was found or checked with Conecto's lookups; a Conecto inbox never writes to it first. | Write from the business's own mailbox (google_mail_send or m365_mail_send). |
| `cold_email` | 422 | The email looks like cold outreach, a pitch or a request to people who never wrote to the business, so it wasn't sent. The third within 7 days pauses the account's email. | Email only people who wrote first or asked to hear from the business. |
| `check_unavailable` | 503 | The check an email to someone new goes through couldn't run just now. | Try again in a minute. |
| `send_failed` | 502 | The reply was saved on the ticket, but the email could not be sent. | Call again in a moment to send it; the message says what failed. |
| `sending_unavailable` | 503 | Email to outsiders is not possible yet while the sending account is in review. | Send to the owner's address for now, or try again later. |

The refusals every tool can give (401 key, 402 balance, 429 limits) are on the errors page: https://conecto.chat/docs/errors.md

## Related

- [ticket_list](https://conecto.chat/tools/helpdesk/ticket_list.md): Tickets, newest activity first, filtered by status, priority, requester, tag, field or contact, or as a work queue. Free up to 1,000,000 reads a month.
- [ticket_get](https://conecto.chat/tools/helpdesk/ticket_get.md): One ticket with its request, every reply, customer message and note, its fields, SLA state and rating. Free up to 1,000,000 reads a month.
- [ticket_create](https://conecto.chat/tools/helpdesk/ticket_create.md): Opens a support ticket for a customer request; the customer is emailed only if you ask. $0.01 a call.
- [ticket_update](https://conecto.chat/tools/helpdesk/ticket_update.md): Changes a ticket's status, priority, category, subject, tags, fields, assignee, or the CRM records it is about. $0.01 a call.
- [ticket_merge](https://conecto.chat/tools/helpdesk/ticket_merge.md): Merges a duplicate ticket into another: its messages, notes, email threads, tags and fields move over. $0.01 a call.
- [ticket_connect_inbox](https://conecto.chat/tools/helpdesk/ticket_connect_inbox.md): Makes an inbox a support inbox: every new email to it opens a ticket, and replies stay in its thread. $0.001 a call.
- [ticket_save_template](https://conecto.chat/tools/helpdesk/ticket_save_template.md): Saves a canned reply under a name, with the status and tags it applies whenever it is sent. $0.001 a call.
- [ticket_list_templates](https://conecto.chat/tools/helpdesk/ticket_list_templates.md): Every saved reply with its text, status and tags. Free up to 1,000,000 reads a month.
- [ticket_delete_template](https://conecto.chat/tools/helpdesk/ticket_delete_template.md): Deletes a saved reply by name. $0.001 a call.
- [ticket_get_settings](https://conecto.chat/tools/helpdesk/ticket_get_settings.md): The help desk's SLA targets, auto-close, satisfaction survey setting and support inboxes. Free up to 1,000,000 reads a month.
- [ticket_update_settings](https://conecto.chat/tools/helpdesk/ticket_update_settings.md): Sets the SLA targets per priority, auto-close and the satisfaction survey. $0.001 a call.
- [ticket_report](https://conecto.chat/tools/helpdesk/ticket_report.md): How support went over the last days: volumes, backlog, response and resolution times, SLA results, ratings, and tickets by channel, priority and tag. Free up to 1,000,000 reads a month.
