---
title: "Check a results upload"
method: GET
path: "/v1/ads/campaign-results/uploads/{uploadId}"
tags: ["Ad Campaign Results"]
---

# Check a results upload

`GET /v1/ads/campaign-results/uploads/{uploadId}`

## Request

- Base URL: `https://zernio.com/api`
- URL: `https://zernio.com/api/v1/ads/campaign-results/uploads/{uploadId}`
- Auth: HTTP bearer

How an upload was matched: rows matched and unmatched, and up to 100 unmatched rows with why (`no_campaign` or `ambiguous`).

`status` turns `done` once every row is processed, usually within seconds. Uploads are kept for 30 days.

## Path parameters

- `uploadId` string, required

## Response `200`

The upload's outcome.

- object
  - `uploadId` string, required
  - `status` 'queued' | 'done' | 'failed', required
  - `source` 'api' | 'csv' | 'hubspot', required
  - `rowsReceived` integer, required
  - `rowsMatched` integer, required
  - `rowsUnmatched` integer, required
  - `unmatched` object[], required
    - `index` integer: The row's position in the request.
    - `campaign` string: The campaign id, UTM or name the row gave.
    - `reason` 'no_campaign' | 'ambiguous'
  - `createdAt` string, date-time, required
  - `completedAt` string, date-time, nullable, required

## Other responses

- `401`: Missing or invalid API key. `code` is `missing_credentials` when no Authorization header was sent and `invalid_credentials` when the key is unknown, revoked or expired.
- `404`: Resource not found

## Changes

- **2026-10-30** `c319eb5d95b6`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/ads/campaign-results/uploads/:uploadId/get.md)

---

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