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.json

Follow 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.