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

# Get modular readiness

> Read the runtime setup-state projection for a modular inventory source

`GET /api/v2/storefront/inventory-sources/{sourceId}/modular`

Returns the runtime projection for a `MODULAR_SOURCE`: per-module contracts, lifecycle stages, missing setup fields, issues, and open source-side work-item counts. This reflects configuration completeness, not a guarantee that runtime inputs or upstream booking have completed.

## Request

<CodeGroup>
  ```bash curl theme={null}
  curl https://api.interchange.io/api/v2/storefront/inventory-sources/retail-modular/modular \
    -H "Authorization: Bearer $SCOPE3_API_KEY"
  ```
</CodeGroup>

## Parameters

| Field      | Type          | Required | Notes                                 |
| ---------- | ------------- | -------- | ------------------------------------- |
| `sourceId` | string (path) | Yes      | Storefront-scoped inventory source ID |

## Response

```json theme={null}
{
  "inventorySource": {
    "id": "900222",
    "storefrontId": "42",
    "sourceId": "retail-modular",
    "name": "Retail Modular Source",
    "executionType": "MODULAR_SOURCE",
    "status": "ACTIVE",
    "healthStatus": "healthy",
    "lastError": null,
    "lastCheckedAt": "2026-05-02T09:00:00Z"
  },
  "modules": [
    {
      "moduleRowId": "mod_01",
      "inventorySourceId": "900222",
      "moduleInstanceId": "inventory-feed-1",
      "kind": "INVENTORY_FEED",
      "name": "Avails Feed",
      "provider": "csv_feed",
      "status": "ACTIVE",
      "contractId": "ctr_inventory_feed",
      "contractVersion": "1.2.0",
      "contract": null,
      "configuredFieldKeys": ["feedUrl", "refreshCron"],
      "missingSetupFieldsBySource": [],
      "lifecycle": [
        {
          "stage": "INGEST_AVAILS",
          "mode": "AUTOMATED",
          "description": "Pull avails from the configured feed.",
          "outputKeys": ["avails"],
          "requiredFieldsBySource": [],
          "missingSetupFieldsBySource": [],
          "moduleConfigReady": true
        }
      ],
      "openWorkItemCount": 0,
      "lastError": null,
      "lastCheckedAt": "2026-05-02T09:00:00Z",
      "issues": []
    }
  ],
  "openWorkItemCount": 0
}
```

Each module has a `kind` (`INVENTORY_FEED`, `BOOKING_LEDGER`, `TRAFFICKING`, `STATUS_SYNC`, `REPORTING_IMPORT`) and a `status` (`CONFIGURING`, `ACTIVE`, `DISABLED`, `ERROR`). `missingSetupFieldsBySource[]` groups unconfigured contract fields by where the value should come from (e.g. `MODULE_CONFIG`, `INVENTORY_FEED`). Each `lifecycle[]` stage reports its fulfilment `mode` (`AUTOMATED`, `HITL`, `UNSUPPORTED`) and a `moduleConfigReady` flag. `openWorkItemCount` rolls up open human-in-the-loop work.

## Errors

* `401 UNAUTHORIZED` — missing or invalid API key.
* `404 NOT_FOUND` — no modular source with this `sourceId`.

See [Errors](/v2/reference/errors) for the full error contract.

## Related

<CardGroup cols={2}>
  <Card title="Inventory source tasks" href="/v2/storefront/inventory-sources/tasks" icon="list-check">
    All operations
  </Card>

  <Card title="Update module config" href="/v2/storefront/inventory-sources/tasks/update-modular-module-config" icon="sliders">
    Fill in missing module config
  </Card>

  <Card title="Get inventory source" href="/v2/storefront/inventory-sources/tasks/get-inventory-source" icon="magnifying-glass">
    Read the source row
  </Card>

  <Card title="Inventory sources overview" href="/v2/storefront/inventory-sources/overview" icon="plug">
    Concepts and lifecycle
  </Card>
</CardGroup>
