Webhook tool

Zoho Desk AI voice agents that turn calls into tickets

A Cartesia agent finds the caller's Zoho Desk contact by phone number, creates a ticket with the problem, and adds a comment when the caller says more.

Support intake agent

Finds the caller in Zoho Desk and logs their issue as a ticket.

Instructions

Look up the caller by phone number. Ask what's wrong and how many people or devices it affects, then create a ticket and read back the number. Add any later details as a comment on the same ticket. Transfer to support if the caller reports an outage or asks for a person.

Handoff
Support team

Connected tools

  • Find contactWebhook
  • Create ticketWebhook
  • Add commentWebhook
  • Transfer to supportTransfer

What a Zoho Desk AI voice agent can do

Open one to watch a call. The grey lines are the tools the agent calls mid-sentence.

Zoho Desk's contact search takes a phone parameter, so the agent finds the caller from their number and greets them by name.

Tool definitions

Webhook tools go to POST /v1/agents/tools. Transfers are a system tool on the agent. Replace the placeholder values in capitals with your own.

Webhook

Find contact

Looks up a Zoho Desk contact by phone number.

Show the JSON definition
find_contact
{
  "type": "webhook",
  "name": "find_contact",
  "description": "Finds the caller's Zoho Desk contact by phone number. Returns the contact ID and name, or nothing if there is no match.",
  "pre_tool_speech": "auto",
  "execution_mode": "immediate",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://api.your-company.com/zoho-desk/contacts/search",
    "method": "GET",
    "query_params_schema": {
      "properties": {
        "phone": {
          "type": "string",
          "dynamic_variable": "system__caller_id"
        }
      }
    },
    "authentication": {
      "mode": "bearer",
      "token": {
        "type": "secret",
        "secret_value": "YOUR_SERVICE_TOKEN"
      }
    }
  }
}

Webhook

Create ticket

Creates a ticket for the caller.

Show the JSON definition
create_ticket
{
  "type": "webhook",
  "name": "create_ticket",
  "description": "Creates a Zoho Desk ticket for the caller. Returns the ticket ID and ticket number.",
  "pre_tool_speech": "auto",
  "execution_mode": "immediate",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://api.your-company.com/zoho-desk/tickets",
    "method": "POST",
    "request_body_schema": {
      "type": "object",
      "properties": {
        "contact_id": {
          "type": "string",
          "description": "The contact ID from find_contact, if there was one."
        },
        "last_name": {
          "type": "string",
          "description": "The caller's last name, for a caller with no contact yet."
        },
        "subject": {
          "type": "string",
          "description": "A short subject, such as Scanner app not syncing."
        },
        "description": {
          "type": "string",
          "description": "What the caller described, in two or three sentences."
        },
        "phone": {
          "type": "string",
          "dynamic_variable": "system__caller_id"
        }
      },
      "required": [
        "subject",
        "description"
      ]
    },
    "authentication": {
      "mode": "bearer",
      "token": {
        "type": "secret",
        "secret_value": "YOUR_SERVICE_TOKEN"
      }
    }
  }
}

Webhook

Add comment

Adds a private comment to the ticket.

Show the JSON definition
add_comment
{
  "type": "webhook",
  "name": "add_comment",
  "description": "Adds a private comment to the caller's ticket with details they gave after it was created.",
  "pre_tool_speech": "auto",
  "execution_mode": "async",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://api.your-company.com/zoho-desk/tickets/{ticket_id}/comments",
    "method": "POST",
    "path_params_schema": {
      "ticket_id": {
        "type": "string",
        "description": "The ticket ID from create_ticket."
      }
    },
    "request_body_schema": {
      "type": "object",
      "properties": {
        "content": {
          "type": "string",
          "description": "The new details, in one or two sentences."
        }
      },
      "required": [
        "content"
      ]
    },
    "authentication": {
      "mode": "bearer",
      "token": {
        "type": "secret",
        "secret_value": "YOUR_SERVICE_TOKEN"
      }
    }
  }
}

