Install
openclaw skills install aioz-stream-toolkitRespond to user requests for AIOZ Stream API. Use provided scripts to upload videos, fetch analytics, manage media, and create livestreams.
openclaw skills install aioz-stream-toolkitInteract with AIOZ Stream API quickly with API key authentication. A suite of integrated bash scripts is provided to automatically call REST APIs.
This skill uses API key authentication via environment variables:
STREAM_PUBLIC_KEY: Your AIOZ Stream public key (provided by the platform)STREAM_SECRET_KEY: Your AIOZ Stream secret key (provided by the platform)Credential-safe policy:
If credentials are not present in the shell session, set them once before running scripts:
export STREAM_PUBLIC_KEY="YOUR_STREAM_PUBLIC_KEY"
export STREAM_SECRET_KEY="YOUR_STREAM_SECRET_KEY"
Header mapping used by scripts:
STREAM_PUBLIC_KEY -> stream-public-key headerSTREAM_SECRET_KEY -> stream-secret-key headerThis keeps credentials out of repeated command history and avoids accidental exposure.
When the user asks for a feature, use one of the bash scripts located in the scripts/ directory.
./scripts/upload_video_file.sh FILE_PATH "TITLE"./scripts/get_media_list.sh [SEARCH] [PAGE]./scripts/get_total_media.sh [SEARCH] [PAGE]{}: ./scripts/get_video_list.sh./scripts/get_video_url_by_name.sh "VIDEO_NAME"./scripts/create_livestream_key.sh "KEY_NAME"./scripts/get_balance.sh./scripts/get_usage_data.sh FROM(dd/mm/yyyy) TO(dd/mm/yyyy)./scripts/get_aggregate_metric.sh TYPE FROM(dd/mm/yyyy) TO(dd/mm/yyyy)./scripts/get_breakdown_metric.sh TYPE FROM(dd/mm/yyyy) TO(dd/mm/yyyy)./scripts/analytic_data.sh TYPE FROM(dd/mm/yyyy) TO(dd/mm/yyyy)Use this script to automatically create a video object, upload the file, and complete the flow:
./scripts/upload_video_file.sh "/path/to/video.mp4" "Video Title"
Actual behavior in script:
To get metrics or account usage:
./scripts/get_usage_data.sh FROM(dd/mm/yyyy) TO(dd/mm/yyyy)
GET /analytics/data?from=...&to=...&interval=hourFROM/TO must be dd/mm/yyyy format (scripts convert to Unix timestamp)./scripts/get_aggregate_metric.sh TYPE FROM(dd/mm/yyyy) TO(dd/mm/yyyy)
TYPE must be video or audio./scripts/get_breakdown_metric.sh TYPE FROM(dd/mm/yyyy) TO(dd/mm/yyyy)
TYPE must be video or audio./scripts/analytic_data.sh TYPE FROM(dd/mm/yyyy) TO(dd/mm/yyyy)
TYPE must be video or audioDate format notes:
FROM and TO must be dd/mm/yyyy (scripts convert to Unix timestamp internally)To search existing media, get balance, or create keys:
./scripts/get_media_list.sh [SEARCH] [PAGE]./scripts/get_total_media.sh [SEARCH] [PAGE]./scripts/get_video_list.sh./scripts/get_video_url_by_name.sh "Video Name"./scripts/create_livestream_key.sh "Key Name"./scripts/get_balance.shNotes:
get_video_list.sh currently returns all media (POST /media with empty body), not strictly video-only filtering.get_video_url_by_name.sh currently returns search results JSON; it does not extract one URL field automatically.For a typical upload lifecycle, use this sequence:
hls_player_url, hls_url, mp4_url)If using manual curl, the core upload flow is the first 3 steps below.
curl -s -X POST 'https://api.aiozstream.network/api/media/create' \
-H "stream-public-key: $STREAM_PUBLIC_KEY" \
-H "stream-secret-key: $STREAM_SECRET_KEY" \
-H 'Content-Type: application/json' \
-d '{
"title": "VIDEO_TITLE",
"type": "video"
}'
Response: extract data.id as VIDEO_ID for the next steps.
Upload the actual video file binary to the created video object. First, get the file size and compute the MD5 hash:
# Get file size (cross-platform compatible)
FILE_SIZE=$(stat -f%z /path/to/video.mp4 2>/dev/null || stat -c%s /path/to/video.mp4)
END_POS=$((FILE_SIZE - 1))
# Compute MD5 hash
HASH=$(md5sum /path/to/video.mp4 | awk '{print $1}')
Then upload via multipart form-data with the Content-Range header:
curl -s -X POST "https://api.aiozstream.network/api/media/VIDEO_ID/part" \
-H "stream-public-key: $STREAM_PUBLIC_KEY" \
-H "stream-secret-key: $STREAM_SECRET_KEY" \
-H "Content-Range: bytes 0-$END_POS/$FILE_SIZE" \
-F "file=@/path/to/video.mp4" \
-F "index=0" \
-F "hash=$HASH"
Important: The Content-Range header is required for the upload to succeed. Format: bytes {start}-{end}/{total_size}.
Form-data fields:
file: the video file binary (use @/path/to/video.mp4)index: 0 (for single-part upload)hash: MD5 hash of the file partAfter the file part is uploaded, call the complete endpoint to finalize:
curl -s -X GET "https://api.aiozstream.network/api/media/VIDEO_ID/complete" \
-H 'accept: application/json' \
-H "stream-public-key: $STREAM_PUBLIC_KEY" \
-H "stream-secret-key: $STREAM_SECRET_KEY"
This triggers transcoding. The upload is now considered successful.
After completing the upload, fetch the video detail to get the streaming URL:
curl -s "https://api.aiozstream.network/api/media/VIDEO_ID" \
-H "stream-public-key: $STREAM_PUBLIC_KEY" \
-H "stream-secret-key: $STREAM_SECRET_KEY"
Parse the response to find the HLS or MP4 URL from the assets field and return it to the user.
(Applicable if implementing custom logic via API directly)
resolution field):standard — Standard qualitygood — Good qualityhighest — Highest qualitylossless — Lossless qualitytype field):hls — HTTP Live Streaming (container: mpegts or mp4)dash — Dynamic Adaptive Streaming (container: fmp4)scripts/ directory.get_video_list, get_video_url_by_name, get_total_media, get_media_listget_aggregate_metric.sh: Two labeled outputs (Watch Time Sum, View Count)get_breakdown_metric.sh: Four labeled JSON blocks (=== device_type ===, === operator_system ===, === country ===, === browser ===)analytic_data.sh: Combined aggregate + breakdown outputget_usage_data.sh: Raw JSON response with pretty-printed formatupload_video_file.sh prints step-by-step status with final URLstranscoding or URLs are empty, inform the user to check again later.STREAM_PUBLIC_KEY and STREAM_SECRET_KEY.https://api.aiozstream.network/api/ accessibility.STREAM_PUBLIC_KEY and STREAM_SECRET_KEY exist in environment (ask user only if missing)./scripts/upload_video_file.sh "FILE_PATH" "TITLE"