Syncible API

Issue blockchain-verified certificates programmatically. One API call to render, mint, and deliver.

Getting Started

  1. 1

    Create an account

    Sign up at syncible.io and register your organization.

  2. 2

    Design your certificate template

    Upload a background image and configure name/QR positioning.

  3. 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. 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.

shell
curl -H "x-api-key: sk_live_your_api_key_here" \
  https://syncible.io/api/protocol/issue

Keep your API key secret. Do not expose it in client-side code. Always make API calls from your backend server.

Get Organization Info

GET/api/protocol/org-info

Returns organization details connected to this API key. Use this to verify your API key is valid and see your organization info.

Response

json
{
  "org": {
    "id": "cm...",
    "name": "My University",
    "description": "Leading educational institution",
    "logo": "https://...",
    "status": "APPROVED",
    "collectionsCount": 5
  }
}

Example

shell
curl -H "x-api-key: sk_live_your_key" \
  https://syncible.io/api/protocol/org-info

List Collections

GET/api/protocol/collections

Returns all certificate templates (collections) in your organization. Use this to get collection IDs for issuing certificates.

Response

json
{
  "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

shell
curl -H "x-api-key: sk_live_your_key" \
  https://syncible.io/api/protocol/collections

Issue Certificate

POST/api/protocol/issue

Renders a certificate image, uploads to IPFS, mints on-chain, and returns all URLs.

Request Body

FieldTypeRequiredDescription
collectionIdstringYesYour template/collection ID
fullNamestringYesRecipient full name
didstringNoOptional identifier for duplicate prevention

Response

json
{
  "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

GET/api/protocol/template/{id}

Returns template/collection details including name, organization, dates, and location. Useful for building dynamic forms.

Error Codes

CodeMeaning
200Success
400Bad request - missing required fields
401Invalid or missing API key
403Quota exceeded or not authorized for this collection
404Collection not found
409Duplicate - certificate already issued for this DID
429Rate limited
500Server 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

shell
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)

javascript
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)

python
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'])
Powered by Syncible