curl --request GET \
--url https://api.woodwide.ai/jobs/{job_id}/results/rows \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.woodwide.ai/jobs/{job_id}/results/rows"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.woodwide.ai/jobs/{job_id}/results/rows', 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.woodwide.ai/jobs/{job_id}/results/rows",
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://api.woodwide.ai/jobs/{job_id}/results/rows"
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://api.woodwide.ai/jobs/{job_id}/results/rows")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.woodwide.ai/jobs/{job_id}/results/rows")
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{
"rows": [
{}
],
"offset": 123,
"limit": 123,
"total": 123,
"total_filtered": 123,
"notice": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Get Job Result Rows
Paginate, filter, and sort the rows of an inference-job result file server-side. Sibling of GET /jobs/{job_id}/results (which returns the signed download URL + summary aggregates); this endpoint lets the console render an interactive row table without downloading the full parquet.
curl --request GET \
--url https://api.woodwide.ai/jobs/{job_id}/results/rows \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.woodwide.ai/jobs/{job_id}/results/rows"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.woodwide.ai/jobs/{job_id}/results/rows', 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.woodwide.ai/jobs/{job_id}/results/rows",
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://api.woodwide.ai/jobs/{job_id}/results/rows"
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://api.woodwide.ai/jobs/{job_id}/results/rows")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.woodwide.ai/jobs/{job_id}/results/rows")
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{
"rows": [
{}
],
"offset": 123,
"limit": 123,
"total": 123,
"total_filtered": 123,
"notice": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Query Parameters
Zero-based offset of the first row.
x >= 0Page size (capped at 500 by the server).
1 <= x <= 500Case-insensitive substring match across every column (mirrors the console's old client-side global filter).
200Column name to sort by. Unknown columns are silently ignored.
200Sort direction. Ignored when sort_by is not set.
^(asc|desc)$Exact-value filter on a single column (combined with search). Required together with filter_value. Unknown columns are silently ignored. Used by the segment drill-down to fetch one cluster's rows without abusing the substring search param.
200Value to match against filter_column (string-coerced on both sides). Ignored when filter_column is not set.
200Subset of columns to return (repeatable: ?columns=a&columns=b). Omit to return every column. Unknown names are silently ignored. Lets the console fetch only the columns it renders so a wide combined result file doesn't ship every input column on every page. search still matches across all columns; the projection only narrows the columns returned.
Response
Successful Response
One page of inference-result rows for the console output viewer.
Paginated server-side from the underlying parquet via polars; lets the
console drop its in-browser DuckDB-WASM windowed reader for this path.
Sibling endpoint of GET /jobs/{id}/results (which returns the
signed download URL + summary aggregates).
One page of inference-result rows as plain JSON objects.
Zero-based offset of the first row in this page.
Number of rows requested (may be capped server-side).
Total unfiltered rows in the underlying result file. Independent of any search parameter, so the UI can show of N against the real dataset size.
Rows matching the requested search filter (or equal to total when no search applied).
Optional human-readable note about degraded results — e.g. set when the original input is no longer available and only model predictions (without input columns) could be returned.
Was this page helpful?