---
title: "Lists the organization's inventory transfers, oldest first, one page at a time."
method: GET
path: "/api/v1/transfers"
tags: ["Transfers"]
---

# Lists the organization's inventory transfers, oldest first, one page at a time.

`GET /api/v1/transfers`

## Request

- Base URL: `https://app.flexonthejob.com`
- URL: `https://app.flexonthejob.com/api/v1/transfers`
- Auth: HTTP bearer

Requires `ManageTransfers` (the Transfers pages need it for reads too). Pagination:
pass the previous response's `nextCursor` as `after`; `limit` defaults to 50
and is capped at 200. All filters combine with AND. Example:
`GET /api/v1/transfers?jobId=1042&status=Pending`. The approval queue (what the
Pending Approvals page lists, and what `approve` / `reject` accept) is
`GET /api/v1/transfers?approvalStatus=Pending&status=Pending`. Response carries a weak
`ETag`; resend it as `If-None-Match` to get 304 when nothing changed.
Also available as CSV (`Accept: text/csv` or `?format=csv`); paging cursor in `X-Next-Cursor`.

## Query parameters

- `jobId` integer
- `status` string
- `approvalStatus` string
- `updatedSince` string, date-time
- `after` string
- `limit` integer
- `format` 'csv'

## Response `200`

A page of transfers and the cursor for the next page (null on the last page).

- PagedResponseOfTransferSummaryDto: One page of a cursor-paginated /api/v1 collection (API_AND_MCP.md: `?after=<syncId>&limit=`).
  - `items` TransferSummaryDto[]: Items of this page in ascending creation order.
    - `id` integer: Numeric id used in `/api/v1/transfers/{id}`. Unique within this organization. Example: `318`.
    - `syncId` string, uuid: Stable cross-device identifier (GUID) — also the pagination cursor value. Example: `0b8f4c1e-6f1a-4a5e-9d7c-2f3e4a5b6c7d`.
    - `status` string: Transfer status name. One of `Draft`, `Pending` (created, stock reserved, not yet picked up), `InTransit`, `AtWaypoint`, `InTransitToWaypoint`, `InTransitToDestination`, `Completed` (delivered), `Cancelled`, `Failed`.
    - `notes` string, nullable: Free-text notes recorded on the transfer. Example: `Transfer for Job J-2026-0042`. Null when none.
    - `jobId` integer, nullable: Id of the job this transfer supplies (see `/api/v1/jobs/{id}`); null for a standalone or sales-order transfer.
    - `jobNumber` string, nullable: Job number of `jobId` at read time. Example: `J-2026-0042`. Null when there is no job.
    - `salesOrderId` integer, nullable: Id of the sales order this transfer fulfils; null otherwise.
    - `isJobTransfer` boolean: True for a transfer created for a job (materials to its job site, or a direct / counter sale). Standalone transfers (both flags false) are the ones `pick` / `start` / `complete` / `fail` accept; job-site and standalone transfers can be cancelled with `POST /api/v1/transfers/{id}/cancel`.
    - `isSalesOrderTransfer` boolean: True for a transfer that fulfils a sales order.
    - `sourceLocationId` integer, nullable: Id of the location the stock leaves (see `/api/v1/locations/{id}`); null when the lines come from several locations or from no location.
    - `sourceLocationName` string, nullable: Name of `sourceLocationId`. Example: `Main Warehouse`. Null when there is none.
    - `destinationLocationId` integer, nullable: Id of the location the stock goes to — for a job-site transfer, the job's site location; null for a de-listing.
    - `destinationLocationName` string, nullable: Name of `destinationLocationId`. Example: `Job Site - J-2026-0042`. Null when there is none.
    - `requiresApproval` boolean: True when the transfer's value exceeded the organization's approval threshold when it was created. Job-site transfers never require approval.
    - `approvalStatus` string, nullable: State of the transfer's approval: `Pending` (awaiting `POST /api/v1/transfers/{id}/approve` or `/reject`), `Approved` or `Rejected`; null when the transfer never needed approval.
    - `lineCount` integer: Number of item lines on the transfer. Example: `4`.
    - `transferDate` string, date-time: When the transfer was initiated, ISO-8601 UTC. Example: `2026-09-23T14:05:00Z`.
    - `initiatedById` string, nullable: Identity user id of the person who created the transfer (for an API/MCP-created transfer, the key's creator); null when unknown on this server.
    - `completedById` string, nullable: Identity user id of the person who completed (received) the transfer; null until it is completed.
    - `createdAt` string, date-time: Creation time, ISO-8601 UTC. Example: `2026-09-23T14:05:00Z`.
    - `updatedAt` string, date-time, nullable: Last modification time, ISO-8601 UTC; null when never modified since creation.
  - `nextCursor` string, nullable: SyncId of the last item; pass it back as `?after=` to fetch the next page. `null` when this is the last page.

## Other responses

- `304`: Unchanged since the `If-None-Match` ETag.
- `400`: Unknown `status` or `approvalStatus`, or unusable `after` cursor (field listed in `errors`).
- `401`: Unauthorized
- `403`: Forbidden
- `429`: Too Many Requests

---

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