# Retrieve an entity's opportunity stages

Operation ID: `getOpportunityStages`

Group: CRM › Opportunity Stages

[Open in the interactive reference](https://docs.api.lensing.ai/lensing/v1/endpoints/getOpportunityStages)

`GET /crm/opportunity-stages/{id}`

Read-only: Reads and returns; changes nothing.

Retrieves a legal entity's opportunity stages, in order. The :id in the path is the legal entity's id, not a stage id. An entity without stages returns NOT_FOUND. For the stages an opportunity's stageId belongs to, use the opportunity's entityId as the :id.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `Api-Version` | header | string · v1 | yes | The API version this request targets, named by its public identifier. Required on every request; omitting it, or naming a version this company does not have, is answered with 400. This document describes version `v1`. |
| `id` | path | string | yes | The legal entity whose stages to return. See id on GET base/entities. |

## Response

`200` Success

Under `data` (getOpportunityStagesOutput):

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | yes | The identifier of this set of stages. It currently equals entityId; treat it as opaque. |
| `entityId` | string | yes | The legal entity the stages belong to. See id on GET base/entities. |
| `lastModifiedDate` | date-time | no | The date and time any of the stages last changed, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. |
| `stages` | array<object> | yes | The stages, ordered by orderIndex. |
| `stages[].id` | string | yes | The unique identifier for the stage. An opportunity's stageId holds this value. |
| `stages[].stageName` | string | yes | The display name of the stage, for example 'Qualification'. |
| `stages[].stageType` | any | yes | What reaching the stage means for an opportunity. One of: `"open"`, `"closedWon"`, `"closedLost"`. |
| `stages[].probability` | decimal | yes | The likelihood that an opportunity in this stage closes as won, as a percentage from 0 to 100. For example, 25 means 25%. A percentage, not an amount, so it has no currency. |
| `stages[].orderIndex` | number | yes | The position of the stage; stages are ordered by it. Unique within the entity. After any write the positions are 0, 1, 2 … with no gaps. |
| `stages[].isDeactivated` | boolean | yes | Whether the stage is retired. A deactivated stage stays on record but is not offered for new opportunities. |
| `stages[].lastModifiedDate` | date-time | no | The date and time the stage record last changed, in UTC. Every write to the entity's stages updates it for every stage. Format YYYY-MM-DDTHH:mm:ss.sssZ. |

```json
{
  "data": {
    "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "entityId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "lastModifiedDate": "2026-01-15T09:30:00.000Z",
    "stages": [
      {
        "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "stageName": "<stageName>",
        "stageType": "open",
        "probability": "19.99",
        "orderIndex": 0,
        "isDeactivated": true,
        "lastModifiedDate": "2026-01-15T09:30:00.000Z"
      }
    ]
  },
  "diagnostics": [
    {
      "code": "<code>",
      "message": "<message>",
      "severity": "error",
      "path": [
        "<path>"
      ],
      "details": "<details>"
    }
  ]
}
```

## Errors

| Code | Status |
| --- | --- |
| `NOT_FOUND` | 400 |

## Statuses

- `400` — Invalid request or business failure. Codes: NOT_FOUND
- `401` — The request carries no valid access token.
- `403` — Not authorized
- `404` — Not found
- `429` — Too many requests from this client address. The response has no body and no `Retry-After` header.
- `500` — Internal server error
