---
title: "Create an asset"
method: POST
path: "/v1/assets"
tags: ["Assets"]
---

# Create an asset

`POST /v1/assets`

## Request

- Base URL: `https://api.scrip.dev`
- URL: `https://api.scrip.dev/v1/assets`
- Auth: HTTP bearer

Create an asset in your organization and link it to the program in `program_id`.

## Headers

- `Idempotency-Key` string

## Request body

- CreateAssetRequest: Creates an asset in a program.
  - `inventory_mode` 'SIMPLE' | 'LOT', required: SIMPLE tracks one balance per participant. LOT tracks individual batches with expiration and vesting dates. Immutable after creation
  - `issuance_policy` 'UNLIMITED' | 'PREFUNDED', required: UNLIMITED mints on demand with no budget cap. PREFUNDED draws from the program wallet. Immutable after creation
  - `max_transaction_amount` string: Optional per-transaction ceiling. Must be a positive decimal string. Null means no limit
  - `name` string, required: The name people see for the asset, such as `Points`.
  - `program_id` string, uuid, required: Program to link this asset to
  - `scale` integer, required: Number of decimal places for amounts (e.g., 2 for dollars and cents). Immutable after creation
  - `symbol` string, required: Short code for this asset, unique in your organization.

## Response `201`

Asset created

- AssetResponse: An asset: the currency or points that participants earn and spend.
  - `created_at` string, date-time: When the asset was created
  - `deleted_at` string, date-time: Set when the asset is archived
  - `id` string, uuid: The id of the asset. Use it in `asset_id` fields and paths.
  - `inventory_mode` string: How balances are tracked
  - `issuance_policy` string: How value is issued
  - `max_transaction_amount` string: Optional per-transaction ceiling. Null means no limit
  - `name` string: The name people see for the asset, such as `Points`.
  - `program_ids` string[]: Programs this asset is linked to
  - `scale` integer: Decimal precision
  - `status` 'ACTIVE' | 'ARCHIVED': Whether the asset is in use (ACTIVE) or retired (ARCHIVED).
  - `symbol` string: Short code for this asset
  - `updated_at` string, date-time: When the asset was last modified

## Other responses

- `400`: Validation failed, or the program in program_id is not ACTIVE (code: validation_error | invalid_json | max_transaction_amount_out_of_range | invalid_status)
- `401`: The API key is missing or not valid. See [Authentication](https://docs.scrip.dev/authentication).
- `403`: The caller is not allowed to do this.
- `404`: Program not found (code: program_not_found)
- `409`: Symbol already exists (code: symbol_already_exists)
- `429`: Too many requests. Wait the number of seconds in the `Retry-After` header, then retry. See [Limits and durations](https://docs.scrip.dev/limits#rate-limits).
- `500`: Something failed on Scrip's side. Retry the request, and quote `request_id` if it keeps failing. [Errors](https://docs.scrip.dev/errors) lists every code, and the [API introduction](https://docs.scrip.dev/api-reference/introduction) describes the error format.

---

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