Status: Implementation in Progress — Mcaster1DNAS v2.6.x (February 2026). v2.1 fields are production-ready. v2.2 additions listed here are being rolled in incrementally. See also the implementation guide at ICY2 Protocol.
Specification Version: 2.2  |  Release Date: February 2026  |  Supersedes: ICY-META v2.1 (Feb 15, 2026)
Author: David St John (Saint John) — MediaCast1/Mcaster1DNAS  |  CSSI Spec: ICY2-META-SPECS.md / https://casterclub.com/specs/icy-2

Overview

ICY-META v2.2 is an extended metadata protocol for streaming media servers, providing rich metadata support beyond the legacy ICY 1.x protocol. It maintains backward compatibility while adding modern features for podcasts, video streams, social media integration, track-level metadata, station programming, listener engagement, audio technical parameters, broadcast distribution, and content verification.

Design Principles

  1. Backward Compatible — ICY2 clients can connect to ICY1 servers; ICY1 clients can connect to ICY2 servers
  2. Zero Configuration — Auto-detection via version header, no server config changes needed
  3. HTTP-Based — Pure HTTP header communication, works over HTTP and HTTPS
  4. Extensible — Version numbering allows future enhancements (2.2, 2.3, etc.)
  5. Optional — All fields are optional; only send what’s relevant

Protocol Detection

Version Header

The presence of the icy-metadata-version header indicates ICY2 support:

icy-metadata-version: 2.1

Server Behavior:

Client Handshake

ICY2-compliant source clients send this header with their source PUT/POST request:

PUT /mountpoint.mp3 HTTP/1.1
Host: server.example.com:9443
icy-metadata-version: 2.2
icy-meta-station-id: unique-station-identifier
icy-name: My Station Name
icy-genre: Electronic
icy-br: 128
icy-pub: 1
Authorization: Basic c291cmNlOnBhc3N3b3Jk
Content-Type: audio/mpeg

[audio data]
v2.1 clients sending icy-station-id (without meta) instead of icy-meta-station-id are fully supported. Legacy ICY 1.x fields (icy-name, icy-genre, icy-br, icy-pub) are always parsed regardless of ICY2 version and must always be included for directory and player compatibility.

ICY 1.x Legacy Headers

These are the original SHOUTcast/Icecast ICY protocol headers. They are never modified, never removed, and are always parsed independently of any ICY2 logic. ICY2 fields are additional — these remain exactly as they have always been for full backwards compatibility.

HeaderTypeDescription
icy-nameStringStation or stream display name
icy-genreStringGenre or content type
icy-urlURLStation homepage or site
icy-pubBooleanPublic listing flag (1 = yes)
icy-brIntegerBitrate in kbps
icy-metaintIntegerInterval in bytes between metadata blocks

Legacy auth fields (also unchanged):

FieldDescription
adminpasswordAdmin interface password
passwordSource encoder password
userOptional username (SHOUTcast v2 / Icecast2)

ICY2 v2.1 Header Forms (Backwards Compatible)

These are the original ICY2 v2.1 header names as implemented in the server’s C source (icy2_meta_parse_headers()). They use the icy- prefix without meta. The server continues to accept these from any client that connected using the v2.1 format.

v2.1 Header (icy- prefix)v2.2 Header (icy-meta- prefix)Stats Key
icy-station-idicy-meta-station-idicy2-station-id
icy-podcast-hosticy-meta-podcast-hosticy2-podcast-host
icy-podcast-rssicy-meta-podcast-rssicy2-podcast-rss
icy-podcast-episodeicy-meta-podcast-episodeicy2-podcast-episode
icy-durationicy-meta-durationicy2-duration
icy-languageicy-meta-languageicy2-language
icy-video-typeicy-meta-videotypeicy2-video-type
icy-video-linkicy-meta-videolinkicy2-video-link
icy-video-titleicy-meta-videotitleicy2-video-title
icy-video-platformicy-meta-videoplatformicy2-video-platform
icy-video-resolutionicy-meta-videoresolutionicy2-video-resolution
icy-dj-handleicy-meta-dj-handleicy2-dj-handle
icy-social-twittericy-meta-social-twittericy2-social-twitter
icy-social-igicy-meta-social-igicy2-social-instagram
icy-social-tiktokicy-meta-social-tiktokicy2-social-tiktok
icy-emojiicy-meta-emojiicy2-emoji
icy-hashtagsicy-meta-hashtag-arrayicy2-hashtags
icy-auth-tokenicy-meta-auth-tokenicy2-auth-token
icy-nsfwicy-meta-nsfwicy2-nsfw
icy-ai-generatedicy-meta-ai-generatoricy2-ai-generated
icy-geo-regionicy-meta-geo-regionicy2-geo-region
icy-certificate-verifyicy-meta-certificateicy2-certificate
icy-verification-statusicy-meta-verification-statusicy2-verification-status
The C parser tries icy-meta-X first, then falls back to icy-X for each field — both always work.

Field Reference (v2.2)

