> ## Documentation Index
> Fetch the complete documentation index at: https://docs.daily.co/llms.txt
> Use this file to discover all available pages before exploring further.

# useRecording

> useRecording returns the state and information of a recording in progress, along with helper functions for daily-js recording methods.

<Badge color="blue">Paid plans only</Badge>

`useRecording(params?): Object`

Accepts optional callbacks for [recording events](/reference/daily-js/events/recording-events).

When multiple recordings are running concurrently (see [multi-instance recording](/docs/guides/features/live-streaming/multi-instance)), you can pass an `instanceId` to get per-instance state. Without `instanceId`, the hook returns aggregate state across all instances. For a list of all active instances, see [`useRecordingInstances`](/reference/daily-react/use-recording-instances).

## Parameters (optional)

An object with the following properties:

<ParamField body="instanceId" type="string">
  A valid UUID. When provided, returns state for a specific recording instance and filters event callbacks to only fire for that instance. See [multi-instance recording](/docs/guides/features/live-streaming/multi-instance).
</ParamField>

<ParamField body="onRecordingError" type="Function">
  Callback for the [`recording-error`](/reference/daily-js/events/recording-events#recording-error) event.
</ParamField>

<ParamField body="onRecordingStarted" type="Function">
  Callback for the [`recording-started`](/reference/daily-js/events/recording-events#recording-started) event.
</ParamField>

<ParamField body="onRecordingStopped" type="Function">
  Callback for the [`recording-stopped`](/reference/daily-js/events/recording-events#recording-stopped) event.
</ParamField>

## Return value

An object with the following properties:

### Without `instanceId` (aggregate state)

When called without `instanceId`, the hook returns aggregate state across all recording instances. This works well for single-instance use cases — the scalar fields (`layout`, `recordingId`, etc.) reflect the only active instance. With multiple concurrent instances, these fields reflect the first active instance; use `useRecording({ instanceId })` for unambiguous per-instance access.

<ResponseField name="error" type="boolean">
  `true` if any instance has a [`recording-error`](/reference/daily-js/events/recording-events#recording-error). With multiple instances, use `useRecording({ instanceId })` for per-instance error state.
</ResponseField>

<ResponseField name="isLocalParticipantRecorded" type="boolean">
  `true` if the local participant is recorded by any instance.
</ResponseField>

<ResponseField name="isRecording" type="boolean">
  `true` if any recording instance is active.
</ResponseField>

<ResponseField name="layout" type="Object">
  Layout of the first active instance. With multiple instances, use `useRecording({ instanceId })` for per-instance layout.
</ResponseField>

<ResponseField name="local" type="boolean">
  `true` for [`local` recordings](/docs/guides/features/recording/index#local).
</ResponseField>

<ResponseField name="recordingId" type="string">
  Recording ID of the first active instance. With multiple instances, use `useRecording({ instanceId })` for per-instance recording ID.
</ResponseField>

<ResponseField name="recordingStartedDate" type="Date">
  Start date of the first active instance. With multiple instances, use `useRecording({ instanceId })` for per-instance start date.
</ResponseField>

<ResponseField name="startedBy" type="string">
  Starter of the first active instance. With multiple instances, use `useRecording({ instanceId })` for per-instance starter.
</ResponseField>

<ResponseField name="startRecording" type="Function">
  See `daily-js` [`startRecording()`](/reference/daily-js/instance-methods/start-recording).
</ResponseField>

<ResponseField name="stopRecording" type="Function">
  See `daily-js` [`stopRecording()`](/reference/daily-js/instance-methods/stop-recording).
</ResponseField>

<ResponseField name="type" type="string">
  Recording type of the first active instance. With multiple instances, use `useRecording({ instanceId })` for per-instance type.
</ResponseField>

<ResponseField name="updateRecording" type="Function">
  See `daily-js` [`updateRecording()`](/reference/daily-js/instance-methods/update-recording).
</ResponseField>

### With `instanceId` (per-instance state)

When called with `instanceId`, the hook returns state for that specific recording instance only.

<ResponseField name="error" type="boolean">
  `true` if this instance has a recording error.
</ResponseField>

<ResponseField name="errorMsg" type="string">
  Error message for this instance, if any.
</ResponseField>

<ResponseField name="instanceId" type="string">
  The instance ID.
</ResponseField>

<ResponseField name="isLocalParticipantRecorded" type="boolean">
  Whether the local participant is recorded by this instance.
</ResponseField>

<ResponseField name="isRecording" type="boolean">
  Whether this instance is currently recording.
</ResponseField>

<ResponseField name="layout" type="Object">
  The [recording layout](/docs/guides/features/recording#customize-cloud-recording-layouts) for this instance.
</ResponseField>

<ResponseField name="local" type="boolean">
  `true` if this is a local recording.
</ResponseField>

<ResponseField name="recordingId" type="string">
  The recording ID for this instance.
</ResponseField>

<ResponseField name="recordingStartedDate" type="Date">
  When this instance started recording.
</ResponseField>

<ResponseField name="startedBy" type="string">
  Who started this recording instance.
</ResponseField>

<ResponseField name="startRecording" type="Function">
  See `daily-js` [`startRecording()`](/reference/daily-js/instance-methods/start-recording).
</ResponseField>

<ResponseField name="stopRecording" type="Function">
  See `daily-js` [`stopRecording()`](/reference/daily-js/instance-methods/stop-recording).
</ResponseField>

<ResponseField name="type" type="string">
  The recording type for this instance.
</ResponseField>

<ResponseField name="updateRecording" type="Function">
  See `daily-js` [`updateRecording()`](/reference/daily-js/instance-methods/update-recording).
</ResponseField>

## Example

### Basic usage

```jsx theme={null}
import { useRecording } from '@daily-co/daily-react';

export const UseRecordingDemo = () => {
  const recording = useRecording();

  return <div>{!recording.isRecording ? 'Not' : ''} recording</div>;
};
```

### Multi-instance usage

```jsx theme={null}
import { useRecording } from '@daily-co/daily-react';
import { useRecordingInstances } from '@daily-co/daily-react';

// instanceId must be a valid UUID
const PORTRAIT_INSTANCE = 'a1b2c3d4-5678-9abc-def0-1234567890ab';
const LANDSCAPE_INSTANCE = 'b2c3d4e5-6789-abcd-ef01-234567890abc';

export const MultiRecordingDemo = () => {
  // Aggregate state: true if any instance is recording
  const { isRecording } = useRecording();

  // Per-instance state
  const portraitRecording = useRecording({
    instanceId: PORTRAIT_INSTANCE,
  });
  const landscapeRecording = useRecording({
    instanceId: LANDSCAPE_INSTANCE,
  });

  return (
    <div>
      <p>Any recording active: {isRecording ? 'Yes' : 'No'}</p>
      <p>Portrait: {portraitRecording.isRecording ? 'Recording' : 'Idle'}</p>
      <p>Landscape: {landscapeRecording.isRecording ? 'Recording' : 'Idle'}</p>
    </div>
  );
};
```

## See also

<CardGroup>
  <Card title="Hooks" icon="code" iconType="solid">
    * [useRecordingInstances()](/reference/daily-react/use-recording-instances)
  </Card>

  <Card title="daily-js methods" icon="code" iconType="solid">
    * [startRecording()](/reference/daily-js/instance-methods/start-recording)
    * [stopRecording()](/reference/daily-js/instance-methods/stop-recording)
    * [updateRecording()](/reference/daily-js/instance-methods/update-recording)
  </Card>

  <Card title="Events" icon="bolt" iconType="solid">
    * [recording-started](/reference/daily-js/events/recording-events#recording-started)
    * [recording-stopped](/reference/daily-js/events/recording-events#recording-stopped)
    * [recording-error](/reference/daily-js/events/recording-events#recording-error)
  </Card>

  <Card title="Guides" icon="book-open" iconType="solid">
    * [Multi-instance live streaming and recording](/docs/guides/features/live-streaming/multi-instance)
  </Card>
</CardGroup>
