API reference
Results
Download the artifact and interpret partial or all-failed collections.
GET /v1/crawl-jobs/{id}/result
Requires the owning account bearer token. Returns the JSON artifact or redirects to signed storage when completed. Returns 409 if the result is not ready, or 404 for a missing or unowned job.
curl --fail-with-body --silent --show-error --max-time 60 \
--location --max-redirs 3 \
"$NOSTIMATES_BASE_URL/v1/crawl-jobs/$JOB_ID/result" \
-H "Authorization: Bearer $NOSTIMATES_API_KEY" \
--output result.json &&
jq '{failedRuns, responses}' result.jsonFollow redirects without forwarding the account token to a different host. Neither the status response nor completion webhook is a full artifact. Signed storage links are short-lived; request the authenticated result endpoint again if needed.
Partial-success envelope
{
"requestId": "8a1d1ac4-1bf4-4f2b-9c9c-bda9d2356e72",
"prompt": "What are the best CRM tools for a small team?",
"targets": [
"google",
"chatgpt",
"perplexity"
],
"runCount": 1,
"requestedAt": "2026-10-09T10:00:00.000Z",
"updatedAt": "2026-10-09T10:02:00.000Z",
"completedAt": "2026-10-09T10:02:00.000Z",
"failedRuns": {
"google": 0,
"chatgpt": 0,
"perplexity": 1
},
"responses": {
"google": [
{
"runNumber": 1,
"runTaskId": "7f5c0888-f5ad-4661-b07b-79fbbe1c7b31",
"status": "completed",
"capturedAt": "2026-10-09T10:01:00.000Z",
"pageUrl": "https://www.google.com/search?q=example",
"aioverview": null,
"serp": {
"organic": [
{
"position": 1,
"snippet": "Illustrative search result summary.",
"title": "Illustrative CRM comparison",
"url": "https://example.com/crm-comparison"
}
],
"peopleAlsoAsk": [],
"shopping": [],
"sponsored": []
}
}
],
"chatgpt": [
{
"runNumber": 1,
"runTaskId": "9a7536e7-b610-420a-a34c-5f829956f4d3",
"status": "completed",
"capturedAt": "2026-10-09T10:01:00.000Z",
"text": "Illustrative captured answer text.",
"markdown": null,
"pageUrl": "https://chatgpt.com/",
"sources": []
}
],
"perplexity": []
}
}The envelope contains requestId, prompt, targets, runCount, requestedAt, updatedAt, completedAt, failedRuns, and responses. There is no top-level status. Every requested target is included in failedRuns and responses; unrequested targets are omitted. Zero failures are explicit. Successful entries are ordered by runNumber; failed runs create gaps and are counted without failed response objects.
All collections failed
{
"requestId": "3f67c2d1-4c35-4f36-a980-29054104a56c",
"prompt": "What are the best CRM tools for a small team?",
"targets": [
"google",
"chatgpt",
"perplexity"
],
"runCount": 1,
"requestedAt": "2026-10-09T10:00:00.000Z",
"updatedAt": "2026-10-09T10:02:00.000Z",
"completedAt": "2026-10-09T10:02:00.000Z",
"failedRuns": {
"google": 1,
"chatgpt": 1,
"perplexity": 1
},
"responses": {
"google": [],
"chatgpt": [],
"perplexity": []
}
}This job can still be completed with completedRuns: 0, failedRuns: 3, runningRuns: 0, totalRuns: 3. No answers were collected. This does not mean brands were absent. Job-level failed instead denotes a parent-level terminal failure.
Store the original responses and failure counts before building your own analytics. Provider fields can be null and source lists empty; account for those states explicitly.