> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rulebase.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Confirm received uploads

> Check that Rulebase received your conversation uploads by listing them through the API, filtering by source or date, and reading each upload status.

Use this guide to list conversation uploads and confirm Rulebase received them. Requests use `https://api2.rulebase.co` and require a Rulebase API key in the `Authorization: Bearer <key>` header.

For the upload write path, see [Uploading conversations](/guides/uploads/conversations).

## List conversation uploads

Send a `GET /conversation_uploads` request. Filter by the same `source` value you used when uploading.

```bash theme={null}
curl "https://api2.rulebase.co/conversation_uploads?source=xcally&limit=50" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

A successful response returns the newest uploads first:

```json theme={null}
{
  "data": [
    {
      "id": "conversation_upload_abc123",
      "status": "completed",
      "source": "xcally",
      "external_id": "abc123",
      "created_at": "2025-07-02T12:00:00.000Z",
      "updated_at": "2025-07-02T12:05:00.000Z"
    }
  ],
  "meta": {
    "page": {
      "next": null,
      "limit": 50
    }
  }
}
```

For the full REST spec see [List conversation uploads](/api-v2-reference/list-conversation-uploads).

## Supported sources

Use the same `source` keys as the conversation upload API:

| Source key      | Description                        |
| --------------- | ---------------------------------- |
| `outreach_kaia` | Outreach Kaia conversation exports |
| `xcally`        | XCALLY voice recordings            |

## Query parameters

| Parameter        | Required | Description                                             |
| ---------------- | -------- | ------------------------------------------------------- |
| `source`         | No       | Upload source key (for example `xcally`)                |
| `external_id`    | No       | Exact match on upload metadata `unique_id` when present |
| `limit`          | No       | Page size. Default `50`, maximum `100`                  |
| `cursor`         | No       | Opaque cursor from `meta.page.next` for the next page   |
| `updated_after`  | No       | Inclusive lower bound on `updated_at` (ISO 8601)        |
| `updated_before` | No       | Inclusive upper bound on `updated_at` (ISO 8601)        |

## Response fields

| Field         | Description                                                                 |
| ------------- | --------------------------------------------------------------------------- |
| `id`          | Rulebase upload id                                                          |
| `status`      | Upload status: `pending`, `processing`, `completed`, `failed`, or `expired` |
| `source`      | Upload source key                                                           |
| `external_id` | Value from upload metadata `unique_id` when present, otherwise `null`       |
| `created_at`  | When the upload was created                                                 |
| `updated_at`  | When the upload was last updated                                            |

`external_id` is available for sources that send `unique_id` in upload metadata (for example XCALLY). It may be `null` for uploads that only carry identifiers inside the archive.

## Pagination

By default the response returns up to 50 of the most recent uploads, ordered by `created_at` descending. When more results exist, `meta.page.next` contains a cursor. Pass that value as `cursor` to fetch the next page.
