Skip to main content
POST
/
v2
/
tickets
/
{ticket_id}
/
connect
Connect to External Ticket
curl --request POST \
  --url https://public.api.serval.com/v2/tickets/{ticket_id}/connect \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "channelTarget": {
    "email": {}
  },
  "externalTicketId": "<string>",
  "externalTicketData": {},
  "externalTicketSubtype": "<string>",
  "accountedForMessageIds": [
    "<string>"
  ]
}
'
{}

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Path Parameters

ticket_id
string
required

The Serval ticket ID to connect

Body

application/json
channelTarget
Email · object

The channel containing the external ticket

externalTicketId
string

The external ticket ID (format depends on the channel type):

  • For Slack (slack_channel or slack_dm): MUST be in the format "channelId:threadTs" Example: "C9DDYQ1B4:1779146751.061339" where channelId is the Slack channel ID (e.g., "C9DDYQ1B4") and threadTs is the Slack message timestamp (e.g., "1779146751.061339")
  • For ServiceNow and other integrations: the sys_id or unique identifier from the external system This should be a globally unique identifier for the external ticket.
externalTicketData
external_ticket_data · object

Optional: Raw external ticket data/metadata to store with the connection. This should be the JSON-serialized external ticket object from the external system. For ServiceNow, this should be the RequestedItem or Incident object. If not provided, external links may not display correctly.

externalTicketSubtype
string | null

Optional: Subtype of the external ticket within the integration. For ServiceNow, use "incident" or "requested_item" to specify the type. This determines which sync handler is used for ongoing synchronization.

accountedForMessageIds
string[]

Optional: Serval message IDs on this ticket to register as already present in the external ticket's channel. Registered messages are skipped by the egresser, so they will not be re-sent to the external system after the connection is established. Use this when you have already posted a summary of the prior conversation to the external system and do not want the individual historical messages replayed on top of it. Each message must belong to this ticket.

Response

Success

The response is of type ConnectTicketToExternalTicketResponse · object.