> Source: https://wexa.ai/docs/connectors/get-connector-ingestion

# get-connector-ingestion

Read a connector's ingestion, as the console's connector page shows it: the pipeline's stages, its state, the last run's counts and error, and the connector's last sync. It never starts a run, so it is safe to poll. Needs the `fabric:orchestrate.read` grant.

**Read a connector's ingestion**

**Wexa MCP server**

```bash
curl -sS -X POST https://fabric.wexa.ai/mcp/$FABRIC_PROJECT_ID \
  -H "authorization: Bearer $FABRIC_API_KEY" \
  -H "Mcp-Session-Id: $MCP_SESSION_ID" \
  -H "content-type: application/json" -H "accept: application/json" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get-connector-ingestion","arguments":{"connector_id":"6b1a3d5e7f9c0b2a4d6e8f01"}}}'
```

```json
{
  "content": [
    {
      "type": "text",
      "text": "{\"lifecycle_id\":\"qlc_000020\",\"result\":{\"connector_id\":\"6b1a3d5e7f9c0b2a4d6e8f01\",\"state\":\"ingested\",\"label\":\"ingested\",\"counts\":{\"nodes\":1240,\"edges\":3310},\"in_progress\":false,\"sync\":{\"status\":\"synced\",\"last_sync\":\"2026-10-10T09:00:00Z\",\"actions\":7}}}"
    }
  ],
  "isError": false
}
```

**REST API**

```bash
curl -sS https://fabric.wexa.ai/v1/get-connector-ingestion \
  -H "authorization: Bearer $FABRIC_API_KEY" \
  -H "content-type: application/json" \
  -d '{"connector_id":"6b1a3d5e7f9c0b2a4d6e8f01"}'
```

```json
{
  "lifecycle_id": "qlc_000020",
  "result": {
    "connector_id": "6b1a3d5e7f9c0b2a4d6e8f01",
    "state": "ingested",
    "label": "ingested",
    "counts": {
      "nodes": 1240,
      "edges": 3310
    },
    "in_progress": false,
    "sync": {
      "status": "synced",
      "last_sync": "2026-10-10T09:00:00Z",
      "actions": 7
    }
  }
}
```

**TypeScript SDK**

```ts
import { Fabric } from '@wexa-fabric/sdk'

const fabric = new Fabric()
const result = await fabric.getConnectorIngestion({
  connector_id: '6b1a3d5e7f9c0b2a4d6e8f01'
})
```

```ts
// result is the payload itself, with no `.result` to read
{
  connector_id: '6b1a3d5e7f9c0b2a4d6e8f01',
  state: 'ingested',
  label: 'ingested',
  counts: {
    nodes: 1240,
    edges: 3310
  },
  in_progress: false,
  sync: {
    status: 'synced',
    last_sync: '2026-10-10T09:00:00Z',
    actions: 7
  }
}
```

**Python SDK**

```python
from wexa import Fabric

fabric = Fabric()
out = fabric.get_connector_ingestion(connector_id="6b1a3d5e7f9c0b2a4d6e8f01")
```

```python
# out is the result, already unwrapped
{
    "connector_id": "6b1a3d5e7f9c0b2a4d6e8f01",
    "state": "ingested",
    "label": "ingested",
    "counts": {
        "nodes": 1240,
        "edges": 3310
    },
    "in_progress": False,
    "sync": {
        "status": "synced",
        "last_sync": "2026-10-10T09:00:00Z",
        "actions": 7
    }
}
```

## Parameters

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `connector_id` | string | Required | The connector, from [`list-connectors`](/docs/connectors/list-connectors). It must have been provisioned in this project. Non-empty string. One you cannot read (unknown, in another organization, provisioned in another project, or outside your access scope) is refused (403). |

**Show full response**

- `connector_id`: the connector you asked about.
- `state`: `draft` (not configured), `registered` (configured, not ingested yet), `ingesting`, `ingested`, `streaming` or `failed`.
- `label`: the state in words, as the console shows it. `run did not finish` when the last run ended without recording a result.
- `stages`: the pipeline's stages in order: `connected`, `schema_extracted`, `ontology_derived`, `queued`, `ingesting`, `ingested`. Each has a `status` of `done`, `current`, `failed` or `pending` and, when known, `started_at` and `ended_at`.
- `counts`: the last run's `nodes` and `edges`. Both are `0` before the first run and after a failed one.
- `run_status`: the last run's own disposition, `running`, `closed`, or `null` when there is no run or it cannot be read.
- `last_om_ingest_at`: when the last run recorded its result.
- `in_progress`: `true` while a run is going.
- `error`: present only when the last run failed: what went wrong, or `the last run failed` when the run gave no reason.
- `sync`: the connector's last sync, as the console lists it: `status`, `last_sync` and `actions`, the number of actions. Absent when there is no sync record.

An example response, for a connector whose last run finished.

**Result of get-connector-ingestion**

**REST API**

