Apply a group of virtual tag suggestions
Turns every pending suggestion in the group into a live rule under its key, creating keys as needed. Pass suggestion_ids to apply a subset; omit it for every pending member. Rules append after any that already exist, ranked by the given id order, otherwise by key and the order the agent proposed them. The batch is all or nothing: if any member cannot be compiled into a rule, nothing is written and the per-suggestion errors come back as a 400. Unlike the single-suggestion endpoint, a member that is already answered is reported as skipped rather than a 409, so a retry that finds the work done succeeds. A member matching an existing rule is skipped as a duplicate and marked applied against that rule.
curl --request POST \
--url https://api.costgraph.ai/api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--header 'X-CostGraph-Tenant-ID: <x-costgraph-tenant-id>' \
--data '
{
"suggestion_ids": [
"<string>"
]
}
'import requests
url = "https://api.costgraph.ai/api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply"
payload = { "suggestion_ids": ["<string>"] }
headers = {
"X-CostGraph-Tenant-ID": "<x-costgraph-tenant-id>",
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-CostGraph-Tenant-ID': '<x-costgraph-tenant-id>',
Authorization: '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({suggestion_ids: ['<string>']})
};
fetch('https://api.costgraph.ai/api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply', 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.costgraph.ai/api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply",
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([
'suggestion_ids' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json",
"X-CostGraph-Tenant-ID: <x-costgraph-tenant-id>"
],
]);
$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.costgraph.ai/api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply"
payload := strings.NewReader("{\n \"suggestion_ids\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-CostGraph-Tenant-ID", "<x-costgraph-tenant-id>")
req.Header.Add("Authorization", "<api-key>")
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.costgraph.ai/api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply")
.header("X-CostGraph-Tenant-ID", "<x-costgraph-tenant-id>")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"suggestion_ids\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.costgraph.ai/api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-CostGraph-Tenant-ID"] = '<x-costgraph-tenant-id>'
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"suggestion_ids\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"message": "some message",
"status": "success",
"data": {
"answered": [
"<string>"
],
"group_id": "<string>",
"progress": {
"applied": 123,
"ignored": 123,
"pending": 123,
"total": 123
},
"resolved": true,
"rules": [
{
"active": true,
"created_at": "<string>",
"description": "<string>",
"expression": "<string>",
"expression_hash": "<string>",
"field": "<string>",
"id": "<string>",
"inherited_from": "<string>",
"key": "<string>",
"match_value": "<string>",
"operator": "<string>",
"origin": "<string>",
"rank": 123,
"rule_type": "<string>",
"scope": "<string>",
"source_text": "<string>",
"tenant_id": "<string>",
"updated_at": "<string>",
"valid_from": "<string>",
"valid_to": "<string>",
"value": "<string>"
}
],
"skipped": [
{
"reason": "<string>",
"rule_id": "<string>",
"suggestion_id": "<string>"
}
]
}
}{
"message": "some message",
"status": "error"
}{
"message": "some message",
"status": "error"
}{
"message": "some message",
"status": "error"
}Authorizations
Enter "Bearer {token}"
Headers
Tenant ID
Path Parameters
Suggestion group ID
Body
Members to apply
Was this page helpful?
curl --request POST \
--url https://api.costgraph.ai/api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--header 'X-CostGraph-Tenant-ID: <x-costgraph-tenant-id>' \
--data '
{
"suggestion_ids": [
"<string>"
]
}
'import requests
url = "https://api.costgraph.ai/api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply"
payload = { "suggestion_ids": ["<string>"] }
headers = {
"X-CostGraph-Tenant-ID": "<x-costgraph-tenant-id>",
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-CostGraph-Tenant-ID': '<x-costgraph-tenant-id>',
Authorization: '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({suggestion_ids: ['<string>']})
};
fetch('https://api.costgraph.ai/api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply', 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.costgraph.ai/api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply",
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([
'suggestion_ids' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json",
"X-CostGraph-Tenant-ID: <x-costgraph-tenant-id>"
],
]);
$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.costgraph.ai/api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply"
payload := strings.NewReader("{\n \"suggestion_ids\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-CostGraph-Tenant-ID", "<x-costgraph-tenant-id>")
req.Header.Add("Authorization", "<api-key>")
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.costgraph.ai/api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply")
.header("X-CostGraph-Tenant-ID", "<x-costgraph-tenant-id>")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"suggestion_ids\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.costgraph.ai/api/v1/tenant/virtual-tag-suggestion-groups/{group_id}/apply")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-CostGraph-Tenant-ID"] = '<x-costgraph-tenant-id>'
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"suggestion_ids\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"message": "some message",
"status": "success",
"data": {
"answered": [
"<string>"
],
"group_id": "<string>",
"progress": {
"applied": 123,
"ignored": 123,
"pending": 123,
"total": 123
},
"resolved": true,
"rules": [
{
"active": true,
"created_at": "<string>",
"description": "<string>",
"expression": "<string>",
"expression_hash": "<string>",
"field": "<string>",
"id": "<string>",
"inherited_from": "<string>",
"key": "<string>",
"match_value": "<string>",
"operator": "<string>",
"origin": "<string>",
"rank": 123,
"rule_type": "<string>",
"scope": "<string>",
"source_text": "<string>",
"tenant_id": "<string>",
"updated_at": "<string>",
"valid_from": "<string>",
"valid_to": "<string>",
"value": "<string>"
}
],
"skipped": [
{
"reason": "<string>",
"rule_id": "<string>",
"suggestion_id": "<string>"
}
]
}
}{
"message": "some message",
"status": "error"
}{
"message": "some message",
"status": "error"
}{
"message": "some message",
"status": "error"
}