Transfer

Transfer to support

Cold transfer to your support line.

Show the JSON definition
transfer_to_support
{
  "config": {
    "system_tools": {
      "transfer_to_number": {
        "description": null,
        "pre_tool_speech": "auto",
        "transfers": [
          {
            "destination": {
              "type": "phone",
              "phone_number": "+14155550174"
            },
            "condition": "The caller reports an outage affecting many users, or asks for a person, after the ticket is created."
          }
        ]
      }
    }
  }
}

Set it up

No native connector. The tools call a small service of yours, which holds the Zoho OAuth connection and calls the Zoho Desk API with your orgId. Vendor details read in November 2026.

  1. Register a Zoho client

    In the Zoho API Console, register a server-based client with Desk.contacts.READ, Desk.search.READ, Desk.tickets.CREATE and Desk.tickets.UPDATE. Keep the refresh token in your service.

  2. Run the three endpoints

    Your service calls GET /api/v1/contacts/search with the phone parameter, POST /api/v1/tickets with subject, departmentId and the contact, and POST /api/v1/tickets/{ticket_id}/comments.

  3. Add the tools

    Point the tools at your service with a bearer secret. The phone fields read system__caller_id, so the agent never asks for the number.

  4. Test on a sample contact

    Call from a number on a test contact, then from a new number, and check both tickets and the comment in Zoho Desk.

Before you build

Why not call Zoho Desk directly

Zoho access tokens expire, and the response says when in expires_in. A webhook tool sends the value you stored, so your service uses the refresh token to get new ones.

Every request needs orgId

All Zoho Desk endpoints except /organizations need an orgId header, and the Authorization header starts with Zoho-oauthtoken. Your service sends both.

Use your data center

Zoho Desk has separate API domains for the US, EU, India, Australia, Canada, Japan and more. Zoho says to use the api_domain from the token response.

Mind the daily API credits

Zoho Desk allows a daily number of API credits by edition, from 5,000 on Free to 100,000 plus 1,000 per user on Enterprise, reset every 24 hours.

Enterprise-grade security

  • HIPAA compliant badge

    HIPAA compliant

  • SOC 2 Type 2 badge

    SOC 2 Type 2

  • GDPR badge

    GDPR

Zoho Desk AI voice agent FAQs

How do I add an AI voice agent to Zoho Desk?

Register a server-based client in the Zoho API Console with Desk.contacts.READ, Desk.search.READ, Desk.tickets.CREATE and Desk.tickets.UPDATE, and run a small service that keeps the refresh token. Cartesia's webhook tools call the service, which calls the Zoho Desk API with your orgId.

Why does Zoho Desk need a service in front of it?

Zoho access tokens expire, and a webhook tool sends the same stored value every time. Your service refreshes the token, adds the orgId header every Zoho Desk endpoint needs, and calls the API domain for your data center.

What happens when the agent can't find the caller in Zoho Desk?

The agent asks for the caller's name, and your service passes a contact object with the ticket. Zoho Desk creates the contact and links it to the new ticket.

Does the agent use up Zoho Desk API credits?

Yes. Each API request uses credits, and Zoho Desk allows a daily number by edition, from 5,000 on Free to 100,000 plus 1,000 per user on Enterprise.

Who bills the phone minutes on a Zoho Desk voice agent?

Cartesia bills the agent at $0.03/min, plus LLM usage and telephony. Phone minutes depend on the number. Cartesia-provisioned numbers are US only and carry Cartesia's telephony fee. Numbers from your Twilio account or a SIP trunk pay your carrier's rates instead.

Get started today

Talk to an expert.

Connect with a member of our team and learn how Cartesia can help you build world-class voice experiences.

Contact Sales

Start building.

Access our models via API and bring a voice agent into production in minutes.

Try Cartesia