```json
{
  "lifecycle_id": "qlc_000020",
  "result": {
    "connector_id": "6b1a3d5e7f9c0b2a4d6e8f01",
    "state": "ingested",
    "label": "ingested",
    "stages": [
      { "stage": "connected", "status": "done" },
      { "stage": "schema_extracted", "status": "done" },
      { "stage": "ontology_derived", "status": "done", "started_at": "2026-10-10 09:00:31+00:00", "ended_at": null },
      { "stage": "queued", "status": "done" },
      { "stage": "ingesting", "status": "done", "started_at": "2026-10-10 09:00:31+00:00", "ended_at": "2026-10-10 09:04:12+00:00" },
      { "stage": "ingested", "status": "done" }
    ],
    "counts": { "nodes": 1240, "edges": 3310 },
    "run_status": "closed",
    "last_om_ingest_at": "2026-10-10T09:04:12Z",
    "in_progress": false,
    "sync": { "status": "synced", "last_sync": "2026-10-10T09:00:00Z", "actions": 7 }
  }
}
```

**Wexa MCP server**

```json
{
  "content": [
    {
      "type": "text",
      "text": "{\"lifecycle_id\":\"qlc_000020\",\"result\":{\"connector_id\":\"6b1a3d5e7f9c0b2a4d6e8f01\",\"state\":\"ingested\",\"label\":\"ingested\",\"stages\":[{\"stage\":\"connected\",\"status\":\"done\"},{\"stage\":\"schema_extracted\",\"status\":\"done\"},{\"stage\":\"ontology_derived\",\"status\":\"done\",\"started_at\":\"2026-10-10 09:00:31+00:00\",\"ended_at\":null},{\"stage\":\"queued\",\"status\":\"done\"},{\"stage\":\"ingesting\",\"status\":\"done\",\"started_at\":\"2026-10-10 09:00:31+00:00\",\"ended_at\":\"2026-10-10 09:04:12+00:00\"},{\"stage\":\"ingested\",\"status\":\"done\"}],\"counts\":{\"nodes\":1240,\"edges\":3310},\"run_status\":\"closed\",\"last_om_ingest_at\":\"2026-10-10T09:04:12Z\",\"in_progress\":false,\"sync\":{\"status\":\"synced\",\"last_sync\":\"2026-10-10T09:00:00Z\",\"actions\":7}}}"
    }
  ],
  "isError": false
}
```

**TypeScript SDK**

```ts
// the object you get back IS the result — there is no `.result` to read
{
  "connector_id": "6b1a3d5e7f9c0b2a4d6e8f01",
  "state": "ingested",
  "label": "ingested",
  "stages": [
    { "stage": "connected", "status": "done" },
    { "stage": "schema_extracted", "status": "done" },
    { "stage": "ontology_derived", "status": "done", "started_at": "2026-10-10 09:00:31+00:00", "ended_at": null },
    { "stage": "queued", "status": "done" },
    { "stage": "ingesting", "status": "done", "started_at": "2026-10-10 09:00:31+00:00", "ended_at": "2026-10-10 09:04:12+00:00" },
    { "stage": "ingested", "status": "done" }
  ],
  "counts": { "nodes": 1240, "edges": 3310 },
  "run_status": "closed",
  "last_om_ingest_at": "2026-10-10T09:04:12Z",
  "in_progress": false,
  "sync": { "status": "synced", "last_sync": "2026-10-10T09:00:00Z", "actions": 7 }
}

// The TS SDK names these camelCase — lifecycleId, traceId — where Python uses
// lifecycle_id and trace_id. Both are non-enumerable: readable, but omitted by
// Object.keys() and JSON.stringify(). `result.lifecycleId` here is undefined.
result.lifecycleId // 'qlc_000020'
```

**Python SDK**

```python
# a dict subclass; `result` is already unwrapped
{
 "connector_id": "6b1a3d5e7f9c0b2a4d6e8f01",
 "state": "ingested",
 "label": "ingested",
 "stages": [
  {"stage": "connected", "status": "done"},
  {"stage": "schema_extracted", "status": "done"},
  {"stage": "ontology_derived", "status": "done", "started_at": "2026-10-10 09:00:31+00:00", "ended_at": None},
  {"stage": "queued", "status": "done"},
  {"stage": "ingesting", "status": "done", "started_at": "2026-10-10 09:00:31+00:00", "ended_at": "2026-10-10 09:04:12+00:00"},
  {"stage": "ingested", "status": "done"}
 ],
 "counts": {"nodes": 1240, "edges": 3310},
 "run_status": "closed",
 "last_om_ingest_at": "2026-10-10T09:04:12Z",
 "in_progress": False,
 "sync": {"status": "synced", "last_sync": "2026-10-10T09:00:00Z", "actions": 7}
}

out.lifecycle_id  # 'qlc_000020' — an attribute, not a key
```

For a run that failed, `state` is `failed`, the `ingesting` stage is `failed`, and `error` says what went wrong.

For a run that failed, `state` is `failed`, the `ingesting` stage is `failed`, and `error` says what went wrong.

**More details**

[`get-connector-sync`](/docs/connectors/get-connector-sync) follows one sync that [`sync-connector`](/docs/connectors/sync-connector) started. This call is the connector's standing picture, whatever started the last run, so it needs no `sync_id`.

A connector that has never been ingested is not an error. It comes back with its `state`, every later stage `pending`, and zero counts.

The connector id in the example is illustrative: swap it for one `list-connectors` returned to you. The error codes are `S8:connector-not-usable` and `S4:validate-input`. Reading the ingestion needs only `fabric:orchestrate.read`, so a key that watches a connector does not need the power to sync it. Not marked consequential. See [ingestion](/docs/context/ingestion).

Every tool call works the same way: [How every tool call works](/docs/sdks-and-apis/how-every-tool-call-works).
