CasterClub SSL Certificate
This website is secured with a DigiCert TLS/SSL certificate.
- Issued To: www.casterclub.com
- Issued By: DigiCert Inc
- Valid From: Jan 1, 2025
- Valid To: Dec 31, 2025
- Encryption: 256-bit TLS 1.3
Verified independently via your browser's certificate viewer.
ICY-META v2.2 Protocol Specification
Project: Mcaster1DNAS / CasterClub Streaming Standards Initiative (CSSI) Version: 2.2 — March 2026 Maintained By: CasterClub / Mcaster1 Core Team License: Open Spec (CSSI)
Overview
ICY-META v2.2 is an extended streaming metadata protocol built on top of the original SHOUTcast ICY 1.x protocol. It preserves full backwards compatibility with all legacy source encoders and listener clients while adding rich metadata support for modern streaming workflows: live DJ sets, podcasts, video simulcasts, social integration, track-level data, station programming, listener engagement, and content compliance.
The protocol is used by Mcaster1DNAS, mcaster1TagStack, mcaster1DSPEncoder, and mcaster1CastIt, and is published as an open specification by the CasterClub Streaming Standards Initiative (CSSI) for adoption by any streaming platform or client.
All ICY2 fields are optional. Legacy ICY 1.x fields (
icy-name,icy-genre, etc.) are never changed, never removed, and always parsed independently of ICY2 logic.
Protocol History
| Version | Origin | Status | Key Feature |
|---|---|---|---|
| ICY 1.x | Nullsoft SHOUTcast (1999) | LEGACY | icy-name, icy-genre, in-stream metadata blocks |
| ICY2 v2.0 | Icecast-KH extensions | LEGACY | Extended HTTP-based source connect |
| ICY2 v2.1 | Mcaster1DNAS / CSSI (Feb 15, 2026) | SUPERSEDED | Station ID, podcast, video, social, content flags (icy- prefix) |
| ICY2 v2.2 | Mcaster1DNAS / CSSI (Feb 2026) | CURRENT | Track metadata, artwork, show scheduling, audio technical, notices, engagement, distribution, PKI, licensing (icy-meta- prefix) |
ICY 1.x Legacy Protocol — Full Specification
The original SHOUTcast ICY protocol. These headers, formats, and behaviors are preserved exactly as-is and must never be altered by any ICY2 implementation. Any server claiming ICY2 support must continue to handle ICY 1.x clients without modification.
Source Connection Headers
A source client connects to the server and sends its stream headers before audio data begins. Two connection formats exist:
Format A — SHOUTcast Legacy SOURCE
SOURCE /mountpoint HTTP/1.0
Authorization: Basic c291cmNlOnBhc3N3b3Jk
Content-Type: audio/mpeg
icy-name: My Radio Station
icy-genre: Electronic
icy-url: http://mystation.com
icy-pub: 1
icy-br: 128
icy-metaint: 8192
Format B — Icecast2 / Modern PUT
PUT /mountpoint.mp3 HTTP/1.1
Host: server.example.com:8000
Authorization: Basic c291cmNlOnBhc3N3b3Jk
Content-Type: audio/mpeg
icy-name: My Radio Station
icy-genre: Electronic
icy-url: http://mystation.com
icy-pub: 1
icy-br: 128
icy-metaint: 8192
ICY 1.x Source Headers
| Header | Type | Description |
|---|---|---|
icy-name |
String | Station or stream display name |
icy-genre |
String | Genre or content type (e.g., Electronic, Rock) |
icy-url |
URL | Station homepage URL |
icy-pub |
Boolean | Public directory listing — 1 = yes, 0 = no |
icy-br |
Integer | Bitrate in kbps (e.g., 128, 320) |
icy-metaint |
Integer | Bytes of audio between in-stream metadata blocks (e.g., 8192) |
Authentication
| Field | Description |
|---|---|
Authorization: Basic |
Base64-encoded source:password (Icecast2) |
password |
Source password sent inline (legacy SHOUTcast) |
adminpassword |
Admin interface password |
user |
Optional username for SHOUTcast v2 or Icecast2 |
In-Stream Metadata Block Format
ICY 1.x embeds track title changes directly inside the audio byte stream. Every metaint bytes of audio data, a metadata block is inserted:
| Byte(s) | Content |
|---|---|
| 1 byte | Block length indicator N. Actual block size = N × 16 bytes. If N = 0, no metadata follows. |
N × 16 bytes |
Null-padded UTF-8 string in the format: StreamTitle='Artist - Title'; |
# Block length byte = 4 (4 × 16 = 64 bytes total)
# Content (null-padded to 64 bytes):
StreamTitle='Daft Punk - Get Lucky';StreamUrl='';
Only
StreamTitleis universally supported.StreamUrlis optional. The full block is always a multiple of 16 bytes, padded with null bytes (\0).
Server Response to Listener
When a listener client connects, the server responds with ICY headers before the audio stream begins:
ICY 200 OK
icy-notice1: SHOUTcast Distributed Network Audio Server
icy-notice2: (c) 1999-2004 Nullsoft, Inc.
icy-name: My Radio Station
icy-genre: Electronic
icy-url: http://mystation.com
icy-pub: 1
icy-br: 128
icy-metaint: 8192
Content-Type: audio/mpeg
[audio stream data with embedded metadata blocks follows]
ICY2 v2.2 — Protocol Detection
A source client signals ICY2 support by including the icy-metadata-version header. The server uses prefix matching — any 2.x value triggers ICY2 parsing. Legacy ICY 1.x fields are still parsed regardless.
icy-metadata-version: 2.2
- Value
2.x(2.0, 2.1, 2.2, etc.) → parse as ICY2 - Header absent or non-2.x → fall back to ICY 1.x parsing only
- ICY2 clients on ICY1 servers: unknown headers are silently ignored
Station Identity
| Header | Type | Description |
|---|---|---|
icy-meta-station-id |
String | Unique global station ID — alphanumeric, hyphens allowed. Permanent across sessions. |
icy-meta-station-logo |
URL | Station logo or branding image URL |
icy-meta-certissuer-id |
String | Certificate authority ID for verification |
icy-meta-cert-rootca |
String | Root CA hash or fingerprint |
icy-meta-certificate |
String | Base64-encoded PEM certificate |
icy-meta-ssh-pubkey |
String | SSH public key for source authentication |
icy-meta-verification-status |
Enum | unverified | pending | verified | gold |
Programming / Show Scheduling
| Header | Type | Description |
|---|---|---|
icy-meta-show-title |
String | Current show or program title |
icy-meta-show-start |
ISO8601 | Datetime the current show started |
icy-meta-show-end |
ISO8601 | Datetime the current show ends |
icy-meta-next-show |
String | Title of the next scheduled program |
icy-meta-next-show-time |
ISO8601 | Scheduled start time of the next program |
icy-meta-schedule-url |
URL | Link to the full station program schedule |
icy-meta-autodj |
Boolean | 1 = AutoDJ/automation active, 0 = live human DJ |
icy-meta-playlist-name |
String | Current playlist or automation source name |
DJ / Host
| Header | Type | Description |
|---|---|---|
icy-meta-dj-handle |
String | Current DJ or host social handle (e.g., @djsynthwave) |
icy-meta-dj-bio |
String | Short DJ biography or tagline — max 280 characters |
icy-meta-dj-genre |
String | DJ's genre set — comma-separated, max 5 values |
icy-meta-dj-showrating |
Enum | all-ages | teen | mature | explicit |
Track Metadata
Per-track fields pushed on every track change, typically by a metadata injection system (e.g., mcaster1TagStack). icy-meta-track-artwork is the primary field for player album art display.
| Header | Type | Description |
|---|---|---|
icy-meta-track-artwork |
URL | Album or track artwork image URL |
icy-meta-track-album |
String | Album or release name |
icy-meta-track-year |
Integer | Release year |
icy-meta-track-label |
String | Record label |
icy-meta-track-bpm |
Integer | Beats per minute |
icy-meta-track-key |
String | Musical key — Camelot or standard notation (e.g., 8B, Am) |
icy-meta-track-genre |
String | Per-track genre — may differ from station genre |
icy-meta-track-mbid |
UUID | MusicBrainz Recording ID for direct track lookup |
icy-meta-track-isrc |
String | International Standard Recording Code — royalty/licensing tracking |
Podcast
| Header | Type | Description |
|---|---|---|
icy-meta-podcast-host |
String | Podcast creator or host name |
icy-meta-podcast-rating |
Enum | all-ages | teen | mature | explicit |
icy-meta-podcast-rss |
URL | Podcast RSS feed URL |
icy-meta-podcast-episode |
String | Episode title or ID (e.g., S4E1 – Decentralized Rights) |
icy-meta-duration |
Integer | Content runtime in seconds — applies to audio, podcast, or video |
icy-meta-language |
String | ISO 639-1 language tag (e.g., en, en-US, es) |
Audio Technical
Reported by source encoders (e.g., mcaster1DSPEncoder). Allows directories and players to display and verify stream quality. icy-meta-loudness uses EBU R128 integrated LUFS measurement.
| Header | Type | Description |
|---|---|---|
icy-meta-audio-codec |
Enum | mp3 | aac | aac-he | ogg | opus | flac |
icy-meta-samplerate |
Integer | Sample rate in Hz (e.g., 44100, 48000) |
icy-meta-channels |
Integer | 1 = mono, 2 = stereo, 6 = 5.1 surround |
icy-meta-loudness |
Float | Integrated loudness in LUFS per EBU R128 (e.g., -14.0) |
icy-meta-encoder |
String | Encoder software and version (e.g., Mcaster1DSP/1.2.0, BUTT/1.40) |
Video Streaming
| Header | Type | Description |
|---|---|---|
icy-meta-videotype |
Enum | live | short | clip | trailer | ad |
icy-meta-videorating |
Enum | all-ages | teen | mature | explicit |
icy-meta-videolink |
URL | Link to the video content or stream page |
icy-meta-videotitle |
String | Title of the video |
icy-meta-videoposter |
URL | Thumbnail or preview image URL |
icy-meta-videochannel |
String | Creator/channel handle |
icy-meta-videoplatform |
Enum | youtube | tiktok | twitch | kick | rumble | vimeo | custom |
icy-meta-videostart |
ISO8601 | Scheduled start datetime for the video |
icy-meta-videolive |
Boolean | 1 = currently live, 0 = pre-recorded |
icy-meta-videocodec |
String | Video codec in use (e.g., h264, vp9, av1) |
icy-meta-videofps |
Integer | Frames per second |
icy-meta-videoresolution |
String | e.g., 1080p, 4K, 720x1280 |
icy-meta-videonsfw |
Boolean | Video-specific NSFW indicator |
Social, Discovery & Branding
| Header | Type | Description |
|---|---|---|
icy-meta-creator-handle |
String | Platform-agnostic public creator or brand handle |
icy-meta-social-twitter |
String | Twitter/X handle |
icy-meta-social-twitch |
String | Twitch handle |
icy-meta-social-ig |
String | Instagram username |
icy-meta-social-tiktok |
String | TikTok profile name |
icy-meta-social-youtube |
URL | YouTube channel URL — static social presence link |
icy-meta-social-facebook-page |
URL | Facebook page URL |
icy-meta-social-linkedin |
URL | LinkedIn profile URL |
icy-meta-social-linktree |
URL | Unified profile link (Linktree, Beacons, etc.) |
icy-meta-emoji |
String | Mood or emotion indicators (e.g., 🎵🔥🎧) |
icy-meta-hashtag-array |
JSON Array | Searchable tags (e.g., ["#electronic","#dj"]) |
Listener Engagement
| Header | Type | Description |
|---|---|---|
icy-meta-request-enabled |
Boolean | 1 = listener song requests currently open |
icy-meta-request-url |
URL | URL for song requests or listener dedications |
icy-meta-chat-url |
URL | Live listener chat room URL |
icy-meta-tip-url |
URL | Listener donation or tip URL (Ko-fi, Patreon, PayPal) |
icy-meta-events-url |
URL | Link to upcoming station events or gigs page |
Broadcast Distribution
icy-meta-crosspost-platforms lists where the content is simultaneously live — distinct from icy-meta-social-youtube which is a static channel profile link.
| Header | Type | Description |
|---|---|---|
icy-meta-crosspost-platforms |
String | Comma-separated active live platforms (e.g., youtube,twitch,tiktok) |
icy-meta-stream-session-id |
String | Unique ID for this broadcast session — distinct from permanent station-id |
icy-meta-cdn-region |
String | CDN or distribution region (e.g., us-east, eu-west) |
icy-meta-relay-origin |
URL | Origin server URL if this mount is a relay |
Station Notices
Real-time listener announcements pushed via the stream for display in ICY2-aware players and notice boards. icy-meta-notice-expires is ISO8601 — players should hide the notice after this time.
| Header | Type | Description |
|---|---|---|
icy-meta-notice |
String | General listener notice or announcement text |
icy-meta-notice-url |
URL | Click-through URL for more information |
icy-meta-notice-expires |
ISO8601 | Datetime after which the notice should no longer display |
Access, Authentication & Compliance
| Header | Type | Description |
|---|---|---|
icy-meta-auth-token |
JWT | Optional Bearer JWT or custom access token |
icy-meta-nsfw |
Boolean | 1 = explicit content — affects directory listings |
icy-meta-ai-generator |
Boolean | 1 = AI-generated or AI-assisted content |
icy-meta-geo-region |
String | Target geographic region (e.g., US, EU, GLOBAL) |
icy-meta-license-type |
Enum | cc-by | cc-by-sa | cc0 | pro-licensed | all-rights-reserved |
icy-meta-royalty-free |
Boolean | 1 = royalty-free content |
icy-meta-license-territory |
String | Comma-separated ISO country codes (e.g., US,CA,EU) or GLOBAL |
ICY2 v2.1 Backwards Compatibility
The server accepts both the v2.2 icy-meta- prefix and the original v2.1 icy- prefix forms for all ICY2-specific fields. Both always work. Clients should prefer icy-meta- going forward.
| v2.1 Form (still accepted) | v2.2 Standard Form |
|---|---|
icy-station-id |
icy-meta-station-id |
icy-podcast-host |
icy-meta-podcast-host |
icy-podcast-rss |
icy-meta-podcast-rss |
icy-podcast-episode |
icy-meta-podcast-episode |
icy-duration |
icy-meta-duration |
icy-language |
icy-meta-language |
icy-video-type |
icy-meta-videotype |
icy-video-link |
icy-meta-videolink |
icy-video-platform |
icy-meta-videoplatform |
icy-dj-handle |
icy-meta-dj-handle |
icy-social-twitter |
icy-meta-social-twitter |
icy-social-ig |
icy-meta-social-ig |
icy-social-tiktok |
icy-meta-social-tiktok |
icy-emoji |
icy-meta-emoji |
icy-hashtags |
icy-meta-hashtag-array |
icy-auth-token |
icy-meta-auth-token |
icy-nsfw |
icy-meta-nsfw |
icy-ai-generated |
icy-meta-ai-generator |
icy-geo-region |
icy-meta-geo-region |
icy-verification-status |
icy-meta-verification-status |
Use Cases & Examples
Live DJ Set
icy-metadata-version: 2.2
icy-name: ChillZone FM
icy-genre: Electronic/House
icy-br: 320
icy-pub: 1
icy-meta-station-id: chillzone-fm-001
icy-meta-show-title: Late Night House Sessions
icy-meta-show-start: 2026-02-21T22:00:00Z
icy-meta-show-end: 2026-02-22T02:00:00Z
icy-meta-autodj: 0
icy-meta-dj-handle: @djsynthwave
icy-meta-dj-bio: Berlin-based electronic DJ — deep house, techno, and everything in between.
icy-meta-dj-genre: Electronic, House, Techno
icy-meta-dj-showrating: all-ages
icy-meta-track-artwork: https://cdn.example.com/art/track123.jpg
icy-meta-track-bpm: 124
icy-meta-track-key: 8B
icy-meta-track-mbid: 3a8e7c21-1234-5678-abcd-ef0123456789
icy-meta-audio-codec: mp3
icy-meta-samplerate: 44100
icy-meta-channels: 2
icy-meta-loudness: -14.0
icy-meta-request-enabled: 1
icy-meta-chat-url: https://chillzone.fm/chat
icy-meta-tip-url: https://ko-fi.com/djsynthwave
icy-meta-crosspost-platforms: youtube,twitch
icy-meta-notice: Tune in to our YouTube stream for the video feed tonight!
icy-meta-notice-expires: 2026-02-22T02:00:00Z
icy-meta-nsfw: 0
icy-meta-license-type: pro-licensed
Podcast Episode
icy-metadata-version: 2.2
icy-name: FutureTalks
icy-genre: Talk/Technology
icy-br: 128
icy-pub: 1
icy-meta-station-id: futuretalks-001
icy-meta-show-title: FutureTalks Podcast
icy-meta-podcast-host: Sasha Tran
icy-meta-podcast-rating: all-ages
icy-meta-podcast-episode: S4E1 – Decentralized Rights
icy-meta-podcast-rss: https://futuretalks.fm/feed.xml
icy-meta-duration: 3600
icy-meta-language: en
icy-meta-track-artwork: https://futuretalks.fm/episodes/s4e1.jpg
icy-meta-license-type: cc-by
icy-meta-royalty-free: 1
YouTube Simulcast
icy-metadata-version: 2.2
icy-name: ChillZone FM
icy-meta-videotype: live
icy-meta-videolink: https://youtube.com/watch?v=live543
icy-meta-videotitle: Synthwave All Night
icy-meta-videoplatform: youtube
icy-meta-videoresolution: 1080p
icy-meta-videocodec: h264
icy-meta-videofps: 60
icy-meta-videolive: 1
icy-meta-crosspost-platforms: youtube,twitch
icy-meta-stream-session-id: session-20260221-cz-001
TikTok Short-Form Push (No Audio Needed)
icy-metadata-version: 2.2
icy-name: @DropMaster
icy-meta-videotype: short
icy-meta-videolink: https://tiktok.com/@dropmaster/video/7739201
icy-meta-videochannel: @dropmaster
icy-meta-videoplatform: tiktok
icy-meta-videoposter: https://cdn.tiktok.com/posters/7739201.jpg
icy-meta-videoresolution: 720x1280
icy-meta-duration: 45
icy-meta-emoji: 🎵🔥🎥
icy-meta-hashtag-array: ["#beatdrop","#shorts","#music"]
AutoDJ with Notice
icy-metadata-version: 2.2
icy-name: ChillZone FM
icy-meta-autodj: 1
icy-meta-playlist-name: Top 40 Rotation
icy-meta-next-show: Morning Drive with DJ Kane
icy-meta-next-show-time: 2026-02-22T07:00:00Z
icy-meta-schedule-url: https://chillzone.fm/schedule
icy-meta-notice: Live show starts at 7am — DJ Kane in the morning!
icy-meta-notice-expires: 2026-02-22T07:00:00Z
v2.2 Changelog — What's New
New in v2.2 (from v2.1)
- Prefix standardization: All ICY2 headers now use
icy-meta-prefix (v2.1icy-prefix forms still accepted) - Track Metadata:
icy-meta-track-artwork,track-album,track-year,track-label,track-bpm,track-key,track-genre,track-mbid,track-isrc - Audio Technical:
icy-meta-audio-codec,samplerate,channels,loudness,encoder - Programming/Show:
icy-meta-show-title,show-start,show-end,next-show,next-show-time,schedule-url,autodj,playlist-name - DJ/Host:
icy-meta-dj-handle,dj-bio,dj-genre,dj-showrating - Listener Engagement:
icy-meta-request-enabled,request-url,chat-url,tip-url,events-url - Broadcast Distribution:
icy-meta-crosspost-platforms,stream-session-id,cdn-region,relay-origin - Station Notices:
icy-meta-notice,notice-url,notice-expires - Licensing:
icy-meta-license-type,royalty-free,license-territory - Video Enhancements:
icy-meta-videorating,videocodec,videofps,videoresolution,videonsfw - Station Identity:
icy-meta-station-logo,ssh-pubkey - Social Expansion:
icy-meta-creator-handle,social-twitch,social-youtube,social-facebook-page,social-linkedin
What Changed from v2.1
- All v2.1 headers with
icy-prefix remapped toicy-meta-canonical form icy-auth-token-keyrenamed toicy-meta-auth-tokenicy-meta-hashtag-arrayreplacesicy-hashtags(same format)icy-meta-ai-generatorreplacesicy-ai-generated- v2.1 forms are still parsed — no breaking changes
Integration Targets
- DSPs: SAM Broadcaster, Edcast, BUTT, Rocket Broadcaster, Mixxx
- Admin/GUI: mcasterClient, metadata-pusher agents
- Directory: yp.casterclub.com via
/8.json,/status.html, or/push - Webhook/event-forwarding for real-time content relay
Testing with cURL
Basic ICY 1.x Legacy Test
curl -k -X PUT \
-H "icy-name: Test Station" \
-H "icy-genre: Test" \
-H "icy-url: http://test.example.com" \
-H "icy-pub: 1" \
-H "icy-br: 128" \
-H "Authorization: Basic c291cmNlOnBhc3N3b3Jk" \
-H "Content-Type: audio/mpeg" \
--data-binary @audio-file.mp3 \
https://server.example.com:9443/test.mp3
ICY2 v2.2 Full Test
curl -k -X PUT \
-H "icy-metadata-version: 2.2" \
-H "icy-name: Test ICY2 Station" \
-H "icy-genre: Electronic" \
-H "icy-br: 128" \
-H "icy-pub: 1" \
-H "icy-meta-station-id: test-station-001" \
-H "icy-meta-show-title: Test Show" \
-H "icy-meta-autodj: 0" \
-H "icy-meta-dj-handle: @testdj" \
-H "icy-meta-track-artwork: https://example.com/art.jpg" \
-H "icy-meta-track-bpm: 128" \
-H "icy-meta-audio-codec: mp3" \
-H "icy-meta-samplerate: 44100" \
-H "icy-meta-channels: 2" \
-H "icy-meta-loudness: -14.0" \
-H "icy-meta-encoder: curl-test/1.0" \
-H "icy-meta-social-twitter: @teststation" \
-H "icy-meta-request-enabled: 1" \
-H "icy-meta-notice: Testing ICY2 v2.2 integration" \
-H "icy-meta-nsfw: 0" \
-H "icy-meta-ai-generator: 0" \
-H "icy-meta-geo-region: GLOBAL" \
-H "icy-meta-license-type: pro-licensed" \
-H "Authorization: Basic c291cmNlOnBhc3N3b3Jk" \
-H "Content-Type: audio/mpeg" \
--data-binary @audio-file.mp3 \
https://server.example.com:9443/test.mp3
Full Interactive Specification
For the complete interactive specification with code examples in C, Python, Go, JavaScript, and PHP, plus client integration guides for Winamp, Mixxx, Audacious, iTunes, and Windows Media Player, visit:
ICY-META v2.2 Full Specification
Maintainer Contact
CasterClub Streaming Standards Initiative (CSSI) 📧 specs@casterclub.com 🌐 https://casterclub.com/specs/icy-2 💻 GitHub: https://github.com/casterclub/specs 🪪 License: Open Specification / Attribution Preferred