curl --request GET \
--url https://app.letsflow.ai/v1/crawl_progress_runs \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.letsflow.ai/v1/crawl_progress_runs"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.letsflow.ai/v1/crawl_progress_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.letsflow.ai/v1/crawl_progress_runs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://app.letsflow.ai/v1/crawl_progress_runs"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.letsflow.ai/v1/crawl_progress_runs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.letsflow.ai/v1/crawl_progress_runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"resource": "crawl_progress_run",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"logical_run_id": "<string>",
"knowledge_source_binding_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"provider_key": "<string>",
"run_kind": "initial_sync",
"lane": "content",
"status": "running",
"liveness": "live_worker",
"wall_started_at": "2023-11-07T05:31:56Z",
"wall_finished_at": "2023-11-07T05:31:56Z",
"execution_ms": 1,
"counts": {
"discovered": 1,
"in_progress": 1,
"succeeded": 1,
"skipped": 1,
"errored": 1,
"deleted": 1
},
"settlement": {
"state": "active",
"reason": "open_work",
"accounting_version": 1,
"traversal_drained": true,
"unmatched_count": 1,
"obligation_total": 1,
"obligation_open": 1,
"obligation_terminal": 1,
"terminal_dispositions": {
"success": 1,
"failed": 1,
"skipped": 1,
"none": 1,
"canceled": 1
},
"oldest_open_age_ms": 1
},
"error_occurrence_counts": {
"pending_count": 1,
"recovered_count": 1,
"unresolved_count": 1
}
}
],
"page": {
"cursor": "<string>",
"next_cursor": "<string>",
"has_more": true,
"limit": 123
},
"meta": {
"request_id": "<string>",
"correlation_id": "<string>",
"operation": "<string>",
"resource": "<string>"
}
}{
"type": "https://app.letsflow.ai/problems/access-grant-not-found",
"title": "<string>",
"status": 123,
"code": "access_grant_admin_extension_required",
"detail": "<string>",
"instance": "<string>",
"request_id": "<string>",
"correlation_id": "<string>",
"retryable": true,
"auth_failure_reason": "<string>",
"availability_reason": "capability_disabled",
"re_auth_required": true,
"violations": [
{
"field": "<string>",
"message": "<string>",
"capability": "<string>",
"details": {}
}
],
"diagnostics": [
{
"code": "<string>",
"severity": "info",
"message": "<string>",
"fixHint": "<string>",
"location": {
"file": "<string>",
"line": 2,
"column": 2,
"stepId": "<string>"
}
}
]
}List Crawl progress runs
Tenant-authorized logical knowledge crawl-progress runs. List and filter retained history; get-one returns slice/batch clocks, waits, stage execution, error totals by category and grain, capped samples, bounded error-occurrence recovery dispositions, and kernel-derived settlement. Subscriber binding ids resolve to the crawl-owner run. Default payloads omit document names, URLs, principals, raw obligation keys, and provider object identifiers. Historical accounting_version 1 rows remain readable and settle from stored status. Historical error rows project null error_grain and http_status.
curl --request GET \
--url https://app.letsflow.ai/v1/crawl_progress_runs \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.letsflow.ai/v1/crawl_progress_runs"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.letsflow.ai/v1/crawl_progress_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.letsflow.ai/v1/crawl_progress_runs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://app.letsflow.ai/v1/crawl_progress_runs"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.letsflow.ai/v1/crawl_progress_runs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.letsflow.ai/v1/crawl_progress_runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"resource": "crawl_progress_run",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"logical_run_id": "<string>",
"knowledge_source_binding_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"provider_key": "<string>",
"run_kind": "initial_sync",
"lane": "content",
"status": "running",
"liveness": "live_worker",
"wall_started_at": "2023-11-07T05:31:56Z",
"wall_finished_at": "2023-11-07T05:31:56Z",
"execution_ms": 1,
"counts": {
"discovered": 1,
"in_progress": 1,
"succeeded": 1,
"skipped": 1,
"errored": 1,
"deleted": 1
},
"settlement": {
"state": "active",
"reason": "open_work",
"accounting_version": 1,
"traversal_drained": true,
"unmatched_count": 1,
"obligation_total": 1,
"obligation_open": 1,
"obligation_terminal": 1,
"terminal_dispositions": {
"success": 1,
"failed": 1,
"skipped": 1,
"none": 1,
"canceled": 1
},
"oldest_open_age_ms": 1
},
"error_occurrence_counts": {
"pending_count": 1,
"recovered_count": 1,
"unresolved_count": 1
}
}
],
"page": {
"cursor": "<string>",
"next_cursor": "<string>",
"has_more": true,
"limit": 123
},
"meta": {
"request_id": "<string>",
"correlation_id": "<string>",
"operation": "<string>",
"resource": "<string>"
}
}{
"type": "https://app.letsflow.ai/problems/access-grant-not-found",
"title": "<string>",
"status": 123,
"code": "access_grant_admin_extension_required",
"detail": "<string>",
"instance": "<string>",
"request_id": "<string>",
"correlation_id": "<string>",
"retryable": true,
"auth_failure_reason": "<string>",
"availability_reason": "capability_disabled",
"re_auth_required": true,
"violations": [
{
"field": "<string>",
"message": "<string>",
"capability": "<string>",
"details": {}
}
],
"diagnostics": [
{
"code": "<string>",
"severity": "info",
"message": "<string>",
"fixHint": "<string>",
"location": {
"file": "<string>",
"line": 2,
"column": 2,
"stepId": "<string>"
}
}
]
}Authorizations
OAuth Bearer access tokens or Flow API keys with the required Flow scope families for the route.
Query Parameters
Optional team scope when the authenticated context is not already team-pinned.
Owner or subscriber knowledge source binding. Subscriber ids resolve to the crawl-owner run.
Knowledge crawler provider key filter.
Logical-run kind filter.
initial_sync, incremental_sync, acl_refresh, reindex, reconcile Content versus access control list (ACL) lane filter.
content, acl Logical-run status filter.
running, cancel_requested, completed, degraded, failed, canceled Inclusive lower bound on logical-run wall_started_at. Disables latest_per_lane unless that flag is set.
Inclusive upper bound on logical-run wall_started_at. Disables latest_per_lane unless that flag is set.
When true, return the latest content and latest access control list (ACL) run per authorized identity. Defaults to true unless a time range is set.
true, false Maximum resources to return.
^[0-9]+$Opaque cursor for the next page of retained crawl-progress runs.