Upwork 0.0.0-dev.3
See the version list below for details.
dotnet add package Upwork --version 0.0.0-dev.3
NuGet\Install-Package Upwork -Version 0.0.0-dev.3
<PackageReference Include="Upwork" Version="0.0.0-dev.3" />
<PackageVersion Include="Upwork" Version="0.0.0-dev.3" />
<PackageReference Include="Upwork" />
paket add Upwork --version 0.0.0-dev.3
#r "nuget: Upwork, 0.0.0-dev.3"
#:package Upwork@0.0.0-dev.3
#addin nuget:?package=Upwork&version=0.0.0-dev.3&prerelease
#tool nuget:?package=Upwork&version=0.0.0-dev.3&prerelease
Upwork
C# SDK for the Upwork GraphQL API. The first supported surface is marketplace job search for freelancer workflows.
Features
- Public marketplace job search
- Authenticated marketplace job search with cursor paging, sort attributes, and typed filter builders
- Marketplace job content lookup by job ID
- Proposal metadata lookup and vendor proposal list/detail workflows for freelancers and agencies
- Proposal attachment upload-link and file-confirmation mutation helpers
- Constants for marketplace job types, durations, workloads, experience levels, proposal statuses, and proposal sort fields
- OAuth token exchange helpers for authorization-code, refresh-token, and enterprise client-credentials flows
- Raw GraphQL execution escape hatch for fields that are not yet wrapped
- Source-generated JSON serialization for trimming and NativeAOT compatibility
Usage
using Upwork;
using var client = new UpworkClient(accessToken);
var jobs = await client.SearchMarketplaceJobPostingsAsync(
UpworkMarketplaceJobFilters.Keywords("dotnet graphql", first: 10) with
{
VerifiedPaymentOnly = true,
},
sortAttributes:
[
new UpworkMarketplaceJobPostingSearchSort(
UpworkMarketplaceJobPostingSearchSortFields.Recency),
]);
For public marketplace search, use SearchPublicMarketplaceJobPostingsAsync with UpworkPublicMarketplaceJobFilter.
For freelancer proposal workflows, use GetProposalMetadataAsync, SearchVendorProposalsAsync, and GetVendorProposalAsync.
Upwork's public GraphQL docs currently expose proposal attachment helper mutations, but not a vendor proposal submit/update mutation.
Public Marketplace Job Search
Search public marketplace jobs with the Upwork GraphQL API.
using var client = new UpworkClient(accessToken);
// Search current public marketplace jobs.
var response = await client.SearchPublicMarketplaceJobPostingsAsync(
UpworkPublicMarketplaceJobFilters.Keywords("dotnet graphql", pageSize: 10) with
{
JobType = UpworkJobTypes.Fixed,
VerifiedPaymentOnly = true,
});
Authenticated Marketplace Job Search
Search marketplace jobs from an authenticated freelancer workflow.
using var client = new UpworkClient(accessToken);
// Search marketplace jobs with cursor pagination and recency sorting.
var response = await client.SearchMarketplaceJobPostingsAsync(
UpworkMarketplaceJobFilters.Keywords("dotnet graphql", first: 10) with
{
VerifiedPaymentOnly = true,
},
sortAttributes:
[
new UpworkMarketplaceJobPostingSearchSort(
UpworkMarketplaceJobPostingSearchSortFields.Recency),
]);
Marketplace Job Content
Fetch full marketplace job content after finding a job ID from search.
using var client = new UpworkClient(accessToken);
// Find a job, then fetch its content by ID.
var search = await client.SearchMarketplaceJobPostingsAsync(
new UpworkMarketplaceJobFilter
{
SearchExpression = "dotnet",
Pagination = new UpworkCursorPagination(first: 1),
});
var firstJob = search.Edges?.FirstOrDefault()?.Node;
var job = await client.GetMarketplaceJobPostingAsync(firstJob.Id!);
Proposal Metadata
Read proposal metadata for freelancer proposal workflows.
using var client = new UpworkClient(accessToken);
// Fetch proposal reference metadata, including engagement durations and decline reasons.
var metadata = await client.GetProposalMetadataAsync(UpworkReasonTypes.ProposalDecline);
Vendor Proposal Search
List vendor proposals for a freelancer or agency account.
using var client = new UpworkClient(accessToken);
// List accepted vendor proposals with cursor pagination.
var response = await client.SearchVendorProposalsAsync(
UpworkVendorProposalFilters.ByStatus(UpworkProposalStatuses.Accepted),
pagination: new UpworkCursorPagination(first: 10));
Vendor Proposal Details
Read a vendor proposal after finding it in the freelancer proposal list.
using var client = new UpworkClient(accessToken);
// Find one accepted proposal and then load its detail record.
var response = await client.SearchVendorProposalsAsync(
UpworkVendorProposalFilters.ByStatus(UpworkProposalStatuses.Accepted),
pagination: new UpworkCursorPagination(first: 1));
var proposalId = response.Edges?
.Select(edge => edge.Node?.Id)
.FirstOrDefault(id => id is { Length: > 0 });
if (proposalId is not { Length: > 0 })
{
throw new AssertInconclusiveException("No accepted vendor proposals were returned for this account.");
}
var proposal = await client.GetVendorProposalAsync(proposalId);
Support
Priority place for bugs: https://github.com/tryAGI/Upwork/issues
Priority place for ideas and general questions: https://github.com/tryAGI/Upwork/discussions
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 112 | 6/23/2026 |
| 0.0.0-dev.7 | 130 | 6/23/2026 |
| 0.0.0-dev.6 | 49 | 6/23/2026 |
| 0.0.0-dev.5 | 52 | 6/23/2026 |
| 0.0.0-dev.4 | 56 | 6/23/2026 |
| 0.0.0-dev.3 | 60 | 6/22/2026 |
| 0.0.0-dev.2 | 66 | 6/21/2026 |
| 0.0.0-dev.1 | 61 | 6/21/2026 |
| 0.0.0-dev | 101 | 6/21/2026 |