Chaindoc SDKs
Chaindoc के पास दो TypeScript SDKs हैं: Server SDK बैकएंड काम के लिए (Node.js) और Embed SDK आपकी वेब ऐप में साइनिंग UI जोड़ने के लिए। दोनों में पूर्ण type definitions हैं, zero runtime dependencies हैं, और किसी भी framework के साथ काम करते हैं।
उपलब्ध SDKs
npm setup और framework-specific configuration (env variables, providers, etc.) के लिए, installation guide देखें।
- Server SDK (@chaindoc_io/server-sdk) - Node.js 18+ के लिए बैकएंड एकीकरण
- Embed SDK (@chaindoc_io/embed-sdk) - वेब एप्लिकेशन्स के लिए फ्रंटएंड साइनिंग इंटरफेस
- Python SDK - जल्द आ रहा है
- PHP SDK - जल्द आ रहा है
Server SDK
Server SDK REST API को type-safe Node.js इंटरफेस में wrap करता है। आप इसका उपयोग documents मैनेज करने, signature requests बनाने, फाइल अपलोड करने और blockchain verification ट्रिगर करने के लिए करेंगे।
इंस्टॉलेशन
npm install @chaindoc_io/server-sdkQuick start
import { Chaindoc } from '@chaindoc_io/server-sdk';
import { readFile } from 'fs/promises';
// 1. Initialize the SDK
const chaindoc = new Chaindoc({
secretKey: process.env.CHAINDOC_SECRET_KEY!,
});
// 2. Upload a document file
const buffer = await readFile('./contract.pdf');
const file = new Blob([buffer], { type: 'application/pdf' });
const { media } = await chaindoc.media.upload([file]);
// 3. Create a document
const doc = await chaindoc.documents.create({
name: 'Service Agreement',
description: 'Contract for consulting services',
media: media[0],
status: 'published', // Triggers blockchain verification
hashtags: ['#contract', '#2024'],
meta: [{ key: 'client', value: 'Acme Corp' }],
});
// 4. Create a signature request
const sigRequest = await chaindoc.signatures.createRequest({
versionId: doc.document.versions[0].uuid,
recipients: [{ email: 'signer@example.com' }],
deadline: new Date('2024-12-31'),
embeddedFlow: true,
});
// 5. Create session for frontend SDK
const session = await chaindoc.embedded.createSession({
email: 'signer@example.com',
metadata: {
documentId: doc.documentId,
signatureRequestId: sigRequest.signatureRequest.uuid,
},
});
console.log('Session ID:', session.sessionId);Express.js Integration
import express from 'express';
import { Chaindoc, ChaindocError } from '@chaindoc_io/server-sdk';
import multer from 'multer';
const app = express();
const upload = multer({ storage: multer.memoryStorage() });
const chaindoc = new Chaindoc({
secretKey: process.env.CHAINDOC_SECRET_KEY!,
});
// Upload and create document
app.post('/api/documents', upload.single('file'), async (req, res) => {
try {
const file = new Blob([req.file!.buffer], { type: req.file!.mimetype });
const { media } = await chaindoc.media.upload([file]);
const doc = await chaindoc.documents.create({
name: req.body.name,
description: req.body.description || '',
media: media[0],
status: 'published',
hashtags: req.body.hashtags || [],
meta: req.body.meta || [],
});
res.json({ documentId: doc.documentId });
} catch (error) {
if (error instanceof ChaindocError) {
res.status(error.statusCode || 500).json({ error: error.message });
} else {
res.status(500).json({ error: 'Internal server error' });
}
}
});
// Create embedded session for signer
app.post('/api/signing/session', async (req, res) => {
try {
const { email, documentId, signatureRequestId } = req.body;
const session = await chaindoc.embedded.createSession({
email,
metadata: { documentId, signatureRequestId },
});
res.json({ sessionId: session.sessionId });
} catch (error) {
if (error instanceof ChaindocError) {
res.status(error.statusCode || 500).json({ error: error.message });
}
}
});
app.listen(3000);Next.js API Routes
import { NextRequest, NextResponse } from 'next/server';
import { Chaindoc, ChaindocError } from '@chaindoc_io/server-sdk';
const chaindoc = new Chaindoc({
secretKey: process.env.CHAINDOC_SECRET_KEY!,
});
export async function POST(request: NextRequest) {
try {
const { email, documentId, signatureRequestId } = await request.json();
const session = await chaindoc.embedded.createSession({
email,
metadata: { documentId, signatureRequestId },
});
return NextResponse.json({
sessionId: session.sessionId,
expiresAt: session.expiresAt,
});
} catch (error) {
if (error instanceof ChaindocError) {
return NextResponse.json(
{ error: error.message },
{ status: error.statusCode || 500 }
);
}
return NextResponse.json(
{ error: 'Internal server error' },
{ status: 500 }
);
}
}Error handling
हमेशा API calls को try-catch blocks में wrap करें और ChaindocError को विशेष रूप से हैंडल करें:
import { ChaindocError } from '@chaindoc_io/server-sdk';
try {
const doc = await chaindoc.documents.create({ /* ... */ });
} catch (error) {
if (error instanceof ChaindocError) {
console.error('API Error:', error.message);
console.error('Status Code:', error.statusCode);
switch (error.statusCode) {
case 400:
// Bad request - check parameters
break;
case 401:
// Unauthorized - check API key
break;
case 404:
// Not found
break;
case 429:
// Rate limited - SDK will auto-retry
break;
}
}
}Embed SDK
Embed SDK आपको Chaindoc साइनिंग इंटरफेस को अपनी वेब ऐप के अंदर दिखाने देता है। यह iframe, OTP verification और आपकी ऐप और Chaindoc के बीच communication को हैंडल करता है। आपके users बिना साइट छोड़े documents पर हस्ताक्षर कर सकते हैं।
इंस्टॉलेशन
npm install @chaindoc_io/embed-sdkBasic usage
import { ChaindocEmbed } from '@chaindoc_io/embed-sdk';
// 1. Initialize SDK (once per page)
const chaindoc = new ChaindocEmbed({
publicKey: 'pk_live_xxxxxxxxxxxxx',
environment: 'production',
});
// 2. Get session from your backend
const response = await fetch('/api/signing/create-session', {
method: 'POST',
body: JSON.stringify({ documentId, signerEmail }),
});
const { sessionId } = await response.json();
// 3. Open signing flow
const instance = chaindoc.openSignatureFlow({
sessionId,
onReady: () => {
console.log('Signing interface loaded');
},
onSuccess: (data) => {
console.log('Document signed:', data.signatureId);
instance.close();
},
onError: (error) => {
console.error('Signing failed:', error.code, error.message);
},
onCancel: () => {
console.log('User cancelled');
instance.close();
},
});React integration
import { useCallback, useRef, useEffect } from 'react';
import { ChaindocEmbed, EmbedInstance } from '@chaindoc_io/embed-sdk';
function SignButton({ sessionId }: { sessionId: string }) {
const sdkRef = useRef<ChaindocEmbed | null>(null);
const instanceRef = useRef<EmbedInstance | null>(null);
useEffect(() => {
sdkRef.current = new ChaindocEmbed({
publicKey: process.env.REACT_APP_CHAINDOC_PUBLIC_KEY!,
});
return () => {
sdkRef.current?.destroy();
};
}, []);
const handleSign = useCallback(() => {
if (!sdkRef.current) return;
instanceRef.current = sdkRef.current.openSignatureFlow({
sessionId,
onSuccess: (data) => {
console.log('Signed!', data.signatureId);
instanceRef.current?.close();
},
onCancel: () => {
instanceRef.current?.close();
},
});
}, [sessionId]);
return <button onClick={handleSign}>Sign Document</button>;
}Vue 3 integration
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue';
import { ChaindocEmbed, type EmbedInstance } from '@chaindoc_io/embed-sdk';
const props = defineProps<{ sessionId: string }>();
let sdk: ChaindocEmbed | null = null;
let instance: EmbedInstance | null = null;
onMounted(() => {
sdk = new ChaindocEmbed({
publicKey: import.meta.env.VITE_CHAINDOC_PUBLIC_KEY,
});
});
onUnmounted(() => {
sdk?.destroy();
});
function openSignature() {
if (!sdk) return;
instance = sdk.openSignatureFlow({
sessionId: props.sessionId,
onSuccess: (data) => {
console.log('Signed!', data.signatureId);
instance?.close();
},
onCancel: () => {
instance?.close();
},
});
}
</script>
<template>
<button @click="openSignature">Sign Document</button>
</template>Inline mode
एक modal के बजाय, साइनिंग इंटरफेस को सीधे अपने page में embed करें:
const instance = chaindoc.openSignatureFlow({
sessionId,
mode: 'inline',
container: document.getElementById('signature-container'),
onSuccess: (data) => {
console.log('Signed!');
},
});Theming
Light या dark themes के साथ appearance को customize करें:
const instance = chaindoc.openSignatureFlow({
sessionId,
theme: 'dark',
// ... other options
});
// Change theme dynamically
instance.changeTheme('light');Full workflow example
यह दोनों SDKs को एक साथ रखता है: Server SDK backend पर documents और sessions बनाने के लिए, Embed SDK frontend पर signing UI दिखाने के लिए।
1Backend: Upload DocumentServer SDK का उपयोग फाइल अपलोड और document बनाने के लिए करें
2Backend: Create Signature Requestembedded flow enabled के साथ signature request बनाएं
3Backend: Generate Sessionप्रत्येक signer के लिए embedded session बनाएं
4Frontend: Initialize Embed SDKpublic key के साथ SDK initialize करें
5Frontend: Open Signing Flowsession ID के साथ signing interface खोलें
6Frontend: Handle SuccessSigned document को process करें और UI update करें
// server.ts
import { Chaindoc } from '@chaindoc_io/server-sdk';
const chaindoc = new Chaindoc({
secretKey: process.env.CHAINDOC_SECRET_KEY!,
});
// Upload & create document
const { media } = await chaindoc.media.upload([pdfFile]);
const doc = await chaindoc.documents.create({
name: 'Contract',
description: 'Service agreement',
media: media[0],
status: 'published',
hashtags: ['#contract'],
meta: [],
});
// Create signature request
const sigRequest = await chaindoc.signatures.createRequest({
versionId: doc.document.versions[0].uuid,
recipients: [{ email: 'signer@example.com' }],
deadline: new Date('2024-12-31'),
embeddedFlow: true,
});
// Create session
const session = await chaindoc.embedded.createSession({
email: 'signer@example.com',
metadata: {
documentId: doc.documentId,
signatureRequestId: sigRequest.signatureRequest.uuid,
},
});
// Return sessionId to frontend
res.json({ sessionId: session.sessionId });Best practices
- SDK को एक बार प्रति page/component lifecycle initialize करें
- Component unmount पर हमेशा SDK instance destroy करें
- सभी callback events हैंडल करें (onSuccess, onError, onCancel)
- API keys को environment variables में store करें
- बेहतर type safety के लिए TypeScript का उपयोग करें
- ChaindocError के साथ proper error handling implement करें
- Production deployment से पहले sandbox keys के साथ test करें
Environment configuration
// Backend
const chaindoc = new Chaindoc({
secretKey: 'sk_live_xxxxx',
});
// Frontend
const embed = new ChaindocEmbed({
publicKey: 'pk_live_xxxxx',
environment: 'production',
});अब क्या करें
- Installation — npm setup, env config और framework-specific providers
- API documentation — पूर्ण REST endpoint reference
- Webhooks — आपके backend के लिए real-time event notifications
- Quick start — 10 मिनट में अपना पहला signature भेजें
- Security — API key management और production hardening