cURL
curl --request POST \
--url https://www.oration.ai/api/v2/tickets/{ticketId}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--header 'x-workspace-id: <x-workspace-id>' \
--header 'x-workspace-slug: <x-workspace-slug>' \
--data '
{
"bodyHtml": "<string>",
"bodyPlain": "<string>",
"threadId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorCustomerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorAgentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"isPrivate": false,
"externalMessageId": "<string>",
"emailInfo": "<string>",
"channelMetadata": "<string>",
"scheduledAt": "<string>",
"sentAt": "<string>"
}
'import requests
url = "https://www.oration.ai/api/v2/tickets/{ticketId}/messages"
payload = {
"bodyHtml": "<string>",
"bodyPlain": "<string>",
"threadId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorCustomerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorAgentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"isPrivate": False,
"externalMessageId": "<string>",
"emailInfo": "<string>",
"channelMetadata": "<string>",
"scheduledAt": "<string>",
"sentAt": "<string>"
}
headers = {
"x-api-key": "<x-api-key>",
"x-workspace-slug": "<x-workspace-slug>",
"x-workspace-id": "<x-workspace-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-api-key': '<x-api-key>',
'x-workspace-slug': '<x-workspace-slug>',
'x-workspace-id': '<x-workspace-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
bodyHtml: '<string>',
bodyPlain: '<string>',
threadId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
authorCustomerId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
authorAgentId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
isPrivate: false,
externalMessageId: '<string>',
emailInfo: '<string>',
channelMetadata: '<string>',
scheduledAt: '<string>',
sentAt: '<string>'
})
};
fetch('https://www.oration.ai/api/v2/tickets/{ticketId}/messages', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.oration.ai/api/v2/tickets/{ticketId}/messages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'bodyHtml' => '<string>',
'bodyPlain' => '<string>',
'threadId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'authorCustomerId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'authorAgentId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'isPrivate' => false,
'externalMessageId' => '<string>',
'emailInfo' => '<string>',
'channelMetadata' => '<string>',
'scheduledAt' => '<string>',
'sentAt' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-api-key: <x-api-key>",
"x-workspace-id: <x-workspace-id>",
"x-workspace-slug: <x-workspace-slug>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.oration.ai/api/v2/tickets/{ticketId}/messages"
payload := strings.NewReader("{\n \"bodyHtml\": \"<string>\",\n \"bodyPlain\": \"<string>\",\n \"threadId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorCustomerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorAgentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"isPrivate\": false,\n \"externalMessageId\": \"<string>\",\n \"emailInfo\": \"<string>\",\n \"channelMetadata\": \"<string>\",\n \"scheduledAt\": \"<string>\",\n \"sentAt\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<x-api-key>")
req.Header.Add("x-workspace-slug", "<x-workspace-slug>")
req.Header.Add("x-workspace-id", "<x-workspace-id>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.oration.ai/api/v2/tickets/{ticketId}/messages")
.header("x-api-key", "<x-api-key>")
.header("x-workspace-slug", "<x-workspace-slug>")
.header("x-workspace-id", "<x-workspace-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"bodyHtml\": \"<string>\",\n \"bodyPlain\": \"<string>\",\n \"threadId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorCustomerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorAgentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"isPrivate\": false,\n \"externalMessageId\": \"<string>\",\n \"emailInfo\": \"<string>\",\n \"channelMetadata\": \"<string>\",\n \"scheduledAt\": \"<string>\",\n \"sentAt\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.oration.ai/api/v2/tickets/{ticketId}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<x-api-key>'
request["x-workspace-slug"] = '<x-workspace-slug>'
request["x-workspace-id"] = '<x-workspace-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"bodyHtml\": \"<string>\",\n \"bodyPlain\": \"<string>\",\n \"threadId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorCustomerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorAgentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"isPrivate\": false,\n \"externalMessageId\": \"<string>\",\n \"emailInfo\": \"<string>\",\n \"channelMetadata\": \"<string>\",\n \"scheduledAt\": \"<string>\",\n \"sentAt\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ticketId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"threadId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"bodyHtml": "<string>",
"bodyPlain": "<string>",
"authorType": "user",
"authorUserId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorCustomerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorAgentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"isPrivate": true,
"source": "email",
"externalMessageId": "<string>",
"emailInfo": "<string>",
"channelMetadata": "<string>",
"scheduledAt": "<string>",
"sentAt": "<string>",
"status": "draft",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"createdAt": "<string>",
"updatedAt": "<string>"
}{
"code": "BAD_REQUEST",
"message": "Invalid input data",
"issues": []
}{
"code": "UNAUTHORIZED",
"message": "Authorization not provided",
"issues": []
}{
"code": "FORBIDDEN",
"message": "Insufficient access",
"issues": []
}{
"code": "INTERNAL_SERVER_ERROR",
"message": "Internal server error",
"issues": []
}Tickets
Post ticket message
Add a message to a ticket’s conversation thread.
POST
/
tickets
/
{ticketId}
/
messages
cURL
curl --request POST \
--url https://www.oration.ai/api/v2/tickets/{ticketId}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--header 'x-workspace-id: <x-workspace-id>' \
--header 'x-workspace-slug: <x-workspace-slug>' \
--data '
{
"bodyHtml": "<string>",
"bodyPlain": "<string>",
"threadId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorCustomerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorAgentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"isPrivate": false,
"externalMessageId": "<string>",
"emailInfo": "<string>",
"channelMetadata": "<string>",
"scheduledAt": "<string>",
"sentAt": "<string>"
}
'import requests
url = "https://www.oration.ai/api/v2/tickets/{ticketId}/messages"
payload = {
"bodyHtml": "<string>",
"bodyPlain": "<string>",
"threadId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorCustomerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorAgentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"isPrivate": False,
"externalMessageId": "<string>",
"emailInfo": "<string>",
"channelMetadata": "<string>",
"scheduledAt": "<string>",
"sentAt": "<string>"
}
headers = {
"x-api-key": "<x-api-key>",
"x-workspace-slug": "<x-workspace-slug>",
"x-workspace-id": "<x-workspace-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-api-key': '<x-api-key>',
'x-workspace-slug': '<x-workspace-slug>',
'x-workspace-id': '<x-workspace-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
bodyHtml: '<string>',
bodyPlain: '<string>',
threadId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
authorCustomerId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
authorAgentId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
isPrivate: false,
externalMessageId: '<string>',
emailInfo: '<string>',
channelMetadata: '<string>',
scheduledAt: '<string>',
sentAt: '<string>'
})
};
fetch('https://www.oration.ai/api/v2/tickets/{ticketId}/messages', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.oration.ai/api/v2/tickets/{ticketId}/messages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'bodyHtml' => '<string>',
'bodyPlain' => '<string>',
'threadId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'authorCustomerId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'authorAgentId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'isPrivate' => false,
'externalMessageId' => '<string>',
'emailInfo' => '<string>',
'channelMetadata' => '<string>',
'scheduledAt' => '<string>',
'sentAt' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-api-key: <x-api-key>",
"x-workspace-id: <x-workspace-id>",
"x-workspace-slug: <x-workspace-slug>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.oration.ai/api/v2/tickets/{ticketId}/messages"
payload := strings.NewReader("{\n \"bodyHtml\": \"<string>\",\n \"bodyPlain\": \"<string>\",\n \"threadId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorCustomerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorAgentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"isPrivate\": false,\n \"externalMessageId\": \"<string>\",\n \"emailInfo\": \"<string>\",\n \"channelMetadata\": \"<string>\",\n \"scheduledAt\": \"<string>\",\n \"sentAt\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<x-api-key>")
req.Header.Add("x-workspace-slug", "<x-workspace-slug>")
req.Header.Add("x-workspace-id", "<x-workspace-id>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.oration.ai/api/v2/tickets/{ticketId}/messages")
.header("x-api-key", "<x-api-key>")
.header("x-workspace-slug", "<x-workspace-slug>")
.header("x-workspace-id", "<x-workspace-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"bodyHtml\": \"<string>\",\n \"bodyPlain\": \"<string>\",\n \"threadId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorCustomerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorAgentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"isPrivate\": false,\n \"externalMessageId\": \"<string>\",\n \"emailInfo\": \"<string>\",\n \"channelMetadata\": \"<string>\",\n \"scheduledAt\": \"<string>\",\n \"sentAt\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.oration.ai/api/v2/tickets/{ticketId}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<x-api-key>'
request["x-workspace-slug"] = '<x-workspace-slug>'
request["x-workspace-id"] = '<x-workspace-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"bodyHtml\": \"<string>\",\n \"bodyPlain\": \"<string>\",\n \"threadId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorCustomerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"authorAgentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"isPrivate\": false,\n \"externalMessageId\": \"<string>\",\n \"emailInfo\": \"<string>\",\n \"channelMetadata\": \"<string>\",\n \"scheduledAt\": \"<string>\",\n \"sentAt\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ticketId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"threadId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"bodyHtml": "<string>",
"bodyPlain": "<string>",
"authorType": "user",
"authorUserId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorCustomerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"authorAgentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"isPrivate": true,
"source": "email",
"externalMessageId": "<string>",
"emailInfo": "<string>",
"channelMetadata": "<string>",
"scheduledAt": "<string>",
"sentAt": "<string>",
"status": "draft",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"createdAt": "<string>",
"updatedAt": "<string>"
}{
"code": "BAD_REQUEST",
"message": "Invalid input data",
"issues": []
}{
"code": "UNAUTHORIZED",
"message": "Authorization not provided",
"issues": []
}{
"code": "FORBIDDEN",
"message": "Insufficient access",
"issues": []
}{
"code": "INTERNAL_SERVER_ERROR",
"message": "Internal server error",
"issues": []
}Add a message to a ticket’s thread. This is the same conversation thread agents see in the ticket detail view — public replies and internal notes both live here.
If
authorType is user, the message is automatically attributed to the user who owns the API key — you cannot pass a different authorUserId. For ai_agent, you must pass the matching authorAgentId. For customer, pass authorCustomerId when you have it, but it is not required yet.Path parameters
string
required
Ticket UUID. Find it from Get ticket or Search tickets.
Request body
The ticketticketId comes from the URL path — do not include it in the body.
string
required
Rich HTML body shown in the thread.
string
required
Plain-text version of the body, used for search, SMS, and accessibility.
string
required
Who this message is from:
user, customer, system, or ai_agent.user— attributed to the API key’s owning user automatically. Do not passauthorUserId.customer— optionally pair withauthorCustomerId(see note below).ai_agent— requiresauthorAgentId.system— no author reference needed; use for automated/system-generated entries.
string
Customer UUID. Recommended when
authorType is customer, but not enforced yet — pass it when you have it so the thread shows the right customer.string
Voice/AI agent UUID. Required when
authorType is ai_agent.boolean
default:"false"
Set to
true to add an internal note that is never sent to the customer. false posts a customer-visible reply.string
Channel this message is associated with, e.g.
manual, api. See Create ticket for the full list of sources.string
Groups internal-note side threads. Omit unless you are replying within a specific side thread.
string
Provider message ID, used to deduplicate messages ingested from an external channel.
object
Email threading headers (
messageId, inReplyTo, references, fromAddress, toAddresses, ccAddresses, bccAddresses, subject). Only relevant for email-sourced messages.object
Provider-specific extras (e.g. Slack or WhatsApp metadata) that do not have a dedicated field.
string
ISO 8601 timestamp for a delayed send. Pair with
status: "scheduled".string
ISO 8601 timestamp the message was delivered. Defaults to the current time if omitted.
string
default:"sent"
One of
draft, scheduled, sent, or failed.Posting a public reply (
isPrivate: false) updates the ticket’s lastAgentActivityAt, and sets firstResponseAt the first time it happens. This endpoint does not trigger any webhook.The request fails with a validation error if
authorType is ai_agent without authorAgentId. authorType: "customer" without authorCustomerId is currently allowed while customer matching on the tickets platform matures — this will likely become required in the future.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Minimum string length:
1Pattern:
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Path Parameters
Pattern:
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Body
application/json
Available options:
user, customer, system, ai_agent Pattern:
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Pattern:
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Pattern:
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Available options:
email, chat_widget, voice, whatsapp, sms, customer_portal, form, manual, api, slack, microsoft_teams, instagram, discord, telegram Available options:
draft, scheduled, sent, failed Response
Successful response
Pattern:
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Pattern:
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Available options:
user, customer, system, ai_agent Pattern:
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Pattern:
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Pattern:
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Available options:
email, chat_widget, voice, whatsapp, sms, customer_portal, form, manual, api, slack, microsoft_teams, instagram, discord, telegram Available options:
draft, scheduled, sent, failed Pattern:
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$⌘I