---
title: "Get a recording"
method: GET
path: "/v1/recordings/{recordingId}"
tags: ["Recordings"]
---

# Get a recording

`GET /v1/recordings/{recordingId}`

## Request

- Base URL: `https://api.ironfang.com/analytics`
- URL: `https://api.ironfang.com/analytics/v1/recordings/{recordingId}`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer

One recording with everything kept about it and its epochs. Needs analytics.sessions.read.

## Response `200`

The recording

- RecordingDetail
  - `browser` string, nullable, required: Coarse class from the user agent.
  - `bytes` integer, required: Compressed bytes stored.
  - `chunks` integer, required
  - `country` string, nullable, required: From Cloudflare, when the request came through it.
  - `created_at` string, date-time, required
  - `device` 'desktop' | 'mobile' | 'tablet' | 'null', nullable, required
  - `duration_ms` integer, required: The recorded activity, in milliseconds: in each page load, from its first batch's start to its last batch's end by the browser's monotonic clock, summed.
  - `end_reason` 'finished' | 'idle_timeout' | 'duration_cap' | 'byte_cap' | 'site_disabled' | 'null', nullable, required
  - `ended_at` string, date-time, nullable, required
  - `entry_path` string, nullable, required
  - `events` integer, required
  - `expires_at` string, date-time, required
  - `first_received_at` string, date-time, nullable, required
  - `id` string, uuid, required
  - `ip` string, nullable, required: The visitor's IP address.
  - `last_received_at` string, date-time, nullable, required
  - `last_seen_at` string, date-time, required: The last batch or heartbeat. An open page sends a heartbeat every 30 seconds.
  - `live` boolean, required: Still open and heard from in the last 90 seconds: someone is on the page. Open but quiet means the visitor has most likely gone; the recording closes after 30 minutes without a word, because leaving a page cannot be told apart from moving to the next one.
  - `origin` string, required
  - `os` string, nullable, required
  - `playable` boolean, required: True once some epoch holds a checkpoint at its start.
  - `session_id` string, uuid, nullable, required: The session the recording belongs to. Null only for a recording made before sessions that has not been placed in one yet.
  - `site_id` string, uuid, required
  - `site_name` string, required
  - `state` 'pending' | 'recording' | 'ready' | 'partial' | 'unplayable', required
  - `visitor_id` string, uuid, nullable, required: The browser that made the recording: a random id the recorder (SDK 0.3.0 and later) keeps in the site's localStorage. The same id on two recordings is the same browser, unless its storage was cleared in between. Null for recordings from older recorders.
  - `config_version` integer, required: The site configuration the recording was made under.
  - `epochs` Epoch[], required
    - `bytes` integer, required
    - `contiguous_through` integer, required: The highest sequence before the first gap; -1 when none.
    - `created_at` string, date-time, required
    - `has_checkpoint` boolean, required
    - `id` string, uuid, required
    - `index` integer, required: A page load or a restart from a fresh checkpoint.
    - `max_sequence` integer, required
  - `ip_source` 'cloudflare' | 'edge' | 'peer' | 'null', nullable, required: cloudflare is the visitor's address as Cloudflare reported it; edge and peer are whoever connected, which is the visitor only when nothing sat in between.
  - `language` string, nullable, required
  - `pixel_ratio` number, nullable, required
  - `referrer` string, nullable, required: Origin and path only; the query and fragment are never kept.
  - `rrweb_version` string, nullable, required
  - `screen` Size, required
    - `height` integer, required
    - `width` integer, required
  - `sdk_version` string, nullable, required
  - `timezone` string, nullable, required: IANA time zone the browser reported.
  - `user_agent` string, nullable, required: The full User-Agent header, at most 512 characters.
  - `viewport` Size, required
    - `height` integer, required
    - `width` integer, required

## Other responses

- `401`: No credential, an invalid one, an expired partner integration key, or a delegated token where none is accepted (`unauthorized`, `invalid_api_key`, `api_key_expired`, `delegated_not_allowed`).
- `403`: The credential lacks the permission or scope, names another organisation, or belongs to a partner integration that is not active (`forbidden`, `insufficient_scope`, `integration_inactive`).
- `404`: No such object in this organisation (`not_found`).

---

[API](https://skmtc.dev/ironfang/apis/ironfang-analytics-api.md) · [All operations](https://skmtc.dev/ironfang/apis/ironfang-analytics-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ironfang/apis/ironfang-analytics-api/revisions/08197080c3d7?raw)
