---
title: "Download a paid file (public, entitlement-gated)"
method: GET
path: "/public/playground/entitlements/{slug}/download/{assetId}"
tags: ["app-data"]
---

# Download a paid file (public, entitlement-gated)

`GET /public/playground/entitlements/{slug}/download/{assetId}`

## Request

- Base URL: `https://api.onplana.com/api`
- URL: `https://api.onplana.com/api/public/playground/entitlements/{slug}/download/{assetId}`
- Auth: none required

Streams a file the app owner uploaded as paid content. The bytes are private until this endpoint authorises them, which is what makes the paywall real , a static bundle can never hold a file back on its own. Always served as an attachment. The entitlement is re-checked per request, so a refund closes access on the next click.

## Path parameters

- `slug` string, required
- `assetId` string, required

## Query parameters

- `key` string, required

## Response `200`

The file bytes (Content-Disposition: attachment).

## Other responses

- `403`: No valid entitlement for this app.
- `404`: No such paid file on this app.
- `429`: Rate limited , not an entitlement failure.

---

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