curl --request POST \
--url https://api.raul.ugps.io/api/v1/conversations/threads/{id}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"attachments": [
{
"name": "<string>",
"contentType": "<string>",
"contentBytes": "<string>"
}
],
"body": "<string>",
"channelAccountId": "<string>",
"cc": [
"<string>"
],
"channelId": 123,
"subject": "<string>",
"to": [
"<string>"
],
"clientId": "<string>",
"contactId": "<string>",
"opportunityId": "<string>",
"quoteId": "<string>"
}
'import requests
url = "https://api.raul.ugps.io/api/v1/conversations/threads/{id}/messages"
payload = {
"attachments": [
{
"name": "<string>",
"contentType": "<string>",
"contentBytes": "<string>"
}
],
"body": "<string>",
"channelAccountId": "<string>",
"cc": ["<string>"],
"channelId": 123,
"subject": "<string>",
"to": ["<string>"],
"clientId": "<string>",
"contactId": "<string>",
"opportunityId": "<string>",
"quoteId": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
attachments: [{name: '<string>', contentType: '<string>', contentBytes: '<string>'}],
body: JSON.stringify('<string>'),
channelAccountId: '<string>',
cc: ['<string>'],
channelId: 123,
subject: '<string>',
to: ['<string>'],
clientId: '<string>',
contactId: '<string>',
opportunityId: '<string>',
quoteId: '<string>'
})
};
fetch('https://api.raul.ugps.io/api/v1/conversations/threads/{id}/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://api.raul.ugps.io/api/v1/conversations/threads/{id}/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([
'attachments' => [
[
'name' => '<string>',
'contentType' => '<string>',
'contentBytes' => '<string>'
]
],
'body' => '<string>',
'channelAccountId' => '<string>',
'cc' => [
'<string>'
],
'channelId' => 123,
'subject' => '<string>',
'to' => [
'<string>'
],
'clientId' => '<string>',
'contactId' => '<string>',
'opportunityId' => '<string>',
'quoteId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://api.raul.ugps.io/api/v1/conversations/threads/{id}/messages"
payload := strings.NewReader("{\n \"attachments\": [\n {\n \"name\": \"<string>\",\n \"contentType\": \"<string>\",\n \"contentBytes\": \"<string>\"\n }\n ],\n \"body\": \"<string>\",\n \"channelAccountId\": \"<string>\",\n \"cc\": [\n \"<string>\"\n ],\n \"channelId\": 123,\n \"subject\": \"<string>\",\n \"to\": [\n \"<string>\"\n ],\n \"clientId\": \"<string>\",\n \"contactId\": \"<string>\",\n \"opportunityId\": \"<string>\",\n \"quoteId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.raul.ugps.io/api/v1/conversations/threads/{id}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"attachments\": [\n {\n \"name\": \"<string>\",\n \"contentType\": \"<string>\",\n \"contentBytes\": \"<string>\"\n }\n ],\n \"body\": \"<string>\",\n \"channelAccountId\": \"<string>\",\n \"cc\": [\n \"<string>\"\n ],\n \"channelId\": 123,\n \"subject\": \"<string>\",\n \"to\": [\n \"<string>\"\n ],\n \"clientId\": \"<string>\",\n \"contactId\": \"<string>\",\n \"opportunityId\": \"<string>\",\n \"quoteId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.raul.ugps.io/api/v1/conversations/threads/{id}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"attachments\": [\n {\n \"name\": \"<string>\",\n \"contentType\": \"<string>\",\n \"contentBytes\": \"<string>\"\n }\n ],\n \"body\": \"<string>\",\n \"channelAccountId\": \"<string>\",\n \"cc\": [\n \"<string>\"\n ],\n \"channelId\": 123,\n \"subject\": \"<string>\",\n \"to\": [\n \"<string>\"\n ],\n \"clientId\": \"<string>\",\n \"contactId\": \"<string>\",\n \"opportunityId\": \"<string>\",\n \"quoteId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyEnviar mensaje en el thread (MESSAGE) o nota interna (COMMENT)
Operacion: Enviar mensaje en el thread.
curl --request POST \
--url https://api.raul.ugps.io/api/v1/conversations/threads/{id}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"attachments": [
{
"name": "<string>",
"contentType": "<string>",
"contentBytes": "<string>"
}
],
"body": "<string>",
"channelAccountId": "<string>",
"cc": [
"<string>"
],
"channelId": 123,
"subject": "<string>",
"to": [
"<string>"
],
"clientId": "<string>",
"contactId": "<string>",
"opportunityId": "<string>",
"quoteId": "<string>"
}
'import requests
url = "https://api.raul.ugps.io/api/v1/conversations/threads/{id}/messages"
payload = {
"attachments": [
{
"name": "<string>",
"contentType": "<string>",
"contentBytes": "<string>"
}
],
"body": "<string>",
"channelAccountId": "<string>",
"cc": ["<string>"],
"channelId": 123,
"subject": "<string>",
"to": ["<string>"],
"clientId": "<string>",
"contactId": "<string>",
"opportunityId": "<string>",
"quoteId": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
attachments: [{name: '<string>', contentType: '<string>', contentBytes: '<string>'}],
body: JSON.stringify('<string>'),
channelAccountId: '<string>',
cc: ['<string>'],
channelId: 123,
subject: '<string>',
to: ['<string>'],
clientId: '<string>',
contactId: '<string>',
opportunityId: '<string>',
quoteId: '<string>'
})
};
fetch('https://api.raul.ugps.io/api/v1/conversations/threads/{id}/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://api.raul.ugps.io/api/v1/conversations/threads/{id}/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([
'attachments' => [
[
'name' => '<string>',
'contentType' => '<string>',
'contentBytes' => '<string>'
]
],
'body' => '<string>',
'channelAccountId' => '<string>',
'cc' => [
'<string>'
],
'channelId' => 123,
'subject' => '<string>',
'to' => [
'<string>'
],
'clientId' => '<string>',
'contactId' => '<string>',
'opportunityId' => '<string>',
'quoteId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://api.raul.ugps.io/api/v1/conversations/threads/{id}/messages"
payload := strings.NewReader("{\n \"attachments\": [\n {\n \"name\": \"<string>\",\n \"contentType\": \"<string>\",\n \"contentBytes\": \"<string>\"\n }\n ],\n \"body\": \"<string>\",\n \"channelAccountId\": \"<string>\",\n \"cc\": [\n \"<string>\"\n ],\n \"channelId\": 123,\n \"subject\": \"<string>\",\n \"to\": [\n \"<string>\"\n ],\n \"clientId\": \"<string>\",\n \"contactId\": \"<string>\",\n \"opportunityId\": \"<string>\",\n \"quoteId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.raul.ugps.io/api/v1/conversations/threads/{id}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"attachments\": [\n {\n \"name\": \"<string>\",\n \"contentType\": \"<string>\",\n \"contentBytes\": \"<string>\"\n }\n ],\n \"body\": \"<string>\",\n \"channelAccountId\": \"<string>\",\n \"cc\": [\n \"<string>\"\n ],\n \"channelId\": 123,\n \"subject\": \"<string>\",\n \"to\": [\n \"<string>\"\n ],\n \"clientId\": \"<string>\",\n \"contactId\": \"<string>\",\n \"opportunityId\": \"<string>\",\n \"quoteId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.raul.ugps.io/api/v1/conversations/threads/{id}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"attachments\": [\n {\n \"name\": \"<string>\",\n \"contentType\": \"<string>\",\n \"contentBytes\": \"<string>\"\n }\n ],\n \"body\": \"<string>\",\n \"channelAccountId\": \"<string>\",\n \"cc\": [\n \"<string>\"\n ],\n \"channelId\": 123,\n \"subject\": \"<string>\",\n \"to\": [\n \"<string>\"\n ],\n \"clientId\": \"<string>\",\n \"contactId\": \"<string>\",\n \"opportunityId\": \"<string>\",\n \"quoteId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyAuthorizations
Token de sesión Better Auth para rutas de backoffice; las rutas de portal usan su token propio.
Headers
UUID v4 estable por intento lógico. Es obligatorio para MESSAGE y opcional para COMMENT.
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$Path Parameters
Body
MESSAGE, COMMENT Show child attributes
Show child attributes
Cuerpo (requerido si no hay adjuntos)
Cuenta de salida (casilla). Sin ella se usa la personal
CC (sólo email)
Modo de envío desde casilla compartida
send_as, on_behalf_of Canal del envío (1002 email, 1003 whatsapp). Debe coincidir con el del thread; default: el del thread
Asunto (sólo email)
Destinatarios explícitos (sólo email)
ID del cliente asociado (sólo WhatsApp)
ID del contacto asociado (sólo WhatsApp)
ID del negocio asociado (sólo WhatsApp)
ID de la cotización asociada (sólo WhatsApp)
Response
MESSAGE sin Idempotency-Key o encabezado presente que no es UUID v4