ClickUp.Client — це .NET-бібліотека для роботи з ClickUp API v2, опублікованими endpoint-ами ClickUp Public API v3 і OAuth token exchange з PowerShell-скриптів та C#-коду. Вона побудована поверх Refit, тому HTTP-контракти описані декларативно, а не через ручне складання HttpRequestMessage.
Основний сценарій — автоматизація ClickUp з PowerShell: читання задач, перегляд backlog-ів, створення задач, оновлення статусів, додавання коментарів і робота з тегами. Методи повертають JSON-рядки, які у PowerShell зручно передавати в ConvertFrom-Json.
- Категорії endpoint-ів повторюють структуру ClickUp Reference:
Users,Tasks,Tags,Lists,Spaces,Folders,Comments. - Для PowerShell є простий facade
ClickUpClientз властивостями$client.Tasks,$client.Tags,$client.Usersтощо. - Є окремий
ClickUpOAuthClientдляPOST /api/v2/oauth/tokenбез попереднього API token. - Є окремий
ClickUpV3Clientдля опублікованих ClickUp Public API v3 endpoint-ів: Chat, Attachments, ACL, Audit Logs, Comments, Docs і Task move/time estimates. - Для C# є DI-реєстрація через
AddClickUpApiClient. - Авторизація виконується через raw
Authorizationheader зCLICKUP_API_TOKEN. - Є retry для
429,5xxі тимчасових транспортних помилок. - Необроблені endpoint-и можна викликати через
$client.Raw. - Тести винесені в окремий xUnit v3 проєкт і не виконують реальних запитів до ClickUp.
D:\Code\ClickUp API
├─ ClickUp.Client.slnx
├─ NuGet.config
├─ ClickUp.Client
│ ├─ Abstractions # Refit-контракти API, розбиті за категоріями ClickUp
│ ├─ Categories # PowerShell-friendly клієнти: Tasks, Tags, Users...
│ ├─ Infrastructure # auth, retry, Refit/HttpClient factory, error mapping
│ ├─ Models # DTO для request payloads
│ └─ ClickUpClient.cs # головний facade
├─ ClickUp.Client.Tests
│ └─ xUnit v3 тести без реальних HTTP-запитів
├─ examples
│ └─ List-ClickUpTasks.ps1
- .NET SDK 10 або новіший для повного multi-target build (
net8.0,net9.0,net10.0,netstandard2.0,net48). - .NET SDK 9 можна використовувати для окремого build лише під
net8.0,net9.0абоnetstandard2.0. - .NET SDK 8 можна використовувати для окремого build лише під
net8.0абоnetstandard2.0. - PowerShell 7 або новіший для сучасних target framework-ів; для Windows PowerShell 5.1 на Windows доступний
net48. - ClickUp personal API token у змінній середовища
CLICKUP_API_TOKEN.
Токен передається в ClickUp як сире значення заголовка Authorization. Префікс Bearer додавати не потрібно.
Для OAuth exchange попередній API token не потрібен: використовуйте ClickUpOAuthClient.
Зібрати solution:
dotnet build .\ClickUp.Client.slnx -c ReleaseЗадати токен:
$env:CLICKUP_API_TOKEN = 'pk_your_personal_token'Підключити бібліотеку в PowerShell:
$targetFramework = 'net10.0' # або 'net9.0' / 'net8.0' / 'netstandard2.0' / 'net48'
$dllDir = ".\ClickUp.Client\bin\Release\$targetFramework"
Get-ChildItem -LiteralPath $dllDir -Filter '*.dll' |
Where-Object { $_.Name -ne 'ClickUp.Client.dll' } |
ForEach-Object {
Add-Type -Path $_.FullName
}
Add-Type -Path (Join-Path $dllDir 'ClickUp.Client.dll')Отримати OAuth access token за authorization code:
$oauth = [ClickUp.Client.ClickUpOAuthClient]::new()
try {
$token = $oauth.GetAccessTokenJson(
'<client_id>',
'<client_secret>',
'<authorization_code>') | ConvertFrom-Json
}
finally {
$oauth.Dispose()
}Отримати задачі зі списку:
$client = [ClickUp.Client.ClickUpClient]::FromEnvironment()
try {
$tasks = $client.Tasks.GetAllTasksJson('<list_id>') | ConvertFrom-Json
$tasks |
Select-Object id, name, url, @{ Name = 'status'; Expression = { $_.status.status } }
}
finally {
$client.Dispose()
}Після build NuGet-залежності, включно з Refit.dll, копіюються в ClickUp.Client\bin\Release\net10.0, net9.0, net8.0, netstandard2.0 або net48. Саме тому в PowerShell потрібно завантажувати всі DLL з папки вибраного target framework, а потім ClickUp.Client.dll.
Публічний API згрупований як у документації ClickUp:
| Властивість | Призначення |
|---|---|
$client.Users |
Поточний користувач і user endpoint-и |
$client.Workspaces |
Workspace/team endpoint-и ClickUp API v2 |
$client.Spaces |
Space endpoint-и |
$client.Folders |
Folder endpoint-и |
$client.Lists |
List endpoint-и |
$client.Tasks |
Task endpoint-и |
$client.Tags |
Tag endpoint-и |
$client.Comments |
Comment endpoint-и |
$client.Raw |
Виклики endpoint-ів, для яких ще немає typed wrapper |
Для ClickUp Public API v3 використовуйте окремий клієнт:
$v3 = [ClickUp.Client.ClickUpV3Client]::FromEnvironment()
try {
$channels = $v3.GetChatChannelsJson('<workspace_id>') | ConvertFrom-Json
}
finally {
$v3.Dispose()
}Приклади:
$client.Users.GetAuthorizedUserJson() | ConvertFrom-Json
$client.Workspaces.GetWorkspacesJson() | ConvertFrom-Json
$client.Spaces.GetSpacesJson('<workspace_or_team_id>') | ConvertFrom-Json
$client.Lists.GetFolderlessListsJson('<space_id>') | ConvertFrom-Json
$client.Tasks.GetTaskJson('<task_id>') | ConvertFrom-Json
$client.Tags.GetSpaceTagsJson('<space_id>') | ConvertFrom-JsonСтворити задачу:
$taskBody = @{
name = 'Review ClickUp client'
description = 'Created from PowerShell through ClickUp.Client.'
priority = 3
} | ConvertTo-Json -Depth 10
$task = $client.Tasks.CreateTaskJson('<list_id>', $taskBody) | ConvertFrom-JsonОновити статус:
$client.Tasks.SetTaskStatusJson('<task_id>', 'in progress') | Out-NullПризначити виконавця і змінити статус:
$client.Tasks.AssignTaskAndSetStatusJson('<task_id>', 'in progress', [long[]]@(12345678)) | Out-NullДодати коментар:
$comment = @'
Виконано:
- Оновлено через PowerShell script.
Перевірки:
- ClickUp API call completed.
Залишкові ризики:
- не виявлено.
'@
$client.Comments.AddTaskCommentJson('<task_id>', $comment, $false) | Out-NullПрацювати з тегами:
$client.Tags.GetSpaceTagsJson('<space_id>') | ConvertFrom-Json
$client.Tags.AddTagToTaskJson('<task_id>', 'blocked') | Out-Null
$client.Tags.RemoveTagFromTaskJson('<task_id>', 'blocked') | Out-NullВикликати endpoint, якого ще немає в категоріях:
$client.Raw.RequestJson('GET', 'team') | ConvertFrom-JsonУ репозиторії є готовий приклад:
.\examples\List-ClickUpTasks.ps1 -ListId '<list_id>'Скрипт завантажує DLL, створює ClickUpClient з CLICKUP_API_TOKEN, читає задачі зі списку і виводить коротку таблицю.
На PowerShell 7 він спочатку шукає net10.0, net9.0, net8.0, а потім fallback-иться на netstandard2.0. На Windows PowerShell 5.1 пріоритет віддається net48.
Для C#-застосунків можна зареєструвати клієнт через DI:
using ClickUp.Client;
services.AddClickUpApiClient(
apiToken: Environment.GetEnvironmentVariable("CLICKUP_API_TOKEN")
?? throw new InvalidOperationException("CLICKUP_API_TOKEN is not set."));Після цього можна інжектити ClickUpClient:
public sealed class ClickUpTaskReader
{
private readonly ClickUpClient _client;
public ClickUpTaskReader(ClickUpClient client)
{
_client = client;
}
public Task<string> GetTasksAsync(string listId)
{
return _client.Tasks.GetAllTasksJsonAsync(listId);
}
}Тести знаходяться в окремому проєкті:
ClickUp.Client.Tests\ClickUp.Client.Tests.csproj
Запустити всі тести:
dotnet test .\ClickUp.Client.slnx -c ReleaseЗапустити тільки test project:
dotnet test .\ClickUp.Client.Tests\ClickUp.Client.Tests.csproj -c ReleaseТести використовують fake HttpMessageHandler, тому:
- не потрібен
CLICKUP_API_TOKEN; - немає реальних HTTP-запитів до ClickUp;
- перевіряються URL-и, HTTP methods, headers, JSON body, retry і категорійний facade.
У репозиторії налаштоване semver-версіювання через MinVer, яке бере версію з git tags під час dotnet build і dotnet pack.
Поточні правила:
- формат release tag:
vMAJOR.MINOR.PATCH, наприкладv0.1.0; - префікс
vзаданий черезMinVerTagPrefix; - якщо в історії ще немає тегів, build-и стартують з діапазону
0.1.xчерезMinVerMinimumMajorMinor=0.1; - нетеговані коміти отримують prerelease-версію з суфіксом
alpha.0.<height>; - коміт, на якому стоїть tag
v0.1.0, збирається рівно як0.1.0.
Типовий потік релізу:
git tag v0.1.0
git push origin v0.1.0
dotnet pack .\ClickUp.Client\ClickUp.Client.csproj -c ReleaseПриклади того, як це працює:
- до першого tag build матиме версію на кшталт
0.1.0-alpha.0.5; - build на commit із tag
v0.1.0матиме версію0.1.0; - наступні коміти після
v0.1.0матимуть версії на кшталт0.1.1-alpha.0.1.
Якщо збірка виконується в CI, потрібно підтягувати повну git history і tags. Для GitHub Actions це зазвичай означає fetch-depth: 0.
У репозиторій додано workflow publish-nuget.yml, який:
- запускається на push tag-ів
v*; - робить
restore,build,test,pack; - публікує пакет у
nuget.org.
Підтримуються 2 способи автентифікації:
- Рекомендований: NuGet Trusted Publishing через GitHub Actions OIDC.
- Fallback: GitHub secret
NUGET_API_KEY.
- Увійдіть на
nuget.org. - Відкрийте
Trusted Publishing. - Додайте policy для репозиторію:
- Owner:
YaroslavTsvirkun - Repository:
ClickUp-API - Workflow File:
publish-nuget.yml
- Owner:
- У GitHub repository додайте repository variable
NUGET_ORG_USERзі значенням вашогоnuget.orgusername. - Створіть і запуште release tag, наприклад:
git tag v0.1.0
git push origin v0.1.0- Створіть scoped API key на
nuget.orgз правомPush. - Додайте його в GitHub repository secret
NUGET_API_KEY. - Створіть і запуште release tag:
git tag v0.1.0
git push origin v0.1.0Якщо потрібно опублікувати вручну з локальної машини:
$env:NUGET_API_KEY = '<your_api_key>'
dotnet pack .\ClickUp.Client\ClickUp.Client.csproj -c Release
dotnet nuget push .\ClickUp.Client\bin\Release\ClickUp.Client.*.nupkg --api-key $env:NUGET_API_KEY --source https://api.nuget.org/v3/index.json --skip-duplicateПримітки:
- package ID зараз
ClickUp.Client; - package metadata, README і LICENSE уже пакуються в
.nupkg; - якщо
ClickUp.Clientуже зайнятий наnuget.org, перед першою публікацією потрібно буде змінитиPackageId.
HTTP-відповіді з неуспішним статусом перетворюються на ClickUpApiException. У винятку доступні:
- HTTP method;
- request URI;
- status code;
- response body.
Retry виконується для:
429 Too Many Requests;5xxвідповідей;- тимчасових транспортних помилок, якщо запит не був скасований через
CancellationToken.
- Додати Refit-метод у відповідний interface в
ClickUp.Client\Abstractions. - Додати PowerShell-friendly метод у відповідний клас з
ClickUp.Client\Categories. - Якщо потрібен request body, додати DTO в
ClickUp.Client\Modelsабо приймати JSON-рядок і перетворювати його черезParseJson. - Додати тест у
ClickUp.Client.Tests. - Запустити:
dotnet test .\ClickUp.Client.slnx -c ReleaseПакет зараз таргетує:
net8.0net9.0net10.0netstandard2.0net48
netstandard2.0 призначений для широкої сумісності з бібліотеками та older host-ами, а net48 покриває legacy .NET Framework та Windows PowerShell 5.1 сценарії.
Старі facade-методи на ClickUpClient, наприклад GetAllTasksJson() або AddTaskCommentJson(), залишені для сумісності з уже написаними скриптами.
Для нового коду краще використовувати категорії:
$client.Tasks.GetAllTasksJson('<list_id>')
$client.Comments.AddTaskCommentJson('<task_id>', $comment, $false)- Не зберігайте
CLICKUP_API_TOKENу коді, README, коментарях або Git. - Передавайте токен через змінні середовища або секрети CI.
- Не виводьте headers у лог без редагування
Authorization.