---
title: "Poll any async job"
method: GET
path: "/business/jobs/{jobId}"
tags: ["Account"]
---

# Poll any async job

`GET /business/jobs/{jobId}`

## Request

- Base URL: `https://api.tryfuse.ai/api/v1`
- URL: `https://api.tryfuse.ai/api/v1/business/jobs/{jobId}`
- Auth: HTTP basic

Poll a CRM async job by the 24-hex id returned with a 202 (list exports via POST /business/lists/{listId}/export, GET /business/exports/{jobId} is an alias). `status` moves pending > processing > completed or failed; poll every few seconds until it is terminal. On completed, `rowCount` and a short-lived presigned `downloadUrl` (regenerated on every poll) are set; on failed, `error` carries the reason. A list or search enrichment's job (the `jobId` from POST /business/lists/{listId}/enrich or POST /business/prospects/search/save-to-list) has type `bulk_enrichment` and also carries `listIds` and `progress`: `status` is pending while it waits behind your other enrichment job, then processing, and ends completed, cancelled or failed (`error` ENRICHMENT_FAILED); stopped means it paused because the balance ran out (`pausedReason` INSUFFICIENT_CREDITS) and resumes from the app. Research runs, smart columns, imports and list processing have their own status endpoints and are not served here. Available to any valid key (no scope needed). Rate limit: 120 requests per minute, 10000 per day.

Errors:
- `404` `JOB_NOT_FOUND` — No async job with that id belongs to the token owner (or it has expired).
- `422` `VALIDATION_FAILED` — `jobId` is not a 24-character hex id — an import's UUID job id is not pollable here.
- `429` `RATE_LIMITED` — Per-user quota for this endpoint family exceeded (120 per minute, 10000 per day, shared with the list endpoints); retry after the Retry-After / RateLimit-Reset seconds.

## Path parameters

- `jobId` string, required: 24-character hex id of an async job, as returned with the 202 that started it (POST /business/lists/{listId}/export).

## Response `200`

Success

- object
  - `job` object, required
    - `jobId` string, required
    - `type` 'list_export' | 'web_monitor_run_ingest' | 'bulk_enrichment' | 'null', nullable, required
    - `status` 'pending' | 'processing' | 'completed' | 'failed' | 'stopped' | 'cancelled', required
    - `rowCount` integer, nullable, required
    - `downloadUrl` string, nullable, required
    - `error` string, nullable, required
    - `listIds` string[]: bulk_enrichment only: the lists the run fills.
    - `progress` object: bulk_enrichment only: the run's counts so far.
      - `totalContacts` integer, required
      - `processedContacts` integer, required
      - `enrichedContacts` integer, required
      - `notFoundContacts` integer, required
      - `alreadyEnrichedContacts` integer, required
      - `creditsCharged` integer, required
    - `pausedReason` 'INSUFFICIENT_CREDITS': bulk_enrichment only, when status is stopped: why the run paused.

## Other responses

- `400`: Error
- `401`: Error
- `402`: Error
- `403`: Error
- `404`: Error
- `409`: Error
- `422`: Error
- `429`: Error
- `500`: Error

---

[API](https://skmtc.dev/fuseai/apis/fuse-business-api.md) · [All operations](https://skmtc.dev/fuseai/apis/fuse-business-api/llms.txt) · [OpenAPI document](https://skmtc.dev/fuseai/apis/fuse-business-api/revisions/50d95e0536f4?raw)
