C# SDK
Learn how to use FastPix C# SDK to build video apps with media upload, live stream, and playback.
Fastpix - C#
The FastPix C# SDK provides a powerful, developer-friendly way to build video capabilities into your .NET applications. You get support for media uploads, live streaming, simulcasting, playback management, DRM configurations, signing keys, and more, so you can build sophisticated video-based applications for your use case.
Prerequisites
Before you start using the SDK, make sure you have the following:
- .NET 8.0 or later: This SDK is compatible with .NET 8.0 or higher
- Visual Studio 2022 or VS Code: Recommended IDE for C# development
- NuGet Package Manager: Required for package management
- FastPix API credentials: You'll need an Access Token and a Secret Key. You can generate these credentials by following the steps in the Authentication guide
- Basic understanding of C# and REST APIs: Familiarity with C# development and API integration concepts
Step 1: Installation
The SDK is available through NuGet and can be installed using your preferred method. Using Package Manager Console
Using Package Manager Console
In Visual Studio, open the Package Manager Console and run:
Install-Package Fastpix
Using .NET CLI
dotnet add package Fastpix
Using PackageReference
Add this to your .csproj file:
<PackageReference Include="Fastpix" Version="1.0.0" />Alternative Installation Methods
From Source
git clone https://github.com/FastPix/fastpix-csharp.git
cd fastpix-csharp
dotnet add reference src/Fastpix/Fastpix.csprojDevelopment Installation
For development or testing purposes, you can install the SDK in development mode:
dotnet add package Fastpix --version 1.0.0
Step 2: Import the SDK
Add the necessary using statements to your C# files:
using Fastpix;
using Fastpix.Models.Components;
using Fastpix.Models.Requests;
using Fastpix.Models.Errors;
using Fastpix.Utils.Retries;Step 3: Initialization
You can set the security parameters through the builder when initializing the SDK client instance. The SDK uses different server URLs for different operations:
For Media Operations
Use the base FastPix server URL:
var sdk = FastPix.Builder()
    .WithSecurity(new Security
    {
        Username = "your-access-token",
        Password = "your-secret-key",
    })
    .WithServerUrl("https://api.fastpix.io/v1/")
    .Build();For Live Stream Operations
Use the live streaming specific server URL:
var sdk = FastPix.Builder()
    .WithSecurity(new Security
    {
        Username = "your-access-token",
        Password = "your-secret-key",
    })
    .WithServerUrl("https://api.fastpix.io/v1/")
    .Build();Environment Variables (Recommended)
For production applications, consider using environment variables for credentials:
var sdk = FastPix.Builder()
    .WithSecurity(new Security
    {
        Username = Environment.GetEnvironmentVariable("FASTPIX_ACCESS_TOKEN"),
        Password = Environment.GetEnvironmentVariable("FASTPIX_SECRET_KEY"),
    })
    .Build();Perform Media Operations
