---
title: "Page through a bulk job’s positions"
method: GET
path: "/v1/vat/bulk/{jobId}/results"
tags: ["VAT validation"]
---

# Page through a bulk job’s positions

`GET /v1/vat/bulk/{jobId}/results`

## Request

- Base URL: `https://api.vatnode.dev`
- URL: `https://api.vatnode.dev/v1/vat/bulk/{jobId}/results`
- Auth: HTTP bearer

Positions in submit order, readable while the job is still running —
a position that is not answered yet has `status: pending`. Each answered
position carries the same `checkId` as the equivalent single check, so
it is traceable to a stored record.

On a `cancelled` or `failed` job, `pending` is final: those positions were never
checked, never charged, and will never be answered. Resubmit the ones you still need as a new batch.

## Path parameters

- `jobId` string, uuid, required

## Query parameters

- `page` integer
- `limit` integer

## Response `200`

One page of positions.

- BulkJobResultPage
  - `items` BulkJobItemResult[], required: Positions in submit order.
    - `position` integer, required: 0-based index in submit order, after de-duplication.
    - `vatId` string, required
    - `status` 'pending' | 'done', required: `pending` while the job is still working through the batch – and permanently, on a `cancelled` or `failed` job, for the positions it never reached. Those were not checked and not charged.
    - `valid` boolean, nullable, required: `true`/`false` once a determination was reached, `null` while pending or when the position failed – in which case `error` is set.
    - `source` 'VIES' | 'CACHE' | 'BZST' | 'MF_PL' | 'ANAF_RO' | 'ARES_CZ' | 'SIREN_FR' | 'PRH_FI' | 'CVR_DK' | 'BOLAGSVERKET_SE' | 'KVK_NL' | 'CBE_BE' | 'JARS_LV' | 'JARS_LT' | 'AJPES_SI', required: Which system produced a result. `VIES` is the only source that can carry a `consultationNumber`; `CACHE` is a prior result up to 15 minutes old; anything else is a national register used as fallback when VIES was unavailable, whose verdict reflects domestic VAT registration and is not a VIES confirmation.
    - `consultationNumber` string, nullable, required: VIES `requestIdentifier`, present only when the account had a requester VAT configured when the job was submitted.
    - `checkId` string, nullable, required: Receipt for the stored check behind this position – the same identifier the single-ID endpoint returns. `null` for a position that produced no verdict.
    - `error` object, nullable, required: Present only for a failed position. The job itself still finishes.
      - `code` string, required: Per-position error code, same taxonomy as the single-ID endpoint (`INVALID_FORMAT`, `RATE_LIMITED`, `VIES_UNAVAILABLE`, `UPSTREAM_TIMEOUT`, `INVALID_REQUESTER`, `VIES_ERROR`, `AUDIT_WRITE_FAILED`, `INTERNAL_ERROR`).
      - `message` string, nullable, required
    - `processedAt` string, date-time, nullable
  - `total` integer, required
  - `page` integer, required
  - `pages` integer, required

## Other responses

- `400`: The request body, query string or path parameters failed structural validation (wrong type, missing required field, out-of-range length, malformed enum, etc.). Returns the standard error envelope with code `INVALID_REQUEST`. This is distinct from a semantically well-formed request that is rejected later (e.g. `INVALID_FORMAT` for a VAT ID that parses but is not a valid VAT number).
- `401`: Missing or invalid API key.
- `404`: The addressed resource does not exist, or is not owned by the authenticated caller. Returns the standard error envelope with code `NOT_FOUND`. Ownership and existence are deliberately not distinguished, so a resource belonging to another account is reported as missing rather than forbidden.

---

[API](https://skmtc.dev/vatnode/apis/vatnode-api.md) · [All operations](https://skmtc.dev/vatnode/apis/vatnode-api/llms.txt) · [OpenAPI document](https://skmtc.dev/vatnode/apis/vatnode-api/revisions/c65828db2037?raw)
