실행 목록
curl --request GET \
--url https://api.example.com/v1/runsimport requests
url = "https://api.example.com/v1/runs"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/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://api.example.com/v1/runs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/runs"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/v1/runs")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"items": [
{
"run_id": "<string>",
"namespace": "<string>",
"app_name": "<string>",
"app_version": "<string>",
"build_id": "<string>",
"run_kind": "<string>",
"state": {},
"input": {},
"progress": {
"done": 123,
"total": 123,
"status_text": "<string>"
},
"dataset_id": "<string>",
"partial": true,
"cancel_requested": true,
"triggered_by": "<string>",
"upstream_ref": "<string>",
"created_at": "<string>",
"started_at": "<string>",
"first_started_at": "<string>",
"finished_at": "<string>",
"usage": {
"metrics": {},
"duration_ms": 123
},
"billing": {
"events": [
{}
],
"total": 123,
"currency": "<string>",
"charged": true
},
"error": {
"code": "<string>",
"category": "<string>",
"message": "<string>",
"retryable": true,
"retry_after": 123,
"item_index": 123,
"details": [
{}
]
}
}
],
"pagination": {
"offset": 123,
"limit": 123,
"count": 123,
"total": 123,
"has_more": true
}
}Runs & Results
실행 목록
시작한 실행을 필터·페이지로 나열.
GET
/
v1
/
runs
실행 목록
curl --request GET \
--url https://api.example.com/v1/runsimport requests
url = "https://api.example.com/v1/runs"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/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://api.example.com/v1/runs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/runs"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/v1/runs")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"items": [
{
"run_id": "<string>",
"namespace": "<string>",
"app_name": "<string>",
"app_version": "<string>",
"build_id": "<string>",
"run_kind": "<string>",
"state": {},
"input": {},
"progress": {
"done": 123,
"total": 123,
"status_text": "<string>"
},
"dataset_id": "<string>",
"partial": true,
"cancel_requested": true,
"triggered_by": "<string>",
"upstream_ref": "<string>",
"created_at": "<string>",
"started_at": "<string>",
"first_started_at": "<string>",
"finished_at": "<string>",
"usage": {
"metrics": {},
"duration_ms": 123
},
"billing": {
"events": [
{}
],
"total": 123,
"currency": "<string>",
"charged": true
},
"error": {
"code": "<string>",
"category": "<string>",
"message": "<string>",
"retryable": true,
"retry_after": 123,
"item_index": 123,
"details": [
{}
]
}
}
],
"pagination": {
"offset": 123,
"limit": 123,
"count": 123,
"total": 123,
"has_more": true
}
}GET https://api-datahub.octoparse.com/v1/runs
인증: API 키 필요(Authorization: Bearer <API Key>).
본인이 시작한 모든 실행. 소유는 계정 단위: API 키, SDK, MCP, 웹 로그인 시작분이 같은 목록. 시작 시각 최신순. pagination.total은 필터 후 합계.
필터 병용 가능. status는 쉼표 구분(OR). credential은 시작 자격 증명의 비민감 안정 id(어떤 키가 쿼터를 쓰는지 추적). created_from / created_to는 시작 시각 기준(시작 inclusive·끝 exclusive). 어휘는 청구 집계와 같습니다. 청구 그룹 키를 그대로 전달하면 해당 실행까지 드릴다운할 수 있습니다.
각 항목에 billing과 usage가 있어 실행 단위 대사에 별도 상세 호출이 필요 없음. 입력 에코 마스킹은 실행 상세와 같음.
요청
쿼리 파라미터
string
실행 상태. 쉼표 구분 다중 값. 어휘 밖은
400.string
시작 자격 증명의 안정 id. 청구 집계
group_by=credential → credential 값을 사용.string
App 참조:
<namespace>/<app_name> 또는 app_<hex>.string
시작 채널. 예:
api / sdk / mcp / cli / web.string
시작 시각 하한(inclusive). 절대 ISO-8601.
string
시작 시각 상한(exclusive).
string
일반은
production. 작성자 디버그는 test.값: test / production.integer
기본값:"0"
페이지 오프셋.범위 ≥ 0.
integer
기본값:"50"
페이지 크기, 최대 200.범위는 1~200입니다.
요청 예시
curl \
-H "Authorization: Bearer $OCTOPARSE_API_KEY" \
"https://api-datahub.octoparse.com/v1/runs?data_app=carol/probe-b&status=SUCCEEDED,PARTIALLY_SUCCEEDED&limit=50"
응답
200 성공
{
"data": {
"items": [
{
"run_id": "run_3b750088f51c",
"namespace": "carol",
"app_name": "probe-b",
"app_version": "0.1.0",
"build_id": null,
"run_kind": "production",
"state": "RUNNING",
"input": {
"product": "p-doc"
},
"progress": {
"done": 0,
"total": null,
"status_text": null
},
"dataset_id": "ds_ec3ba97b8534",
"partial": false,
"cancel_requested": false,
"triggered_by": "api",
"upstream_ref": null,
"created_at": "2026-09-15T07:45:41.876601+00:00",
"started_at": "2026-09-15T07:45:41.883082+00:00",
"first_started_at": "2026-09-15T07:45:41.883082+00:00",
"finished_at": null,
"usage": {
"metrics": {
"records_collected": 0
},
"duration_ms": null
},
"billing": {
"events": [],
"total": 0.0,
"currency": "USD",
"charged": false
},
"error": null
},
"…"
],
"pagination": {
"offset": 0,
"limit": 2,
"count": 2,
"total": 2,
"has_more": false
}
}
}
data로 감쌉니다. 필드:
object[]
필수
실행 목록. 각 항목은 실행 상세 필드와 같음(
sample_records 없음).표시 fields
표시 fields
string
필수
—
string
—
string
—
string
—
string
—
string
—
enum
필수
값:
PENDING / QUEUED / RUNNING / SUCCEEDED / PARTIALLY_SUCCEEDED / FAILED / CANCELLED / EXPIRED.object
—
string
—
boolean
—
boolean
취소 요청 후 정리 중이면
true(협조 중지/부분 결과 회수). 종료 시 항상 false(서버 정규화). state에서 유도 불필요.string
—
string
—
string
—
string
—
string
워커가 처음 실행을 가져온 시각.
started_at과 달리 재시도에 덮어쓰지 않아 벽시계 기준: queued = first_started_at - created_at, 총 벽시간 = finished_at - first_started_at. started_at으로 queued를 구하면 이전 시도를 대기로 오산. 미할당만 null.string
—
오류
| HTTP | code | category | 설명 |
|---|---|---|---|
| 401 | unauthorized | forbidden | API 키 누락 또는 무효. |
| 400 | invalid-status | invalid_input | status에 어휘 밖 값. |
{"error": {code, category, message, retryable}}입니다. 오류 참고.
클라이언트 라이브러리
# Auto-paginate
for r in client.iterate_runs(data_app="carol/probe-b", created_from="2026-09-01T00:00:00+08:00"):
print(r["run_id"], r["state"], r["billing"]["total"])
# Use the page form when you need totals
page = client.list_runs_page(status="QUEUED,RUNNING", limit=50)
print(page["pagination"]["total"])
// Auto-paginate
for await (const r of client.iterateRuns({ dataApp: "carol/probe-b", createdFrom: "2026-09-01T00:00:00+08:00" })) {
console.log(r.run_id, r.state, r.billing.total);
}
// Use the page form when you need totals
const page = await client.listRunsPage({ status: "QUEUED,RUNNING", limit: 50 });
console.log(page.pagination.total);