Page Designer
Design PDF templates from a blank page, with text, tables, images and barcodes. Send JSON from your app and get back the filled-out PDF.
- No credit card needed
- Free test PDFs
- 2.0¢ per PDF on Starter
POST /api/v2/templates/{template_id}/submissions
{
"data": {
"attendee": {
"name": "Maya Chen"
},
"seat": "B12",
"ticket_id": "NWS-20931"
}
}
Trusted by teams in lending, insurance, property and healthcare
Templates your AI agent can write
A page design is JSON with a public schema, so your agent can build one from a sentence and change it when you ask.
- Works through the DocSpring MCP server or the API
- A versioned JSON Schema, so its layouts keep working
- Errors that point to the value, so it can fix them
Fine-tune it with drag and drop
Open your agent's page design in the editor, or start from a blank page. Drag elements onto the page, size them and snap them to each other.
- Text, images, tables, charts, checkboxes, shapes, QR codes, barcodes and fillable form fields
- Free sections, stacks, columns and repeating sections
- Snap, rotate, lock and hide elements
Tables that grow with your data
Send a list and the table adds a row for each item, over as many pages as it takes.
- A row for each item, with its heading on every page
- Repeating sections for whole blocks of the page
- Show sections and elements only when they apply
QR codes and barcodes
Draw a QR code or any of seven kinds of barcode from your data, at whatever size the page needs.
- Code 128, Code 39, Code 93, Code 25, EAN-13, EAN-8 and UPC-A
- Text and data together, like a link that ends in an order number
- Check digits added for you, or checked when you send them
Generate a PDF in a few lines of code
Send JSON to the same API as every other DocSpring template.
- SDKs in ten languages, or any HTTP client
- Create page designs with the API, as JSON
- Wait for the PDF, or let it run in the background
import { Client } from 'docspring-ts'
const client = new Client()
const templateId = 'tpl_1234567890abcdef01'
const submission = await client.createSubmission(templateId, {
data: { full_name: 'Maya Chen', monthly_income: 6200 },
})
console.log(submission.files.pdf?.download_url)
import { Client } from 'docspring'
const client = new Client()
const templateId = 'tpl_1234567890abcdef01'
const submission = await client.createSubmission(templateId, {
data: { full_name: 'Maya Chen', monthly_income: 6200 },
})
console.log(submission.files.pdf.download_url)
from docspring import Client
client = Client()
data = {"full_name": "Maya Chen", "monthly_income": 6200}
submission = client.create_submission(
"tpl_1234567890abcdef01",
{"data": data},
)
print(submission.files.pdf.download_url)
require 'docspring'
client = DocSpring::Client.new
submission = client.create_submission(
'tpl_1234567890abcdef01',
{ data: { full_name: 'Maya Chen', monthly_income: 6200 } }
)
puts submission.files.pdf.download_url
<?php
require 'vendor/autoload.php';
$client = new DocSpring\Api\Client();
$data = ['full_name' => 'Maya Chen', 'monthly_income' => 6200];
$submission = $client->createSubmission(
'tpl_1234567890abcdef01',
['data' => $data]
);
echo $submission->getFiles()->getPdf()->getDownloadUrl() . "\n";
import com.docspring.*;
public class Example {
public static void main(String[] args) throws Exception {
CreateSubmissionRequest body = new CreateSubmissionRequest()
.putDataItem("full_name", "Maya Chen")
.putDataItem("monthly_income", 6200);
Submission submission = new Client().createSubmission(
"tpl_1234567890abcdef01", body, null, null);
GeneratedFile pdf = submission.getFiles().getPdf();
System.out.println(pdf.getDownloadUrl());
}
}
using DocSpring.Client.Model;
var client = DocSpring.Sdk.NewClientFromEnv();
var data = new Dictionary<string, object> {
["full_name"] = "Maya Chen",
["monthly_income"] = 6200,
};
var response = await client.CreateSubmissionAsync(
"tpl_1234567890abcdef01",
new CreateSubmissionRequest { Data = data });
var submission = response.Created();
Console.WriteLine(submission.Files.Pdf.DownloadUrl);
import "github.com/docspring/docspring-go/v4"
client := docspring.NewClient("", "")
submission, _, err := client.CreateSubmission(
context.Background(), "tpl_1234567890abcdef01",
).Body(docspring.CreateSubmissionRequest{Data: map[string]any{
"full_name": "Maya Chen", "monthly_income": 6200,
}}).Execute()
if err != nil {
log.Fatal(err)
}
fmt.Println(submission.Files.Pdf.GetDownloadUrl())
conn = Docspring.Connection.new()
{:ok, %Docspring.Model.Submission{} = submission} =
Docspring.Api.Client.create_submission(
conn,
"tpl_1234567890abcdef01",
%{data: %{full_name: "Maya Chen", monthly_income: 6200}}
)
IO.puts(submission.files.pdf.download_url)
use docspring::models::CreateSubmissionRequest as Request;
use docspring::{Api, CreateSubmissionParams as Params};
use serde_json::{from_value, json};
let client = docspring::Client::from_env()?;
let data = json!({"full_name": "Maya Chen", "monthly_income": 6200});
let body = Request { data: from_value(data)?, ..Default::default() };
let params = Params::builder()
.template_id("tpl_1234567890abcdef01").body(body).build();
let submission = client.create_submission(params).await?;
let pdf = submission.files.pdf.and_then(|f| f.download_url);
println!("{}", pdf.unwrap_or_default());
API=https://sync.api.docspring.com/api/v2
curl -s "$API/templates/tpl_1234567890abcdef01/submissions" \
-u "$DOCSPRING_TOKEN_ID:$DOCSPRING_TOKEN_SECRET" \
-H "Content-Type: application/json" \
-d '{
"data": { "full_name": "Maya Chen", "monthly_income": 6200 }
}' \
| jq -r '.files.pdf.download_url'
Test PDFs are free, unlimited and watermarked.
Features
Headers and footers
A header and a footer on every page, with page numbers like "Page 2 of 3".
Fonts
19 openly licensed fonts, the same in the editor as in the PDF.
Images
Logos you upload, and photos from the data you send.
Text that fits
A text box can grow with its text, shrink the text to fit, or cut it off.
Preview
The Preview tab shows the PDF with sample data after each change.
Embedded editor
Let your customers build their own pages in the editor inside your app.
Versions
Publish a version, so changes to the draft don't reach your integration.
US or EU hosting
Keep your documents in the US or the EU. SOC 2 Type II audited.
Questions about the Page Designer
Read the Page Designer guideWhat is the Page Designer?
A kind of PDF template that starts from a blank page. You or your AI agent place text, images, tables, charts, checkboxes, shapes, QR codes and barcodes on the page and put fields from your data in them. Each request fills in the design and returns a PDF.
Can a page design have fillable form fields?
Yes. Add text fields, checkboxes, radio buttons and drop-downs. Each request fills them in from your data, and whoever opens the PDF can change them in their PDF reader, unless you make a field read-only.
Can an AI agent build a page design for me?
Yes. Connect your agent to the DocSpring MCP server, or give it an API token, and describe the page you need. It writes the layout as JSON, which a public JSON Schema describes, and DocSpring checks it and points to any mistake. Change the design in the editor afterwards, and your agent can read your changes back.
How is it different from a PDF or HTML template?
A PDF template fills in a PDF you already have, and an HTML template is HTML and CSS that you write. The Page Designer starts from a blank page and needs no code: you lay the page out with the mouse, and tables and text boxes grow with your data.
Can a table run onto more than one page?
Yes. A table adds a row for each item in a list, and a table with more rows than fit on the page carries on over the next one. Its heading row can repeat on each page, and rows can be kept from breaking across pages.
Can I create and update page designs with the API?
Yes. A page design's layout is a JSON document with a published JSON Schema, so you can create and update page designs with the API, or generate layouts in your own code.
Which fonts can I use?
19 openly licensed fonts, including Roboto, Open Sans, Lato and Poppins, and handwriting fonts such as Dancing Script. The editor shows the same fonts the PDF uses.
Is DocSpring secure enough for financial, insurance and healthcare documents?
DocSpring is SOC 2 Type II audited and HIPAA compliant, and keeps your documents in the US or the EU. We sign a BAA on every paid plan: contact [email protected] before you send protected health information. Enterprise customers can also run DocSpring on their own servers.
How much does a page design PDF cost?
A PDF uses 4 credits for up to 10 pages. Very large files and long processing count as extra units. Test PDFs are free and watermarked.
Compare PDF template tools
Template editors, document generation and pricing, side by side.
Design your first PDF today
Test PDFs are free and unlimited. No credit card needed.

