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

# Continue streaming across multiple Runs

> Stream data across restarts or separate processes

After completing this topic, you can retrieve existing Runs by client key or name and resume streaming data into them across restarts or separate processes.

## Before you begin

* You have already created at least one Run. See [Organize streamed data into Assets and Runs](/documentation/ingest/stream/organize-streamed-data-into-assets-and-runs).
* You have a Sift API key and base URL. See [Authentication](/documentation/manage/set-up-api-access).

## How Run retrieval works

When a process restarts or a new process needs to stream into an existing Run, you can look up the Run by its `client_key` or other criteria instead of storing the server-assigned `run_id` externally. Sift provides two retrieval methods:

* `RunService.GetRun`: retrieves a single Run by its exact `run_id`. Use this when you already have the ID.
* `RunService.ListRuns`: searches for Runs using filter criteria such as `client_key` or `name`. Use this when you need to find a Run without a stored ID.

## Retrieve and resume a Run

### Step 1: Look up a Run by client key

Use `RunService.ListRuns` with a filter on `client_key` to find a specific Run.

<CodeGroup>
  ```bash curl theme={null}
  curl -G \
    -H "Authorization: Bearer $API_TOKEN" \
    -d "filter=client_key=='example_client_key'" \
    $SIFT_REST_URL/api/v2/runs
  ```

  ```bash grpcurl theme={null}
  grpcurl -H "authorization: Bearer $API_TOKEN" -d @ $SIFT_GRPC_URL:$PORT_NUM sift.runs.v2.RunService/ListRuns <<EOM
  {
    "filter": "client_key == 'example_client_key'"
  }
  EOM
  ```
</CodeGroup>

Other available search parameters are documented in [ListRunsRequest](/api/reference/protocol-buffers/runs#listrunsrequest).

### Step 2: Include the Run ID in subsequent ingestion requests

Once you have the `run_id`, include it in your `IngestWithConfigDataStreamRequest` to continue associating new data with that Run.

### Step 3: Update a Run

To modify an existing Run (for example, to set its `stop_time`), use `RunService.UpdateRun`. See [UpdateRunRequest](/api/reference/protocol-buffers/runs#updaterunrequest) for the available fields.

## Verify the result

After streaming additional data into the Run, open Sift and navigate to the asset. The Run should show updated data covering the full time range across all streaming sessions.

## Next steps

* [Organize streamed data into Assets and Runs](/documentation/ingest/stream/organize-streamed-data-into-assets-and-runs)
* [Stream telemetry from a running application](/documentation/ingest/stream/stream-telemetry-from-a-running-application)

## Reference

* [Run API reference](/api/reference/protocol-buffers/runs#run)
* [RunService reference](/api/reference/protocol-buffers/runs#runservice)
* [ListRunsRequest](/api/reference/protocol-buffers/runs#listrunsrequest)
* [UpdateRunRequest](/api/reference/protocol-buffers/runs#updaterunrequest)
* [Runs reference](/documentation/reference/runs-reference)
