Save a template. Fill it with data from anywhere.

Send JSON from your code, your AI agent, or Claude and ChatGPT over MCP, and get a hosted PDF or image link back. Same data, same layout.

Get an API key
https://mcp.ojo.so/mcp

30 free credits. No card.

Sent by
Your appAPINorthwind Ltd.
Your agentMCPGlobex Corp.
Claude or ChatGPTChatBluebird Studio
Saved templateInvoice
Invoice template, with customer.name and invoice.number marked
{{customer.name}}{{invoice.number}}
Invoice INV-2026-0151 for Northwind Ltd.
PDF link
Invoice INV-2026-0152 for Globex Corp.
PDF link
Invoice INV-2026-0153 for Bluebird Studio
PDF link
Sent by
Your appAPINorthwind Ltd.
Your agentMCPGlobex Corp.
Claude or ChatGPTChatBluebird Studio
Template
Invoice template, with customer.name and invoice.number marked
customer.nameinvoice.number
Invoice INV-2026-0151 for Northwind Ltd.
PDF link
Invoice INV-2026-0152 for Globex Corp.
PDF link
Invoice INV-2026-0153 for Bluebird Studio
PDF link
Sent by
Your appAPINorthwind Ltd.
Your agentMCPGlobex Corp.
Claude or ChatGPTChatBluebird Studio
Template
Invoice template, with customer.name and invoice.number marked
customer.nameinvoice.number
Invoice INV-2026-0151 for Northwind Ltd.
PDF link
Invoice INV-2026-0152 for Globex Corp.
PDF link
Invoice INV-2026-0153 for Bluebird Studio
PDF link
Sent by
Your appAPINorthwind Ltd.
Your agentMCPGlobex Corp.
Claude or ChatGPTChatBluebird Studio
Template
Invoice template, with customer.name and invoice.number marked
customer.nameinvoice.number
Invoice INV-2026-0151 for Northwind Ltd.
PDF link
Invoice INV-2026-0152 for Globex Corp.
PDF link
Invoice INV-2026-0153 for Bluebird Studio
PDF link
Three senders fill one saved template, and each gets back a link to its own PDF.

Every PDF your app sends needs a browser running somewhere.

AspectRun it yourselfoJo
Browseryou run, patch and size ChromiumoJo runs it, you send JSON
Fonts and page layoutinstalled and pinned on every serverset up once, previewed before you save
Filesyou store and serve thema hosted link in the response
The same request either way. On one side you keep three things running.

From a design to a file in three steps.

  1. Make the template.

    Paste your HTML, start from a gallery template, or have your AI write it over MCP. The template is HTML, CSS and Handlebars.

    Certificate of completion template, shown with Ada Lovelace{{recipientName}}{{course}}
  2. Save it to oJo.

    It gets an ID. Change it later and every render after the save uses the new version.

    Template IDa41d…07c2
  3. Send data, get a file.

    Your app or agent posts JSON with the template ID. The response holds the file's URL, and for a PDF its page count and the credits it used.

curl -X POST https://api.ojo.so/v1/pdf/template \
  -H "Authorization: Bearer <your API key>" \
  -H "Content-Type: application/json" \
  -d '{"templateId": "a41d…07c2", "modify": {"course": "Data Engineering"}, "pages": [
    {"modify": {"recipientName": "Ada Lovelace"}},
    {"modify": {"recipientName": "Grace Hopper"}},
    {"modify": {"recipientName": "Alan Turing"}}
  ]}'
Response
{
  "pdfUrl": "user-content.example/4f2a91c3/0d6b2f8e41a94c7d.pdf",
  "pages": 3,
  "credits": 1
}
certificates.pdf, 3 pages
Certificate of completion for Ada Lovelace, Data Engineering, page 1 of 3
Certificate of completion for Grace Hopper, Data Engineering, page 2 of 3
Certificate of completion for Alan Turing, Data Engineering, page 3 of 3
Page 1 of 3

Many images at once: POST /v1/image/bulk renders up to 50 images a call.

Your AI designs the template. oJo renders it.

Writing the template is the slow part. Ask Claude or ChatGPT to write it over MCP, preview it and save it. From then on your code sends the data.

Connect any MCP client with your oJo account. MCP sits on the same API, templates and credits.

Design and save
create_template
Preview before you save
create_preview_link
Render a PDF or an image
generate_pdf_from_template generate_image_from_template
Connect your AI
Claude
invoice-sample.pdf
Template, saved Invoice
Invoice INV-2026-0142 for Acme Inc., page 1 of 1
From ClaudeINV-2026-0142, 1 page
Invoice GS-2026-0318 for Acme Europe B.V., page 1 of 2
From your appGS-2026-0318, 2 pages
Saved as a template your app can fill with new data.

Start from a template.

Invoices, certificates, reports and Open Graph cards. Each one is plain HTML you can change.

All templates

Invoice

PDFA4Use template
Invoice preview

Under 1 cent a render.

$29 a month for 3,000 credits, $79 for 10,000. One credit renders an image, or a PDF of up to 20 pages. Failed renders are free.

Free start

$0

30 free credits. No card.

Get an API key

3,000 credits

$29 / month

Under 1 cent a render

10,000 credits

$79 / month

Under 0.8 cents a render

See pricing

Questions

Render your first PDF or image today.

Pick a gallery template, send your data, get a file.

Get an API key
https://mcp.ojo.so/mcp

30 free credits. No card.

Transit ADA and Title VI Report for September 2026, page 1 of 3
Certificate of completion for Ada Lovelace, Data Engineering
Product card for Portable Bluetooth Speaker
Invoice INV-2026-0142 for Acme Inc., page 1 of 1
Job posting for Senior Full Stack Developer
Invoice GS-2026-0318 for Acme Europe B.V., page 1 of 2
Product card for Electric Standing Desk
Product card for Fitness Smartwatch Pro
oJo - Save a template. Fill it with data from anywhere.