1.1 Create Media from URL
Create media by providing a URL to an existing video file. This is useful when you have videos hosted on external platforms like AWS S3, Google Cloud Storage, or any publicly accessible URL.
var request = new CreateMediaRequest
{
    Inputs = new List<Input>
    {
        Input.CreateVideoInput(new VideoInput
        {
            Type = "video",
            Url = "https://static.fastpix.io/sample.mp4",
        })
    },
    Metadata = new Dictionary<string, string>
    {
        { "title", "My Video" },
        { "description", "Video created from URL" }
    },
    AccessPolicy = CreateMediaRequestAccessPolicy.Public
};
var response = await sdk.Media.CreateMediaAsync(request);
if (response.CreateMediaSuccessResponse != null)
{
    Console.WriteLine("Media created successfully!");
    Console.WriteLine($"Media ID: {response.CreateMediaSuccessResponse.Id}");
}1.2 Direct Upload Media from Device
Upload media files directly from your local device or server using the direct upload endpoint:
var request = new DirectUploadVideoMediaRequest
{
    CorsOrigin = "*",
    PushMediaSettings = new PushMediaSettings
    {
        AccessPolicy = BasicAccessPolicy.Public,
        Metadata = new Dictionary<string, string>
        {
            { "title", "Uploaded Video" },
            { "category", "user-generated" }
        }
    }
};
var response = await sdk.Videos.UploadAsync(request);
if (response.DirectUploadVideoMediaSuccessResponse != null)
{
    Console.WriteLine("Direct upload initiated successfully!");
    Console.WriteLine($"Upload ID: {response.DirectUploadVideoMediaSuccessResponse.Data.UploadId}");
    Console.WriteLine($"Upload URL: {response.DirectUploadVideoMediaSuccessResponse.Data.Url}");
}1.3 List All Media
Retrieve a list of all media in your workspace with pagination support:
var response = await sdk.ManageVideos.ListVideosAsync(
    offset: 1,
    limit: 10
);
if (response.ListVideosSuccessResponse != null)
{
    var videos = response.ListVideosSuccessResponse.Data;
    foreach (var video in videos)
    {
        Console.WriteLine($"Video ID: {video.Id}");
        Console.WriteLine($"Title: {video.Metadata?.GetValueOrDefault("title", "No title")}");
    }
}1.4 Get Media by ID
Retrieve detailed information about a specific media item:
var mediaId = "your-media-id";
var response = await sdk.ManageVideos.GetVideoByIdAsync(mediaId);
if (response.GetVideoByIdSuccessResponse != null)
{
    var video = response.GetVideoByIdSuccessResponse.Data;
    Console.WriteLine($"Video ID: {video.Id}");
    Console.WriteLine($"Status: {video.Status}");
    Console.WriteLine($"Created At: {video.CreatedAt:yyyy-MM-dd HH:mm:ss}");
}1.5 Update Media
Update metadata and settings for an existing media item:
var mediaId = "your-media-id";
var request = new UpdatedMediaRequestBody
{
    Metadata = new Dictionary<string, string>
    {
        { "title", "Updated Video Title" },
        { "description", "Updated description" },
        { "category", "updated-category" }
    }
};
var response = await sdk.Videos.UpdateAsync(mediaId, request);
if (response.UpdatedMediaSuccessResponse != null)
{
    Console.WriteLine("Media updated successfully!");
}1.6 Media Configuration Operations
1.6.1 Update Source Access
Update the source access policy for a media item:
var mediaId = "your-media-id";
var request = new UpdateSourceAccessRequestBody
{
    AccessPolicy = UpdateSourceAccessRequestBodyAccessPolicy.Private
};
var response = await sdk.ManageVideos.UpdateSourceAccessAsync(mediaId, request);
if (response.UpdateSourceAccessSuccessResponse != null)
{
    Console.WriteLine("Source access updated successfully!");
}1.6.2 Update MP4 Support
Enable or disable MP4 support for a media item:
var mediaId = "your-media-id";
var request = new UpdateMp4SupportRequestBody
{
    Mp4Support = true
};
var response = await sdk.ManageVideos.UpdateMp4SupportAsync(mediaId, request);
if (response.UpdateMp4SupportSuccessResponse != null)
{
    Console.WriteLine("MP4 support updated successfully!");
}1.6.3 Get Media Input Info
Retrieve input information for a media item:
var mediaId = "your-media-id";
var response = await sdk.ManageVideos.RetrieveMediaInputInfoAsync(mediaId);
if (response.RetrieveMediaInputInfoSuccessResponse != null)
{
    var inputInfo = response.RetrieveMediaInputInfoSuccessResponse.Data;
    Console.WriteLine($"Input URL: {inputInfo.InputUrl}");
    Console.WriteLine($"Input Type: {inputInfo.InputType}");
    Console.WriteLine($"File Size: {inputInfo.FileSize}");
}1.7 Delete Media
Remove a media item from your workspace:
var mediaId = "your-media-id";
var response = await sdk.ManageVideos.DeleteVideoAsync(mediaId);
if (response.StatusCode == 204)
{
    Console.WriteLine("Media deleted successfully!");
}1.8 Playback Operations
1.8.1 Create Media Playback ID
Generate a playback ID for secure video access:
var mediaId = "your-media-id";
var request = new CreateMediaPlaybackIdRequestBody
{
    AccessPolicy = AccessPolicy.Public
};
var response = await sdk.Playback.CreateAsync(mediaId, request);
if (response.CreateMediaPlaybackIdSuccessResponse != null)
{
    var playbackId = response.CreateMediaPlaybackIdSuccessResponse.Data.Id;
    Console.WriteLine($"Playback ID created: {playbackId}");
}1.8.2 Get Playback ID
Retrieve details of a specific playback ID:
var mediaId = "your-media-id";
var playbackId = "your-playback-id";
var response = await sdk.Playback.GetByIdAsync(mediaId, playbackId);
if (response.GetPlaybackIdSuccessResponse != null)
{
    var playback = response.GetPlaybackIdSuccessResponse.Data;
    Console.WriteLine($"Playback ID: {playback.Id}");
    Console.WriteLine($"Access Policy: {playback.AccessPolicy}");
}1.8.3 Delete Media Playback ID
Remove a playback ID:
var mediaId = "your-media-id";
var playbackId = "your-playback-id";
var response = await sdk.Playback.DeleteAsync(mediaId, playbackId);
if (response.StatusCode == 204)
{
    Console.WriteLine("Playback ID deleted successfully!");
}1.9 AI-Powered Media Features
The FastPix SDK includes powerful AI features for media enhancement and analysis:
1.9.1 Generate Video Summary
Generate an AI-powered summary of your video content:
var mediaId = "your-media-id";
var requestBody = new UpdateMediaSummaryRequestBody
{
    Generate = true,
    SummaryLength = 120 // Optional: specify word count
};
var response = await sdk.InVideoAiFeatures.UpdateMediaSummaryAsync(mediaId, requestBody);
if (response.UpdateMediaSummarySuccessResponse != null)
{
    Console.WriteLine("Video summary generation initiated successfully!");
}1.9.2 Generate Video Chapters
Automatically generate chapters for your video:
var mediaId = "your-media-id";
var requestBody = new UpdateMediaChaptersRequestBody
{
    Chapters = true
};
var response = await sdk.InVideoAiFeatures.UpdateMediaChaptersAsync(mediaId, requestBody);
if (response.UpdateMediaChaptersSuccessResponse != null)
{
    Console.WriteLine("Video chapters generation initiated successfully!");
}1.9.3 Extract Named Entities
Extract named entities (people, places, organizations) from your video:
var mediaId = "your-media-id";
var requestBody = new UpdateMediaNamedEntitiesRequestBody
{
    NamedEntities = true
};
var response = await sdk.InVideoAiFeatures.UpdateMediaNamedEntitiesAsync(mediaId, requestBody);
if (response.UpdateMediaNamedEntitiesSuccessResponse != null)
{
    Console.WriteLine("Named entities extraction initiated successfully!");
}1.9.4 Content Moderation
Enable AI-powered content moderation for inappropriate content:
var mediaId = "your-media-id";
var requestBody = new UpdateMediaModerationRequestBody
{
    Moderation = new UpdateMediaModerationModeration
    {
        Type = MediaType.Video
    }
};
var response = await sdk.InVideoAiFeatures.UpdateMediaModerationAsync(mediaId, requestBody);
if (response.UpdateMediaModerationSuccessResponse != null)
{
    Console.WriteLine("Content moderation enabled successfully!");
}1.10 Media Tracks Management
Manage audio and subtitle tracks for your media:
1.10.1 Add Media Track
Add an audio or subtitle track to your media:
var mediaId = "your-media-id";
var request = new AddTrackRequestBody
{
    Type = AddTrackRequestBodyType.Audio,
    Language = "en",
    Url = "https://example.com/audio-track.mp3"
};
var response = await sdk.ManageVideos.AddMediaTrackAsync(mediaId, request);
if (response.AddMediaTrackSuccessResponse != null)
{
    Console.WriteLine("Media track added successfully!");
}1.10.2 Update Media Track
Update an existing media track:
var mediaId = "your-media-id";
var trackId = "your-track-id";
var request = new UpdateTrackRequestBody
{
    Language = "es",
    Url = "https://example.com/updated-track.mp3"
};
var response = await sdk.ManageVideos.UpdateMediaTrackAsync(mediaId, trackId, request);
if (response.UpdateMediaTrackSuccessResponse != null)
{
    Console.WriteLine("Media track updated successfully!");
}1.10.3 Delete Media Track
Remove a media track:
var mediaId = "your-media-id";
var trackId = "your-track-id";
var response = await sdk.ManageVideos.DeleteMediaTrackAsync(mediaId, trackId);
if (response.StatusCode == 204)
{
    Console.WriteLine("Media track deleted successfully!");
}1.10.4 Generate Subtitle Track
Generate subtitles for your media:
var mediaId = "your-media-id";
var trackId = "your-track-id";
var response = await sdk.ManageVideos.GenerateSubtitleTrackAsync(mediaId, trackId);
if (response.GenerateSubtitleTrackSuccessResponse != null)
{
    Console.WriteLine("Subtitle generation initiated successfully!");
}1.11 Upload Management
Manage uploads and track their status:
1.10.4 Generate Subtitle Track
Generate subtitles for your media:
var mediaId = "your-media-id";
var trackId = "your-track-id";
var response = await sdk.ManageVideos.GenerateSubtitleTrackAsync(mediaId, trackId);
if (response.GenerateSubtitleTrackSuccessResponse != null)
{
    Console.WriteLine("Subtitle generation initiated successfully!");
}1.11.2 Cancel Upload
Cancel an ongoing upload:
var uploadId = "your-upload-id";
var response = await sdk.Uploads.CancelAsync(uploadId);
if (response.StatusCode == 200)
{
    Console.WriteLine("Upload cancelled successfully!");
}1.12 Media Clips
Work with media clips and live stream clips:
1.12.1 Get Media Clips
Retrieve all clips of a media file:
var sourceMediaId = "your-source-media-id";
var response = await sdk.ManageVideos.GetMediaClipsAsync(sourceMediaId);
if (response.GetMediaClipsSuccessResponse != null)
{
    var clips = response.GetMediaClipsSuccessResponse.Data;
    foreach (var clip in clips)
    {
        Console.WriteLine($"Clip ID: {clip.Id}");
        Console.WriteLine($"Start Time: {clip.StartTime}");
        Console.WriteLine($"End Time: {clip.EndTime}");
    }
}1.12.2 Get Live Clips
Retrieve all clips of a live stream:
var livestreamId = "your-livestream-id";
var response = await sdk.ManageVideos.ListLiveClipsAsync(livestreamId);
if (response.ListLiveClipsSuccessResponse != null)
{
    var clips = response.ListLiveClipsSuccessResponse.Data;
    foreach (var clip in clips)
    {
        Console.WriteLine($"Clip ID: {clip.Id}");
        Console.WriteLine($"Duration: {clip.Duration}");
    }
}1.13 Playlist Management
Create and manage playlists for organizing your media content:
1.13.1 Create Playlist
Create a new playlist:
var request = new CreatePlaylistRequest
{
    Name = "My Video Playlist",
    Description = "A collection of my favorite videos",
    Type = CreatePlaylistRequestType.Manual,
    PlayOrder = PlaylistOrder.CreatedDateASC,
    Metadata = new Dictionary<string, string>
    {
        { "category", "entertainment" },
        { "tags", "videos,playlist" }
    }
};
var response = await sdk.Playlists.CreateAsync(request);
if (response.CreateAPlaylistSuccessResponse != null)
{
    Console.WriteLine("Playlist created successfully!");
    Console.WriteLine($"Playlist ID: {response.CreateAPlaylistSuccessResponse.Data.Id}");
}1.13.2 List All Playlists
Retrieve all playlists in your workspace:
var response = await sdk.Playlists.ListAsync(
    offset: 1,
    limit: 10
);
if (response.GetAllPlaylistsSuccessResponse != null)
{
    var playlists = response.GetAllPlaylistsSuccessResponse.Data;
    foreach (var playlist in playlists)
    {
        Console.WriteLine($"Playlist ID: {playlist.Id}");
        Console.WriteLine($"Name: {playlist.Name}");
        Console.WriteLine($"Media Count: {playlist.Media?.Count ?? 0}");
    }
}1.13.3 Get Playlist by ID
Retrieve details of a specific playlist:
var playlistId = "your-playlist-id";
var response = await sdk.Playlists.GetByIdAsync(playlistId);
if (response.GetPlaylistByIdSuccessResponse != null)
{
    var playlist = response.GetPlaylistByIdSuccessResponse.Data;
    Console.WriteLine($"Playlist Name: {playlist.Name}");
    Console.WriteLine($"Description: {playlist.Description}");
    Console.WriteLine($"Media Count: {playlist.Media?.Count ?? 0}");
}1.13.4 Update Playlist
Update playlist details:
var playlistId = "your-playlist-id";
var request = new UpdatePlaylistRequestBody
{
    Name = "Updated Playlist Name",
    Description = "Updated description"
};
var response = await sdk.Playlists.UpdateAsync(playlistId, request);
if (response.UpdatePlaylistSuccessResponse != null)
{
    Console.WriteLine("Playlist updated successfully!");
}1.13.5 Add Media to Playlist
Add media items to a playlist:
var playlistId = "your-playlist-id";
var request = new MediaIdsRequest
{
    MediaIds = new List<string> { "media-id-1", "media-id-2" }
};
var response = await sdk.Playlists.AddMediaAsync(playlistId, request);
if (response.AddMediaToPlaylistSuccessResponse != null)
{
    Console.WriteLine("Media added to playlist successfully!");
}1.13.6 Replace Playlist Media
Replace all media in a playlist:
var playlistId = "your-playlist-id";
var request = new MediaIdsRequest
{
    MediaIds = new List<string> { "new-media-id-1", "new-media-id-2" }
};
var response = await sdk.Playlists.ChangeMediaOrderAsync(playlistId, request);
if (response.ChangeMediaOrderInPlaylistSuccessResponse != null)
{
    Console.WriteLine("Playlist media replaced successfully!");
}1.13.7 Delete Media from Playlist
Remove specific media from a playlist:
var playlistId = "your-playlist-id";
var request = new MediaIdsRequest
{
    MediaIds = new List<string> { "media-id-to-remove" }
};
var response = await sdk.Playlists.DeleteMediaAsync(playlistId, request);
if (response.DeleteMediaFromPlaylistSuccessResponse != null)
{
    Console.WriteLine("Media removed from playlist successfully!");
}1.13.8 Delete Playlist
Remove an entire playlist:
var playlistId = "your-playlist-id";
var response = await sdk.Playlists.DeleteAsync(playlistId);
if (response.StatusCode == 204)
{
    Console.WriteLine("Playlist deleted successfully!");
}Live Stream Operations
2.1 Create Live Stream
Create a new live stream for broadcasting:
var request = new CreateLiveStreamRequest
{
    PlaybackSettings = new PlaybackSettings
    {
        AccessPolicy = BasicAccessPolicy.Public
    },
    InputMediaSettings = new InputMediaSettings
    {
        MediaPolicy = BasicAccessPolicy.Public,
        Metadata = new Dictionary<string, string>
        {
            { "title", "My Live Stream" }
        },
        EnableDvrMode = true
    }
};
var response = await sdk.LiveStreams.CreateAsync(request);
if (response.CreateNewStreamSuccessResponse != null)
{
    var streamId = response.CreateNewStreamSuccessResponse.Data.StreamId;
    Console.WriteLine("Live stream created successfully!");
    Console.WriteLine($"Stream ID: {streamId}");
}2.2 List All Live Streams
Retrieve all live streams in your workspace:
var response = await sdk.LiveStreams.ListAsync(
    limit: 10,
    offset: 1,
    orderBy: OrderBy.Desc
);
if (response.GetAllStreamsSuccessResponse != null)
{
    var streams = response.GetAllStreamsSuccessResponse.Data;
    foreach (var stream in streams)
    {
        Console.WriteLine($"Stream ID: {stream.StreamId}");
        Console.WriteLine($"Name: {stream.Name}");
        Console.WriteLine($"Status: {stream.Status}");
    }
}2.3 Get Live Stream by ID
Retrieve details of a specific live stream:
var streamId = "your-stream-id";
var response = await sdk.Streams.GetByIdAsync(streamId);
if (response.GetLiveStreamByIdSuccessResponse != null)
{
    var stream = response.GetLiveStreamByIdSuccessResponse.Data;
    Console.WriteLine($"Stream ID: {stream.StreamId}");
    Console.WriteLine($"Name: {stream.Name}");
    Console.WriteLine($"Status: {stream.Status}");
    Console.WriteLine($"Stream URL: {stream.StreamUrl}");
}2.4 Update Live Stream
Update live stream settings and metadata:
var streamId = "your-stream-id";
var request = new PatchLiveStreamRequest
{
    Metadata = new Dictionary<string, string>
    {
        { "title", "Updated Live Event" },
        { "description", "Updated description" }
    },
    ReconnectWindow = 30
};
var response = await sdk.Streams.UpdateAsync(streamId, request);
if (response.UpdateLiveStreamSuccessResponse != null)
{
    Console.WriteLine("Live stream updated successfully!");
}2.5 Delete Live Stream
Remove a live stream:
var streamId = "your-stream-id";
var response = await sdk.Streams.DeleteAsync(streamId);
if (response.StatusCode == 204)
{
    Console.WriteLine("Live stream deleted successfully!");
}2.6 Create Live Stream Playback ID
Generate a playback ID for live stream access:
var streamId = "your-stream-id";
var request = new CreatePlaybackIdOfStreamRequestBody
{
    AccessPolicy = CreatePlaybackIdOfStreamRequestAccessPolicy.Public
};
var response = await sdk.LivePlayback.CreatePlaybackIdOfStreamAsync(streamId, request);
if (response.CreatePlaybackIdOfStreamSuccessResponse != null)
{
    var playbackId = response.CreatePlaybackIdOfStreamSuccessResponse.Data.Id;
    Console.WriteLine($"Live stream playback ID created: {playbackId}");
}2.7 Delete Live Stream Playback ID
Remove a live stream playback ID:
var streamId = "your-stream-id";
var playbackId = "your-playback-id";
var response = await sdk.LivePlayback.DeletePlaybackIdOfStreamAsync(streamId, playbackId);
if (response.StatusCode == 204)
{
    Console.WriteLine("Live stream playback ID deleted successfully!");
}
2.8 Get Live Stream Playback ID
Retrieve playback details for a live stream:
var streamId = "your-stream-id";
var playbackId = "your-playback-id";
var response = await sdk.LivePlayback.GetPlaybackIdOfStreamAsync(streamId, playbackId);
if (response.GetPlaybackIdOfStreamSuccessResponse != null)
{
    var playback = response.GetPlaybackIdOfStreamSuccessResponse.Data;
    Console.WriteLine($"Playback Policy: {playback.AccessPolicy}");
}2.9 Create Simulcast
Create a simulcast for broadcasting to multiple platforms simultaneously:
var streamId = "your-stream-id";
var request = new CreateSimulcastOfStreamRequestBody
{
    Platform = CreateSimulcastOfStreamRequestPlatform.YOUTUBE,
    Credentials = new CreateSimulcastOfStreamRequestCredentials
    {
        StreamKey = "your-youtube-stream-key"
    }
};
var response = await sdk.SimulcastStream.CreateSimulcastOfStreamAsync(streamId, request);
if (response.SimulcastResponse != null)
{
    Console.WriteLine("Simulcast created successfully!");
    Console.WriteLine($"Simulcast ID: {response.SimulcastResponse.Data.Id}");
}2.10 Get Simulcast Details
Retrieve details of a specific simulcast:
var streamId = "your-stream-id";
var simulcastId = "your-simulcast-id";
var response = await sdk.SimulcastStream.GetSpecificSimulcastOfStreamAsync(streamId, simulcastId);
if (response.SimulcastResponse != null)
{
    var simulcast = response.SimulcastResponse.Data;
    Console.WriteLine($"Simulcast ID: {simulcast.Id}");
    Console.WriteLine($"Platform: {simulcast.Platform}");
    Console.WriteLine($"Status: {simulcast.Status}");
}2.11 Update Simulcast
Update simulcast configuration:
var streamId = "your-stream-id";
var simulcastId = "your-simulcast-id";
var request = new UpdateSimulcastOfStreamRequestBody
{
    Status = UpdateSimulcastOfStreamRequestStatus.IDLE
};
var response = await sdk.SimulcastStream.UpdateSpecificSimulcastOfStreamAsync(streamId, simulcastId, request);
if (response.SimulcastResponse != null)
{
    Console.WriteLine("Simulcast updated successfully!");
}2.12 Delete Simulcast
Remove a simulcast:
var streamId = "your-stream-id";
var simulcastId = "your-simulcast-id";
var response = await sdk.SimulcastStream.DeleteSimulcastOfStreamAsync(streamId, simulcastId);
if (response.StatusCode == 204)
{
    Console.WriteLine("Simulcast deleted successfully!");
}2.13 Live Stream Control Operations
2.13.1 Enable Live Stream
Enable a live stream for broadcasting:
var streamId = "your-stream-id";
var response = await sdk.Streams.EnableAsync(streamId);
if (response.StatusCode == 200)
{
    Console.WriteLine("Live stream enabled successfully!");
}2.13.2 Disable Live Stream
Disable a live stream:
var streamId = "your-stream-id";
var response = await sdk.ManageLiveStream.DisableLiveStreamAsync(streamId);
if (response.StatusCode == 200)
{
    Console.WriteLine("Live stream disabled successfully!");
}2.13.3 Complete Live Stream
Mark a live stream as completed:
var streamId = "your-stream-id";
var response = await sdk.ManageLiveStream.CompleteLiveStreamAsync(streamId);
if (response.StatusCode == 200)
{
    Console.WriteLine("Live stream completed successfully!");
}2.13.4 Get Live Stream Viewer Count
Get the current viewer count for a live stream:
var streamId = "your-stream-id";
var response = await sdk.ManageLiveStream.GetLiveStreamViewerCountByIdAsync(streamId);
if (response.GetLiveStreamViewerCountByIdSuccessResponse != null)
{
    var viewerCount = response.GetLiveStreamViewerCountByIdSuccessResponse.Data;
    Console.WriteLine($"Current Viewers: {viewerCount.ViewerCount}");
    Console.WriteLine($"Peak Viewers: {viewerCount.PeakViewers}");
}2.14 Simulcast Management
2.14.1 List Simulcast Targets
Get all simulcast targets for a stream:
var streamId = "your-stream-id";
var response = await sdk.SimulcastStreams.ListSimulcastsOfStreamAsync(streamId);
if (response.ListSimulcastsOfStreamSuccessResponse != null)
{
    var simulcasts = response.ListSimulcastsOfStreamSuccessResponse.Data;
    foreach (var simulcast in simulcasts)
    {
        Console.WriteLine($"Simulcast ID: {simulcast.Id}");
        Console.WriteLine($"Platform: {simulcast.Platform}");
        Console.WriteLine($"Status: {simulcast.Status}");
    }
}DRM Configuration Operations
3.1 Get DRM Configuration List
Retrieve all DRM configurations in your workspace:
var response = await sdk.DrmConfigurations.ListAsync(
    offset: 1,
    limit: 10
);
if (response.GetDrmConfigurationSuccessResponse != null)
{
    var configurations = response.GetDrmConfigurationSuccessResponse.Data;
    foreach (var config in configurations)
    {
        Console.WriteLine($"DRM Configuration ID: {config.Id}");
        Console.WriteLine($"Name: {config.Name}");
    }
}3.2 Get DRM Configuration by ID
Retrieve details of a specific DRM configuration:
var drmConfigurationId = "4fa85f64-5717-4562-b3fc-2c963f66afa6";
var response = await sdk.DrmConfigurations.GetByIdAsync(drmConfigurationId);
if (response.GetDrmConfigurationByIdSuccessResponse != null)
{
    var config = response.GetDrmConfigurationByIdSuccessResponse.Data;
    Console.WriteLine($"DRM Configuration ID: {config.Id}");
    Console.WriteLine($"Name: {config.Name}");
    Console.WriteLine($"Description: {config.Description}");
}Signing Keys Operations
4.1 Create Signing Key
Generate a new signing key pair for JWT authentication:
var response = await sdk.SigningKeys.CreateAsync();
if (response.CreateSigningKeySuccessResponse != null)
{
    var keyData = response.CreateSigningKeySuccessResponse.Data;
    Console.WriteLine("Signing key created successfully!");
    Console.WriteLine($"Key ID: {keyData.Id}");
    Console.WriteLine($"Private Key: {keyData.PrivateKey}");
    Console.WriteLine($"Created At: {keyData.CreatedAt:yyyy-MM-dd HH:mm:ss}");
}4.2 List Signing Keys
Retrieve all signing keys in your workspace:
var response = await sdk.SigningKeys.ListAsync(
    offset: 1,
    limit: 10
);
if (response.ListSigningKeysSuccessResponse != null)
{
    var keys = response.ListSigningKeysSuccessResponse.Data;
    foreach (var key in keys)
    {
        Console.WriteLine($"Key ID: {key.Id}");
        Console.WriteLine($"Created At: {key.CreatedAt:yyyy-MM-dd HH:mm:ss}");
    }
}4.3 Get Signing Key by ID
Retrieve details of a specific signing key:
var keyId = "your-key-id";
var response = await sdk.SigningKeys.GetByIdAsync(keyId);
if (response.GetSigningKeyByIdSuccessResponse != null)
{
    var key = response.GetSigningKeyByIdSuccessResponse.Data;
    Console.WriteLine($"Key ID: {key.Id}");
    Console.WriteLine($"Created At: {key.CreatedAt:yyyy-MM-dd HH:mm:ss}");
}4.4 Delete Signing Key
Remove a signing key:
var keyId = "your-key-id";
var response = await sdk.SigningKeys.DeleteAsync(keyId);
if (response.StatusCode == 204)
{
    Console.WriteLine("Signing key deleted successfully!");
}Video Data Operations
The FastPix SDK provides comprehensive analytics and data operations to help you understand your content performance and user engagement.
5.1 Views Analytics
5.1.1 Get Views Data
Retrieve detailed view analytics for your videos:
var request = new ListVideoViewsRequest
{
    Timespan = ListVideoViewsTimespan.Sevendays,
    Filterby = "browser_name:Chrome",
    Limit = 100
};
var response = await sdk.Views.ListAsync(request);
if (response.ListVideoViewsSuccessResponse != null)
{
    var views = response.ListVideoViewsSuccessResponse.Data;
    foreach (var view in views)
    {
        Console.WriteLine($"View ID: {view.ViewId}");
        Console.WriteLine($"Video ID: {view.VideoId}");
        Console.WriteLine($"Viewer ID: {view.ViewerId}");
        Console.WriteLine($"Watch Time: {view.WatchTime}");
    }
}5.1.2 Get Views by Dimension
Get view data filtered by specific dimensions:
var viewId = "your-view-id";
var response = await sdk.Views.GetDetailsAsync(viewId);
if (response.GetVideoViewDetailsSuccessResponse != null)
{
    var viewData = response.GetVideoViewDetailsSuccessResponse.Data;
    Console.WriteLine($"View ID: {viewData.ViewId}");
    Console.WriteLine($"Video ID: {viewData.VideoId}");
    Console.WriteLine($"Watch Time: {viewData.WatchTime}");
}5.1.3 Get Top Content Views
Retrieve views data for your top-performing content:
var response = await sdk.Views.ListTopContentAsync(
    timespan: ListByTopContentTimespan.Sevendays,
    limit: 10
);
if (response.ListByTopContentSuccessResponse != null)
{
    var topContent = response.ListByTopContentSuccessResponse.Data;
    foreach (var content in topContent)
    {
        Console.WriteLine($"Video ID: {content.VideoId}");
        Console.WriteLine($"Total Views: {content.TotalViews}");
        Console.WriteLine($"Rank: {content.Rank}");
    }
}5.1.4 Get Timeseries Views
Get concurrent viewers data over time:
var response = await sdk.Views.GetTimeseriesAsync();
if (response.GetDataViewlistCurrentViewsGetTimeseriesViewsSuccessResponse != null)
{
    var timeseries = response.GetDataViewlistCurrentViewsGetTimeseriesViewsSuccessResponse.Data;
    foreach (var dataPoint in timeseries)
    {
        Console.WriteLine($"Timestamp: {dataPoint.IntervalTime}");
        Console.WriteLine($"Concurrent Viewers: {dataPoint.NumberOfViews}");
    }
}5.1.5 Get Views Count
Get filtered views count by dimension:
var response = await sdk.Views.GetConcurrentViewersBreakdownAsync(
    dimension: GetDataViewlistCurrentViewsFilterDimension.Country,
    limit: 10
);
if (response.GetDataViewlistCurrentViewsFilterSuccessResponse != null)
{
    var breakdown = response.GetDataViewlistCurrentViewsFilterSuccessResponse.Data;
    foreach (var item in breakdown)
    {
        Console.WriteLine($"Dimension: {item.Dimension}");
        Console.WriteLine($"Value: {item.Value}");
        Console.WriteLine($"Count: {item.ConcurrentViewers}");
    }
}5.2 Dimensions Analytics
5.2.1 List Dimensions
Get all available dimensions for analytics:
var response = await sdk.Dimensions.ListAsync();
if (response.ListDimensionsSuccessResponse != null)
{
    var dimensions = response.ListDimensionsSuccessResponse.Data;
    foreach (var dimension in dimensions)
    {
        Console.WriteLine($"Dimension: {dimension.Name}");
        Console.WriteLine($"Type: {dimension.Type}");
        Console.WriteLine($"Description: {dimension.Description}");
    }
}5.2.2 Get Dimensions Data
Retrieve dimensional analytics data:
var dimensionsId = "your-dimensions-id";
var response = await sdk.Dimensions.GetByIdAsync(dimensionsId);
if (response.GetDimensionsDataSuccessResponse != null)
{
    var dimensionData = response.GetDimensionsDataSuccessResponse.Data;
    Console.WriteLine($"Dimension: {dimensionData.Name}");
    Console.WriteLine($"Values: {string.Join(", ", dimensionData.Values)}");
}5.3 Metrics Analytics
5.3.1 Get Metrics Breakdown
Get metrics data broken down by specific criteria:
var request = new ListBreakdownValuesRequest
{
    MetricId = ListBreakdownValuesMetricId.QualityOfExperienceScore,
    Timespan = ListBreakdownValuesTimespan.Sevendays,
    Filterby = "browser_name:Chrome",
    GroupBy = "browser_name"
};
var response = await sdk.Metrics.ListBreakdownAsync(request);
if (response.ListBreakdownValuesSuccessResponse != null)
{
    var breakdown = response.ListBreakdownValuesSuccessResponse.Data;
    foreach (var item in breakdown)
    {
        Console.WriteLine($"Category: {item.Category}");
        Console.WriteLine($"Value: {item.Value}");
        Console.WriteLine($"Count: {item.Count}");
    }
}5.3.2 Get Overall Video Metrics
Retrieve overall metrics for your videos:
var response = await sdk.Metrics.ListOverallAsync(
    metricId: ListOverallValuesMetricId.QualityOfExperienceScore,
    timespan: ListOverallValuesTimespan.Sevendays,
    measurement: "avg",
    filterby: "browser_name:Chrome"
);
if (response.ListOverallValuesSuccessResponse != null)
{
    var metrics = response.ListOverallValuesSuccessResponse.Data;
    Console.WriteLine($"Total Views: {metrics.TotalViews}");
    Console.WriteLine($"Unique Viewers: {metrics.UniqueViews}");
    Console.WriteLine($"Watch Time: {metrics.TotalWatchTime}");
    Console.WriteLine($"Engagement Rate: {metrics.Value}");
}5.3.3 Get Metrics Timeseries
Get metrics data over time:
var request = new GetTimeseriesDataRequest
{
    MetricId = GetTimeseriesDataMetricId.QualityOfExperienceScore,
    Timespan = GetTimeseriesDataTimespan.Sevendays,
    Filterby = "browser_name:Chrome"
};
var response = await sdk.Metrics.GetTimeseriesAsync(request);
if (response.GetTimeseriesDataSuccessResponse != null)
{
    var timeseries = response.GetTimeseriesDataSuccessResponse.Data;
    foreach (var dataPoint in timeseries)
    {
        Console.WriteLine($"Date: {dataPoint.IntervalTime}");
        Console.WriteLine($"Value: {dataPoint.MetricValue}");
    }
}5.3.4 Get Metrics Comparison
Compare metrics across different periods or content:
var response = await sdk.Metrics.ListComparisonValuesAsync(
    timespan: ListComparisonValuesTimespan.Sevendays,
    filterby: "browser_name:Chrome",
    dimension: ListComparisonValuesDimension.BrowserName,
    valueP: "Chrome"
);
if (response.ListComparisonValuesSuccessResponse != null)
{
    var comparison = response.ListComparisonValuesSuccessResponse.Data;
    foreach (var item in comparison)
    {
        Console.WriteLine($"Dimension: {item.Dimension}");
        Console.WriteLine($"Value: {item.Value}");
        Console.WriteLine($"Count: {item.Count}");
    }
}5.4 Error Analytics
5.4.1 Get Error Data
Retrieve error analytics and debugging information:
var response = await sdk.Errors.ListAsync(
    offset: 1,
    limit: 10
);
if (response.ListErrorsSuccessResponse != null)
{
    var errors = response.ListErrorsSuccessResponse.Data;
    foreach (var error in errors)
    {
        Console.WriteLine($"Error ID: {error.Id}");
        Console.WriteLine($"Error Type: {error.Type}");
        Console.WriteLine($"Message: {error.Message}");
        Console.WriteLine($"Timestamp: {error.Timestamp}");
    }
}Error Handling
Handling errors in this SDK should largely match your expectations. All operations return a response object or throw an exception.
By default an API error will throw a FastPixException exception, which has the following properties:
| Property | Type | Description | 
|---|---|---|
| Message | string | The error message | 
| StatusCode | int | The HTTP status code | 
| RawResponse | string | The raw HTTP response | 
| Body | string | The response content | 
Example Error Handling
try
{
    var response = await sdk.LiveStreams.CreateAsync(request);
    if (response.CreateNewStreamSuccessResponse != null)
    {
        // Handle success
        Console.WriteLine($"Stream created: {response.CreateNewStreamSuccessResponse.Data.StreamId}");
    }
}
catch (UnauthorizedException ex)
{
    // Handle authentication errors
    Console.WriteLine($"Authentication failed: {ex.Message}");
}
catch (ValidationErrorResponse ex)
{
    // Handle validation errors
    Console.WriteLine($"Validation error: {ex.Message}");
}
catch (BadRequestException ex)
{
    // Handle general API errors
    Console.WriteLine($"API error: {ex.Message}");
    Console.WriteLine($"Status code: {ex.StatusCode}");
}
catch (FastPixException ex)
{
    // Handle general SDK errors
    Console.WriteLine($"SDK error: {ex.Message}");
    Console.WriteLine($"Status code: {ex.StatusCode}");
}Retry Configuration
var retryConfig = new RetryConfig
{
    InitialInterval = 1,         // Initial retry interval in seconds
    MaxInterval = 50,            // Maximum interval between retries
    Exponent = 1.1,              // Exponential backoff multiplier
    MaxElapsedTime = 100,        // Max total elapsed time for retries
    RetryConnectionErrors = false // Whether to retry on connection errors
};
var sdk = FastPix.Builder()
    .WithSecurity(new Security
    {
        Username = "your-access-token",
        Password = "your-secret-key",
    })
    .WithRetryConfig(retryConfig)
    .Build();Support & Resources
References
- Documentation: Visit the FastPix API Reference for detailed API documentation.
- GitHub Issues: Report bugs or request features on the GitHub repository.
- FastPix Platform: Access your workspace at dashboard.fastpix.io.
- Contact Us: technical support.
SDK Maturity
This SDK is currently in beta. While it's production-ready, there may be breaking changes between versions without a major version update. We recommend:
Best Practices
- Pin to specific versions: Use fixed SDK or package versions for production applications to avoid unexpected changes.
- Test thoroughly: Validate all functionality before deploying updates to production.
- Monitor changelogs: Keep an eye on release notes for breaking changes or important updates.
Updated 15 days ago