Access Royaltyport project data via the CLI sandbox. Use when working with music royalty contracts, entities, artists, writers, relations, recordings, compositions, or statements.
Access Royaltyport project data through the CLI. Upload and download contracts and statements, track processing status, and explore project data stored as YAML files in a sandboxed filesystem.
Install the CLI and authenticate:
npm install -g @royaltyport/cli
Set your API token as an environment variable (preferred for agents):
export ROYALTYPORT_TOKEN=rp_your_token_here
Or authenticate interactively:
royaltyport login
royaltyport projects
royaltyport project info <project_id>
This prints the project's AGENTS.md — a detailed breakdown of every directory, file type, and YAML field available in the sandbox.
Run bash commands in the sandbox with project exec. Commands run with the workspace root as the working directory.
# Single command
royaltyport project exec <project_id> "ls contracts/"
# Multiple commands in one call (reuses the same sandbox connection)
royaltyport project exec <project_id> "ls contracts/" "cat stats.yaml"
# Run commands in parallel
royaltyport project exec <project_id> "cat stats.yaml" "ls contracts/" --parallel
stdout and stderr stream to their respective outputs. The process exits with the last non-zero exit code (or 0 if all succeed).
# Upload from file
royaltyport contracts upload <project_id> contract.pdf
# Upload with extractions
royaltyport contracts upload <project_id> contract.pdf --extractions extract-royalties,extract-splits,extract-entities
# Upload from base64
royaltyport contracts upload <project_id> --base64 "$BASE64" --file-name contract.pdf
Available extractions: extract-accounting-period, extract-assets, extract-commitments, extract-compensations, extract-control-areas, extract-costs, extract-creative-approvals, extract-dates, extract-royalties, extract-signatures, extract-splits, extract-targets, extract-balances.
# Check once
royaltyport contracts status <project_id> <staging_id>
# Watch until staging and extractions complete
royaltyport contracts status <project_id> <staging_id> --watch
royaltyport contracts list <project_id>
royaltyport contracts list <project_id> --page 2 --per-page 50
royaltyport contracts download <project_id> <contract_id>
royaltyport contracts download <project_id> <contract_id> --output ./downloads/contract.pdf
# Upload from file
royaltyport statements upload <project_id> statement.pdf
# Upload from base64
royaltyport statements upload <project_id> --base64 "$BASE64" --file-name statement.pdf
# Check once
royaltyport statements status <project_id> <staging_id>
# Watch until staging and processing complete
royaltyport statements status <project_id> <staging_id> --watch
royaltyport statements list <project_id>
royaltyport statements list <project_id> --page 2 --per-page 50
royaltyport statements download <project_id> <statement_id>
royaltyport statements download <project_id> <statement_id> --output ./downloads/statement.pdf
stats.yaml # Record counts for all resource types
contracts/contract_{id}/ # Per-contract data
uploaded.yaml # File metadata (id, file_name, file_type)
extracted/ # AI-extracted contract terms
royalties.yaml, entities.yaml, dates.yaml, control_areas.yaml,
compensations.yaml, costs.yaml, artists.yaml, writers.yaml,
recordings.yaml, compositions.yaml, signatures.yaml, splits.yaml,
accounting_period.yaml, languages.yaml, types.yaml,
creative_approvals.yaml, targets.yaml, commitments.yaml
relationships/ # Parent/sibling/child links
statements.yaml # Linked statements
entities/entity_{id}/ # metadata.yaml, merged.yaml, relations.yaml, artists.yaml, writers.yaml
artists/artist_{id}/ # metadata.yaml, merged.yaml, entities.yaml
writers/writer_{id}/ # metadata.yaml, merged.yaml, entities.yaml
relations/relation_{id}/ # metadata.yaml, merged.yaml, entities.yaml
recordings/recording_{id}/ # metadata.yaml, products.yaml, tracks.yaml
compositions/composition_{id}/ # metadata.yaml, products.yaml, tracks.yaml
statements/
statement_{id}/ # metadata.yaml, contracts.yaml
recordings/statement_{id}/assets.yaml # Recording assets (isrc, upc, matched)
compositions/statement_{id}/assets.yaml # Composition assets (iswc, work_id, matched)
royaltyport project exec $PROJECT_ID "cat stats.yaml"
# List all contracts
royaltyport project exec $PROJECT_ID "ls contracts/"
# Find contract by name
royaltyport project exec $PROJECT_ID "grep -ril 'CONTRACT_NAME' contracts/contract_*/uploaded.yaml"
# Find contracts involving an entity
royaltyport project exec $PROJECT_ID "grep -ril 'ENTITY_NAME' contracts/contract_*/extracted/entities.yaml"
# File metadata
royaltyport project exec $PROJECT_ID "cat contracts/contract_{id}/uploaded.yaml"
# Extracted terms
royaltyport project exec $PROJECT_ID "cat contracts/contract_{id}/extracted/royalties.yaml"
royaltyport project exec $PROJECT_ID "cat contracts/contract_{id}/extracted/splits.yaml"
royaltyport project exec $PROJECT_ID "ls contracts/contract_{id}/extracted/"
# Search by name
royaltyport project exec $PROJECT_ID "grep -rl 'SEARCH_TERM' artists/"
royaltyport project exec $PROJECT_ID "grep -rl 'SEARCH_TERM' writers/"
royaltyport project exec $PROJECT_ID "grep -rl 'SEARCH_TERM' entities/"
# List all artist names
royaltyport project exec $PROJECT_ID "grep -rh '^name:' artists/artist_*/metadata.yaml | sort"
# Read artist details
royaltyport project exec $PROJECT_ID "cat artists/artist_{id}/metadata.yaml"
royaltyport project exec $PROJECT_ID "cat artists/artist_{id}/merged.yaml"
# Search by name or ISRC/ISWC
royaltyport project exec $PROJECT_ID "grep -rl 'SEARCH_TERM' recordings/"
royaltyport project exec $PROJECT_ID "grep -rl 'ISWC_CODE' compositions/"
# Read recording details
royaltyport project exec $PROJECT_ID "cat recordings/recording_{id}/metadata.yaml"
# List statements
royaltyport project exec $PROJECT_ID "ls statements/ | head -20"
# Read statement metadata
royaltyport project exec $PROJECT_ID "cat statements/statement_{id}/metadata.yaml"
# Read matched recording assets on a statement
royaltyport project exec $PROJECT_ID "cat statements/recordings/statement_{id}/assets.yaml"
# Fetch several files in one call
royaltyport project exec $PROJECT_ID \
"cat stats.yaml" \
"ls contracts/" \
"ls statements/"
# Parallel reads for independent data
royaltyport project exec $PROJECT_ID \
"cat contracts/contract_{id}/extracted/royalties.yaml" \
"cat contracts/contract_{id}/extracted/entities.yaml" \
--parallel
stats.yaml to understand how much data the project has.grep -rl for searching across files, grep -rh for extracting values.merged.yaml — artists, writers, and entities may have duplicates merged into a root record.grep, cat, find, wc, sort, head) all work.extracted/ are AI-extracted terms. One YAML file per category.project exec to avoid repeated sandbox connections.--parallel when commands are independent and you want faster results.