Station Identity

HeaderTypeStats KeyNotes
icy-meta-station-idStringicy2-station-idPermanent unique station identifier
icy-meta-station-logoURLicy2-station-logoStation logo/branding image
icy-meta-certissuer-idStringicy2-certissuer-idCertificate authority ID
icy-meta-cert-rootcaStringicy2-cert-rootcaRoot CA hash
icy-meta-certificateStringicy2-certificateBase64 PEM certificate
icy-meta-ssh-pubkeyStringicy2-ssh-pubkeySSH public key for auth
icy-meta-verification-statusEnumicy2-verification-statusunverified/pending/verified/gold

Programming / Show

HeaderTypeStats KeyNotes
icy-meta-show-titleStringicy2-show-titleCurrent program title
icy-meta-show-startISO8601icy2-show-startCurrent show start time
icy-meta-show-endISO8601icy2-show-endCurrent show end time
icy-meta-next-showStringicy2-next-showNext scheduled program
icy-meta-next-show-timeISO8601icy2-next-show-timeNext show start time
icy-meta-schedule-urlURLicy2-schedule-urlFull program schedule URL
icy-meta-autodjBooleanicy2-autodj1=automation active, 0=live
icy-meta-playlist-nameStringicy2-playlist-nameCurrent playlist or automation source

DJ / Host

HeaderTypeStats KeyNotes
icy-meta-dj-handleStringicy2-dj-handleSocial handle (e.g., @djsynthwave)
icy-meta-dj-bioStringicy2-dj-bioShort biography or tagline, max 280 chars
icy-meta-dj-genreStringicy2-dj-genreComma-separated genres, max 5
icy-meta-dj-showratingEnumicy2-dj-showratingall-ages, teen, mature, explicit

Track Metadata

HeaderTypeStats KeyNotes
icy-meta-track-artworkURLicy2-track-artworkAlbum/track art URL — primary player display
icy-meta-track-albumStringicy2-track-albumAlbum or release name
icy-meta-track-yearIntegericy2-track-yearRelease year
icy-meta-track-labelStringicy2-track-labelRecord label
icy-meta-track-bpmIntegericy2-track-bpmBeats per minute
icy-meta-track-keyStringicy2-track-keyMusical key (e.g., 8B, Am)
icy-meta-track-genreStringicy2-track-genrePer-track genre
icy-meta-track-mbidUUIDicy2-track-mbidMusicBrainz Recording ID
icy-meta-track-isrcStringicy2-track-isrcInternational Standard Recording Code

Podcast

HeaderTypeStats KeyNotes
icy-meta-podcast-hostStringicy2-podcast-hostPodcast creator/host name
icy-meta-podcast-ratingEnumicy2-podcast-ratingall-ages, teen, mature, explicit
icy-meta-podcast-rssURLicy2-podcast-rssRSS feed URL
icy-meta-podcast-episodeStringicy2-podcast-episodeEpisode title or ID
icy-meta-durationIntegericy2-durationContent runtime in seconds (all types)
icy-meta-languageStringicy2-languageISO 639-1 language tag

Video

HeaderTypeStats KeyNotes
icy-meta-videotypeEnumicy2-video-typelive, short, clip, trailer, ad
icy-meta-videoratingEnumicy2-video-ratingall-ages, teen, mature, explicit
icy-meta-videolinkURLicy2-video-linkVideo content URL
icy-meta-videotitleStringicy2-video-titleVideo title
icy-meta-videoposterURLicy2-video-posterThumbnail/preview image
icy-meta-videochannelStringicy2-video-channelCreator/channel handle
icy-meta-videoplatformEnumicy2-video-platformyoutube, tiktok, twitch, kick, rumble, vimeo
icy-meta-videostartISO8601icy2-video-startScheduled video start time
icy-meta-videoliveBooleanicy2-video-live1=currently live
icy-meta-videocodecStringicy2-video-codech264, vp9, av1
icy-meta-videofpsIntegericy2-video-fpsFrames per second
icy-meta-videoresolutionStringicy2-video-resolutione.g., 1080p, 4K
icy-meta-videonsfwBooleanicy2-video-nsfwVideo-specific NSFW flag

Audio Technical

HeaderTypeStats KeyNotes
icy-meta-audio-codecEnumicy2-audio-codecmp3, aac, aac-he, ogg, opus, flac
icy-meta-samplerateIntegericy2-samplerateSample rate in Hz
icy-meta-channelsIntegericy2-channels1=mono, 2=stereo, 6=5.1
icy-meta-loudnessFloaticy2-loudnessLUFS integrated loudness (EBU R128)
icy-meta-encoderStringicy2-encoderEncoder name and version

Social

