Annotation Insights

View annotation insights by date, labeler, and project.

About

Annotation Insights are a premium feature.

For up-to-date information on our plans and their associated features, see our pricing page.

Annotation Insights show statistics on annotation jobs for projects in a workspace. You can view insights by date, labeler, and project.

For example, you can find:

  1. How many images someone annotated in a given time frame;
  2. How many rejection events occurred during the review stage, including images that were later approved;
  3. The first-pass acceptance rate for reviewed images (the percentage approved without ever being rejected);
  4. How many bounding boxes were drawn for a project;
  5. How many images were model-assisted or marked as null;
  6. Time spent labeling, and more.

Web App

View Annotation Insights

To view Annotation Insights "Settings", then "Manage Users" in the Roboflow sidebar:

Then, click "Annotation Insights":

You will then be taken to the Annotation Insights dashboard:

On the dashboard, you can see aggregate information about the number of annotations created, updated, and removed over a given time period. You can also see a breakdown by project.

Labeler Statistics

The dashboard table breaks annotation activity down per labeler and project.

ColumnDescription
"Images Labeled"Images the labeler annotated, including images marked as having no objects. An image counts once per day it was worked on.
"Unique Images Labeled"Distinct images the labeler annotated in the date range, counted once no matter how many days they worked on it. Not shown for date ranges before August 1, 2023.
"Net Annotations"Annotations added minus annotations removed.
"Total Annotations Added", "Total Annotations Removed", "Total Annotations Updated"Counts of the annotation changes the labeler made.
"Model Assisted"Images the labeler annotated using model-assisted labeling.
"Marked Null"Images the labeler marked as having no objects.

When annotation review is enabled for the Workspace, the table also shows review statistics:

ColumnDescription
"Approved"Images approved during review.
"Rejected"The total number of rejection events. Every rejection counts, including images that are later corrected and approved.
"Approval Rate"First-pass acceptance, the percentage of reviewed images approved without ever being rejected. An image that is rejected and later approved does not count toward first-pass acceptance.

"Rejected" counts rejection events, not the images currently in a rejected state. An image that is rejected, corrected, and re-approved still adds to the total, so the count reflects every time work is sent back for revision.

Filtering and Export

You can filter results by:

  • Date range
  • Project
  • Labeler (either the whole team, or select members)

You can also export results as a CSV.

HTTP API

Annotation Insights

Roboflow provides statistics on annotations associated with your workspace and projects. You can view annotation insights in the Roboflow dashboard and through the REST API.

On August 1st, 2023, we improved how annotation metrics are tracked. The Annotation Insights v2 endpoint provides annotation data from August 1st, 2023 and later.

To retrieve annotation insights for a workspace, make a GET request to the following endpoint:

https://api.roboflow.com/${WORKSPACE}/stats

This endpoint accepts the following URL parameters:

ParameterDescriptionRequired
api_key<a href="https://docs.roboflow.com/reference/platform/rest-api/authenticate-with-the-rest-api" class="button primary">API Authentication</a>Yes
startDateStart date in YYYY-MM-DD format. Data available from 2023-08-01 onward.Yes
endDateEnd date in YYYY-MM-DD format.Yes
projectProject slug (dataset URL) to filter results.Optional
userIdUser ID to filter results.Optional

Example response:

{
    "data": [
        {
            "approved": 73,
            "boxesDrawn": 127,
            "imagesLabeled": 73,
            "uniqueImagesLabeled": 70,
            "projectId": "projectId123",
            "projectName": "My CV Project",
            "markedNull": 8,
            "modelAssisted": 1,
            "rejected": 2,
            "labelerId": "labelerId123",
            "workspaceId": "workspaceId123",
            "approvalRate": 97.26
        },
        {
            "approved": 0,
            "boxesDrawn": 10,
            "imagesLabeled": 5,
            "uniqueImagesLabeled": 5,
            "projectId": "projectId123",
            "projectName": "My CV Project",
            "markedNull": 0,
            "modelAssisted": 0,
            "rejected": 0,
            "labelerId": "labelerId456",
            "workspaceId": "workspaceId123",
            "approvalRate": null
        }
    ],
    "labelers": [
        {
            "displayName": "Lenny",
            "email": "lenny@roboflow.foo",
            "id": "labelerId123"
        },
        {
            "displayName": "Dana",
            "email": "dana@roboflow.foo",
            "id": "labelerId456"
        }
    ],
    "stats": {
        "numImagesLabeled": 78,
        "numBoxesDrawn": 137,
        "numImagesMarkedNull": 8,
        "totalImagesUsingModelAssist": 1,
        "approvalRate": 97.26
    }
}

Annotation Insights Data Structure

