curl --request POST \
--url https://api.getoneprofile.ai/assistant/actions/{proposal_id}/approve/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"grant_conversation": false
}
'import requests
url = "https://api.getoneprofile.ai/assistant/actions/{proposal_id}/approve/"
payload = { "grant_conversation": False }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({grant_conversation: false})
};
fetch('https://api.getoneprofile.ai/assistant/actions/{proposal_id}/approve/', 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.getoneprofile.ai/assistant/actions/{proposal_id}/approve/",
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([
'grant_conversation' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.getoneprofile.ai/assistant/actions/{proposal_id}/approve/"
payload := strings.NewReader("{\n \"grant_conversation\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<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.getoneprofile.ai/assistant/actions/{proposal_id}/approve/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"grant_conversation\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/assistant/actions/{proposal_id}/approve/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"grant_conversation\": false\n}"
response = http.request(request)
puts response.read_body{
"applied_result": {},
"can_undo": true,
"conversation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"decided_at": "2023-11-07T05:31:56Z",
"decided_by_display_name": "<string>",
"error": "<string>",
"grantable": true,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"message_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"origin": "chat",
"price_credits": 123,
"price_label": "<string>",
"proposed_at": "2023-11-07T05:31:56Z",
"status": "proposed",
"summary": "<string>",
"undoable": true,
"undone_at": "2023-11-07T05:31:56Z",
"undone_by_display_name": "<string>",
"verb": "create_table_from_search",
"verb_label": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Approve a proposed action
Apply a proposal on your say-so. Idempotent: approving an action that already applied returns it unchanged, so a second click applies nothing twice. An action whose apply is refused (the balance cannot cover it, the object it names is gone) comes back failed with the reason on the card, not as an error.
With grant_conversation, the verb is also allowed in the proposal’s conversation from now on, so the next call applies without asking. Refused for a send, which always asks first.
curl --request POST \
--url https://api.getoneprofile.ai/assistant/actions/{proposal_id}/approve/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"grant_conversation": false
}
'import requests
url = "https://api.getoneprofile.ai/assistant/actions/{proposal_id}/approve/"
payload = { "grant_conversation": False }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({grant_conversation: false})
};
fetch('https://api.getoneprofile.ai/assistant/actions/{proposal_id}/approve/', 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.getoneprofile.ai/assistant/actions/{proposal_id}/approve/",
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([
'grant_conversation' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.getoneprofile.ai/assistant/actions/{proposal_id}/approve/"
payload := strings.NewReader("{\n \"grant_conversation\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<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.getoneprofile.ai/assistant/actions/{proposal_id}/approve/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"grant_conversation\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/assistant/actions/{proposal_id}/approve/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"grant_conversation\": false\n}"
response = http.request(request)
puts response.read_body{
"applied_result": {},
"can_undo": true,
"conversation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"decided_at": "2023-11-07T05:31:56Z",
"decided_by_display_name": "<string>",
"error": "<string>",
"grantable": true,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"message_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"origin": "chat",
"price_credits": 123,
"price_label": "<string>",
"proposed_at": "2023-11-07T05:31:56Z",
"status": "proposed",
"summary": "<string>",
"undoable": true,
"undone_at": "2023-11-07T05:31:56Z",
"undone_by_display_name": "<string>",
"verb": "create_table_from_search",
"verb_label": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Authorizations
Path Parameters
Body
Approve a proposal, and optionally let its conversation apply the verb unasked.
Also allow the verb in the proposal's conversation, so the next call applies without asking. Refused for a send, which always asks.
Response
Successful Response
One action the assistant proposed or applied, and what became of it: the card.
Prices are quoted in credits, never tenths, and never as a raw id: who
decided is a display name resolved at this boundary. applied_result
is the verb's own record of what it made (the new column's id, the rows
enrolled), for the card's link and its Undo.
Whether Undo applies now: undoable and applied.
Why an approval failed to apply, in plain words; null otherwise.
Whether the card may offer Approve and allow in this conversation: only a pending proposal of a verb that is not a send.
Which surface raised a proposal.
Kept as its own enum rather than reusing the thread-store origins: a scheduled search proposes with no conversation behind it at all, and the activity feed needs to say so.
chat, agent, scheduled_search The published price of the operation when it was proposed, in credits; null when free.
"Free", "1 credit" or "N credits", as the card says it.
Where one proposed action stands.
PROPOSED waits on a person. APPLIED happened, and may be undone where the verb allows it. UNDONE is applied-then-reversed and stays on the record: Undo reverses the workspace change, never the spend, and a trail that forgot the spend would be lying. DISMISSED is a person saying no. FAILED is an approval whose apply raised; the error stays with the row so the card can say why instead of vanishing.
proposed, applied, undone, dismissed, failed Whether the verb can be reversed at all.
The eight things an AI may do to a workspace.
Exactly eight, not sixty: today's cell-level actions all run against one cell, and building a table, adding contacts to a sequence and starting a search had no home at all. Anything new here is a product decision about what an assistant may touch, not a convenience for a planner.
create_table_from_search, add_column, run_column, enrich_rows, add_contacts_to_sequence, push_to_destination, call_endpoint, start_search Was this page helpful?