API Reference
The Proudify REST API lets you fetch and manage the certificates you have issued programmatically using a personal access token.
Introduction
All API requests are made over HTTPS. The API returns JSON for all responses. Requests and responses are UTF-8 encoded. Timestamps are in ISO 8601 format.
The API currently provides read access to certificates you have issued. Write endpoints (issuing, updating, deleting) are on the roadmap.
Authentication
The API uses Bearer token authentication (Laravel Sanctum personal access tokens).
Every request must include an Authorization header:
Authorization: Bearer YOUR_API_TOKEN
Generating a token
- Sign in to your Proudify account.
- Go to Profile → API Tokens.
- Enter a name for the token and click Create Token.
- Copy the token immediately — it will not be shown again.
Treat API tokens like passwords. Do not embed them in client-side code or commit them to version control. Use environment variables.
Base URL
All endpoints are prefixed with:
https://proudify.in/api/v1
Rate Limiting
The API is rate-limited to 60 requests per minute per token.
When you exceed the limit you receive a 429 Too Many Requests response.
The following headers are included in every response:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed per window. |
X-RateLimit-Remaining | Requests remaining in the current window. |
Retry-After | Seconds to wait before retrying (only on 429). |
Errors
All error responses follow the same shape:
{
"message": "Unauthenticated."
}
| Status | Meaning |
|---|---|
400 | Bad Request — invalid parameters. |
401 | Unauthorized — missing or invalid token. |
403 | Forbidden — you do not own this resource. |
404 | Not Found — resource does not exist. |
422 | Validation Error — see errors key for details. |
429 | Too Many Requests — rate limit exceeded. |
500 | Server Error — something went wrong on our end. |
/certificates
Returns a paginated list of all certificates issued by the authenticated user, sorted newest first.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
per_page |
integer | optional | Results per page. Default: 15. Max: 100. |
page |
integer | optional | Page number to retrieve. Default: 1. |
Example Request
# List the first 25 certificates curl https://proudify.in/api/v1/certificates?per_page=25 \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Accept: application/json"
Response
{
"data": [
{
"uuid": "01940e3d-bfa2-7b2e-aef0-c3db35e12abc",
"title": "Data Science – Batch 2025",
"recipient_name": "Priya Mehta",
"recipient_email": "priya@example.com",
"description": null,
"date_of_issue": "2025-06-01",
"date_of_expiry": null,
"status": "issued",
"verification_code": "PRD-A1B2C3",
"verify_url": "https://proudify.in/certificates/verify/...",
"created_at": "2025-06-01T10:30:00+05:30"
}
],
"links": {
"first": "https://proudify.in/api/v1/certificates?page=1",
"last": "https://proudify.in/api/v1/certificates?page=4",
"prev": null,
"next": "https://proudify.in/api/v1/certificates?page=2"
},
"meta": {
"current_page": 1,
"per_page": 25,
"total": 87,
"last_page": 4
}
}
/certificates/{uuid}
Returns a single certificate. The {uuid} segment accepts either
the certificate's UUID or the human-readable Credential ID
(e.g. PRD-A1B2C3) printed on the certificate.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
uuid |
string | required | The certificate UUID or Credential ID. |
Example Request
curl https://proudify.in/api/v1/certificates/01940e3d-bfa2-7b2e-aef0-c3db35e12abc \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Accept: application/json" # Also works with the Credential ID printed on the certificate curl https://proudify.in/api/v1/certificates/PRD-A1B2C3 \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Accept: application/json"
Response
{
"data": {
"uuid": "01940e3d-bfa2-7b2e-aef0-c3db35e12abc",
"title": "Data Science – Batch 2025",
"recipient_name": "Priya Mehta",
"recipient_email": "priya@example.com",
"description": null,
"date_of_issue": "2025-06-01",
"date_of_expiry": null,
"status": "issued",
"verification_code": "PRD-A1B2C3",
"verify_url": "https://proudify.in/certificates/verify/...",
"created_at": "2025-06-01T10:30:00+05:30"
}
}
/certificates/{uuid}/image
Streams the rendered certificate as a PNG image.
Returns 404 if the image has not been generated yet.
Example Request
curl https://proudify.in/api/v1/certificates/01940e3d-bfa2-7b2e-aef0-c3db35e12abc/image \ -H "Authorization: Bearer YOUR_API_TOKEN" \ --output certificate.png
/certificates/{uuid}/download
Downloads the certificate as a PDF file with a
Content-Disposition: attachment header.
Returns 404 with "The PDF is still being generated." if the file is not ready yet.
Example Request
curl https://proudify.in/api/v1/certificates/01940e3d-bfa2-7b2e-aef0-c3db35e12abc/download \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -L --output "certificate.pdf"
/certificates/{uuid}/qr
Streams the QR code for the certificate as a PNG image. Scanning the QR code opens the public verification page for the credential.
Example Request
curl https://proudify.in/api/v1/certificates/01940e3d-bfa2-7b2e-aef0-c3db35e12abc/qr \ -H "Authorization: Bearer YOUR_API_TOKEN" \ --output qr.png
Certificate Object
Fields returned inside data for every certificate endpoint.
| Field | Type | Description |
|---|---|---|
uuid | string | Internal UUID of the certificate. |
title | string | Name of the certificate / program. |
recipient_name | string | Full name of the certificate recipient. |
recipient_email | string | Email address of the recipient. |
description | string|null | Optional description or achievement text. |
date_of_issue | string (date) | Issue date in YYYY-MM-DD format. |
date_of_expiry | string|null | Expiry date if set, otherwise null. |
status | string | Current status: issued, expired, or revoked. |
verification_code | string | Human-readable Credential ID (e.g. PRD-A1B2C3). |
verify_url | string (url) | Public verification URL for this certificate. |
created_at | string (ISO 8601) | When the certificate record was created. |
Ready to build?
Generate your API token from the Profile page and start making requests.