Syncible API
Issue blockchain-verified certificates programmatically. One API call to render, mint, and deliver.
Getting Started
- 1
Create an account
Sign up at syncible.io and register your organization.
- 2
Design your certificate template
Upload a background image and configure name/QR positioning.
- 3
Get your API key
An organization-level API key is auto-generated when your org is approved. Find it in your organization detail page.
- 4
Call the API
Issue certificates with a single POST request.
Authentication
All API requests require an API key passed in the x-api-key header.
curl -H "x-api-key: sk_live_your_api_key_here" \
https://syncible.io/api/protocol/issueKeep your API key secret. Do not expose it in client-side code. Always make API calls from your backend server.
Get Organization Info
/api/protocol/org-infoReturns organization details connected to this API key. Use this to verify your API key is valid and see your organization info.
Response
{
"org": {
"id": "cm...",
"name": "My University",
"description": "Leading educational institution",
"logo": "https://...",
"status": "APPROVED",
"collectionsCount": 5
}
}Example
curl -H "x-api-key: sk_live_your_key" \
https://syncible.io/api/protocol/org-infoList Collections
/api/protocol/collectionsReturns all certificate templates (collections) in your organization. Use this to get collection IDs for issuing certificates.
Response
{
"collections": [
{
"id": "cm...",
"name": "Blockchain Course 2026",
"symbol": "BC-2026",
"description": "Certificate for blockchain course",
"dateFrom": "2026-01-01",
"dateTo": "2026-06-30",
"location": "Ha Noi",
"certificateCount": 42,
"mintQuota": 100,
"templateImage": "https://..."
}
]
}Example
curl -H "x-api-key: sk_live_your_key" \
https://syncible.io/api/protocol/collectionsIssue Certificate
/api/protocol/issueRenders a certificate image, uploads to IPFS, mints on-chain, and returns all URLs.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| collectionId | string | Yes | Your template/collection ID |
| fullName | string | Yes | Recipient full name |
| did | string | No | Optional identifier for duplicate prevention |
Response
{
"success": true,
"certificate": {
"id": "cm...",
"fullName": "Recipient Name",
"certificateId": "CERT-M1234-ABCD",
"certificateUrl": "https://syncible.io/en/certificatedetail/Qm...",
"imageUrl": "https://gateway.pinata.cloud/ipfs/Qm...",
"tokenId": 42,
"mintTxHash": "0x...",
"explorerUrl": "https://explorer.vietcha.in/token/.../instance/42",
"did": "did:vnid:123"
}
}Get Template Info
/api/protocol/template/{id}Returns template/collection details including name, organization, dates, and location. Useful for building dynamic forms.
Error Codes
| Code | Meaning |
|---|---|
| 200 | Success |
| 400 | Bad request - missing required fields |
| 401 | Invalid or missing API key |
| 403 | Quota exceeded or not authorized for this collection |
| 404 | Collection not found |
| 409 | Duplicate - certificate already issued for this DID |
| 429 | Rate limited |
| 500 | Server error |
Rate Limits
API requests are limited to 10 requests per minute per API key. If you exceed this limit, you will receive a 429 response.
Examples
cURL
curl -X POST https://syncible.io/api/protocol/issue \
-H "Content-Type: application/json" \
-H "x-api-key: sk_live_your_key" \
-d '{
"collectionId": "your-collection-id",
"fullName": "Nguyen Van A",
"did": "did:vnid:123"
}'JavaScript (fetch)
const response = await fetch('https://syncible.io/api/protocol/issue', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': 'sk_live_your_key',
},
body: JSON.stringify({
collectionId: 'your-collection-id',
fullName: 'Nguyen Van A',
did: 'did:vnid:123',
}),
});
const data = await response.json();
console.log(data.certificate.certificateUrl);Python (requests)
import requests
response = requests.post(
'https://syncible.io/api/protocol/issue',
headers={
'Content-Type': 'application/json',
'x-api-key': 'sk_live_your_key',
},
json={
'collectionId': 'your-collection-id',
'fullName': 'Nguyen Van A',
'did': 'did:vnid:123',
},
)
data = response.json()
print(data['certificate']['certificateUrl'])