Integration Examples
Complete, production-ready code examples showing how to integrate with the DRP API using different languages and frameworks.Node.js / JavaScript
Complete Integration Example
Copy
const axios = require('axios');
const API_BASE = 'https://api.digitalreceiptprotocol.org';
const API_KEY = 'your_api_key_here';
// Step 1: Generate keys for new user
async function generateKeys() {
const response = await axios.post(`${API_BASE}/api/v1/onboarding/generate-keys`);
return response.data; // { publicKey, privateKey }
}
// Step 2: Register user
async function registerUser(userId, email, publicKey) {
const response = await axios.post(
`${API_BASE}/api/v1/onboarding/register`,
{ userId, email, publicKey },
{ headers: { 'X-API-Key': API_KEY } }
);
return response.data;
}
// Step 3: Encrypt and store receipt
async function storeReceipt(userId, receiptData, transactionId) {
// First encrypt
const encrypted = await axios.post(
`${API_BASE}/api/v1/receipts/encrypt`,
{ userId, receiptData },
{ headers: { 'X-API-Key': API_KEY } }
);
// Then store
const stored = await axios.post(
`${API_BASE}/api/v1/receipts`,
{
userId,
encryptedReceipt: encrypted.data.encryptedData,
transactionId,
metadata: {
merchantId: 'merchant_001',
amount: receiptData.amount,
timestamp: new Date().toISOString()
}
},
{ headers: { 'X-API-Key': API_KEY } }
);
return stored.data;
}
// Step 4: Retrieve receipt
async function getReceipt(userId, receiptId) {
// Request access token
const tokenResponse = await axios.post(
`${API_BASE}/api/v1/keys/request-access`,
{ userId, receiptId },
{ headers: { 'X-API-Key': API_KEY } }
);
// Fetch encrypted receipt
const receipt = await axios.get(
`${API_BASE}/api/v1/receipts/${userId}`,
{
headers: {
'X-API-Key': API_KEY,
'X-Access-Token': tokenResponse.data.accessToken
}
}
);
return receipt.data;
}
// Usage example
async function main() {
try {
// Generate keys for new user
const { publicKey, privateKey } = await generateKeys();
console.log('Keys generated successfully');
// Store private key securely (in production: use device secure storage)
// Register user
await registerUser('user123', '[email protected]', publicKey);
console.log('User registered successfully');
// Store a receipt
const receipt = await storeReceipt('user123', {
merchantName: 'Coffee Shop',
amount: 4200,
currency: 'USD',
items: [{ name: 'Latte', price: 4200 }]
}, 'txn_abc123');
console.log('Receipt stored:', receipt);
// Retrieve receipt
const fetchedReceipt = await getReceipt('user123', 'receipt_xyz789');
console.log('Receipt retrieved:', fetchedReceipt);
// Decrypt client-side with private key
// (In production: use crypto library with stored private key)
} catch (error) {
console.error('Error:', error.response?.data || error.message);
}
}
main();
Express.js API Integration
Copy
const express = require('express');
const axios = require('axios');
const app = express();
app.use(express.json());
const DRP_API_BASE = 'https://api.digitalreceiptprotocol.org';
const DRP_API_KEY = process.env.DRP_API_KEY;
// Endpoint to onboard new user
app.post('/api/users/onboard', async (req, res) => {
try {
const { userId, email, phoneNumber } = req.body;
// Generate keys
const keysResponse = await axios.post(
`${DRP_API_BASE}/api/v1/onboarding/generate-keys`
);
const { publicKey, privateKey } = keysResponse.data;
// Register user with DRP
await axios.post(
`${DRP_API_BASE}/api/v1/onboarding/register`,
{ userId, email, phoneNumber, publicKey },
{ headers: { 'X-API-Key': DRP_API_KEY } }
);
// Return private key to client (they must store it securely)
res.json({
success: true,
publicKey,
privateKey // Client stores this securely
});
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Endpoint to store receipt after transaction
app.post('/api/receipts/store', async (req, res) => {
try {
const { userId, receiptData, transactionId } = req.body;
// Encrypt receipt
const encrypted = await axios.post(
`${DRP_API_BASE}/api/v1/receipts/encrypt`,
{ userId, receiptData },
{ headers: { 'X-API-Key': DRP_API_KEY } }
);
// Store encrypted receipt
const stored = await axios.post(
`${DRP_API_BASE}/api/v1/receipts`,
{
userId,
encryptedReceipt: encrypted.data.encryptedData,
transactionId,
metadata: {
merchantId: req.body.merchantId,
amount: receiptData.amount,
timestamp: new Date().toISOString()
}
},
{ headers: { 'X-API-Key': DRP_API_KEY } }
);
res.json({ success: true, receipt: stored.data });
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Endpoint to retrieve user receipts
app.get('/api/receipts/:userId', async (req, res) => {
try {
const { userId } = req.params;
const { receiptId } = req.query;
// Request access token
const tokenResponse = await axios.post(
`${DRP_API_BASE}/api/v1/keys/request-access`,
{ userId, receiptId },
{ headers: { 'X-API-Key': DRP_API_KEY } }
);
// Fetch receipts
const receipts = await axios.get(
`${DRP_API_BASE}/api/v1/receipts/${userId}`,
{
headers: {
'X-API-Key': DRP_API_KEY,
'X-Access-Token': tokenResponse.data.accessToken
}
}
);
res.json(receipts.data);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
Python
Complete Integration Example
Copy
import requests
import os
from typing import Dict, Any
API_BASE = 'https://api.digitalreceiptprotocol.org'
API_KEY = os.environ.get('DRP_API_KEY')
def generate_keys() -> Dict[str, str]:
"""Generate RSA-2048 key pair for new user"""
response = requests.post(f'{API_BASE}/api/v1/onboarding/generate-keys')
response.raise_for_status()
return response.json()
def register_user(user_id: str, email: str, public_key: str) -> Dict[str, Any]:
"""Register user with DRP"""
response = requests.post(
f'{API_BASE}/api/v1/onboarding/register',
json={
'userId': user_id,
'email': email,
'publicKey': public_key
},
headers={'X-API-Key': API_KEY}
)
response.raise_for_status()
return response.json()
def encrypt_receipt(user_id: str, receipt_data: Dict[str, Any]) -> Dict[str, Any]:
"""Encrypt receipt data with user's public key"""
response = requests.post(
f'{API_BASE}/api/v1/receipts/encrypt',
json={
'userId': user_id,
'receiptData': receipt_data
},
headers={'X-API-Key': API_KEY}
)
response.raise_for_status()
return response.json()
def store_receipt(user_id: str, encrypted_receipt: str, transaction_id: str, metadata: Dict[str, Any]) -> Dict[str, Any]:
"""Store encrypted receipt"""
response = requests.post(
f'{API_BASE}/api/v1/receipts',
json={
'userId': user_id,
'encryptedReceipt': encrypted_receipt,
'transactionId': transaction_id,
'metadata': metadata
},
headers={'X-API-Key': API_KEY}
)
response.raise_for_status()
return response.json()
def get_receipt(user_id: str, receipt_id: str) -> Dict[str, Any]:
"""Retrieve receipt with access token"""
# Request access token
token_response = requests.post(
f'{API_BASE}/api/v1/keys/request-access',
json={'userId': user_id, 'receiptId': receipt_id},
headers={'X-API-Key': API_KEY}
)
token_response.raise_for_status()
access_token = token_response.json()['accessToken']
# Fetch receipt
receipt_response = requests.get(
f'{API_BASE}/api/v1/receipts/{user_id}',
headers={
'X-API-Key': API_KEY,
'X-Access-Token': access_token
}
)
receipt_response.raise_for_status()
return receipt_response.json()
def main():
"""Example usage"""
try:
# Generate keys
keys = generate_keys()
print('Keys generated successfully')
# Register user
register_user('user123', '[email protected]', keys['publicKey'])
print('User registered successfully')
# Encrypt and store receipt
receipt_data = {
'merchantName': 'Coffee Shop',
'amount': 4200,
'currency': 'USD',
'items': [{'name': 'Latte', 'price': 4200}]
}
encrypted = encrypt_receipt('user123', receipt_data)
stored = store_receipt(
'user123',
encrypted['encryptedData'],
'txn_abc123',
{
'merchantId': 'merchant_001',
'amount': 4200,
'timestamp': '2025-12-15T10:30:00Z'
}
)
print(f'Receipt stored: {stored}')
# Retrieve receipt
receipt = get_receipt('user123', 'receipt_xyz789')
print(f'Receipt retrieved: {receipt}')
except requests.exceptions.RequestException as e:
print(f'Error: {e}')
if __name__ == '__main__':
main()
Flask API Integration
Copy
from flask import Flask, request, jsonify
import requests
import os
app = Flask(__name__)
DRP_API_BASE = 'https://api.digitalreceiptprotocol.org'
DRP_API_KEY = os.environ.get('DRP_API_KEY')
@app.route('/api/users/onboard', methods=['POST'])
def onboard_user():
"""Onboard new user to DRP"""
try:
data = request.json
user_id = data['userId']
email = data['email']
# Generate keys
keys_response = requests.post(
f'{DRP_API_BASE}/api/v1/onboarding/generate-keys'
)
keys_response.raise_for_status()
keys = keys_response.json()
# Register user
register_response = requests.post(
f'{DRP_API_BASE}/api/v1/onboarding/register',
json={
'userId': user_id,
'email': email,
'publicKey': keys['publicKey']
},
headers={'X-API-Key': DRP_API_KEY}
)
register_response.raise_for_status()
return jsonify({
'success': True,
'publicKey': keys['publicKey'],
'privateKey': keys['privateKey']
})
except Exception as e:
return jsonify({'error': str(e)}), 500
@app.route('/api/receipts/store', methods=['POST'])
def store_receipt_endpoint():
"""Store encrypted receipt"""
try:
data = request.json
user_id = data['userId']
receipt_data = data['receiptData']
transaction_id = data['transactionId']
# Encrypt receipt
encrypt_response = requests.post(
f'{DRP_API_BASE}/api/v1/receipts/encrypt',
json={'userId': user_id, 'receiptData': receipt_data},
headers={'X-API-Key': DRP_API_KEY}
)
encrypt_response.raise_for_status()
encrypted = encrypt_response.json()
# Store receipt
store_response = requests.post(
f'{DRP_API_BASE}/api/v1/receipts',
json={
'userId': user_id,
'encryptedReceipt': encrypted['encryptedData'],
'transactionId': transaction_id,
'metadata': {
'merchantId': data.get('merchantId'),
'amount': receipt_data['amount'],
'timestamp': data.get('timestamp')
}
},
headers={'X-API-Key': DRP_API_KEY}
)
store_response.raise_for_status()
return jsonify({'success': True, 'receipt': store_response.json()})
except Exception as e:
return jsonify({'error': str(e)}), 500
@app.route('/api/receipts/<user_id>', methods=['GET'])
def get_receipts(user_id):
"""Retrieve user receipts"""
try:
receipt_id = request.args.get('receiptId')
# Request access token
token_response = requests.post(
f'{DRP_API_BASE}/api/v1/keys/request-access',
json={'userId': user_id, 'receiptId': receipt_id},
headers={'X-API-Key': DRP_API_KEY}
)
token_response.raise_for_status()
access_token = token_response.json()['accessToken']
# Fetch receipts
receipts_response = requests.get(
f'{DRP_API_BASE}/api/v1/receipts/{user_id}',
headers={
'X-API-Key': DRP_API_KEY,
'X-Access-Token': access_token
}
)
receipts_response.raise_for_status()
return jsonify(receipts_response.json())
except Exception as e:
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
app.run(port=3000)
Go
Complete Integration Example
Copy
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
)
const apiBase = "https://api.digitalreceiptprotocol.org"
var apiKey = os.Getenv("DRP_API_KEY")
type KeyPair struct {
PublicKey string `json:"publicKey"`
PrivateKey string `json:"privateKey"`
}
type ReceiptData struct {
MerchantName string `json:"merchantName"`
Amount int `json:"amount"`
Currency string `json:"currency"`
}
type EncryptedReceipt struct {
EncryptedData string `json:"encryptedData"`
}
func generateKeys() (*KeyPair, error) {
resp, err := http.Post(apiBase+"/api/v1/onboarding/generate-keys", "application/json", nil)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var keys KeyPair
if err := json.NewDecoder(resp.Body).Decode(&keys); err != nil {
return nil, err
}
return &keys, nil
}
func registerUser(userID, email, publicKey string) error {
payload := map[string]string{
"userId": userID,
"email": email,
"publicKey": publicKey,
}
data, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", apiBase+"/api/v1/onboarding/register", bytes.NewBuffer(data))
req.Header.Set("X-API-Key", apiKey)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
return nil
}
func encryptReceipt(userID string, receiptData ReceiptData) (*EncryptedReceipt, error) {
payload := map[string]interface{}{
"userId": userID,
"receiptData": receiptData,
}
data, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", apiBase+"/api/v1/receipts/encrypt", bytes.NewBuffer(data))
req.Header.Set("X-API-Key", apiKey)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var encrypted EncryptedReceipt
if err := json.NewDecoder(resp.Body).Decode(&encrypted); err != nil {
return nil, err
}
return &encrypted, nil
}
func storeReceipt(userID, encryptedReceipt, transactionID string) error {
payload := map[string]interface{}{
"userId": userID,
"encryptedReceipt": encryptedReceipt,
"transactionId": transactionID,
"metadata": map[string]interface{}{
"merchantId": "merchant_001",
"amount": 4200,
"timestamp": "2025-12-15T10:30:00Z",
},
}
data, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", apiBase+"/api/v1/receipts", bytes.NewBuffer(data))
req.Header.Set("X-API-Key", apiKey)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
return nil
}
func main() {
// Generate keys
keys, err := generateKeys()
if err != nil {
fmt.Printf("Error generating keys: %v\n", err)
return
}
fmt.Println("Keys generated successfully")
// Register user
err = registerUser("user123", "[email protected]", keys.PublicKey)
if err != nil {
fmt.Printf("Error registering user: %v\n", err)
return
}
fmt.Println("User registered successfully")
// Encrypt receipt
receiptData := ReceiptData{
MerchantName: "Coffee Shop",
Amount: 4200,
Currency: "USD",
}
encrypted, err := encryptReceipt("user123", receiptData)
if err != nil {
fmt.Printf("Error encrypting receipt: %v\n", err)
return
}
// Store receipt
err = storeReceipt("user123", encrypted.EncryptedData, "txn_abc123")
if err != nil {
fmt.Printf("Error storing receipt: %v\n", err)
return
}
fmt.Println("Receipt stored successfully")
}
Error Handling Best Practices
Retry Logic with Exponential Backoff
Copy
async function apiCallWithRetry(apiCall, maxRetries = 3) {
let lastError;
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
return await apiCall();
} catch (error) {
lastError = error;
// Don't retry on client errors (except rate limiting)
if (error.response?.status >= 400 &&
error.response?.status < 500 &&
error.response?.status !== 429) {
throw error;
}
// Calculate backoff delay
const delay = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s
console.log(`Attempt ${attempt + 1} failed. Retrying in ${delay}ms...`);
await new Promise(resolve => setTimeout(resolve, delay));
}
}
throw lastError;
}
// Usage
const receipt = await apiCallWithRetry(() =>
axios.post(`${API_BASE}/api/v1/receipts`, receiptData, {
headers: { 'X-API-Key': API_KEY }
})
);
Testing Examples
Unit Test Example (Jest)
Copy
const { generateKeys, registerUser } = require('./drp-client');
const axios = require('axios');
jest.mock('axios');
describe('DRP Integration', () => {
test('should generate keys successfully', async () => {
const mockKeys = {
publicKey: 'mock-public-key',
privateKey: 'mock-private-key'
};
axios.post.mockResolvedValue({ data: mockKeys });
const keys = await generateKeys();
expect(keys).toEqual(mockKeys);
expect(axios.post).toHaveBeenCalledWith(
'https://api.digitalreceiptprotocol.org/api/v1/onboarding/generate-keys'
);
});
test('should register user successfully', async () => {
axios.post.mockResolvedValue({ data: { success: true } });
const result = await registerUser('user123', '[email protected]', 'public-key');
expect(result).toEqual({ success: true });
});
});