This endpoint returns a payload with the following structure:

  • data: Per-labeler metrics grouped by project. Each object represents one labeler's activity on a single project.
    • projectId: ID of the project (from session.datasetId).
    • projectName: Project name, resolved via getProjectsByIds.
    • projectType: Type of project (e.g., "object-detection").
    • labelerId: Unique ID of the labeler.
    • workspaceId: ID of the workspace this session belongs to.
    • imagesLabeled: Count of images where the labeler created, edited, deleted annotations, or marked them null. Counted per session, so an image worked on across several days counts more than once.
    • uniqueImagesLabeled: The same count with each image counted only once across the date range.
    • boxesDrawn: Net number of annotations created (equals boxesAdded - boxesRemoved).
    • markedNull: Number of images explicitly marked as null by the labeler.
    • modelAssisted: Count of images where model assist was used.
    • approved: Count of images that were approved.
    • rejected: Count of rejection events for this labeler/project pairing. Each rejection is counted independently, even if the image was later approved.
    • approvalRate: First-pass acceptance rate - the percentage of reviewed images that were approved without ever being rejected. Returns null when no images were reviewed.
    • netBoxesAdded: Total of the number of new boxes created within each session (see note below)
    • netBoxesUpdated: Currently equivalent to boxesUpdated (included for consistency).
    • boxesAdded: Total number of annotations created.
    • boxesRemoved: Total number of annotations deleted.
    • boxesUpdated: Total number of annotations edited.
  • labelers: Metadata for each labeler ID present in data.
    • Derived from unique labelerIds.
    • id: Labeler’s user ID.
    • displayName: Name from the user profile.
    • email: Email address.
      • For system labelers (e.g., autolabelservice), returns placeholder values.
  • meta: Supplementary metadata.
    • notices: Array of disclaimers.
      • Currently includes a single item noting that metrics are available only after August 1, 2023.
  • stats: Aggregated workspace-level totals across all sessions.
    • numImagesLabeled: Total count of unique labeled images.
    • numBoxesDrawn: Net annotations created across all sessions.
    • numImagesMarkedNull: Images marked null at least once.
    • totalImagesUsingModelAssist: Images labeled with model assistance.
    • numBoxesAdded: Total number of annotations created.
    • numBoxesRemoved: Total number of annotations deleted.
    • numBoxesUpdated: Total number of annotations edited.
    • netBoxesAdded: numBoxesAdded - numBoxesRemoved.
    • netBoxesUpdated: numBoxesUpdated (included for naming symmetry).
    • approvalRate: Aggregate first-pass acceptance rate across all labelers and projects - the percentage of reviewed images approved without ever being rejected. Returns null when no images were reviewed.

Because data[].imagesLabeled , in the per-labeler counts, records each session separately, the same image can be counted more than once if it was labeled on multiple days or by multiple labelers. Use data[].uniqueImagesLabeled to count each image once per labeler. The overall stats.numImagesLabeled field is derived from combinedData and counts each unique image only once across the date range. This difference often explains why the total image count from the API may not exactly match what the UI displays, depending on which metric the UI uses (per-session vs. unique images).

netBoxesAdded: For each session, Roboflow counts boxes added (boxes that are present at the time the session ends; if a box is added, then removed before the session ends, it will not be included in the count) within that one session. The netBoxesAdded stat totals the net box additions (they do not match later deletions). It therefore equals the sum of “Total of the number of new boxes created within each session,” not the dataset’s final box count.

Annotation Insights (Legacy Endpoint)

This endpoint will soon be deprecated. Please upgrade to the new endpoint: Annotation Stats v2

Roboflow provides statistics on annotations associated with your workspace and projects. You can view annotation insights in the Roboflow dashboard and through the REST API.

To retrieve annotation insights for a workspace, make a GET request to the following endpoint:

https://api.roboflow.com/workspace-stats

This endpoint accepts the following URL parameters:

  • api_key: API key for the workspace from which to retrieve statistics.
  • start: Retrieve statistics starting from this date (accepts a number in milliseconds).
  • end: Retrieve statistics ending from this date (accepts a number in milliseconds).
  • includeTicks: When true, include graphing ticks.
  • projectId: Retrieve data only for the specified project.
  • rawData: When true, returns raw (un-aggregated) data for unique images labeled.
  • limit: The number of records to return. rawData must be true.
  • offset: Offset of records to be returned. rawData must be true.

This endpoint returns a payload with the following structure:

{
    "data": {
        "last_updated": "2023-01-01T20:07:21.057Z",
        "data": [
            {
                "projectId": "project123",
                "projectName": "My CV Project",
                "total_time_spent_annotating_minutes": 24.09,
                "total_images_labeled": 10,
                "total_boxes_created": 0,
                "seconds_per_image": 31,
                "num_images_marked_null": 0,
                "acceptance_rate": 0
            }
        ],
        "labelers": [
            {
                "id": "labelerId123",
                "displayName": "Lenny Raccoon",
                "email": "lenny@roboflow.foo"
            }
        ],
        // if includeTicks=true
        "ticks": [
            {
                start_ms": 1656929228959,
                "end_ms": 1660867628959,
                "values": {
                    "labelerId123": {
                        "total_time_spent_annotating_minutes": 133.38,
                        "total_images_labeled": 983,
                        "total_boxes_created": 1432,
                        "seconds_per_image": 0
                    }
                }
            }
        ]
    }
}