Official .NET SDK for pulling content from your Agility CMS instance via the Fetch API.
- Upgraded to .NET 10 - Now targets
net10.0for the latest performance and language features - Updated all dependencies to their latest versions
IsPreviewis a parameter set on EACH method call- GraphQL Content Items support
- Single unified assembly (removed
SharedandCoreprojects)
Install via NuGet Package Manager:
dotnet add package Agility.NET.FetchAPIOr add to your .csproj:
<PackageReference Include="Agility.NET.FetchAPI" Version="3.1.0" />- .NET 10.0 or later
In your Program.cs or startup configuration:
using Agility.NET.FetchAPI.Helpers;
using Agility.NET.FetchAPI.Services;
// Configure Agility settings
builder.Services.Configure<AppSettings>(options =>
{
options.InstanceGUID = "your-instance-guid";
options.FetchAPIKey = "your-fetch-api-key";
options.PreviewAPIKey = "your-preview-api-key";
options.Locales = "en-us";
options.ChannelName = "website";
});
// Register HttpClient and FetchApiService
builder.Services.AddHttpClient<FetchApiService>();public class MyController : Controller
{
private readonly FetchApiService _agilityService;
public MyController(FetchApiService agilityService)
{
_agilityService = agilityService;
}
public async Task<IActionResult> GetContent()
{
var item = await _agilityService.GetContentItem(
new GetItemParameters
{
IsPreview = false,
Locale = "en-us",
ContentId = 123,
ContentLinkDepth = 2
});
return Ok(item);
}
}public class AppSettings
{
public string InstanceGUID { get; set; } // Your Agility instance GUID
public string SecurityKey { get; set; } // Security key (optional)
public string WebsiteName { get; set; } // Website name (optional)
public string FetchAPIKey { get; set; } // API key for fetch (live) mode
public string PreviewAPIKey { get; set; } // API key for preview mode
public string Locales { get; set; } // Supported locales (e.g., "en-us")
public string ChannelName { get; set; } // Default channel name
public int CacheInMinutes { get; set; } // Cache duration in minutes
}The SDK automatically routes requests to the correct regional endpoint based on your Instance GUID suffix:
| Region | GUID Suffix | Endpoint |
|---|---|---|
| US (default) | — | https://api.aglty.io |
| USA 2 | -us2 |
https://api-usa2.aglty.io |
| Canada | -c |
https://api-ca.aglty.io |
| Europe | -e |
https://api-eu.aglty.io |
| Australia | -a |
https://api-aus.aglty.io |
| Development | -d |
https://api-dev.aglty.io |
| Function | Parameters | Description |
|---|---|---|
GetContentItem |
GetItemParameters |
Get a single content item |
GetContentList |
GetListParameters |
Get a content list |
GetGallery |
GetGalleryParameters |
Get a gallery |
GetPage |
GetPageParameters |
Get a page |
GetSitemapFlat |
GetSitemapParameters |
Get a flat sitemap |
GetSitemapNested |
GetSitemapParameters |
Get a nested sitemap |
GetUrlRedirections |
GetUrlRedirectionsParameters |
Get URL redirections |
GetSyncContent |
GetSyncParameters |
Sync all content using a sync token |
GetSyncPages |
GetSyncParameters |
Sync all pages using a sync token |
GetContentByGraphQL<T> |
query, locale, object name, preview | Query content using GraphQL |
The SDK also provides typed versions of the main methods:
| Method | Returns |
|---|---|
GetTypedContentItem<T> |
ContentItemResponse<T>, with your fields class as T |
GetTypedContentList<T> |
ContentListResponse<T> |
GetTypedPage |
PageResponse |
GetTypedSitemapFlat |
List<SitemapPage> |
GetTypedSitemapNested |
List<SitemapPage> |
public class GetItemParameters
{
public bool IsPreview { get; set; } // Use preview or fetch mode
public string Locale { get; set; }
public int ContentId { get; set; }
public int ContentLinkDepth { get; set; }
public bool ExpandAllContentLinks { get; set; }
}public class GetListParameters
{
public bool IsPreview { get; set; } // Use preview or fetch mode
public string Locale { get; set; }
public string ReferenceName { get; set; }
public string Fields { get; set; }
public int Take { get; set; }
public int Skip { get; set; }
public string Filter { get; set; }
public string Sort { get; set; }
public string Direction { get; set; }
public int ContentLinkDepth { get; set; }
public bool ExpandAllContentLinks { get; set; }
}public class GetGalleryParameters
{
public bool IsPreview { get; set; } // Use preview or fetch mode
public int GalleryId { get; set; }
}public class GetPageParameters
{
public bool IsPreview { get; set; } // Use preview or fetch mode
public string Locale { get; set; }
public int PageId { get; set; }
public int ContentLinkDepth { get; set; } // Must be 0 for GetTypedPage
public bool ExpandAllContentLinks { get; set; }
}public class GetSitemapParameters
{
public bool IsPreview { get; set; } // Use preview or fetch mode
public string Locale { get; set; }
public string ChannelName { get; set; }
}public class GetUrlRedirectionsParameters
{
public bool IsPreview { get; set; } // Use preview or fetch mode
public DateTime? LastAccessDate { get; set; }
}public class GetSyncParameters
{
public bool IsPreview { get; set; } // Use preview or fetch mode
public string Locale { get; set; }
public long SyncToken { get; set; }
public int PageSize { get; set; }
}Query content using GraphQL for more flexible data retrieval. Pass the locale to query and the name of the top-level
object to return; T is the class for each item's fields:
var query = @"
{
posts {
contentID
fields {
title
content
}
}
}";
List<ContentItemResponse<PostFields>> posts =
await _agilityService.GetContentByGraphQL<PostFields>(query, "en-us", "posts", isPreview: false);Each locale has its own GraphQL endpoint (/v1/{guid}/{fetch|preview}/{locale}/graphql); versions before 3.1.0
always queried en-us.
-
Clone the repo:
git clone https://github.com/agility/agilitycms-dotnet-fetch-api
-
Open in your IDE and restore packages:
dotnet restore
-
Build:
dotnet build
-
Configure test credentials:
cp tests/Agility.NET.FetchAPI.Tests/test.runsettings.template tests/Agility.NET.FetchAPI.Tests/test.runsettings
Edit
test.runsettingswith your Agility credentials. -
Run tests:
dotnet test --settings tests/Agility.NET.FetchAPI.Tests/test.runsettings
Every request sends X-Agility-SDK: agility-fetch-sdk-dotnet/<version> (also used as the User-Agent), so the API
can tell SDK traffic apart. A non-200 response throws an ApplicationException (wrapped in
AgilityResponseException) whose message starts HttpException: {status} - {reason} and includes the API's response.
This project uses GitHub Actions. The CI workflow builds, tests and packs every pull request and push to main.
Its tests call a real instance, so configure these repository secrets:
| Secret | Description |
|---|---|
AGILITY_INSTANCE_GUID |
Your Agility CMS instance GUID |
AGILITY_FETCH_API_KEY |
API key for fetch (live) mode |
AGILITY_PREVIEW_API_KEY |
API key for preview mode |
- Set
<Version>insrc/Agility.NET.FetchAPI/Agility.NET.FetchAPI.csprojand add aCHANGELOG.mdentry. - Merge to
main, then tag it:git tag v3.1.0 && git push origin v3.1.0. - The Release workflow checks that the tag matches the version, builds, tests, packs, and (after approval in the
nugetenvironment) publishes to NuGet with Trusted Publishing: no API key is stored anywhere. - It then creates the GitHub release for the tag, with the version's
CHANGELOG.mdsection as the notes and the.nupkgand.snupkgattached. A tag with noCHANGELOG.mdentry fails before anything is published.
To use this SDK with the Agility CMS .NET Starter:
- Add a project reference or install the NuGet package
- Configure
AppSettingswith your Agility credentials - Register
FetchApiServicewith dependency injection
MIT License - see LICENSE for details.