# Get operator efficiency
URL: https://docs.fluenta.io/docs/reference/analytics/get-operator-efficiency
Operation: `getOperatorEfficiency`
Required permission: `read`

`GET /v1/external/organizations/{organizationId}/operators/{operatorId}/analytics/efficiency`

One operario’s «Eficiencia» per day over a range of up to 92 plant days: their own marcas against their share of each puesto-hour’s meta.

What it is: one «operario»’s «Eficiencia» day by day, the chart of that person’s report in the dashboard («Reportes», by «operario»). Each entry of `days` is one plant day: `units` are the «marcas» that person registered, at whichever «puestos» they sat; `goal` is their share of the «meta» of every «puesto»-hour they marked in, 2 decimals (when two people shared a «puesto» in one hour, each takes the part of its «meta» that matches their part of its units); `efficiency` is `units` × 100 ÷ the unrounded `goal`.

This is the person’s figure, the one the «Clasificación» ranks by. It is not a «puesto»’s: two «operarios» who shared a «puesto» add up to that «puesto»’s units and goal.

`efficiency` is «Eficiencia»: units made × 100 ÷ the «meta» of the same span, a percentage with 2 decimals (100 = exactly the goal, it can pass 100; never a 0–1 ratio), null where the goal is 0. Every «puesto» counts towards it, a «puesto de salida» or not.

Range: `from` and `to` are plant days, both included, at most 92 days apart counting both (`RANGE_TOO_LARGE` past it); for a longer span, ask consecutive ranges. `days` is oldest first, and a day with no work in the range is no row, not a row of zeros.

Days and hours are the plant’s own: a plant day is a calendar day `YYYY-MM-DD` in the organization’s timezone (`getOrganization` `timezone`), never UTC, and an `hour` is the clock hour 0–23 that starts at it in that zone.

Plan: needs the plan feature `operatorReports` (the «operario» reports), the one its dashboard screen is gated by. Pro, a trial of Pro and an «exenta» organization answer it; a Light organization, of either plan version, does not: 403 `PLAN_LIMIT` with `feature: "operatorReports"`. `getPlan` `features` lists what the organization’s plan has.

Heavy read: besides the credential’s ordinary budget it spends the heavy one, 20 requests per 60 seconds per credential and organization; past it the answer is 429 `RATE_LIMITED` with `Retry-After`.

See also: `getOperatorReport` for the same days plus one day hour by hour; `getLeaderboard` for every «operario» on one day.

### Authorization

- `apiToken` — Bearer token. An API token created in Configuración › Tokens de API, or a connected app’s access token

Send it as `Authorization: Bearer <your API token>`.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `operatorId` | path | integer | yes | The «operario»: the `id` of one from `listOperators`. Unknown or of another organization: 404 `OPERATOR_NOT_FOUND`. |
| `from` | query | string | yes | First plant day of the range, `YYYY-MM-DD` on the plant’s own clock, included. At most 92 days from `from` to `to`, counting both: past it, 400 `RANGE_TOO_LARGE`. |
| `to` | query | string | yes | Last plant day of the range, `YYYY-MM-DD` on the plant’s own clock, included. Before `from`: 400 `RANGE_INVALID`. |
| `organizationId` | path | integer | yes | The organization, from `getMe` or `listOrganizations`. |

### Responses

| Status | Description |
| --- | --- |
| `200` | The «operario»’s «Eficiencia», one row per plant day worked in the range. |
| `400` | `INVALID_DAY`: `from` or `to` is not a real calendar day written `YYYY-MM-DD`. `RANGE_INVALID`: `from` is after `to`. `RANGE_TOO_LARGE`: more than 92 plant days from `from` to `to`, both included (`maxDays` in the body says the cap); ask a shorter range. `INVALID_REQUEST`: a query parameter is missing, of the wrong type or outside its allowed values; `details` lists each one as `{field, message}`. Body: `{statusCode, code, message}`, the message in Spanish, for the usuario. |
| `401` | Missing, malformed, unknown, expired or revoked credential: `INVALID_API_TOKEN`. |
| `402` | The organization is blocked: `ORG_BLOCKED`. |
| `403` | `PLAN_LIMIT` with `feature: "operatorReports"`: the organization’s plan lacks the «operario» reports (Pro, a trial of Pro and an «exenta» organization answer it; a Light organization, of either plan version, does not). `PLAN_LIMIT` with `feature: "aiConnector"`: a connected app reads an organization without «Conectar con IA». `INSUFFICIENT_SCOPE`: the credential lacks the «Permiso» `read`. Retrying does not help: the plan or the credential has to change. |
| `404` | `ORGANIZATION_NOT_FOUND`: the organization does not exist or is out of the credential’s reach. `OPERATOR_NOT_FOUND`: the «operario» does not exist or is another organization’s. One body for a row that is missing and for one of another organization. |
| `429` | The credential is over its rate limit: `RATE_LIMITED`. Per credential, in fixed windows of 60 seconds: 60 requests in one organization on Light and 120 on Pro; 20 on the heavy reads (the range figures, the whole floor, the month and the pauses); 300 across every organization; 60 on the routes that name no organization. Wait `Retry-After` seconds; a refused request counts against nothing. |

### Example

```bash
curl -X GET 'https://api.fluenta.io/v1/external/organizations/{organizationId}/operators/{operatorId}/analytics/efficiency' \
  -H 'Authorization: Bearer <your API token>'
```