Zapier
5,000+ app integrations with visual workflow builder
Connect Glyph to your automation workflows and generate PDFs from any platform that supports HTTP requests. No code required.
With Glyph webhooks, you can automatically generate PDFs when:
Zapier
5,000+ app integrations with visual workflow builder
Make.com
Advanced scenarios with data transformation
n8n
Self-hosted automation with full control
Any Platform
Works with any tool that can make HTTP requests
Before you begin, you’ll need:
Every Glyph PDF generation follows the same pattern:
1. Preview → 2. Modify (optional) → 3. GeneratePOST /v1/preview - Create a session with your template and data
sessionId you’ll use in subsequent stepsPOST /v1/modify (optional) - Apply AI-powered customizations
POST /v1/generate - Convert the session to PDF
Create a new Zap in your Zapier account
Choose your Trigger (e.g., “New Form Submission in Typeform”)
Add an Action - Search for “Webhooks by Zapier”
Select Custom Request
Configure Step 1: Create Preview
Configure the HTTP request:
| Field | Value |
|---|---|
| Method | POST |
| URL | https://api.glyph.you/v1/preview |
| Data Pass-Through | No |
Headers:
| Key | Value |
|---|---|
| Authorization | Bearer gk_your_api_key |
| Content-Type | application/json |
Body:
{ "template": "quote-modern", "data": { "client": { "name": "{{trigger_field_name}}", "company": "{{trigger_field_company}}", "email": "{{trigger_field_email}}" }, "lineItems": [ { "description": "{{trigger_field_service}}", "quantity": 1, "unitPrice": {{trigger_field_price}}, "total": {{trigger_field_price}} } ], "totals": { "subtotal": {{trigger_field_price}}, "total": {{trigger_field_price}} }, "meta": { "quoteNumber": "Q-{{zap_meta_id}}", "date": "{{zap_meta_human_date}}" } }}Add another Webhooks by Zapier action:
| Field | Value |
|---|---|
| Method | POST |
| URL | https://api.glyph.you/v1/generate |
Headers:
| Key | Value |
|---|---|
| Authorization | Bearer gk_your_api_key |
| Content-Type | application/json |
| Accept | application/json |
Body:
{ "sessionId": "{{step1_sessionId}}", "format": "pdf"}The response includes a base64-encoded PDF that you can:
Trigger: New submission in Typeform
Actions:
/v1/preview/v1/generateMake.com (formerly Integromat) offers more advanced data manipulation. Here’s how to set up a scenario.
Create a new Scenario in Make.com
Add your trigger module (e.g., “Watch New Submissions” in Google Forms)
Add an HTTP module → Make a request
Configuration:
| Field | Value |
|---|---|
| URL | https://api.glyph.you/v1/preview |
| Method | POST |
| Body type | Raw |
| Content type | JSON (application/json) |
Headers:
Add a new header:
AuthorizationBearer gk_your_api_keyRequest content (JSON):
{ "template": "quote-modern", "data": { "client": { "name": "{{1.answers.name}}", "company": "{{1.answers.company}}", "email": "{{1.answers.email}}" }, "lineItems": {{toJSON(1.answers.items)}}, "totals": { "subtotal": {{1.answers.subtotal}}, "tax": {{1.answers.tax}}, "total": {{1.answers.total}} }, "meta": { "quoteNumber": "Q-{{formatDate(now; 'YYYYMMDD')}}-{{1.responseId}}", "date": "{{formatDate(now; 'MMMM D, YYYY')}}" } }}Parse response: Yes
Add another HTTP module:
| Field | Value |
|---|---|
| URL | https://api.glyph.you/v1/generate |
| Method | POST |
| Body type | Raw |
| Content type | JSON (application/json) |
Headers:
Authorization: Bearer gk_your_api_keyAccept: application/jsonRequest content:
{ "sessionId": "{{2.data.sessionId}}", "format": "pdf"}Insert an HTTP module between preview and generate:
| Field | Value |
|---|---|
| URL | https://api.glyph.you/v1/modify |
| Method | POST |
Request content:
{ "sessionId": "{{2.data.sessionId}}", "prompt": "Apply professional navy blue styling to the header"}For any platform that supports HTTP requests (n8n, Pipedream, Power Automate, custom scripts), here’s the complete API flow.
| Step | Method | Endpoint | Purpose |
|---|---|---|---|
| 1 | POST | https://api.glyph.you/v1/preview | Create session with data |
| 2 | POST | https://api.glyph.you/v1/modify | AI modifications (optional) |
| 3 | POST | https://api.glyph.you/v1/generate | Generate PDF |
All requests must include:
Authorization: Bearer gk_your_api_keyContent-Type: application/jsonRequest:
curl -X POST https://api.glyph.you/v1/preview \ -H "Authorization: Bearer gk_your_api_key" \ -H "Content-Type: application/json" \ -d '{ "template": "quote-modern", "data": { "client": { "name": "Acme Corporation", "email": "billing@acme.com", "company": "Acme Corp" }, "lineItems": [ { "description": "Consulting Services", "quantity": 10, "unitPrice": 150, "total": 1500 } ], "totals": { "subtotal": 1500, "tax": 120, "total": 1620 }, "meta": { "quoteNumber": "Q-2024-001", "date": "January 22, 2024" } } }'Response:
{ "html": "<!DOCTYPE html><html>...</html>", "sessionId": "550e8400-e29b-41d4-a716-446655440000"}Request:
curl -X POST https://api.glyph.you/v1/modify \ -H "Authorization: Bearer gk_your_api_key" \ -H "Content-Type: application/json" \ -d '{ "sessionId": "550e8400-e29b-41d4-a716-446655440000", "prompt": "Add a professional watermark with our company name" }'Response:
{ "html": "<!DOCTYPE html><html>...</html>", "changes": ["Added watermark with company name"]}Request (returns binary PDF):
curl -X POST https://api.glyph.you/v1/generate \ -H "Authorization: Bearer gk_your_api_key" \ -H "Content-Type: application/json" \ -d '{ "sessionId": "550e8400-e29b-41d4-a716-446655440000", "format": "pdf" }' \ --output document.pdfRequest (returns JSON with base64):
curl -X POST https://api.glyph.you/v1/generate \ -H "Authorization: Bearer gk_your_api_key" \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -d '{ "sessionId": "550e8400-e29b-41d4-a716-446655440000", "format": "pdf" }'Response:
{ "url": "data:application/pdf;base64,JVBERi0xLjQK...", "format": "pdf", "size": 45678}Use the HTTP Request node with these settings:
Node 1: Create Preview
https://api.glyph.you/v1/previewAuthorizationBearer gk_your_api_keyNode 2: Generate PDF
https://api.glyph.you/v1/generate{ "sessionId": "{{ $json.sessionId }}", "format": "pdf" }// Step 1: Create Previewconst previewResponse = await axios.post( 'https://api.glyph.you/v1/preview', { template: 'quote-modern', data: { client: steps.trigger.event.data, lineItems: steps.trigger.event.items, totals: steps.trigger.event.totals } }, { headers: { 'Authorization': `Bearer ${process.env.GLYPH_API_KEY}`, 'Content-Type': 'application/json' } });
// Step 2: Generate PDFconst pdfResponse = await axios.post( 'https://api.glyph.you/v1/generate', { sessionId: previewResponse.data.sessionId, format: 'pdf' }, { headers: { 'Authorization': `Bearer ${process.env.GLYPH_API_KEY}`, 'Content-Type': 'application/json', 'Accept': 'application/json' } });
return pdfResponse.data;Add HTTP action for preview:
https://api.glyph.you/v1/previewAuthorization: Bearer gk_your_api_keyAdd Parse JSON action on the response
Add another HTTP action for generate using the parsed sessionId
| Template ID | Best For |
|---|---|
quote-modern | Clean, minimal quotes and invoices |
quote-professional | Traditional business documents |
quote-bold | High-impact modern designs |
{ "client": { "name": "Required - Client name", "company": "Optional - Company name", "email": "Optional - Email address", "address": "Optional - Mailing address" }, "lineItems": [ { "description": "Service or product name", "details": "Optional - Additional details", "quantity": 1, "unitPrice": 100, "total": 100 } ], "totals": { "subtotal": 100, "discount": 0, "tax": 8, "taxRate": 8, "total": 108 }, "meta": { "quoteNumber": "Q-2024-001", "date": "January 22, 2024", "validUntil": "February 22, 2024", "notes": "Optional notes" }, "branding": { "logoUrl": "https://example.com/logo.png", "companyName": "Your Company", "companyAddress": "123 Main St" }}| Code | Meaning | Solution |
|---|---|---|
401 | Invalid API key | Check your Authorization header |
400 | Invalid request data | Verify your JSON structure |
404 | Session not found | Session may have expired (1 hour limit) |
429 | Rate limit exceeded | Wait and retry, or upgrade your plan |
500 | Server error | Retry the request |
For automation workflows, implement exponential backoff:
// Pseudocode for retry logicasync function makeRequestWithRetry(url, options, maxRetries = 3) { for (let i = 0; i < maxRetries; i++) { try { const response = await fetch(url, options); if (response.ok) return response;
if (response.status === 429) { // Rate limited - wait and retry await sleep(Math.pow(2, i) * 1000); continue; }
throw new Error(`HTTP ${response.status}`); } catch (error) { if (i === maxRetries - 1) throw error; await sleep(Math.pow(2, i) * 1000); } }}The session has expired (sessions last 1 hour). Solutions:
gk_html field in the preview response is valid