DeviantArtFs 6.0.2

There is a newer version of this package available.
See the version list below for details.
dotnet add package DeviantArtFs --version 6.0.2                
NuGet\Install-Package DeviantArtFs -Version 6.0.2                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="DeviantArtFs" Version="6.0.2" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add DeviantArtFs --version 6.0.2                
#r "nuget: DeviantArtFs, 6.0.2"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install DeviantArtFs as a Cake Addin
#addin nuget:?package=DeviantArtFs&version=6.0.2

// Install DeviantArtFs as a Cake Tool
#tool nuget:?package=DeviantArtFs&version=6.0.2                


A .NET / F# library to interact with the DeviantArt / API.


Each request that can be made to DeviantArt is represented by a module somewhere in the DeviantArtFs.Api namespace. These modules have static methods that take one or more parameters:

  • token (an object that implements the IDeviantArtAccessToken interface and provides the library with the API credentials)
  • expansion (on some requests; allows user object expansion)
  • A parameter specific to the request (if any)
  • A range specifier (for endpoints that ask the user to request a particular range of results
    • paging: a DeviantArtPagingParams record, which specifies an offset and an optional limit / page size
      • DeviantArtFs is aware of the maximum limits for each API request; to request the maximum page size, use int.MaxValue as the limit
    • cursor: a string provided in the previous page's result (use null to start at the beginning)
    • offset / limit: used in ToAsyncSeq and ToArrayAsync wrapper methods in place of paging / cursor

The main method is usually named AsyncExecute and returns an async workflow, the result of which is an F# record type that lines up with the original JSON. An ExecuteAsync method is also available that returns a .NET Task instead.

For endpoints that allow paging, ToAsyncSeq and ToArrayAsync methods will be available as well; when using these, DeviantArtFs may perform multiple API calls, asking for the maximum amount of results in each. Be careful not to request too much data or you might hit API usage limits.

Optional types

Many objects in the DeviantArt API have optional fields, which are difficult to represent in languages such as F# that expect a fixed schema. DeviantArtFs represents these optional fields with F# option types.

The library provides extension methods for dealing with option types from outside F#:

using DeviantArtFs.Extensions;

public string? GetTitle(Deviation d) {
    return d.title.ToObj();

public IEnumerable<DeviationPreview> GetThumbnails(Deviation d) {
    return d.thumbs.OrEmpty();

public bool CheckIfFavorited(Deviation d) {
    return d.is_favourited.IsTrue();

Deleted deviations and status updates

Deviation and DeviantArtStatus objects can represent a deviation or status update that has been deleted; this is why most of the fields on those two types are marked optional. Check the is_deleted field (or IsDeleted property) before attempting to access any of the other fields.

Partial updates

Stash.Update and User.ProfileUpdate allow you to choose which fields to update on the object. DeviantArtFs uses discriminated unions to represent these updates:

await Requests.User.ProfileUpdate.ExecuteAsync(token, new[] {

await Requests.Stash.Update.ExecuteAsync(token, 12345678L, new[] {
    UpdateField.NewTitle("new stack title"),

Note that DeviantArt allows a null value for the "description" field on a stack, and this is represented by its own union case.

Known issues

  • Mature content filtering is not supported (use the is_mature flag on the deviation instead).
  • The profile_pic field in the user.profile expansion is not supported due to circular type definitions. Get it from the full profile object instead.
  • The following fields in the deviation object are not supported:
    • challenge
    • challenge_entry
    • motion_book
    • premium_folder_data
    • text_content
    • suggested_reasons
  • The api_session return object is not supported.


  • ExampleConsoleApp: An F# console application that shows some data on the current user's recent (and not-so-recent) submissions, along with some of their info. Reads the access token interactively from standard input.
  • GalleryViewer: A VB.NET app that lets you see the "All" view of someone's gallery and read the descriptions of individual submissions. Uses the Client Credentials grant and stores tokens in a file.
  • WebApp: An ASP.NET Core 2.1 app written in C# that lets you view someone's gallery folders and corresponding submission thumbnails. Uses the Client Credentials grant and stores tokens in a database.


See also:

Both Authorization Code (recommended) and Implicit grant types are supported. The DeviantArtAuth module provides methods to support the Authorization Code grant type (getting tokens from an authorization code and refreshing tokens).

If you are writing a Windows desktop application, the package DeviantArtFs.WinForms package uses Internet Explorer to provide a way to get a code or token from the user using either grant type.

If you need to store the access token somewhere (such as in a database or file), you may want to create your own class that implements the IDeviantArtAccessToken, IDeviantArtRefreshToken, or IDeviantArtAutomaticRefreshToken interface. Using the latter will allow DeviantArtFs to automatically refresh the token and store the new value when it recieves an HTTP 401 response. (An InvalidRefreshTokenException is thrown if the token cannot be refreshed.)

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on DeviantArtFs:

Package Downloads

An F#/.NET library to interact with the API and manage state (.NET Standard 2.0)

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
9.2.0 81 6/19/2024
9.2.0-beta1 69 6/19/2024
9.1.1 100 4/27/2024
9.1.0-rc1 190 11/27/2023
9.0.0 241 11/22/2023
9.0.0-beta4 118 5/30/2023
9.0.0-beta2 92 5/28/2023
8.0.0 439 5/30/2021
8.0.0-beta4 259 5/30/2021
8.0.0-beta3 307 5/30/2021
8.0.0-beta2 217 5/30/2021
7.0.1 383 1/11/2021
7.0.0 357 1/9/2021
7.0.0-beta1 272 1/9/2021
6.0.2 346 1/5/2021
6.0.1 405 12/28/2020
6.0.0 317 12/27/2020
6.0.0-beta2 310 12/26/2020
6.0.0-beta1 298 12/26/2020
5.0.0 494 2/11/2020
5.0.0-beta1 414 2/11/2020
4.0.0 486 1/23/2020
4.0.0-beta2 428 1/23/2020
4.0.0-beta1 437 1/22/2020
3.0.0 531 1/17/2020
2.2.0 535 1/6/2020
2.1.0 508 9/9/2019
2.0.0-beta3 484 3/9/2019
2.0.0-beta2 478 3/8/2019
2.0.0-beta1 458 3/6/2019
1.1.0-beta1 450 3/5/2019
1.0.0 681 2/10/2019
0.9.0 1,312 1/29/2019
0.8.0 670 1/28/2019
0.7.3 695 1/22/2019
0.7.2 672 1/22/2019
0.7.1 1,321 1/19/2019
0.7.0 705 1/18/2019
0.6.0 1,349 1/14/2019
0.5.0 1,329 1/11/2019
0.4.0 1,332 1/3/2019
0.3.0 1,344 12/31/2018
0.2.0-alpha 1,141 12/27/2018
0.1.0-alpha 601 12/21/2018

6.0.2: Fixed use of multiple IDs in MetadataById request