Upwork 0.0.0-dev.3

This is a prerelease version of Upwork.
There is a newer version of this package available.
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
                    
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="Upwork" Version="0.0.0-dev.3" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Upwork" Version="0.0.0-dev.3" />
                    
Directory.Packages.props
<PackageReference Include="Upwork" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Upwork --version 0.0.0-dev.3
                    
#r "nuget: Upwork, 0.0.0-dev.3"
                    
#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.
#:package Upwork@0.0.0-dev.3
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Upwork&version=0.0.0-dev.3&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Upwork&version=0.0.0-dev.3&prerelease
                    
Install as a Cake Tool

Upwork

Nuget package dotnet License: MIT

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.

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,
    });

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);

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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • 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