curl --request POST \
--url https://platform-api.trychainshift.ai/api/v1/platform/runs \
--header 'API-Key: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"models": [
"CHATGPT",
"GEMINI"
],
"location": "US-NEW_YORK",
"promptIDs": [
"cM0RPoxbNbJy0mS-MhsHOg"
],
"promptSetID": "IkVMHhjFWcBXcJ41-h9yBQ",
"region": "KR",
"repeatCount": 1
}
'import requests
url = "https://platform-api.trychainshift.ai/api/v1/platform/runs"
payload = {
"models": ["CHATGPT", "GEMINI"],
"location": "US-NEW_YORK",
"promptIDs": ["cM0RPoxbNbJy0mS-MhsHOg"],
"promptSetID": "IkVMHhjFWcBXcJ41-h9yBQ",
"region": "KR",
"repeatCount": 1
}
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({
models: ['CHATGPT', 'GEMINI'],
location: 'US-NEW_YORK',
promptIDs: ['cM0RPoxbNbJy0mS-MhsHOg'],
promptSetID: 'IkVMHhjFWcBXcJ41-h9yBQ',
region: 'KR',
repeatCount: 1
})
};
fetch('https://platform-api.trychainshift.ai/api/v1/platform/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://platform-api.trychainshift.ai/api/v1/platform/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([
'models' => [
'CHATGPT',
'GEMINI'
],
'location' => 'US-NEW_YORK',
'promptIDs' => [
'cM0RPoxbNbJy0mS-MhsHOg'
],
'promptSetID' => 'IkVMHhjFWcBXcJ41-h9yBQ',
'region' => 'KR',
'repeatCount' => 1
]),
CURLOPT_HTTPHEADER => [
"API-Key: <api-key>",
"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://platform-api.trychainshift.ai/api/v1/platform/runs"
payload := strings.NewReader("{\n \"models\": [\n \"CHATGPT\",\n \"GEMINI\"\n ],\n \"location\": \"US-NEW_YORK\",\n \"promptIDs\": [\n \"cM0RPoxbNbJy0mS-MhsHOg\"\n ],\n \"promptSetID\": \"IkVMHhjFWcBXcJ41-h9yBQ\",\n \"region\": \"KR\",\n \"repeatCount\": 1\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://platform-api.trychainshift.ai/api/v1/platform/runs")
.header("API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"models\": [\n \"CHATGPT\",\n \"GEMINI\"\n ],\n \"location\": \"US-NEW_YORK\",\n \"promptIDs\": [\n \"cM0RPoxbNbJy0mS-MhsHOg\"\n ],\n \"promptSetID\": \"IkVMHhjFWcBXcJ41-h9yBQ\",\n \"region\": \"KR\",\n \"repeatCount\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform-api.trychainshift.ai/api/v1/platform/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 \"models\": [\n \"CHATGPT\",\n \"GEMINI\"\n ],\n \"location\": \"US-NEW_YORK\",\n \"promptIDs\": [\n \"cM0RPoxbNbJy0mS-MhsHOg\"\n ],\n \"promptSetID\": \"IkVMHhjFWcBXcJ41-h9yBQ\",\n \"region\": \"KR\",\n \"repeatCount\": 1\n}"
response = http.request(request)
puts response.read_body{
"id": "S8cqDSjSot67bCK6YtmvHw"
}{
"code": "COMMON_VALIDATION",
"details": [
"limit: must be 100 or less"
],
"message": "Data validation failed"
}{
"code": "COMMON_UNAUTHORIZED",
"message": "Unauthenticated user"
}{
"code": "INSUFFICIENT_CREDITS",
"message": "Insufficient credits."
}{
"code": "MODEL_NOT_GRANTED",
"message": "This model is not granted to the organization. An agreement is required to use it"
}{
"code": "PROMPT_NOT_FOUND",
"message": "Prompt not found"
}{
"code": "PLATFORM_RATE_LIMIT_EXCEEDED",
"message": "Too many requests. Please try again later."
}{
"message": "Internal Server Error",
"requestID": "bkZqnHQepkgTOocTvyHWSlHcGzRqQbZk"
}Submit a run
Runs the organization’s prompts on the specified models. This is a one-time run at the time of the request, not periodic monitoring. When the request succeeds, a prompt run (Run) is created. The run target must be either promptIDs (individual prompts) or promptSetID (an entire prompt set); you cannot use both at the same time. Check progress with the id in the response via Get prompt run status.
Errors
| HTTP | Code | Description |
|---|---|---|
| 400 | COMMON_BINDING | • Failed to parse the request body JSON • Invalid promptIDs or promptSetID format (PLATFORM_INVALID_ID in details) |
| 400 | COMMON_VALIDATION | • models missing, more than 8, or a value outside the allowed list • promptIDs more than 500 • repeatCount out of range (1 to 100) |
| 400 | RUN_PROMPT_TARGET_REQUIRED | Exactly one of promptIDs or promptSetID was not specified |
| 400 | PROMPT_SET_EMPTY | The specified set has no prompts to run |
| 400 | MODEL_NOT_SUPPORTED | model value not supported by the Platform API |
| 400 | MODEL_DISCONTINUED | A discontinued model was requested (no models are currently discontinued). Discontinued models do not appear in GET /models either |
| 400 | NO_AVAILABLE_PLATFORM | All requested models are currently unavailable for collection |
| 400 | REGION_NOT_SUPPORTED | Unsupported region code |
| 400 | REGION_NOT_SUPPORTED_FOR_MODEL | Region not supported by the model |
| 400 | LOCATION_NOT_SUPPORTED | Unsupported location code (a value not in GET /locations) |
| 400 | LOCATION_REGION_MISMATCH | Location does not belong to the specified region |
| 400 | LOCATION_NOT_SUPPORTED_FOR_MODEL | One or more of the requested models does not support this location |
| 400 | QUESTION_NOT_MARKETING_PLATFORM | Prompt does not belong to the Platform API |
| 400 | RUN_TOO_MANY_TASKS | Total number of runs (prompts × models × repeats) exceeds 10,000 |
| 401 | COMMON_UNAUTHORIZED | API key or access token is missing or invalid |
| 402 | INSUFFICIENT_CREDITS | Organization credit balance is lower than the unit price of this request |
| 403 | MODEL_NOT_GRANTED | A model that requires a separate agreement (CLAUDE, PERPLEXITY, GROK, DEEPSEEK) was requested without the grant (it does not appear in GET /models either) |
| 404 | PROMPT_NOT_FOUND | Prompt does not exist or belongs to another organization |
| 404 | PROMPT_SET_NOT_FOUND | Set does not exist or belongs to another organization |
| 404 | CAMPAIGN_NOT_FOUND | The campaign the prompt belongs to was not found |
| 429 | PLATFORM_RATE_LIMIT_EXCEEDED | Rate limit exceeded. Wait the number of seconds in the Retry-After header, then retry |
| 500 | — | Internal server error. Returns message and requestID without code |
curl --request POST \
--url https://platform-api.trychainshift.ai/api/v1/platform/runs \
--header 'API-Key: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"models": [
"CHATGPT",
"GEMINI"
],
"location": "US-NEW_YORK",
"promptIDs": [
"cM0RPoxbNbJy0mS-MhsHOg"
],
"promptSetID": "IkVMHhjFWcBXcJ41-h9yBQ",
"region": "KR",
"repeatCount": 1
}
'import requests
url = "https://platform-api.trychainshift.ai/api/v1/platform/runs"
payload = {
"models": ["CHATGPT", "GEMINI"],
"location": "US-NEW_YORK",
"promptIDs": ["cM0RPoxbNbJy0mS-MhsHOg"],
"promptSetID": "IkVMHhjFWcBXcJ41-h9yBQ",
"region": "KR",
"repeatCount": 1
}
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({
models: ['CHATGPT', 'GEMINI'],
location: 'US-NEW_YORK',
promptIDs: ['cM0RPoxbNbJy0mS-MhsHOg'],
promptSetID: 'IkVMHhjFWcBXcJ41-h9yBQ',
region: 'KR',
repeatCount: 1
})
};
fetch('https://platform-api.trychainshift.ai/api/v1/platform/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://platform-api.trychainshift.ai/api/v1/platform/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([
'models' => [
'CHATGPT',
'GEMINI'
],
'location' => 'US-NEW_YORK',
'promptIDs' => [
'cM0RPoxbNbJy0mS-MhsHOg'
],
'promptSetID' => 'IkVMHhjFWcBXcJ41-h9yBQ',
'region' => 'KR',
'repeatCount' => 1
]),
CURLOPT_HTTPHEADER => [
"API-Key: <api-key>",
"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://platform-api.trychainshift.ai/api/v1/platform/runs"
payload := strings.NewReader("{\n \"models\": [\n \"CHATGPT\",\n \"GEMINI\"\n ],\n \"location\": \"US-NEW_YORK\",\n \"promptIDs\": [\n \"cM0RPoxbNbJy0mS-MhsHOg\"\n ],\n \"promptSetID\": \"IkVMHhjFWcBXcJ41-h9yBQ\",\n \"region\": \"KR\",\n \"repeatCount\": 1\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://platform-api.trychainshift.ai/api/v1/platform/runs")
.header("API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"models\": [\n \"CHATGPT\",\n \"GEMINI\"\n ],\n \"location\": \"US-NEW_YORK\",\n \"promptIDs\": [\n \"cM0RPoxbNbJy0mS-MhsHOg\"\n ],\n \"promptSetID\": \"IkVMHhjFWcBXcJ41-h9yBQ\",\n \"region\": \"KR\",\n \"repeatCount\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform-api.trychainshift.ai/api/v1/platform/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 \"models\": [\n \"CHATGPT\",\n \"GEMINI\"\n ],\n \"location\": \"US-NEW_YORK\",\n \"promptIDs\": [\n \"cM0RPoxbNbJy0mS-MhsHOg\"\n ],\n \"promptSetID\": \"IkVMHhjFWcBXcJ41-h9yBQ\",\n \"region\": \"KR\",\n \"repeatCount\": 1\n}"
response = http.request(request)
puts response.read_body{
"id": "S8cqDSjSot67bCK6YtmvHw"
}{
"code": "COMMON_VALIDATION",
"details": [
"limit: must be 100 or less"
],
"message": "Data validation failed"
}{
"code": "COMMON_UNAUTHORIZED",
"message": "Unauthenticated user"
}{
"code": "INSUFFICIENT_CREDITS",
"message": "Insufficient credits."
}{
"code": "MODEL_NOT_GRANTED",
"message": "This model is not granted to the organization. An agreement is required to use it"
}{
"code": "PROMPT_NOT_FOUND",
"message": "Prompt not found"
}{
"code": "PLATFORM_RATE_LIMIT_EXCEEDED",
"message": "Too many requests. Please try again later."
}{
"message": "Internal Server Error",
"requestID": "bkZqnHQepkgTOocTvyHWSlHcGzRqQbZk"
}FAQ
Where do I get the results after submitting? Poll Get run status with the returnedrunID, and once it is FINISHED, query List answers with the runID filter.Body
Prompt run request
List of models to run. Only values retrievable from GET /models are allowed. Discontinued models are rejected with 400 MODEL_DISCONTINUED before validation, so they are not kept in the oneof list (none at present)
1 - 13 elementsCHATGPT, GOOGLE_OVERVIEW, GOOGLE_AI, PERPLEXITY, GEMINI, NAVER_AI_BRIEFING, NAVER_AI_TAB, CLAUDE, META_MUSE, BAIDU_AI_SEARCH, GROK, BAIDU_AI_TAB, DEEPSEEK ["CHATGPT", "GEMINI"]
Run location (city-level, below the country). If omitted, the run uses the region (country) level. Only codes retrievable from GET /locations are allowed, and if region is also specified, the location must belong to that region. If region is omitted, the run uses the location's region. Every requested model must support this location (check with GET /locations?model=).
"US-NEW_YORK"