---
title: "List bulk employment rows"
method: GET
path: "/v1/bulk-employment-jobs/{job_id}/rows"
tags: ["Employment Management"]
---

# List bulk employment rows

`GET /v1/bulk-employment-jobs/{job_id}/rows`

## Request

- Base URL: `https://gateway.remote.com`
- URL: `https://gateway.remote.com/v1/bulk-employment-jobs/{job_id}/rows`
- Auth: one of:
  - OAuth 2
    - Authorization code: `/auth/oauth2/authorize`
    - Token URL: `/auth/oauth2/token` scopes: `https://gateway.remote.com/company.manage`
  - OAuth 2
    - Authorization code: `/auth/oauth2/authorize`
    - Token URL: `/auth/oauth2/token` scopes: `employment:read`
  - OAuth 2
    - Authorization code: `/auth/oauth2/authorize`
    - Token URL: `/auth/oauth2/token` scopes: `all:read`
  - OAuth 2
    - Authorization code: `/auth/oauth2/authorize`
    - Token URL: `/auth/oauth2/token` scopes: `all:write`
  - OAuth 2
    - Client credentials
    - Token URL: `/auth/oauth2/token` scopes: `employment:read`
  - OAuth 2
    - Client credentials
    - Token URL: `/auth/oauth2/token` scopes: `all:read`
  - OAuth 2
    - Client credentials
    - Token URL: `/auth/oauth2/token` scopes: `all:write`
  - HTTP bearer

Returns grouped bulk employment rows, including field-level validation errors in `errors`, row-level failures in `row_errors`, and submission-phase failures in `submission_errors`. If a row passes validation but later fails during Global Payroll activation, that failure is surfaced here after submission rather than in the initial create response.

## Authentication

This endpoint accepts any one of the following token types:

- **Company-scoped access token** (`OAuth2AuthorizationCode`) — obtained by a company manager through the Authorization Code flow or the Refresh Token flow. See [Authentication for partners](https://developer.remote.com/docs/authentication-for-partners).
- **Company-scoped access token (assertion)** (`OAuth2CompanyManagerAssertion`) — obtained through the `urn:ietf:params:oauth:grant-type:jwt-bearer` grant for a company manager. See [OAuth Assertion](https://developer.remote.com/docs/authorization-method-oauth-assertion).
- **Customer API token** (`CustomerAPIToken`) — generated by the customer on their Integration Settings page, with the scopes they choose there. See [Authorization for customers](https://developer.remote.com/docs/authorization-for-customers).

## Scopes

Any one of the scopes in a token type's row is enough. `all:read` and `all:write` work too.

| Token type | Category | Read only Scope | Write only Scope (read access implicit) |
|---|---|---|---|
| Company-scoped access token | Manage employments (`employments`) | View employments (`employment:read`) | Manage employments (`employment:write`) |
| Company-scoped access token (assertion) | Manage employments (`employments`) | View employments (`employment:read`) | Manage employments (`employment:write`) |
| Customer API token | Manage employments (`employments`) | View employments (`employment:read`) | Manage employments (`employment:write`) |

## Path parameters

- `job_id` string, required

## Query parameters

- `page` integer
- `page_size` integer

## Response `200`

Success

- ImportJobRowsResponse
  - `data` object, required
    - `aggregates` object: Import-type-specific aggregates computed over the complete import job
      - `employing_countries` object[]: Multi-entity pay item uploads only: each employing country the upload's rows have, sorted by name. Rows whose employee wasn't found, and the deleted and skipped rows the rows list never shows, are left out
        - `code` string, required: ISO 3166-1 alpha-3 country code
        - `name` string, required
      - `employing_legal_entities` object[]: Multi-entity pay item uploads only: each employing legal entity the upload's rows have, sorted by name. Rows whose employee wasn't found, and the deleted and skipped rows the rows list never shows, are left out
        - `country_code` string, nullable, required
        - `name` string, required
        - `slug` string, required
      - `employing_legal_entity_counts` object: Multi-entity pay item uploads only: distinct employing legal entities across the complete import job
        - `ready_to_submit` integer, required: Employing legal entities of the rows the next submission adds
        - `successful` integer, required: Employing legal entities of the successful rows; after submission, of the added rows
      - `team_member_counts` object: Distinct team members across the complete import job, counted once even when they are split across several table records. `needs_changes` and `ready_to_submit` are mutually exclusive; `successfully_assigned` and `failed_to_assign` are subsets of `ready_to_submit`. The counts describe the job as of `job_stage`: the same rows count as needing changes before submission and as failed to assign afterwards.
        - `failed_to_assign` integer, required: Team members with at least one row that failed to be assigned
        - `job_stage` 'creation' | 'column_mapping' | 'validation' | 'submission', required: The stage of the import job. * `creation` - The import job is in the creation stage, which means the rows are being created. * `column_mapping` - The import job is in the column mapping stage, which means the CSV headers are being mapped to JSON schema fields. * `validation` - The import job is in the validation stage, which means the rows are being validated. * `submission` - The import job is in the submission stage, which means the rows are being submitted.
        - `needs_changes` integer, required: Team members with at least one row that needs changes before the job can be submitted
        - `ready_to_submit` integer, required: Team members with nothing blocking submission, and at least one row to submit
        - `successfully_assigned` integer, required: Team members whose rows have all been assigned, with no failures
        - `total` integer, required: Distinct team members in the job. Rows with no employee are counted as one unidentified team member
    - `counts_by_column` object: Per-column error and valid row counts, keyed by the column's field path. Counts every row that is not deleted or skipped, or only the rows in `filter[status]` when it is given. `counts_by_status` always counts the whole job
    - `counts_by_status` object, required
      - `deleted` integer, required
      - `error` integer, required
      - `imported` integer, required
      - `pending` integer, required
      - `retryable` integer, required
      - `skipped` integer, required
      - `successful` integer, required
      - `unprocessable` integer, required
    - `current_page` integer, required
    - `ordered_rows` integer[]
    - `rows` object, required
      - `failures` ImportJobRow[], required
        - `data` ImportDataRow, required
        - `errors` object, required: Fields with their error messages
        - `metadata` object: Row metadata. For login-email-selection-enabled imports (e.g. EOR bulk invite), each reviewed row carries a `login_email_signals` object with the per-row login-email review signals.
          - `login_email_signals` object: Per-row review-step signals for login email selection, present only when the feature is enabled. `sso_enforced` reflects whether SSO login is enforced for the row's category. `personal` and `work` report, for each provided email, whether it is already registered on another account.
            - `personal` object
              - …
            - `sso_enforced` boolean
            - `work` object
              - …
        - `row_error_details` object
          - `ambiguous` object[]
            - `amount` integer, nullable, required
            - `created_by` object, nullable, required
              - …
            - `effective_date` string, nullable, required
            - `employee_identifier` string, nullable, required
            - `end_date` string, nullable, required
            - `inserted_at` string, nullable, required
            - `occurrence` string, nullable, required
            - `pay_item` string, nullable, required
            - `slug` string, required
        - `row_errors` object
        - `row_level_errors` ImportJobRowError[]: The row's errors outside the requested `column_fields`, then its submission errors unless the row is successful or imported (those rows keep the submission errors of an earlier failed submit). Only present when the rows were requested with `row_level_errors=true`.
          - `error` string, nullable
          - `field_name` string, nullable
          - `messages` string[], required
        - `row_number` integer, required
        - `schema_variant_id` string, nullable: The id of the schema variant this row's fields follow, a key of `row_schema_variants` on the job-scoped json-schema response. `null` when the row uses the job-level schema. Only present for job types with per-row schema variants.
        - `status` 'successful' | 'imported' | 'error' | 'unprocessable' | 'pending' | 'deleted' | 'skipped' | 'retryable'
        - `submission_errors` ImportJobRowError[]
          - `error` string, nullable
          - `field_name` string, nullable
          - `messages` string[], required
      - `imported` ImportJobRow[], required
        - `data` ImportDataRow, required
        - `errors` object, required: Fields with their error messages
        - `metadata` object: Row metadata. For login-email-selection-enabled imports (e.g. EOR bulk invite), each reviewed row carries a `login_email_signals` object with the per-row login-email review signals.
          - `login_email_signals` object: Per-row review-step signals for login email selection, present only when the feature is enabled. `sso_enforced` reflects whether SSO login is enforced for the row's category. `personal` and `work` report, for each provided email, whether it is already registered on another account.
            - `personal` object
              - …
            - `sso_enforced` boolean
            - `work` object
              - …
        - `row_error_details` object
          - `ambiguous` object[]
            - `amount` integer, nullable, required
            - `created_by` object, nullable, required
              - …
            - `effective_date` string, nullable, required
            - `employee_identifier` string, nullable, required
            - `end_date` string, nullable, required
            - `inserted_at` string, nullable, required
            - `occurrence` string, nullable, required
            - `pay_item` string, nullable, required
            - `slug` string, required
        - `row_errors` object
        - `row_level_errors` ImportJobRowError[]: The row's errors outside the requested `column_fields`, then its submission errors unless the row is successful or imported (those rows keep the submission errors of an earlier failed submit). Only present when the rows were requested with `row_level_errors=true`.
          - `error` string, nullable
          - `field_name` string, nullable
          - `messages` string[], required
        - `row_number` integer, required
        - `schema_variant_id` string, nullable: The id of the schema variant this row's fields follow, a key of `row_schema_variants` on the job-scoped json-schema response. `null` when the row uses the job-level schema. Only present for job types with per-row schema variants.
        - `status` 'successful' | 'imported' | 'error' | 'unprocessable' | 'pending' | 'deleted' | 'skipped' | 'retryable'
        - `submission_errors` ImportJobRowError[]
          - `error` string, nullable
          - `field_name` string, nullable
          - `messages` string[], required
      - `pending` ImportJobRow[], required
        - `data` ImportDataRow, required
        - `errors` object, required: Fields with their error messages
        - `metadata` object: Row metadata. For login-email-selection-enabled imports (e.g. EOR bulk invite), each reviewed row carries a `login_email_signals` object with the per-row login-email review signals.
          - `login_email_signals` object: Per-row review-step signals for login email selection, present only when the feature is enabled. `sso_enforced` reflects whether SSO login is enforced for the row's category. `personal` and `work` report, for each provided email, whether it is already registered on another account.
            - `personal` object
              - …
            - `sso_enforced` boolean
            - `work` object
              - …
        - `row_error_details` object
          - `ambiguous` object[]
            - `amount` integer, nullable, required
            - `created_by` object, nullable, required
              - …
            - `effective_date` string, nullable, required
            - `employee_identifier` string, nullable, required
            - `end_date` string, nullable, required
            - `inserted_at` string, nullable, required
            - `occurrence` string, nullable, required
            - `pay_item` string, nullable, required
            - `slug` string, required
        - `row_errors` object
        - `row_level_errors` ImportJobRowError[]: The row's errors outside the requested `column_fields`, then its submission errors unless the row is successful or imported (those rows keep the submission errors of an earlier failed submit). Only present when the rows were requested with `row_level_errors=true`.
          - `error` string, nullable
          - `field_name` string, nullable
          - `messages` string[], required
        - `row_number` integer, required
        - `schema_variant_id` string, nullable: The id of the schema variant this row's fields follow, a key of `row_schema_variants` on the job-scoped json-schema response. `null` when the row uses the job-level schema. Only present for job types with per-row schema variants.
        - `status` 'successful' | 'imported' | 'error' | 'unprocessable' | 'pending' | 'deleted' | 'skipped' | 'retryable'
        - `submission_errors` ImportJobRowError[]
          - `error` string, nullable
          - `field_name` string, nullable
          - `messages` string[], required
      - `retryable` ImportJobRow[], required
        - `data` ImportDataRow, required
        - `errors` object, required: Fields with their error messages
        - `metadata` object: Row metadata. For login-email-selection-enabled imports (e.g. EOR bulk invite), each reviewed row carries a `login_email_signals` object with the per-row login-email review signals.
          - `login_email_signals` object: Per-row review-step signals for login email selection, present only when the feature is enabled. `sso_enforced` reflects whether SSO login is enforced for the row's category. `personal` and `work` report, for each provided email, whether it is already registered on another account.
            - `personal` object
              - …
            - `sso_enforced` boolean
            - `work` object
              - …
        - `row_error_details` object
          - `ambiguous` object[]
            - `amount` integer, nullable, required
            - `created_by` object, nullable, required
              - …
            - `effective_date` string, nullable, required
            - `employee_identifier` string, nullable, required
            - `end_date` string, nullable, required
            - `inserted_at` string, nullable, required
            - `occurrence` string, nullable, required
            - `pay_item` string, nullable, required
            - `slug` string, required
        - `row_errors` object
        - `row_level_errors` ImportJobRowError[]: The row's errors outside the requested `column_fields`, then its submission errors unless the row is successful or imported (those rows keep the submission errors of an earlier failed submit). Only present when the rows were requested with `row_level_errors=true`.
          - `error` string, nullable
          - `field_name` string, nullable
          - `messages` string[], required
        - `row_number` integer, required
        - `schema_variant_id` string, nullable: The id of the schema variant this row's fields follow, a key of `row_schema_variants` on the job-scoped json-schema response. `null` when the row uses the job-level schema. Only present for job types with per-row schema variants.
        - `status` 'successful' | 'imported' | 'error' | 'unprocessable' | 'pending' | 'deleted' | 'skipped' | 'retryable'
        - `submission_errors` ImportJobRowError[]
          - `error` string, nullable
          - `field_name` string, nullable
          - `messages` string[], required
      - `skipped` ImportJobRow[], required
        - `data` ImportDataRow, required
        - `errors` object, required: Fields with their error messages
        - `metadata` object: Row metadata. For login-email-selection-enabled imports (e.g. EOR bulk invite), each reviewed row carries a `login_email_signals` object with the per-row login-email review signals.
          - `login_email_signals` object: Per-row review-step signals for login email selection, present only when the feature is enabled. `sso_enforced` reflects whether SSO login is enforced for the row's category. `personal` and `work` report, for each provided email, whether it is already registered on another account.
            - `personal` object
              - …
            - `sso_enforced` boolean
            - `work` object
              - …
        - `row_error_details` object
          - `ambiguous` object[]
            - `amount` integer, nullable, required
            - `created_by` object, nullable, required
              - …
            - `effective_date` string, nullable, required
            - `employee_identifier` string, nullable, required
            - `end_date` string, nullable, required
            - `inserted_at` string, nullable, required
            - `occurrence` string, nullable, required
            - `pay_item` string, nullable, required
            - `slug` string, required
        - `row_errors` object
        - `row_level_errors` ImportJobRowError[]: The row's errors outside the requested `column_fields`, then its submission errors unless the row is successful or imported (those rows keep the submission errors of an earlier failed submit). Only present when the rows were requested with `row_level_errors=true`.
          - `error` string, nullable
          - `field_name` string, nullable
          - `messages` string[], required
        - `row_number` integer, required
        - `schema_variant_id` string, nullable: The id of the schema variant this row's fields follow, a key of `row_schema_variants` on the job-scoped json-schema response. `null` when the row uses the job-level schema. Only present for job types with per-row schema variants.
        - `status` 'successful' | 'imported' | 'error' | 'unprocessable' | 'pending' | 'deleted' | 'skipped' | 'retryable'
        - `submission_errors` ImportJobRowError[]
          - `error` string, nullable
          - `field_name` string, nullable
          - `messages` string[], required
      - `successes` ImportJobRow[], required
        - `data` ImportDataRow, required
        - `errors` object, required: Fields with their error messages
        - `metadata` object: Row metadata. For login-email-selection-enabled imports (e.g. EOR bulk invite), each reviewed row carries a `login_email_signals` object with the per-row login-email review signals.
          - `login_email_signals` object: Per-row review-step signals for login email selection, present only when the feature is enabled. `sso_enforced` reflects whether SSO login is enforced for the row's category. `personal` and `work` report, for each provided email, whether it is already registered on another account.
            - `personal` object
              - …
            - `sso_enforced` boolean
            - `work` object
              - …
        - `row_error_details` object
          - `ambiguous` object[]
            - `amount` integer, nullable, required
            - `created_by` object, nullable, required
              - …
            - `effective_date` string, nullable, required
            - `employee_identifier` string, nullable, required
            - `end_date` string, nullable, required
            - `inserted_at` string, nullable, required
            - `occurrence` string, nullable, required
            - `pay_item` string, nullable, required
            - `slug` string, required
        - `row_errors` object
        - `row_level_errors` ImportJobRowError[]: The row's errors outside the requested `column_fields`, then its submission errors unless the row is successful or imported (those rows keep the submission errors of an earlier failed submit). Only present when the rows were requested with `row_level_errors=true`.
          - `error` string, nullable
          - `field_name` string, nullable
          - `messages` string[], required
        - `row_number` integer, required
        - `schema_variant_id` string, nullable: The id of the schema variant this row's fields follow, a key of `row_schema_variants` on the job-scoped json-schema response. `null` when the row uses the job-level schema. Only present for job types with per-row schema variants.
        - `status` 'successful' | 'imported' | 'error' | 'unprocessable' | 'pending' | 'deleted' | 'skipped' | 'retryable'
        - `submission_errors` ImportJobRowError[]
          - `error` string, nullable
          - `field_name` string, nullable
          - `messages` string[], required
      - `unprocessable` ImportJobRow[], required
        - `data` ImportDataRow, required
        - `errors` object, required: Fields with their error messages
        - `metadata` object: Row metadata. For login-email-selection-enabled imports (e.g. EOR bulk invite), each reviewed row carries a `login_email_signals` object with the per-row login-email review signals.
          - `login_email_signals` object: Per-row review-step signals for login email selection, present only when the feature is enabled. `sso_enforced` reflects whether SSO login is enforced for the row's category. `personal` and `work` report, for each provided email, whether it is already registered on another account.
            - `personal` object
              - …
            - `sso_enforced` boolean
            - `work` object
              - …
        - `row_error_details` object
          - `ambiguous` object[]
            - `amount` integer, nullable, required
            - `created_by` object, nullable, required
              - …
            - `effective_date` string, nullable, required
            - `employee_identifier` string, nullable, required
            - `end_date` string, nullable, required
            - `inserted_at` string, nullable, required
            - `occurrence` string, nullable, required
            - `pay_item` string, nullable, required
            - `slug` string, required
        - `row_errors` object
        - `row_level_errors` ImportJobRowError[]: The row's errors outside the requested `column_fields`, then its submission errors unless the row is successful or imported (those rows keep the submission errors of an earlier failed submit). Only present when the rows were requested with `row_level_errors=true`.
          - `error` string, nullable
          - `field_name` string, nullable
          - `messages` string[], required
        - `row_number` integer, required
        - `schema_variant_id` string, nullable: The id of the schema variant this row's fields follow, a key of `row_schema_variants` on the job-scoped json-schema response. `null` when the row uses the job-level schema. Only present for job types with per-row schema variants.
        - `status` 'successful' | 'imported' | 'error' | 'unprocessable' | 'pending' | 'deleted' | 'skipped' | 'retryable'
        - `submission_errors` ImportJobRowError[]
          - `error` string, nullable
          - `field_name` string, nullable
          - `messages` string[], required
    - `total_count` integer, required
    - `total_pages` integer, required

## Other responses

- `400`: Bad Request
- `403`: Forbidden
- `404`: Not Found
- `429`: Unprocessable Entity

---

[API](https://skmtc.dev/remote-com/apis/employments.md) - [All operations](https://skmtc.dev/remote-com/apis/employments/llms.txt) - [OpenAPI document](https://skmtc.dev/remote-com/apis/employments/revisions/da61f6ebc73a?raw)
