## `GET /sop/:name/:id`

**Get instance state** — Returns the current state of a process instance — inputs, outputs, current state, and a summary of each step&#39;s status.

> **Auth:** Requires `X-SOP-Token` header. See [Authentication](/api-docs/guides/authentication.md).

### Path parameters

- `name` (string, required) — The process name.
- `id` (string, required) — The instance ULID returned by `POST /start`.

### Response

`200 application/json` — Instance state with inputs, outputs, and step summary.

```json
{
  "id":           "01HXYZ_ACME_001",
  "process":      "customer-onboarding",
  "state":        "completed",
  "inputs":       { "company_name": "Acme Corp", "country": "US" },
  "outputs":      { "account_id": "ACC-9271", "status": "approved" },
  "started_at":   "2024-01-15T10:30:00Z",
  "completed_at": "2024-01-15T11:02:14Z"
}
```

### Errors

| Status | Code | Meaning |
|--------|------|---------|
| 404 | `not_found` | No instance with that id under the named process. |

### Code examples

#### curl

```bash
curl https://api.opensop.dev/sop/customer-onboarding/01HXYZ_ACME_001 \
  -H "X-SOP-Token: $OPENSOP_TOKEN"
```

#### Node

```js
const res = await fetch(
  `https://api.opensop.dev/sop/customer-onboarding/${instanceId}`,
  { headers: { "X-SOP-Token": process.env.OPENSOP_TOKEN } }
);
```

#### Python

```python
resp = requests.get(
  f"https://api.opensop.dev/sop/customer-onboarding/{instance_id}",
  headers={"X-SOP-Token": os.environ["OPENSOP_TOKEN"]}
)
```

#### Ruby

```ruby
Net::HTTP.start("api.opensop.dev", use_ssl: true) do |h|
  req = Net::HTTP::Get.new("/sop/customer-onboarding/#{instance_id}")
  req["X-SOP-Token"] = ENV["OPENSOP_TOKEN"]
  puts h.request(req).body
end
```

