diff --git a/api-guide/authentication.mdx b/api-guide/authentication.mdx
index 5e65f95..dc4ca8d 100644
--- a/api-guide/authentication.mdx
+++ b/api-guide/authentication.mdx
@@ -5,21 +5,9 @@ sidebar:
order: 2
---
-import { Tabs, TabItem, Code, LinkCard } from '@astrojs/starlight/components'
-import fs from 'fs'
-import path from 'path'
-
-export const authenticationExamples = {
- javascript: await getCodeSample('javascript', 'test_authentication', 'js'),
- typescript: await getCodeSample('typescript', 'test_authentication', 'ts'),
- ruby: await getCodeSample('ruby', 'test_authentication', 'rb'),
- python: await getCodeSample('python', 'test_authentication', 'py'),
- php: await getCodeSample('php', 'test_authentication', 'php'),
- java: await getCodeSample('java', 'test_authentication', 'java'),
- csharp: await getCodeSample('csharp', 'test_authentication', 'cs'),
- go: await getCodeSample('go', 'test_authentication', 'go'),
- elixir: await getCodeSample('elixir', 'test_authentication', 'exs'),
-}
+import { Tabs, TabItem, Code, LinkCard } from "@astrojs/starlight/components";
+import fs from "fs";
+import path from "path";
export async function getCodeSample(language, filename, extension) {
const filePath = path.join(
@@ -44,12 +32,12 @@ DocSpring uses API tokens for authentication. You can authenticate using HTTP ba
Use your API token ID as the username, and the API token secret as the password.
-## Environment Variables
+### Environment Variables
All DocSpring API clients support authentication via environment variables. Set the following environment variables, and the client will automatically use them:
@@ -76,7 +64,7 @@ const client = new DocSpring.Client(); // Automatically uses process.env
client = docspring.Client() # Automatically uses os.environ
```
-## HTTP Basic Authentication
+### HTTP Basic Authentication
"HTTP basic authentation" means that you need to send an `Authorization` header with
the value `Basic` followed by `token_id:token_secret` in Base64 encoding.
@@ -98,49 +86,13 @@ curl -H "Authorization: Basic QVBJX1RPS0VOX0lEOkFQSV9UT0tFTl9TRUNSRVQ=" \
https://sync.api.docspring.com/api/v1/authentication
```
-## Test Authentication
-
-Our API includes an `/authentication` endpoint that you can use to make sure your API tokens are valid.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+---
-
-
-
+### Next Steps
-
-
-
-
+
diff --git a/api-guide/autogenerated-api-clients.mdx b/api-guide/autogenerated-api-clients.mdx
index f67d498..be06d61 100644
--- a/api-guide/autogenerated-api-clients.mdx
+++ b/api-guide/autogenerated-api-clients.mdx
@@ -5,7 +5,7 @@ sidebar:
order: 7
---
-import { LinkCard, Code, Aside } from '@astrojs/starlight/components'
+import { LinkCard, Code, Aside } from "@astrojs/starlight/components";
We use [openapi-generator](https://github.com/OpenAPITools/openapi-generator) to
automatically generate API clients from our OpenAPI schema.
@@ -45,7 +45,7 @@ OpenAPI Generator supports the following languages:
+
+## Related Resources
+
+
+
+
diff --git a/api-guide/create-data-requests.mdx b/api-guide/create-data-requests.mdx
index 305a4eb..616848c 100644
--- a/api-guide/create-data-requests.mdx
+++ b/api-guide/create-data-requests.mdx
@@ -3,7 +3,7 @@ title: Create Data Requests
description: Learn how to create PDF submissions with pending data requests
---
-import { LinkCard } from '@astrojs/starlight/components'
+import { LinkCard } from "@astrojs/starlight/components";
### Create a new PDF job submission with pending data requests
diff --git a/api-guide/generate-pdfs/batch-generate-pdfs.mdx b/api-guide/generate-pdfs/batch-generate-pdfs.mdx
new file mode 100644
index 0000000..857a3ba
--- /dev/null
+++ b/api-guide/generate-pdfs/batch-generate-pdfs.mdx
@@ -0,0 +1,111 @@
+---
+title: Batch Generate PDFs
+description: Create up to 50 submissions in a single API call
+sidebar:
+ order: 4
+---
+
+import { Aside, LinkCard } from "@astrojs/starlight/components";
+
+Batch submission requests let you create multiple PDFs in parallel with a single call to the DocSpring API. Each item in the batch can point to a different template, supply different data, and choose between test or live mode.
+
+## Endpoint
+
+```
+POST /api/v1/submissions/batches
+```
+
+
+
+## Request Structure
+
+Provide an array of submissions. Every entry accepts the same payload as a standard submission request:
+
+```json
+{
+ "submissions": [
+ {
+ "template_id": "tpl_contract",
+ "data": { "name": "John Smith" },
+ "test": true,
+ "metadata": { "pdf_filename": "contract_draft_john_smith" }
+ },
+ {
+ "template_id": "tpl_invoice",
+ "data": { "name": "Acme Corp" },
+ "test": false,
+ "wait": false
+ }
+ ]
+}
+```
+
+
+
+## Response Format
+
+Batch responses include a `batch` object and an array of child `submissions`:
+
+```json
+{
+ "batch": {
+ "id": "bat_123",
+ "status": "processed",
+ "created_at": "2024-02-01T12:00:00Z"
+ },
+ "submissions": [
+ {
+ "id": "sub_first",
+ "status": "processed",
+ "download_url": "https://.../sub_first.pdf"
+ },
+ {
+ "id": "sub_second",
+ "status": "pending"
+ }
+ ]
+}
+```
+
+When you set `wait=false` on any submission, the batch response may return before the PDF is ready. Poll each submission with `GET /api/v1/submissions/{id}` or listen for the `submission.completed` webhook.
+
+## Limits & Best Practices
+
+- **Up to 50 submissions** per batch request.
+- **Mix templates freely** – each item can target a different template.
+- **Test vs. live mode** – set `test` per submission.
+- **Back pressure** – prefer batch requests when generating many documents to avoid hitting rate limits with individual calls.
+- **Webhooks** – enable webhooks if you need to know when asynchronous submissions finish processing.
+
+## Related Topics
+
+
+
+
+
+
+
+
diff --git a/api-guide/customize-pdf-title-and-filename.mdx b/api-guide/generate-pdfs/customize-pdf-title-and-filename.mdx
similarity index 95%
rename from api-guide/customize-pdf-title-and-filename.mdx
rename to api-guide/generate-pdfs/customize-pdf-title-and-filename.mdx
index 5779c6b..daa1970 100644
--- a/api-guide/customize-pdf-title-and-filename.mdx
+++ b/api-guide/generate-pdfs/customize-pdf-title-and-filename.mdx
@@ -5,7 +5,7 @@ sidebar:
order: 3
---
-import { Aside } from '@astrojs/starlight/components'
+import { Aside } from "@astrojs/starlight/components";
When generating PDFs through the DocSpring API, you can customize both the PDF title (shown in PDF reader applications) and the filename in the download URL.
diff --git a/api-guide/generate-pdfs/generate-pdfs-via-api.mdx b/api-guide/generate-pdfs/generate-pdfs-via-api.mdx
new file mode 100644
index 0000000..aa0c058
--- /dev/null
+++ b/api-guide/generate-pdfs/generate-pdfs-via-api.mdx
@@ -0,0 +1,79 @@
+---
+title: Generate PDFs via API
+description: Generate PDFs from templates using the DocSpring API
+sidebar:
+ order: 3
+---
+
+import { LinkCard } from "@astrojs/starlight/components";
+
+DocSpring generates PDFs by filling your templates with submission data. Templates can either be uploads that you annotate in the Template Editor or fully custom HTML/CSS layouts that you host in DocSpring.
+
+## Endpoint
+
+```
+POST /api/v1/templates/{template_id}/submissions
+```
+
+
+
+## Request Payload Basics
+
+Every submission must include:
+
+- `data` — Field values that match your template schema.
+- `test` — Use `true` for free, watermarked PDFs while building your integration.
+- `metadata` — Optional map for values you want echoed back in webhooks.
+- `version` — Choose `draft`, `latest`, or a specific version such as `1.2.3`.
+
+Optional parameters:
+
+- `wait` — Decide between synchronous and asynchronous processing.
+- `editable` — Keep the resulting PDF fillable or flatten the form fields.
+- `expires_in` — Set a TTL for the generated PDF download link.
+- `field_overrides` — Temporarily adjust field requirements or defaults.
+- `data_requests` — Kick off a data collection or signature workflow before finalizing the PDF.
+
+## Processing Modes
+
+Submissions sent to `sync.api.docspring.com` wait for processing and return the `download_url` in the response. Switching `wait=false` or using the asynchronous domain returns immediately with a pending submission. See [Sync vs. Async Processing](/docs/api-guide/synchronous-requests/) for flow diagrams, polling tips, and webhook guidance.
+
+## Batch Generation
+
+Need to create many PDFs at once? Use the batch endpoint to submit up to 50 requests together. Each entry can target a different template, switch between test/live, and specify its own metadata.
+
+
+
+## More Info
+
+
+
+
+
+
+
+
diff --git a/api-guide/truncated-text.mdx b/api-guide/generate-pdfs/handle-truncated-text.mdx
similarity index 94%
rename from api-guide/truncated-text.mdx
rename to api-guide/generate-pdfs/handle-truncated-text.mdx
index 54350cb..3751b56 100644
--- a/api-guide/truncated-text.mdx
+++ b/api-guide/generate-pdfs/handle-truncated-text.mdx
@@ -1,11 +1,11 @@
---
-title: When Text Doesn't Fit in a Field
+title: Handle Truncated Text
description: Handle text that doesn't fit in a PDF field
sidebar:
order: 5
---
-import { Aside, Code } from '@astrojs/starlight/components'
+import { Aside, Code } from "@astrojs/starlight/components";
If the full text can't fit in a field and the field's "Overflow" option is set to "Truncate",
DocSpring will store any truncated text in the submission.
diff --git a/api-guide/special-newline-characters.mdx b/api-guide/generate-pdfs/special-newline-characters.mdx
similarity index 94%
rename from api-guide/special-newline-characters.mdx
rename to api-guide/generate-pdfs/special-newline-characters.mdx
index 94245b2..5a4f398 100644
--- a/api-guide/special-newline-characters.mdx
+++ b/api-guide/generate-pdfs/special-newline-characters.mdx
@@ -5,7 +5,7 @@ sidebar:
order: 4
---
-import { Aside } from '@astrojs/starlight/components'
+import { Aside } from "@astrojs/starlight/components";
## The `%%LF%%` Sequence
diff --git a/api-guide/install-api-client.mdx b/api-guide/install-api-client.mdx
index b5f71dc..1412a60 100644
--- a/api-guide/install-api-client.mdx
+++ b/api-guide/install-api-client.mdx
@@ -5,55 +5,67 @@ sidebar:
order: 1
---
-import { Tabs, TabItem, LinkCard } from '@astrojs/starlight/components'
-import JavaScriptInstallation from '@components/sdk-installation/javascript.astro'
-import TypeScriptInstallation from '@components/sdk-installation/typescript.astro'
-import RubyInstallation from '@components/sdk-installation/ruby.astro'
-import PythonInstallation from '@components/sdk-installation/python.astro'
-import PHPInstallation from '@components/sdk-installation/php.astro'
-import JavaInstallation from '@components/sdk-installation/java.astro'
-import CSharpInstallation from '@components/sdk-installation/csharp.astro'
-import GoInstallation from '@components/sdk-installation/go.astro'
-import ElixirInstallation from '@components/sdk-installation/elixir.astro'
-import './install-api-client.css'
+import { Tabs, TabItem, LinkCard } from "@astrojs/starlight/components";
+import SdkInstallationCardGrid from "@components/SdkInstallationCardGrid.astro";
+import "./install-api-client.css";
+import { sdkLinkCardConfigs } from "@utils/sdkInstallations";
+
+import JavaScriptMarkdown from "../../sdk-installation/javascript.md";
+import TypeScriptMarkdown from "../../sdk-installation/typescript.md";
+import RubyMarkdown from "../../sdk-installation/ruby.md";
+import PythonMarkdown from "../../sdk-installation/python.md";
+import PHPMarkdown from "../../sdk-installation/php.md";
+import CSharpMarkdown from "../../sdk-installation/csharp.md";
+import GoMarkdown from "../../sdk-installation/go.md";
+import JavaMarkdown from "../../sdk-installation/java.md";
+import ElixirMarkdown from "../../sdk-installation/elixir.md";
Choose your preferred programming language to get started with the DocSpring API.
-
-
-
-
-
-
-
-
-
+
+
-
+
+
+
+
+
+
+
-
+
+
-
+
+
-
+
+
-
+
+
-
+
+
+
+
+
+
+
diff --git a/api-guide/openapi-schema.mdx b/api-guide/openapi-schema.mdx
index ca12854..fca9abb 100644
--- a/api-guide/openapi-schema.mdx
+++ b/api-guide/openapi-schema.mdx
@@ -5,7 +5,7 @@ sidebar:
order: 6
---
-import { LinkCard, Aside } from '@astrojs/starlight/components'
+import { LinkCard, Aside } from "@astrojs/starlight/components";
We define our API endpoints and request/response schemas using the [OpenAPI specification](https://swagger.io/docs/specification/about/) (formerly known as [Swagger](https://swagger.io/)).
@@ -21,12 +21,6 @@ and [Postman collection](/docs/api-guide/postman/).
## Resources
-
-
+### 2.7.3
+
+
+ Released on Jan 28, 2026
+
+
+- Improved dark mode styling across embedded visual forms (header, footer, and form fields)
+- Updated signature modal colors and contrast for better readability
+
+### 2.7.2
+
+
+ Released on Jan 22, 2026
+
+
+- Added support for initials fields in visual forms / data requests
+
+### 2.7.1
Released on Jul 10, 2025
diff --git a/forms/compare-docspring-forms.mdx b/forms/compare-docspring-forms.mdx
index 7c8bc2b..0239a1f 100644
--- a/forms/compare-docspring-forms.mdx
+++ b/forms/compare-docspring-forms.mdx
@@ -5,53 +5,39 @@ sidebar:
order: 0
---
-import { LinkCard, Aside, Code, Icon } from '@astrojs/starlight/components'
+import { LinkCard, Aside, Code, Icon } from "@astrojs/starlight/components";
-DocSpring supports three different kinds of forms that can be used to fill out and generate PDFs.
-
-- [Web Forms](/docs/forms/web-forms/)
- - Ideal for turning complex PDFs into a simple web-based form with inputs and checkboxes.
-- [Visual Forms](/docs/forms/visual-forms/)
- - Show a visual representation of the PDF to users and allow them to fill out the fields. Similar to filling out a PDF form in Acrobat or Preview on macOS.
-- [Data Requests](/docs/forms/data-requests/)
- - Generate legally binding electronic signatures with UETA/ESIGN compliance. Renders a visual form inside a secure iframe and adds compliance features and audit trails.
-
-
-
-### Key Differences
-
-| Feature | Web Forms | Visual Forms | Data Requests |
-| ---------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- |
-| Available on DocSpring.com | | | |
-| Embed on your own website | | | |
-| Field validation | | | |
-| Mobile support | | | |
-| Works with PDF templates | | | |
-| Works with HTML templates | | | |
-| Visual PDF preview | | | |
-| Audit trail tracking | | | |
-| User authentication tracking | | | |
-| Legally binding e-signatures | | | |
-
-## Next Steps
+DocSpring supports three different kinds of forms that can be used to collect data and generate PDFs.
+
+### Comparison
+
+| Feature | Web Forms | Visual Forms | Data Requests |
+| --------------------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- |
+| Available on [DocSpring.com](https://docspring.com) | | | |
+| Embed on your own website | | | |
+| Field validation | | | |
+| Mobile support | | | |
+| Works with PDF templates | | | |
+| Works with HTML templates | | | |
+| Visual PDF preview | | | |
+| Audit trail tracking | | | |
+| User authentication tracking | | | |
+| Legally binding e-signatures | | | |
diff --git a/forms/data-requests.mdx b/forms/data-requests.mdx
index 8f2a362..5a0a75a 100644
--- a/forms/data-requests.mdx
+++ b/forms/data-requests.mdx
@@ -3,13 +3,13 @@ title: Data Requests
description: Core documentation for collecting UETA and ESIGN compliant electronic signatures
---
-import { LinkCard, Aside } from '@astrojs/starlight/components'
+import { LinkCard, Aside } from "@astrojs/starlight/components";
### Collect legally binding electronic signatures
Create a Data Request to collect UETA and ESIGN compliant electronic signatures.
-When you make an API request to fill out a PDF, you can specify that some fields must be filled in by certain people (including signature fields). The PDF submission will be in a pending state until all of the data requests have been completed. You can then send these people a link to fill in the form, or embed this form on your own website. When everyone has filled in the form, the PDF will be generated, and we can send your server a webhook notification.
+When you make an API request to fill out a PDF, you can specify that some fields must be filled in by certain people (including signature or initials fields). The PDF submission will be in a pending state until all of the data requests have been completed. You can then send these people a link to fill in the form, or embed this form on your own website. When everyone has filled in the form, the PDF will be generated, and we can send your server a webhook notification.
To collect UETA and ESIGN compliant electronic signatures, DocSpring must record an audit trail that includes user authentication. This means that you need to send us some details about how and when your users have been authenticated.
@@ -35,7 +35,7 @@ To ensure legal compliance, data requests must include:
- The user's full name
- The user's email address
- Details about how and when the user was authenticated
-- The fields that the user must fill out (including signature fields)
+- The fields that the user must fill out (including signature or initials fields)
- Optional metadata to save on the data request