Skip to main content
Invoices vs orders: These guides walk through invoices (formal billing, line items, publish). The collect flow is the same for orders — use /v1/orders/* instead of /v1/invoices/* and set source_type: "ORDER" on the checkout session. See Orders and Parties & counterparties.Hosted checkout: To skip party, invoice, session, and execute steps entirely, see Hosted checkout.
End-to-end invoice collection with HttpClient and System.Text.Json (.NET 6+).
API Reference: Obtain token · Collect

Prerequisites

  • .NET 6 or later
  • Register a typed HttpClient or use IHttpClientFactory
  • Store secrets in User Secrets, Azure Key Vault, or environment variables — not appsettings.json in source control

Steps

1

Token request

using System.Net.Http.Json;
using System.Text.Json;

var baseUrl = "https://api.heydollr.app";
using var http = new HttpClient { BaseAddress = new Uri(baseUrl) };

var tokenRes = await http.PostAsJsonAsync("/v1/jwt/client/obtain/token", new
{
    client_id = Environment.GetEnvironmentVariable("DOLLR_CLIENT_ID"),
    client_secret = Environment.GetEnvironmentVariable("DOLLR_CLIENT_SECRET"),
});
tokenRes.EnsureSuccessStatusCode();
using var doc = await JsonDocument.ParseAsync(await tokenRes.Content.ReadAsStreamAsync());
var bearer = doc.RootElement.GetProperty("access_token").GetString();

http.DefaultRequestHeaders.Authorization =
    new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", bearer);
2

Invoice flow

var party = await http.PostAsJsonAsync("/v1/parties/create", new
{
    fullname = "Amara Kamara",
    phone = "231771234567",
    country_code = "LR",
});
// Parse party id, create counterparty, create invoice, add item, PUT publish
3

Execute

var referenceId = Guid.NewGuid().ToString();

var execution = await http.PostAsJsonAsync("/v1/executions/collection", new
{
    session_id = sessionId,
    payment_account_id = paymentAccountId,
    currency = "USD",
    reference_id = referenceId,
});
Save referenceId to your database before awaiting the response.
4

Poll status

var statusRes = await http.GetAsync($"/v1/status/collection/{referenceId}");
var statusJson = await statusRes.Content.ReadFromJsonAsync<JsonElement>();

Try it yourself

Hosted checkout

Mobile money and card on a Dollr-hosted page — fastest path.

Orders

Same collect flow with source_type: ORDER and /v1/orders/*.

Direct checkout

One API call to create source — API-embedded flow.
Last modified on May 22, 2026