curl --request POST \
--url https://app.octavehq.com/api/v2/skills/{key}/runs \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"request": "",
"items": [
"<string>"
],
"delivery": {
"mode": "digest",
"slack": null,
"webhook": null
},
"callbackUrl": "<string>",
"idempotencyKey": "<string>"
}
'import requests
url = "https://app.octavehq.com/api/v2/skills/{key}/runs"
payload = {
"request": "",
"items": ["<string>"],
"delivery": {
"mode": "digest",
"slack": None,
"webhook": None
},
"callbackUrl": "<string>",
"idempotencyKey": "<string>"
}
headers = {
"api_key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {api_key: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
request: '',
items: ['<string>'],
delivery: {mode: 'digest', slack: null, webhook: null},
callbackUrl: '<string>',
idempotencyKey: '<string>'
})
};
fetch('https://app.octavehq.com/api/v2/skills/{key}/runs', 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://app.octavehq.com/api/v2/skills/{key}/runs",
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([
'request' => '',
'items' => [
'<string>'
],
'delivery' => [
'mode' => 'digest',
'slack' => null,
'webhook' => null
],
'callbackUrl' => '<string>',
'idempotencyKey' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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://app.octavehq.com/api/v2/skills/{key}/runs"
payload := strings.NewReader("{\n \"request\": \"\",\n \"items\": [\n \"<string>\"\n ],\n \"delivery\": {\n \"mode\": \"digest\",\n \"slack\": null,\n \"webhook\": null\n },\n \"callbackUrl\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("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://app.octavehq.com/api/v2/skills/{key}/runs")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"request\": \"\",\n \"items\": [\n \"<string>\"\n ],\n \"delivery\": {\n \"mode\": \"digest\",\n \"slack\": null,\n \"webhook\": null\n },\n \"callbackUrl\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.octavehq.com/api/v2/skills/{key}/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api_key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"request\": \"\",\n \"items\": [\n \"<string>\"\n ],\n \"delivery\": {\n \"mode\": \"digest\",\n \"slack\": null,\n \"webhook\": null\n },\n \"callbackUrl\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"_metadata": {
"requestId": "requestId",
"timestamp": "2021-01-01T00:00:00.000Z",
"usage": 0,
"message": "message"
},
"run": {
"oId": "<string>",
"subject": {
"kind": "skill",
"skill": {
"source": "catalog",
"name": "<string>"
},
"draft": true
},
"subjectLabel": "<string>",
"request": "<string>",
"trigger": "manual",
"status": "queued",
"counts": {
"total": 123,
"pending": 123,
"succeeded": 123,
"failed": 123,
"skipped": 123
},
"credits": {
"unitPrice": 123,
"quoted": 123,
"held": 123,
"charged": 123
},
"delivery": {
"mode": "digest",
"slack": {
"channel": {
"id": "<string>",
"name": "<string>"
}
},
"webhook": {
"url": "<string>"
},
"callbackUrl": "<string>"
},
"idempotencyKey": "<string>",
"createdBy": {
"oId": "<string>",
"email": "<string>"
},
"summary": {
"line": "<string>",
"deliveries": [
{
"destination": "<string>",
"ok": true,
"message": "<string>"
}
],
"stoppedReason": "<string>"
},
"error": "<string>",
"pauseReason": "user",
"createdAt": "<string>",
"startedAt": "<string>",
"finishedAt": "<string>"
},
"started": true
}{
"_metadata": {
"requestId": "requestId",
"timestamp": "2021-01-01T00:00:00.000Z",
"usage": 0,
"message": "message"
},
"message": "<string>"
}Run a skill
Runs a Skill with a request in words — once, or once per items line (at most 200) — and returns the run at once; each run is a hosted, brand-checked document (an Asset link) made by the skill’s agent, and costs the skill’s base price (charged only when its document is published) plus its research tools as used, up to 1,000 credits all-in. The skill’s agent interprets the request and each item (a company domain, a person’s email, a deal or CRM id, options in words); MCP skill_run with check: true returns the skill’s usage line. Poll GET /api/v2/runs/{oId}, or pass callbackUrl to be POSTed the finished run. A repeated idempotencyKey returns the run it started.
curl --request POST \
--url https://app.octavehq.com/api/v2/skills/{key}/runs \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"request": "",
"items": [
"<string>"
],
"delivery": {
"mode": "digest",
"slack": null,
"webhook": null
},
"callbackUrl": "<string>",
"idempotencyKey": "<string>"
}
'import requests
url = "https://app.octavehq.com/api/v2/skills/{key}/runs"
payload = {
"request": "",
"items": ["<string>"],
"delivery": {
"mode": "digest",
"slack": None,
"webhook": None
},
"callbackUrl": "<string>",
"idempotencyKey": "<string>"
}
headers = {
"api_key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {api_key: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
request: '',
items: ['<string>'],
delivery: {mode: 'digest', slack: null, webhook: null},
callbackUrl: '<string>',
idempotencyKey: '<string>'
})
};
fetch('https://app.octavehq.com/api/v2/skills/{key}/runs', 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://app.octavehq.com/api/v2/skills/{key}/runs",
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([
'request' => '',
'items' => [
'<string>'
],
'delivery' => [
'mode' => 'digest',
'slack' => null,
'webhook' => null
],
'callbackUrl' => '<string>',
'idempotencyKey' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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://app.octavehq.com/api/v2/skills/{key}/runs"
payload := strings.NewReader("{\n \"request\": \"\",\n \"items\": [\n \"<string>\"\n ],\n \"delivery\": {\n \"mode\": \"digest\",\n \"slack\": null,\n \"webhook\": null\n },\n \"callbackUrl\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("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://app.octavehq.com/api/v2/skills/{key}/runs")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"request\": \"\",\n \"items\": [\n \"<string>\"\n ],\n \"delivery\": {\n \"mode\": \"digest\",\n \"slack\": null,\n \"webhook\": null\n },\n \"callbackUrl\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.octavehq.com/api/v2/skills/{key}/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api_key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"request\": \"\",\n \"items\": [\n \"<string>\"\n ],\n \"delivery\": {\n \"mode\": \"digest\",\n \"slack\": null,\n \"webhook\": null\n },\n \"callbackUrl\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"_metadata": {
"requestId": "requestId",
"timestamp": "2021-01-01T00:00:00.000Z",
"usage": 0,
"message": "message"
},
"run": {
"oId": "<string>",
"subject": {
"kind": "skill",
"skill": {
"source": "catalog",
"name": "<string>"
},
"draft": true
},
"subjectLabel": "<string>",
"request": "<string>",
"trigger": "manual",
"status": "queued",
"counts": {
"total": 123,
"pending": 123,
"succeeded": 123,
"failed": 123,
"skipped": 123
},
"credits": {
"unitPrice": 123,
"quoted": 123,
"held": 123,
"charged": 123
},
"delivery": {
"mode": "digest",
"slack": {
"channel": {
"id": "<string>",
"name": "<string>"
}
},
"webhook": {
"url": "<string>"
},
"callbackUrl": "<string>"
},
"idempotencyKey": "<string>",
"createdBy": {
"oId": "<string>",
"email": "<string>"
},
"summary": {
"line": "<string>",
"deliveries": [
{
"destination": "<string>",
"ok": true,
"message": "<string>"
}
],
"stoppedReason": "<string>"
},
"error": "<string>",
"pauseReason": "user",
"createdAt": "<string>",
"startedAt": "<string>",
"finishedAt": "<string>"
},
"started": true
}{
"_metadata": {
"requestId": "requestId",
"timestamp": "2021-01-01T00:00:00.000Z",
"usage": 0,
"message": "message"
},
"message": "<string>"
}Authorizations
Path Parameters
The skill: a workspace skill's oId (skl_ prefix) or a catalog skill's name (deal-coach, meeting-prep, abm, …).
1 - 64"deal-coach"
Body
What you want from the skill, in words: who or what it is about and any options. The skill's agent interprets it; for items, it applies to each.
8000Run once per item (at most 200): each a line naming what that run is for ("acme.com", "jane@acme.com", "Acme renewal, crmo_…").
1 - 200 elements1 - 2000Where results go besides the callback: a Slack channel and/or an https webhook, as one digest when the run finishes or per item.
Show child attributes
Show child attributes
POSTed the finished run (status, counts, credits, every item) once its last item settles.
A key for this run: a second call with it returns the same run.
1 - 120