조직 수정
조직의 일부 필드를 수정합니다. 본인 조직과 직속 하위 조직을 수정할 수 있고, 생략한 필드는 유지됩니다. 상위·하위 관계와 결제 방식은 이 API로 바꿀 수 없습니다. Supabase JWT 호출자는 이름과 청구 수신자 변경에 호출 조직의 owner 역할이 필요하고, webhook 필드는 owner 또는 admin이 변경할 수 있습니다. 접근 권한이 없는 조직은 찾을 수 없는 것으로 처리되며, 하위 조직이 상위 조직을 수정하면 권한이 없습니다.
curl --request PATCH \
--url https://client-api.tryvox.co/v3/organizations/{organization_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"webhook_url": "<string>",
"webhook_version": "v2",
"webhook_event_subscriptions": [
"<string>"
],
"billing_invoice_recipient_emails": [
"<string>"
]
}
'import requests
url = "https://client-api.tryvox.co/v3/organizations/{organization_id}"
payload = {
"name": "<string>",
"webhook_url": "<string>",
"webhook_version": "v2",
"webhook_event_subscriptions": ["<string>"],
"billing_invoice_recipient_emails": ["<string>"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
webhook_url: '<string>',
webhook_version: 'v2',
webhook_event_subscriptions: ['<string>'],
billing_invoice_recipient_emails: ['<string>']
})
};
fetch('https://client-api.tryvox.co/v3/organizations/{organization_id}', 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://client-api.tryvox.co/v3/organizations/{organization_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'webhook_url' => '<string>',
'webhook_version' => 'v2',
'webhook_event_subscriptions' => [
'<string>'
],
'billing_invoice_recipient_emails' => [
'<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://client-api.tryvox.co/v3/organizations/{organization_id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"webhook_url\": \"<string>\",\n \"webhook_version\": \"v2\",\n \"webhook_event_subscriptions\": [\n \"<string>\"\n ],\n \"billing_invoice_recipient_emails\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://client-api.tryvox.co/v3/organizations/{organization_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"webhook_url\": \"<string>\",\n \"webhook_version\": \"v2\",\n \"webhook_event_subscriptions\": [\n \"<string>\"\n ],\n \"billing_invoice_recipient_emails\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://client-api.tryvox.co/v3/organizations/{organization_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"webhook_url\": \"<string>\",\n \"webhook_version\": \"v2\",\n \"webhook_event_subscriptions\": [\n \"<string>\"\n ],\n \"billing_invoice_recipient_emails\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"is_main": true,
"webhook_version": "<string>",
"webhook_event_subscriptions": [
"<string>"
],
"created_at": 123,
"parent_organization_id": "<string>",
"webhook_url": "<string>",
"billing_invoice_recipient_emails": [
"<string>"
],
"subscription": {
"display_name": "<string>",
"plan_sms_send_text_fee": 123,
"plan_sms_send_mms_fee": 123,
"plan_sms_recv_fee": 123,
"plan_concurrent_call_limit": 123,
"plan_hourly_call_limit": 123,
"plan_daily_call_limit": 123
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Request validation failed.",
"details": {
"field": "name",
"reason": "must not be blank"
}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication is required.",
"details": {}
}
}{
"error": {
"code": "FORBIDDEN",
"message": "Permission denied.",
"details": {}
}
}{
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Resource not found.",
"details": {
"resource": "agent"
}
}
}{
"error": {
"code": "CONFLICT",
"message": "The requested operation conflicts with current state.",
"details": {
"current_status": "draft"
}
}
}{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Too many requests.",
"details": {
"limit": 10,
"window_seconds": 1,
"scope": "user"
}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error.",
"details": {}
}
}{
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "Service temporarily unavailable.",
"details": {}
}
}Authorizations
조직 API 키를 Authorization: Bearer <token> 형식으로 보냅니다.
Path Parameters
수정할 조직 ID입니다(본인 또는 직속 하위 조직).
Body
수정할 조직 필드입니다.
조직 수정 요청입니다. 변경할 필드만 보내며(최소 1개), 생략한 필드는 유지됩니다. 상위·하위 관계와 결제 방식은 이 API로 바꿀 수 없습니다.
조직 이름입니다. 앞뒤 공백은 제거됩니다. null은 거부되고, 생략 시 유지됩니다.
1 - 255webhook 수신 URL입니다. https URL만 허용하며, null 또는 빈 문자열이면 해제되고 생략 시 유지됩니다.
2048Call webhook payload 버전입니다. v2만 설정할 수 있습니다(v1은 레거시 단방향이라 API로 설정할 수 없고, v1→v2 업그레이드만 가능합니다). null은 거부되고, 생략 시 유지됩니다.
"v2"구독할 webhook 이벤트 타입 목록입니다. 현재 sms_received, handoff, campaign, sms_batch, chat_started, chat_ended, chat_analyzed가 구독 대상이며, Chat lifecycle 이벤트는 organization의 Call webhook_version과 무관하게 항상 v2로 전송됩니다. 통화 관련 이벤트는 구독과 무관하게 항상 발송됩니다. 중복은 제거되고, null은 거부되며 생략 시 유지됩니다.
청구서 안내 수신 이메일 목록입니다. 소문자로 정규화되며 중복은 거부됩니다. null은 거부되고, 생략 시 유지됩니다.
Response
성공 응답
조직 ID입니다.
조직 이름
상위 조직 여부입니다(false면 하위 조직).
Call webhook payload 버전 (v1/v2)
구독 중인 webhook 이벤트 타입 목록입니다.
리소스 생성 시각입니다. unix milliseconds 형식입니다.
상위 조직 ID입니다. 하위 조직만 값이 있고 상위 조직은 null입니다.
webhook 수신 URL
청구서 안내 수신 이메일입니다.
구독 정보입니다. 상위 조직만 포함되고 하위 조직은 null입니다.
Show child attributes
Show child attributes
Was this page helpful?
curl --request PATCH \
--url https://client-api.tryvox.co/v3/organizations/{organization_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"webhook_url": "<string>",
"webhook_version": "v2",
"webhook_event_subscriptions": [
"<string>"
],
"billing_invoice_recipient_emails": [
"<string>"
]
}
'import requests
url = "https://client-api.tryvox.co/v3/organizations/{organization_id}"
payload = {
"name": "<string>",
"webhook_url": "<string>",
"webhook_version": "v2",
"webhook_event_subscriptions": ["<string>"],
"billing_invoice_recipient_emails": ["<string>"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
webhook_url: '<string>',
webhook_version: 'v2',
webhook_event_subscriptions: ['<string>'],
billing_invoice_recipient_emails: ['<string>']
})
};
fetch('https://client-api.tryvox.co/v3/organizations/{organization_id}', 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://client-api.tryvox.co/v3/organizations/{organization_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'webhook_url' => '<string>',
'webhook_version' => 'v2',
'webhook_event_subscriptions' => [
'<string>'
],
'billing_invoice_recipient_emails' => [
'<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://client-api.tryvox.co/v3/organizations/{organization_id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"webhook_url\": \"<string>\",\n \"webhook_version\": \"v2\",\n \"webhook_event_subscriptions\": [\n \"<string>\"\n ],\n \"billing_invoice_recipient_emails\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://client-api.tryvox.co/v3/organizations/{organization_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"webhook_url\": \"<string>\",\n \"webhook_version\": \"v2\",\n \"webhook_event_subscriptions\": [\n \"<string>\"\n ],\n \"billing_invoice_recipient_emails\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://client-api.tryvox.co/v3/organizations/{organization_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"webhook_url\": \"<string>\",\n \"webhook_version\": \"v2\",\n \"webhook_event_subscriptions\": [\n \"<string>\"\n ],\n \"billing_invoice_recipient_emails\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"is_main": true,
"webhook_version": "<string>",
"webhook_event_subscriptions": [
"<string>"
],
"created_at": 123,
"parent_organization_id": "<string>",
"webhook_url": "<string>",
"billing_invoice_recipient_emails": [
"<string>"
],
"subscription": {
"display_name": "<string>",
"plan_sms_send_text_fee": 123,
"plan_sms_send_mms_fee": 123,
"plan_sms_recv_fee": 123,
"plan_concurrent_call_limit": 123,
"plan_hourly_call_limit": 123,
"plan_daily_call_limit": 123
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Request validation failed.",
"details": {
"field": "name",
"reason": "must not be blank"
}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication is required.",
"details": {}
}
}{
"error": {
"code": "FORBIDDEN",
"message": "Permission denied.",
"details": {}
}
}{
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Resource not found.",
"details": {
"resource": "agent"
}
}
}{
"error": {
"code": "CONFLICT",
"message": "The requested operation conflicts with current state.",
"details": {
"current_status": "draft"
}
}
}{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Too many requests.",
"details": {
"limit": 10,
"window_seconds": 1,
"scope": "user"
}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error.",
"details": {}
}
}{
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "Service temporarily unavailable.",
"details": {}
}
}