> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.ovalbee.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.ovalbee.com/_mcp/server.

# Labeling stats

> Running totals of the labeling side of a Supervisely process: how many people label and how many images they have submitted.

## Overview

Counts the labeling side of a Supervisely process and keeps the numbers on the node card. Connect
the **Process** output of either manager node — a labeling queue and a batch of jobs are read the
same way.

The totals only ever grow. Supervisely keeps the current status of an entity, so a rejected image
loses that status the moment its author picks it up again, and this node remembers what it saw. Once
both inputs are set, the node runs itself every 15 minutes.

## Prerequisites

| Requirement                 | What you need                                                                                                                                                                                     |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Process handle**          | The **Process** output of a [Labeling queue manager](/node-library/nodes/supervisely-labeling-queue-manager) or a [Labeling jobs manager](/node-library/nodes/supervisely-labeling-jobs-manager). |
| **Supervisely credentials** | An existing `supervisely` secret allowed to read jobs in that team.                                                                                                                               |

## How it works

Reads the jobs of the connected process, whether they belong to a queue or stand on their own.

Adds what it sees to the running totals, so an image counts once however many times it passes.

Publishes how many people label and how many images they have submitted.

## FAQ

#### What changes with the jobs form?

Each person there holds a whole batch, not one image, so the card also shows **Images in work**:
how many images the open jobs hold right now. That row is live and does go down. A queue hands
out one image at a time, so it is not shown for it.

#### Why do the numbers never go down?

They answer "how much work has this process done", not "what is in progress right now". The
stage datasets of the manager node show the live picture.

#### What counts as labeled?

An image a labeler has submitted at least once, whatever the reviewer decided afterwards.

#### Where does the button lead?

Into the Supervisely annotation tool, on a live labeling job with work waiting in it. With no
live job it opens the list instead.

#### Why does the run fail right after I connect a manager?

The manager has to run first. Until it has created its Supervisely queue or dataset, the
**Process** handle has nothing to read and each run fails.

#### Can one node watch two processes?

No. One node reads one **Process** handle. Add a second node for a second step.

#### What does this node not support?

Per-person breakdowns and time ranges. It also holds the ids it has seen in its own state, so
a process with very many images makes that state large.

## Inputs

**`Process`** `object` — required

The Process output of a Labeling queue manager or a Labeling jobs manager. Both forms are read the same way. Key: `PROCESS`.

---

**`Supervisely credentials`** `secret` — required

Allowed credential types: `supervisely`. Key: `SLY_SECRET`.

---

## Outputs

**`Stats`** `object`

Compact labeling table shown on the node card. Hidden from the flow editor. Key: `STATS`.

---

**`Supervisely URL`** `string`

Opens the Supervisely annotation tool on a live labeling job. Falls back to the list when there is no live job. Key: `SLY_URL`.

---

**`State`** `object`

Internal running totals, kept so the numbers never go backwards. Hidden from the flow editor. Key: `STATE`.

---

## JSON config

Machine-readable node interface for automation and advanced usage.

#### Show JSON

```json
{
  "name": "Labeling stats",
  "description": "Running totals of the labeling side of a Supervisely process: how many people label and how many images they have submitted.",
  "category": "Supervisely",
  "namespace": "supervisely",
  "templateKey": "supervisely/labeling_stats",
  "version": "v1",
  "inputs": [
    {
      "key": "PROCESS",
      "label": "Process",
      "type": "object",
      "description": "The Process output of a Labeling queue manager or a Labeling jobs manager. Both forms are read the same way.",
      "required": true,
      "default": null,
      "visibleWhen": null
    },
    {
      "key": "SLY_SECRET",
      "label": "Supervisely credentials",
      "type": "secret",
      "description": "",
      "required": true,
      "default": null,
      "visibleWhen": null,
      "options": {
        "types": [
          "supervisely"
        ]
      }
    }
  ],
  "outputs": [
    {
      "key": "STATS",
      "label": "Stats",
      "type": "object",
      "description": "Compact labeling table shown on the node card.",
      "artifact": false,
      "badge": false,
      "badgeOpens": null,
      "hidden": true
    },
    {
      "key": "SLY_URL",
      "label": "Supervisely URL",
      "type": "string",
      "description": "Opens the Supervisely annotation tool on a live labeling job. Falls back to the list when there is no live job.",
      "artifact": false,
      "badge": false,
      "badgeOpens": null,
      "hidden": false
    },
    {
      "key": "STATE",
      "label": "State",
      "type": "object",
      "description": "Internal running totals, kept so the numbers never go backwards.",
      "artifact": false,
      "badge": false,
      "badgeOpens": null,
      "hidden": true
    }
  ],
  "automation": {
    "isolated": true,
    "requires_configuration": true,
    "schedule": "*/15 * * * *",
    "discard_history": "on_success"
  },
  "widgets": {
    "widget": {
      "id": "table",
      "settings": {
        "data": {
          "type": "variable",
          "value": "self.outputs.STATS"
        }
      }
    },
    "secondaryWidget": {
      "id": "link",
      "settings": {
        "name": {
          "type": "input",
          "value": "Open labeling"
        },
        "link": {
          "type": "variable",
          "value": "self.outputs.SLY_URL"
        }
      }
    }
  }
}
```