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

# List Failed Import Items

> See which people an import could not bring in, and why

An import that reports failures says how many, not who. This endpoint names them: one
item per LinkedIn URL the import was given, with a plain-English `reason`, a stable
`reasonCode` you can branch on, and the raw `errorMessage` the import recorded.

When Clustr holds the person's profile, the item also carries `name`, `headline`,
`jobTitle`, `companyName` and `avatarUrl`. A failed item usually has none, since the
profile is often what could not be fetched; use `linkedinUrl` to identify it.

By default it lists the items that failed. That includes the ones a finished import left
unprocessed, which a running import would still get to. Prospects discovered through your
contacts are left out unless you ask for them with `itemType`.

> [!NOTE]
>
> Also available to AI assistants as the `list_failed_import_items` tool on the
> [MCP server](https://docs.clustr-ai.com/mcp-server.md). In the app, open an import's **Details** in Import history.

## Reasons

| `reasonCode` | `reason` | What to do |
| - | - | - |
| `profile_not_found` | Profile not found or removed | Check the URL; the profile may be deleted or private |
| `invalid_url` | LinkedIn URL is not valid | Fix the URL and import it again |
| `temporary` | Temporary error, retry | Retry the import's unfinished items |
| `timed_out` | Took too long to process, retry | Retry |
| `not_saved` | Could not be saved, retry | Retry |
| `unfinished` | Not processed before the import ended, retry | Retry |
| `cancelled` | Skipped because the import was cancelled | Import it again if you still want it |
| `pending` | Waiting to be processed | Nothing yet: the import is still running |
| `unknown` | Could not be imported | Retry, or send the `errorMessage` to support |

New codes may be added; treat an unfamiliar one like `unknown`.

`retryable` is `true` for the contacts that retrying the import's unfinished items would
re-process: a contact that did not complete, of an import that is no longer running, with
a valid URL. A profile that was not found will most likely fail again.

```bash cURL theme={null}
curl "https://api.clustr-ai.com/api/public/jobs/job_jctzmfh41nr4v8hvs87eakgs48/items?status=failed" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

```python Python theme={null}
import requests

resp = requests.get(
    "https://api.clustr-ai.com/api/public/jobs/job_jctzmfh41nr4v8hvs87eakgs48/items",
    params={"status": "failed"},
    headers={"Authorization": "Bearer YOUR_API_KEY"},
)
for item in resp.json()["data"]["items"]:
    print(item["linkedinUrl"], item["reason"])
```

```javascript JavaScript theme={null}
const resp = await fetch(
  "https://api.clustr-ai.com/api/public/jobs/job_jctzmfh41nr4v8hvs87eakgs48/items?status=failed",
  { headers: { Authorization: "Bearer YOUR_API_KEY" } },
);
const { data } = await resp.json();
```

```json 200 theme={null}
{
  "success": true,
  "data": {
    "clustrJobId": "job_jctzmfh41nr4v8hvs87eakgs48",
    "jobId": "job_abc123",
    "jobStatus": "COMPLETED",
    "status": "failed",
    "itemTypes": ["contact", "employee"],
    "total": 2,
    "limit": 100,
    "offset": 0,
    "items": [
      {
        "clustrJobItemId": "item_2ymmsvynzec1qpwz7qtt6qv6dx",
        "clustrPersonId": "per_dn4x39qnxzxjhp7f5p4npnhb8z",
        "id": "eb8abb1e-a6de-4a7f-8ba4-5e7154370978",
        "itemType": "contact",
        "linkedinUrl": "https://www.linkedin.com/in/jane-doe-123",
        "linkedinId": "jane-doe-123",
        "status": "FAILED",
        "reasonCode": "profile_not_found",
        "reason": "Profile not found or removed",
        "errorMessage": "fetch profile: apify returned no profile for https://www.linkedin.com/in/jane-doe-123",
        "retryCount": 0,
        "retryable": true,
        "createdAt": "2026-09-24T09:12:03Z",
        "completedAt": "2026-09-24T09:13:41Z"
      },
      {
        "clustrJobItemId": "item_yrcd4mbn8kbc683xerbdd284tj",
        "clustrPersonId": "per_z6yzrhwpx1rnk19d2bw8q0ex64",
        "id": "0c1f3a52-51f4-4b8e-9d5c-2f8b1e7a9d10",
        "itemType": "contact",
        "linkedinUrl": "https://www.linkedin.com/in/john-roe",
        "linkedinId": "john-roe",
        "status": "FAILED",
        "reasonCode": "temporary",
        "reason": "Temporary error, retry",
        "errorMessage": "fetch profile: profile fetch: apify status 502: Bad Gateway",
        "retryCount": 0,
        "retryable": true,
        "createdAt": "2026-09-24T09:12:03Z",
        "completedAt": "2026-09-24T09:14:02Z"
      }
    ]
  }
}
```

```json 404 theme={null}
{
  "success": false,
  "error": { "message": "job not found", "code": "NOT_FOUND" }
}
```


## OpenAPI

````yaml GET /jobs/{id}/items
openapi: 3.1.0
info:
  title: Clustr Public API
  description: >
    Programmatic access to your Clustr network: import connectors, search warm
    intros (opportunities), and manage target accounts.


    ## Authentication

    All endpoints require a Bearer token (API key) in the `Authorization`
    header.


    ```

    Authorization: Bearer <your_api_key>

    ```


    API keys can be created and managed from the [API settings
    page](https://app.clustr-ai.com/api).
  version: '1.0'
  contact:
    name: Clustr Support
    url: https://clustr-ai.com
servers:
  - url: https://api.clustr-ai.com/api/public
    description: Production
security:
  - BearerAuth: []
paths:
  /jobs/{id}/items:
    get:
      tags:
        - Jobs
      summary: List Failed Import Items
      description: >
        The people an import was asked to bring in, and what happened to each.
        By default,

        the ones that failed, each with a plain-English reason, a stable reason
        code and the

        raw error message.
      operationId: listJobItems
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
          description: >-
            The job's Clustr ID (`job_…`), from [List
            Jobs](/api-reference/list-jobs) or the import that

            started it. The id from earlier responses also works.
          example: job_m2febv7j52w0w0c1hn4tjbp4h1
        - name: status
          in: query
          required: false
          schema:
            type: string
            enum:
              - failed
              - completed
              - all
            default: failed
          description: >-
            `failed` (the default) lists the items that failed, `completed` the
            ones imported, and `all` every item.
        - name: itemType
          in: query
          required: false
          schema:
            type: string
          description: >-
            `contact` (a URL you sent), `employee` (a person an account-research
            run searched) or

            `prospect` (a person discovered through a contact). Send a
            comma-separated list for several.
        - name: limit
          description: Items per page, up to 500.
          in: query
          required: false
          schema:
            type: integer
            default: 100
            maximum: 500
        - name: offset
          description: The number of items to skip, to read the next page.
          in: query
          required: false
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: One page of items
          content:
            application/json:
              schema:
                type: object
                required:
                  - success
                  - data
                properties:
                  success:
                    type: boolean
                  data:
                    type: object
                    properties:
                      clustrJobId:
                        type: string
                        description: >-
                          The job's Clustr ID, for example
                          `job_bm6j1mmkkp0f2wkrvsrh7ma08b`. Follow the job with
                          [Get Job

                          Status](/api-reference/get-job-status).
                        example: job_bm6j1mmkkp0f2wkrvsrh7ma08b
                      jobId:
                        type: string
                        description: >-
                          Kept for integrations built before Clustr IDs. New
                          integrations should use `clustrJobId`.
                      jobStatus:
                        type: string
                      status:
                        type: string
                      itemTypes:
                        type: array
                        items:
                          type: string
                      total:
                        type: integer
                        description: >-
                          The number of items matching the filter, across all
                          pages.
                      limit:
                        type: integer
                      offset:
                        type: integer
                      items:
                        type: array
                        items:
                          type: object
                          properties:
                            clustrJobItemId:
                              type: string
                              description: >-
                                The item's Clustr ID, for example
                                `item_h2tj244snp9b2hptsmqr857xcv`. Use it to
                                refer to this

                                item.
                              example: item_h2tj244snp9b2hptsmqr857xcv
                            clustrPersonId:
                              type: string
                              description: >-
                                The person's Clustr ID, for example
                                `per_vv0yfj89hegxk0mzgphmtfn4nq`. Use it to
                                refer to this

                                person.
                              example: per_vv0yfj89hegxk0mzgphmtfn4nq
                            id:
                              type: string
                              description: >-
                                Kept for integrations built before Clustr IDs.
                                New integrations should use `clustrJobItemId`.
                            itemType:
                              type: string
                              description: >-
                                The item's type: `contact`, `employee` or
                                `prospect`.
                            linkedinUrl:
                              type: string
                            linkedinId:
                              type: string
                            name:
                              type: string
                              description: >-
                                The person's name, when Clustr has their
                                profile. A failed item usually has none.
                            headline:
                              type: string
                            jobTitle:
                              type: string
                            companyName:
                              type: string
                            avatarUrl:
                              type: string
                            status:
                              type: string
                              description: >-
                                The item's status: `PENDING`, `PROCESSING`,
                                `COMPLETED` or `FAILED`.
                            reasonCode:
                              type: string
                              description: >-
                                The reason code: `imported`,
                                `profile_not_found`, `invalid_url`, `temporary`,
                                `timed_out`, `not_saved`, `unfinished`,
                                `cancelled`, `pending` or `unknown`. New codes
                                may be added.
                            reason:
                              type: string
                              description: The reason as a plain-English sentence
                            errorMessage:
                              type: string
                              description: The raw error message recorded for this item.
                            retryCount:
                              type: integer
                            retryable:
                              type: boolean
                              description: >-
                                True when retrying the job's unfinished items
                                would process this one again.
                            createdAt:
                              type: string
                              format: date-time
                            completedAt:
                              type: string
                              format: date-time
        '400':
          description: Unknown status or itemType
        '401':
          description: Invalid or missing API key
        '404':
          description: Job not found
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: The API key you created on the API settings page of the Clustr app.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.