HeaderTypeStats KeyNotes
icy-meta-creator-handleStringicy2-creator-handlePlatform-agnostic public identity
icy-meta-social-twitterStringicy2-social-twitterTwitter/X handle
icy-meta-social-twitchStringicy2-social-twitchTwitch handle
icy-meta-social-igStringicy2-social-instagramInstagram username
icy-meta-social-tiktokStringicy2-social-tiktokTikTok profile name
icy-meta-social-youtubeURLicy2-social-youtubeYouTube channel URL
icy-meta-social-facebook-pageURLicy2-social-facebookFacebook page URL
icy-meta-social-linkedinURLicy2-social-linkedinLinkedIn profile URL
icy-meta-social-linktreeURLicy2-social-linktreeUnified profile link
icy-meta-emojiStringicy2-emojiMood/emotion indicators
icy-meta-hashtag-arrayJSONicy2-hashtagsJSON array of hashtag strings

Listener Engagement

HeaderTypeStats KeyNotes
icy-meta-request-enabledBooleanicy2-request-enabled1=requests open
icy-meta-request-urlURLicy2-request-urlSong request / dedication form
icy-meta-chat-urlURLicy2-chat-urlLive listener chat URL
icy-meta-tip-urlURLicy2-tip-urlListener donation/tip URL
icy-meta-events-urlURLicy2-events-urlUpcoming events page

Broadcast Distribution

HeaderTypeStats KeyNotes
icy-meta-crosspost-platformsStringicy2-crosspost-platformsComma-sep active platforms (e.g., youtube,twitch)
icy-meta-stream-session-idStringicy2-stream-session-idUnique ID for this broadcast session
icy-meta-cdn-regionStringicy2-cdn-regionCDN distribution region (e.g., us-east, eu-west)
icy-meta-relay-originURLicy2-relay-originOrigin server URL if this is a relay mount

Station Notices

HeaderTypeStats KeyNotes
icy-meta-noticeStringicy2-noticeGeneral listener notice/announcement
icy-meta-notice-urlURLicy2-notice-urlClick-through URL for notice
icy-meta-notice-expiresISO8601icy2-notice-expiresDatetime after which notice is hidden

Access & Authentication

HeaderTypeStats KeyNotes
icy-meta-auth-tokenJWTicy2-auth-tokenBearer JWT or custom token

Content Flags & Compliance

HeaderTypeStats KeyNotes
icy-meta-nsfwBooleanicy2-nsfwBinary NSFW filter flag for directory filtering
icy-meta-ai-generatorBooleanicy2-ai-generatedAI-generated content transparency flag
icy-meta-geo-regionStringicy2-geo-regionTarget region (ISO 3166-1, e.g., US, EU, GLOBAL)
icy-meta-license-typeEnumicy2-license-typecc-by, cc0, pro-licensed, all-rights-reserved
icy-meta-royalty-freeBooleanicy2-royalty-free1=royalty-free content
icy-meta-license-territoryStringicy2-license-territoryComma-sep ISO country codes, or GLOBAL

Server Implementation

Detection Logic

// Check for ICY2 version header
const char *version = httpp_getvar(parser, "icy-metadata-version");
if (version && strncmp(version, "2.", 2) == 0) {
    // Parse as ICY2
    icy2_metadata *meta = icy2_meta_new();
    icy2_meta_parse_headers(meta, parser);
    icy2_meta_copy_to_stats(meta, source->stats);
    icy2_meta_free(meta);
} else {
    // Fall back to ICY 1.x legacy parsing
    parse_legacy_icy_headers(parser);
}

Parser Implementation Notes

The v2.2 parser accepts both icy-meta-X (spec-compliant) and legacy icy-X (v2.1 clients) header forms during the migration period. Try icy-meta-X first; fall back to icy-X:

/* Example: station-id -- try spec-compliant prefix first, fall back for v2.1 clients */
str = httpp_getvar(parser, "icy-meta-station-id");
if (!str) str = httpp_getvar(parser, "icy-station-id");
if (str) meta->station_id = icy2_strdup_safe(str);

Version History

VersionRelease DateStatusKey Features
2.1February 15, 2026✅ ReleasedCore station ID, podcast, video, social, content flags
2.2February 2026🚧 In ProgressTrack metadata, artwork, show scheduling, audio technical, notices, engagement, distribution, PKI, licensing
2.3Q3 2026💡 ProposedDynamic updates, multi-language, subscriber metadata, interactivity

Client Best Practices

  1. Always include icy-metadata-version — this triggers ICY2 parsing
  2. Use consistent station-id — helps with stream tracking and analytics
  3. Provide social media handles — enhances discoverability
  4. Set appropriate content flags — NSFW, AI-generated for transparency
  5. Include video metadata if streaming video alongside audio
  6. Use emoji sparingly — 2–5 emoji max for UI enhancement
  7. Validate URLs — ensure all URL fields are properly formatted
  8. Keep hashtags relevant — 3–10 hashtags, space or comma-separated

License & Attribution

Copyright © 2026 David St John (Saint John) — MediaCast1 / Mcaster1DNAS Project.
Released under the Creative Commons Attribution 4.0 International License (CC BY 4.0).
Implementation in Mcaster1DNAS is licensed under GNU GPL v2.

See Also