curl --request POST \
--url https://www.getsurfaced.ai/api/v1/runs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Workspace-Id: <x-workspace-id>' \
--data '
{
"briefIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"locales": [
"<string>"
],
"pipelineReleaseId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"metadata": {}
}
'import requests
url = "https://www.getsurfaced.ai/api/v1/runs"
payload = {
"briefIds": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"locales": ["<string>"],
"pipelineReleaseId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"metadata": {}
}
headers = {
"X-Workspace-Id": "<x-workspace-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Workspace-Id': '<x-workspace-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
briefIds: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
locales: ['<string>'],
pipelineReleaseId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
metadata: {}
})
};
fetch('https://www.getsurfaced.ai/api/v1/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://www.getsurfaced.ai/api/v1/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([
'briefIds' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'locales' => [
'<string>'
],
'pipelineReleaseId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Workspace-Id: <x-workspace-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://www.getsurfaced.ai/api/v1/runs"
payload := strings.NewReader("{\n \"briefIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"locales\": [\n \"<string>\"\n ],\n \"pipelineReleaseId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Workspace-Id", "<x-workspace-id>")
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://www.getsurfaced.ai/api/v1/runs")
.header("X-Workspace-Id", "<x-workspace-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"briefIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"locales\": [\n \"<string>\"\n ],\n \"pipelineReleaseId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.getsurfaced.ai/api/v1/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Workspace-Id"] = '<x-workspace-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"briefIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"locales\": [\n \"<string>\"\n ],\n \"pipelineReleaseId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"runId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"jobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "queued"
},
"poll": "/api/v1/jobs/<jobId>"
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}Trigger a content pipeline run
Queues article-generation tasks for the supplied Content Briefs. Returns 202 with a runId and a jobId; poll GET /jobs/{id} until status is completed or failed, with a timeout: if the run is cancelled or stopped its job stays queued forever, so then check the run. Subject to billing (a plan without API access, the article allowance and LLM cost guardrails), which fail with 402 BILLING_LIMIT, and to the pipeline rate-limit tier (10 requests per minute per key), which fails with 429 RATE_LIMITED. A target that already has a live Page fails with 409 DUPLICATE_PAGE before any generation spend; details.collisions lists the existing Pages. This endpoint cannot confirm a duplicate, so resolve or archive the existing Page first.
curl --request POST \
--url https://www.getsurfaced.ai/api/v1/runs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Workspace-Id: <x-workspace-id>' \
--data '
{
"briefIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"locales": [
"<string>"
],
"pipelineReleaseId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"metadata": {}
}
'import requests
url = "https://www.getsurfaced.ai/api/v1/runs"
payload = {
"briefIds": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"locales": ["<string>"],
"pipelineReleaseId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"metadata": {}
}
headers = {
"X-Workspace-Id": "<x-workspace-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Workspace-Id': '<x-workspace-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
briefIds: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
locales: ['<string>'],
pipelineReleaseId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
metadata: {}
})
};
fetch('https://www.getsurfaced.ai/api/v1/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://www.getsurfaced.ai/api/v1/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([
'briefIds' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'locales' => [
'<string>'
],
'pipelineReleaseId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Workspace-Id: <x-workspace-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://www.getsurfaced.ai/api/v1/runs"
payload := strings.NewReader("{\n \"briefIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"locales\": [\n \"<string>\"\n ],\n \"pipelineReleaseId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Workspace-Id", "<x-workspace-id>")
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://www.getsurfaced.ai/api/v1/runs")
.header("X-Workspace-Id", "<x-workspace-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"briefIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"locales\": [\n \"<string>\"\n ],\n \"pipelineReleaseId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.getsurfaced.ai/api/v1/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Workspace-Id"] = '<x-workspace-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"briefIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"locales\": [\n \"<string>\"\n ],\n \"pipelineReleaseId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"runId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"jobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "queued"
},
"poll": "/api/v1/jobs/<jobId>"
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "<string>",
"details": {}
}
}Authorizations
API key (sk_live_...) created at https://www.getsurfaced.ai/app/settings/account/api-keys
Headers
Body
- Option 1
- Option 2
Provide either briefIds (optionally with locales for cross-product expansion) or pre-resolved pairs of (briefId, locale). The two variants are mutually exclusive.