# API Reference

Laravel Ingest exposes a RESTful API for managing and monitoring import processes. All endpoints are prefixed with /api/v1/ingest (configurable via config/ingest.php).

# Authentication

The API routes are wrapped in the api middleware group by default. You will typically need to provide an authentication token (e.g., Sanctum or Passport) in the Authorization header.


# List Ingest Runs

Retrieves a paginated list of all ingest runs, sorted by the most recent.

  • Endpoint: GET /
  • Success Response: 200 OK with a paginated JSON object of IngestRunResource objects.
curl -X GET -H "Authorization: Bearer <token>" https://myapp.com/api/v1/ingest

# Show Ingest Run Details

Retrieves the details of a single ingest run, including its rows.

  • Endpoint: GET /{ingestRun}
  • URL Parameters:
    • ingestRun (integer, required): The ID of the ingest run.
  • Success Response: 200 OK with a single IngestRunResource object.
curl -X GET -H "Authorization: Bearer <token>" https://myapp.com/api/v1/ingest/123

# Upload File and Start Run

Starts a new ingest run from a file upload.

  • Endpoint: POST /upload/{importerSlug}
  • URL Parameters:
    • importerSlug (string, required): The slug of the importer definition (e.g., user-importer).
  • Body (multipart/form-data):
    • file (file, required): The data file to import (e.g., CSV, XLSX).
    • dry_run (boolean, optional): If 1 or true, performs a simulation without saving data.
  • Success Response: 202 Accepted with the newly created IngestRunResource.
curl -X POST \
  -H "Authorization: Bearer <token>" \
  -F "file=@/path/to/data.csv" \
  https://myapp.com/api/v1/ingest/upload/user-importer

# Trigger Non-Upload Run

Starts a new ingest run for a source that does not require a file upload (e.g., FTP, URL).

  • Endpoint: POST /trigger/{importerSlug}
  • URL Parameters:
    • importerSlug (string, required): The slug of the importer definition.
  • Success Response: 202 Accepted with the newly created IngestRunResource.
curl -X POST \
  -H "Authorization: Bearer <token>" \
  https://myapp.com/api/v1/ingest/trigger/daily-stock-importer

# Cancel Ingest Run

Sends a cancellation request to a running ingest batch.

  • Endpoint: POST /{ingestRun}/cancel
  • URL Parameters:
    • ingestRun (integer, required): The ID of the ingest run to cancel.
  • Success Response: 200 OK with {"message": "Cancellation request sent."}.
curl -X POST \
  -H "Authorization: Bearer <token>" \
  https://myapp.com/api/v1/ingest/123/cancel

# Retry Failed Ingest Run

Creates a new ingest run containing only the failed rows from a previous run.

  • Endpoint: POST /{ingestRun}/retry
  • URL Parameters:
    • ingestRun (integer, required): The ID of the original run with failed rows.
  • Body (application/json, optional):
    • {"dry_run": true}
  • Success Response: 202 Accepted with the newly created retry IngestRunResource.
  • Error Response: 400 Bad Request if the original run has no failed rows.
curl -X POST \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  https://myapp.com/api/v1/ingest/123/retry

# Get Error Summary

Retrieves an aggregated summary of errors for a specific ingest run. Useful for quickly understanding the most common issues without fetching all failed rows.

  • Endpoint: GET /{ingestRun}/errors/summary
  • URL Parameters:
    • ingestRun (integer, required): The ID of the ingest run.
  • Success Response: 200 OK with an IngestErrorSummaryResource object.
curl -X GET \
  -H "Authorization: Bearer <token>" \
  https://myapp.com/api/v1/ingest/123/errors/summary

# Download Failed Rows as CSV

Downloads a CSV file containing only the failed rows from an ingest run. The CSV includes all original data columns plus _error_message and _row_number columns. This enables a "Fix & Re-Upload" workflow.

  • Endpoint: GET /{ingestRun}/failed-rows/download
  • URL Parameters:
    • ingestRun (integer, required): The ID of the ingest run.
  • Success Response: 200 OK with a streamed CSV file download.
  • Error Response: 404 Not Found if the run has no failed rows.
curl -X GET \
  -H "Authorization: Bearer <token>" \
  -o failed-rows.csv \
  https://myapp.com/api/v1/ingest/123/failed-rows/download

# IngestErrorSummaryResource Object

The JSON representation for an error analysis summary.

{
  "data": {
    "total_failed_rows": 15,
    "error_summary": [
      { "message": "Duplicate entry found for key 'email'.", "count": 8 },
      { "message": "The given data was invalid.", "count": 7 }
    ],
    "validation_summary": [
      { "message": "email: The email field is required.", "count": 5 },
      { "message": "name: The name must be at least 2 characters.", "count": 2 }
    ]
  }
}

# IngestRunResource Object

The standard JSON representation for an ingest run.

{
  "data": {
    "id": 123,
    "importer": "user-importer",
    "status": "processing",
    "user_id": 1,
    "original_filename": "users.csv",
    "progress": {
      "total": 1000,
      "processed": 500,
      "successful": 498,
      "failed": 2
    },
    "summary": null,
    "started_at": "2023-10-27T10:00:00.000000Z",
    "completed_at": null,
    "rows": [ /* collection of IngestRowResource objects */ ]
  }
}