Webhook tool

ServiceNow AI voice agents that log incidents from the phone

The agent takes the caller's problem, creates a ServiceNow incident with contact type phone, reads back the number, and checks the status of open ones.

Service desk phone agent

Creates and checks ServiceNow incidents by phone.

Instructions

Ask what is wrong and who is affected, then create an incident and read back the number. If the caller gives an incident number, look it up and tell them its state. Transfer for outages or if they ask for a person.

Handoff
Service desk

Connected tools

  • Create incidentWebhook
  • Get incidentWebhook
  • Transfer to service deskTransfer

What a ServiceNow AI voice agent can do

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

The agent writes a short description, the caller's account of the problem and an urgency, and reads back the incident number.

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

Create incident

Creates an incident with contact type phone.

Show the JSON definition
create_incident
{
  "type": "webhook",
  "name": "create_incident",
  "description": "Creates a ServiceNow incident for the caller's problem. Returns the incident number.",
  "pre_tool_speech": "auto",
  "execution_mode": "immediate",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://YOUR_INSTANCE.service-now.com/api/now/table/incident",
    "method": "POST",
    "query_params_schema": {
      "properties": {
        "sysparm_fields": {
          "type": "string",
          "constant_value": "number,sys_id"
        }
      }
    },
    "request_body_schema": {
      "type": "object",
      "properties": {
        "short_description": {
          "type": "string",
          "description": "One line, such as Printers down on third floor."
        },
        "description": {
          "type": "string",
          "description": "The caller's name, who is affected and what they said, then: Called from {{system__caller_id}}."
        },
        "urgency": {
          "type": "string",
          "enum": [
            "1",
            "2",
            "3"
          ],
          "description": "1 if many people are blocked, 2 if one person is blocked, 3 otherwise."
        },
        "contact_type": {
          "type": "string",
          "constant_value": "phone"
        }
      },
      "required": [
        "short_description",
        "description",
        "urgency"
      ]
    },
    "authentication": {
      "mode": "basic_auth",
      "username": "voice.agent",
      "password": {
        "type": "secret",
        "secret_value": "YOUR_SERVICE_ACCOUNT_PASSWORD"
      }
    }
  }
}

Webhook

Get incident

Looks up an incident by its number.

Show the JSON definition
get_incident
{
  "type": "webhook",
  "name": "get_incident",
  "description": "Looks up an incident by number. Returns its state and short description.",
  "pre_tool_speech": "auto",
  "execution_mode": "immediate",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://YOUR_INSTANCE.service-now.com/api/now/table/incident",
    "method": "GET",
    "query_params_schema": {
      "properties": {
        "sysparm_query": {
          "type": "string",
          "description": "number= followed by the incident number in capitals, such as number=INC0010388."
        },
        "sysparm_fields": {
          "type": "string",
          "constant_value": "number,sys_id,state,short_description"
        },
        "sysparm_display_value": {
          "type": "string",
          "constant_value": "true"
        },
        "sysparm_limit": {
          "type": "integer",
          "constant_value": 1
        }
      },
      "required": [
        "sysparm_query"
      ]
    },
    "authentication": {
      "mode": "basic_auth",
      "username": "voice.agent",
      "password": {
        "type": "secret",
        "secret_value": "YOUR_SERVICE_ACCOUNT_PASSWORD"
      }
    }
  }
}

Transfer

Transfer to service desk

Cold transfer to the service desk.

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

Set it up

No native connector. The tools call the ServiceNow Table API on your instance with Basic auth for a service account, stored as a secret. Vendor details read in November 2026.

  1. Create a service account

    Add a ServiceNow user for the voice agent and give it only the roles it needs to create and read incidents. The Table API acts with that user's access.

  2. Add the tools

    Set your instance in the URLs, the account's user name as the Basic auth username and its password as the secret.

  3. Write the instructions

    Say how to pick urgency, what counts as an outage, and that the incident goes in before any transfer.

  4. Test both paths

    Report a problem and check the incident in ServiceNow, then call back with that number and ask for its status.

Before you build

The caller field stays empty

caller_id is a reference to a user record. The tool puts the caller's name and number in the description instead. Add a lookup on sys_user if you want it set.

Display values for speech

With sysparm_display_value set to true, the Table API returns labels such as In Progress instead of state codes, which the agent can say as they are.

Small responses

sysparm_fields limits the response to the fields named. Without it, a created incident comes back with every field, which the agent does not need.

Rate limit rules

Admins can set inbound REST rate limit rules per user, role or all users, counted per hour. A request over the limit gets 429 with a Retry-After header.

Enterprise-grade security

  • HIPAA compliant badge

    HIPAA compliant

  • SOC 2 Type 2 badge

    SOC 2 Type 2

  • GDPR badge

    GDPR

ServiceNow AI voice agent FAQs

How do I connect ServiceNow to an AI voice agent?

Create a ServiceNow user for the agent with only the roles it needs to create and read incidents. Set your instance in the tool URLs and store the user's name and password as basic auth. The Table API then acts with that user's access.

Can the agent add to an existing ServiceNow incident?

Yes, with another tool that sends PATCH to /api/now/table/incident/{sys_id}. Return sys_id from get_incident so the agent has it.

Who bills the phone minutes on a ServiceNow 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. Per Cartesia's docs, the transfer to your service desk needs a Twilio or SIP trunk number.

Does the incident record who called?

The caller's name and number go in the description, not the caller field. caller_id is a reference to a user record, so the tool leaves it empty. Add a lookup on sys_user if you want it set.

Do ServiceNow rate limits apply to the agent?

They can. Admins can set inbound REST rate limit rules per user, role or all users, counted per hour, and a request over the limit gets 429 with a Retry-After header. The tools act as one service account, so a rule on that user covers every call the agent makes.

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