Uploading a spreadsheet works fine for a cohort that graduates once a quarter. It doesn't work for an on-demand LMS, an automated bootcamp, or an e-learning platform where someone finishes a course every hour.
That's what the ProofDeck API is for — trigger certificate generation, send the email, and get a verification URL back, in under 30 lines of code.
Here's how to wire it into your backend with Python or Node.js.
"Hook ProofDeck into any LMS webhook, completion trigger, or Stripe payment event. Takes minutes, not days."
Step 1: Get Your API Key
- Log in to your ProofDeck Dashboard.
- Go to Settings → Developer & API.
- Generate a secret key (
pd_live_secret_...). Keep it in your environment variables — not your codebase.
Step 2: Issue a Certificate — Python
import os
import requests
API_KEY = os.getenv("PROOFDECK_API_KEY", "pd_live_secret_your_token_here")
ENDPOINT = "https://api.proofdeck.app/v1/certificates"
payload = {
"template_id": 42,
"recipient_name": "Tolu Adebayo",
"recipient_email": "tolu@example.com",
"course_title": "Full-Stack Web Development",
"issue_date": "2026-09-25",
"send_email": True
}
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
response = requests.post(ENDPOINT, json=payload, headers=headers)
data = response.json()
if response.status_code == 201:
print("Certificate issued successfully!")
print(f"Verification URL: {data['verification_url']}")
print(f"Certificate ID: {data['certificate_id']}")
else:
print(f"Error: {data.get('message', 'Failed to issue')}")Step 3: Issue a Certificate — Node.js / TypeScript
If you're in Next.js, Express, or NestJS:
import axios from "axios";
interface IssueCertificateInput {
templateId: number;
recipientName: string;
recipientEmail: string;
courseTitle: string;
}
export async function issueStudentCertificate(input: IssueCertificateInput) {
try {
const response = await axios.post(
"https://api.proofdeck.app/v1/certificates",
{
template_id: input.templateId,
recipient_name: input.recipientName,
recipient_email: input.recipientEmail,
course_title: input.courseTitle,
send_email: true,
},
{
headers: {
Authorization: `Bearer ${process.env.PROOFDECK_API_KEY}`,
"Content-Type": "application/json",
},
}
);
return response.data;
} catch (error: any) {
console.error("ProofDeck Issuance Error:", error.response?.data || error.message);
throw error;
}
}What You Get Back
On success (201 Created):
{
"id": 8492,
"certificate_id": "PD-8492-AX",
"recipient_name": "Tolu Adebayo",
"verification_url": "https://www.proofdeck.app/verify/PD-8492-AX",
"pdf_download_url": "https://api.proofdeck.app/v1/certificates/PD-8492-AX/download",
"status": "issued",
"created_at": "2026-09-25T07:45:00Z"
}Store verification_url and certificate_id in your own database and you can render instant credential badges right inside your student portal.
Full endpoint schemas and rate limits live in the ProofDeck Developer Docs.


