Quick Start for C#
Integrate PDFBolt's REST API in C# to generate PDFs from URLs, HTML, or templates. The examples below cover all three conversion modes (Direct, Sync, Async).
1. Get Your API Key
Find your API key on the API Keys page in your Dashboard. If you don't have an account, sign up – the free plan includes 100 document conversions per month.
2. Make Your First Request
Any HTTP client works – adjust the request structure to match your library.
Examples use the built-in HttpClient and System.Text.Json.
Choose your endpoint:
- Direct
- Sync
- Async
The Direct endpoint provides immediate PDF generation and returns the raw PDF file in the response.
Choose your source:
- URL
- HTML
- Template
Convert a webpage to PDF:
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class DirectUrl {
public static async Task Main(string[] args) {
using var client = new HttpClient();
var requestData = new {
url = "https://example.com",
format = "A4",
printBackground = true
};
var request = new HttpRequestMessage {
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.pdfbolt.com/v1/direct"),
Content = new StringContent(
JsonSerializer.Serialize(requestData),
Encoding.UTF8,
"application/json"
)
};
request.Headers.Add("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
try {
using var response = await client.SendAsync(request);
if (!response.IsSuccessStatusCode) {
var errorContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"HTTP {(int)response.StatusCode}");
Console.WriteLine($"Error Message: {errorContent}");
return;
}
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("webpage.pdf", pdfBytes);
Console.WriteLine("PDF generated successfully");
} catch (Exception ex) {
Console.WriteLine($"Error: {ex.Message}");
}
}
}
Convert HTML to PDF (HTML must be base64 encoded):
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class DirectHtml {
public static async Task Main(string[] args) {
using var client = new HttpClient();
string htmlContent = "<html><body><h1>Hello!</h1><p>This is a sample PDF.</p></body></html>";
string base64Html = Convert.ToBase64String(Encoding.UTF8.GetBytes(htmlContent));
var requestData = new {
html = base64Html,
format = "A4",
printBackground = true,
margin = new {
top = "30px",
left = "30px"
}
};
var request = new HttpRequestMessage {
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.pdfbolt.com/v1/direct"),
Content = new StringContent(
JsonSerializer.Serialize(requestData),
Encoding.UTF8,
"application/json"
)
};
request.Headers.Add("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
try {
using var response = await client.SendAsync(request);
if (!response.IsSuccessStatusCode) {
var errorContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"HTTP {(int)response.StatusCode}");
Console.WriteLine($"Error Message: {errorContent}");
return;
}
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("document.pdf", pdfBytes);
Console.WriteLine("PDF generated successfully");
} catch (Exception ex) {
Console.WriteLine($"Error: {ex.Message}");
}
}
}
Convert a template with data to PDF:
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class DirectTemplate {
public static async Task Main(string[] args) {
using var client = new HttpClient();
var requestData = new {
templateId = "your-template-id",
templateData = new {
client_name = "John Doe",
invoice_number = "INV-001",
total_amount = "$299.99",
line_items = new object[] {
new { description = "Web Development", unit_price = "$200.00" },
new { description = "Design Services", unit_price = "$99.99" }
}
}
};
var request = new HttpRequestMessage {
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.pdfbolt.com/v1/direct"),
Content = new StringContent(
JsonSerializer.Serialize(requestData),
Encoding.UTF8,
"application/json"
)
};
request.Headers.Add("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
try {
using var response = await client.SendAsync(request);
if (!response.IsSuccessStatusCode) {
var errorContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"HTTP {(int)response.StatusCode}");
Console.WriteLine($"Error Message: {errorContent}");
return;
}
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("invoice.pdf", pdfBytes);
Console.WriteLine("PDF generated successfully");
} catch (Exception ex) {
Console.WriteLine($"Error: {ex.Message}");
}
}
}
Create your first template in the app, then use its ID with JSON data in your API calls. Learn more about Templates
The Sync endpoint returns a JSON response with a download URL for the PDF (valid for 24 hours).
Choose your source:
- URL
- HTML
- Template
Convert a webpage and get a download URL:
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class SyncUrl {
public static async Task Main(string[] args) {
using var client = new HttpClient();
var requestData = new {
url = "https://example.com",
format = "A4",
printBackground = true
};
var request = new HttpRequestMessage {
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.pdfbolt.com/v1/sync"),
Content = new StringContent(
JsonSerializer.Serialize(requestData),
Encoding.UTF8,
"application/json"
)
};
request.Headers.Add("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
try {
using var response = await client.SendAsync(request);
if (!response.IsSuccessStatusCode) {
var errorContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"HTTP {(int)response.StatusCode}");
Console.WriteLine($"Error Message: {errorContent}");
return;
}
var responseContent = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<JsonElement>(responseContent);
Console.WriteLine($"PDF URL: {result.GetProperty("documentUrl").GetString()}");
} catch (Exception ex) {
Console.WriteLine($"Error: {ex.Message}");
}
}
}
Convert HTML and get a download URL (HTML must be base64 encoded):
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class SyncHtml {
public static async Task Main(string[] args) {
using var client = new HttpClient();
string htmlContent = "<html><body><h1>Hello!</h1><p>This is a sample PDF.</p></body></html>";
string base64Html = Convert.ToBase64String(Encoding.UTF8.GetBytes(htmlContent));
var requestData = new {
html = base64Html,
format = "A4",
printBackground = true,
margin = new {
top = "30px",
left = "30px"
}
};
var request = new HttpRequestMessage {
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.pdfbolt.com/v1/sync"),
Content = new StringContent(
JsonSerializer.Serialize(requestData),
Encoding.UTF8,
"application/json"
)
};
request.Headers.Add("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
try {
using var response = await client.SendAsync(request);
if (!response.IsSuccessStatusCode) {
var errorContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"HTTP {(int)response.StatusCode}");
Console.WriteLine($"Error Message: {errorContent}");
return;
}
var responseContent = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<JsonElement>(responseContent);
Console.WriteLine($"PDF URL: {result.GetProperty("documentUrl").GetString()}");
} catch (Exception ex) {
Console.WriteLine($"Error: {ex.Message}");
}
}
}
Convert a template with data and get a download URL:
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class SyncTemplate {
public static async Task Main(string[] args) {
using var client = new HttpClient();
var requestData = new {
templateId = "your-template-id",
templateData = new {
client_name = "John Doe",
invoice_number = "INV-001",
total_amount = "$299.99",
line_items = new object[] {
new { description = "Web Development", unit_price = "$200.00" },
new { description = "Design Services", unit_price = "$99.99" }
}
}
};
var request = new HttpRequestMessage {
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.pdfbolt.com/v1/sync"),
Content = new StringContent(
JsonSerializer.Serialize(requestData),
Encoding.UTF8,
"application/json"
)
};
request.Headers.Add("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
try {
using var response = await client.SendAsync(request);
if (!response.IsSuccessStatusCode) {
var errorContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"HTTP {(int)response.StatusCode}");
Console.WriteLine($"Error Message: {errorContent}");
return;
}
var responseContent = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<JsonElement>(responseContent);
Console.WriteLine($"PDF URL: {result.GetProperty("documentUrl").GetString()}");
} catch (Exception ex) {
Console.WriteLine($"Error: {ex.Message}");
}
}
}
Create your first template in the app, then use its ID with JSON data in your API calls. Learn more about Templates
The Async endpoint returns a requestId immediately and delivers the final result via webhook callback.
Choose your source:
- URL
- HTML
- Template
Convert a webpage and receive a webhook callback:
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class AsyncUrl {
public static async Task Main(string[] args) {
using var client = new HttpClient();
var requestData = new {
url = "https://example.com",
format = "A4",
printBackground = true,
webhook = "https://your-app.com/webhook"
};
var request = new HttpRequestMessage {
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.pdfbolt.com/v1/async"),
Content = new StringContent(
JsonSerializer.Serialize(requestData),
Encoding.UTF8,
"application/json"
)
};
request.Headers.Add("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
try {
using var response = await client.SendAsync(request);
if (!response.IsSuccessStatusCode) {
var errorContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"HTTP {(int)response.StatusCode}");
Console.WriteLine($"Error Message: {errorContent}");
return;
}
var responseContent = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<JsonElement>(responseContent);
Console.WriteLine($"Request ID: {result.GetProperty("requestId").GetString()}");
Console.WriteLine("PDF will be sent to webhook when ready");
} catch (Exception ex) {
Console.WriteLine($"Error: {ex.Message}");
}
}
}
Convert HTML and receive a webhook callback (HTML must be base64 encoded):
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class AsyncHtml {
public static async Task Main(string[] args) {
using var client = new HttpClient();
string htmlContent = "<html><body><h1>Hello!</h1><p>This is a sample PDF.</p></body></html>";
string base64Html = Convert.ToBase64String(Encoding.UTF8.GetBytes(htmlContent));
var requestData = new {
html = base64Html,
format = "A4",
printBackground = true,
margin = new {
top = "30px",
left = "30px"
},
webhook = "https://your-app.com/webhook"
};
var request = new HttpRequestMessage {
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.pdfbolt.com/v1/async"),
Content = new StringContent(
JsonSerializer.Serialize(requestData),
Encoding.UTF8,
"application/json"
)
};
request.Headers.Add("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
try {
using var response = await client.SendAsync(request);
if (!response.IsSuccessStatusCode) {
var errorContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"HTTP {(int)response.StatusCode}");
Console.WriteLine($"Error Message: {errorContent}");
return;
}
var responseContent = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<JsonElement>(responseContent);
Console.WriteLine($"Request ID: {result.GetProperty("requestId").GetString()}");
Console.WriteLine("PDF will be sent to webhook when ready");
} catch (Exception ex) {
Console.WriteLine($"Error: {ex.Message}");
}
}
}
Convert a template with data and receive a webhook callback:
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class AsyncTemplate {
public static async Task Main(string[] args) {
using var client = new HttpClient();
var requestData = new {
templateId = "your-template-id",
templateData = new {
client_name = "John Doe",
invoice_number = "INV-001",
total_amount = "$299.99",
line_items = new object[] {
new { description = "Web Development", unit_price = "$200.00" },
new { description = "Design Services", unit_price = "$99.99" }
}
},
webhook = "https://your-app.com/webhook"
};
var request = new HttpRequestMessage {
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.pdfbolt.com/v1/async"),
Content = new StringContent(
JsonSerializer.Serialize(requestData),
Encoding.UTF8,
"application/json"
)
};
request.Headers.Add("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
try {
using var response = await client.SendAsync(request);
if (!response.IsSuccessStatusCode) {
var errorContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"HTTP {(int)response.StatusCode}");
Console.WriteLine($"Error Message: {errorContent}");
return;
}
var responseContent = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<JsonElement>(responseContent);
Console.WriteLine($"Request ID: {result.GetProperty("requestId").GetString()}");
Console.WriteLine("PDF will be sent to webhook when ready");
} catch (Exception ex) {
Console.WriteLine($"Error: {ex.Message}");
}
}
}
Create your first template in the app, then use its ID with JSON data in your API calls. Learn more about Templates
Next Steps
📄️ API Endpoints
📄️ Conversion Parameters
📄️ Error Handling
📄️ Templates
- Optimizing HTML for Professional PDF Output – HTML/CSS techniques: page breaks, fonts, and image optimization.
- Compress PDF via API: Reduce File Size Programmatically – reduce PDF file size via the PDFBolt API.