DCID Server SDK - Python
A Python SDK for interacting with the DCID Server API. This SDK provides a simple, type-safe interface for authentication and identity operations.
Installation
pip install dcid-server-sdk
Or install from source:
cd python
pip install -e .
Quick Start
from dcid_server_sdk import DCIDServerSDK, InitiateOTPOptions, ConfirmOTPOptions
# Initialize the SDK
sdk = DCIDServerSDK(
api_key="your-api-key-here",
environment="prod" # or 'dev'
)
# Register/Sign-in with OTP
result = sdk.auth.register_otp(InitiateOTPOptions(email="user@example.com"))
# Confirm OTP and get tokens
tokens = sdk.auth.confirm_otp(
ConfirmOTPOptions(
email="user@example.com",
otp="123456"
)
)
print(f"Access Token: {tokens.access_token}")
print(f"Refresh Token: {tokens.refresh_token}")
API Reference
Initialization
from dcid_server_sdk import DCIDServerSDK
sdk = DCIDServerSDK(
api_key="your-api-key-here", # Required: API key
environment="prod", # Optional: Environment (default: "prod")
timeout=30000, # Optional: Request timeout in ms (default: 30000)
default_headers={}, # Optional: Default headers
logger=None, # Optional: Custom logger
enable_request_logging=False # Optional: Enable request logging
)
Authentication Methods
auth.register_otp(options)
Initiates OTP registration/sign-in process. Covers POST /auth/sign-in/initiate.
Parameters:
email(str, optional): User's email addressphone(str, optional): User's phone number (with country code)
Returns: InitiateOTPResponse
otp(str, optional): OTP code (only in dev environment)
Example:
from dcid_server_sdk import InitiateOTPOptions
# With email
result = sdk.auth.register_otp(InitiateOTPOptions(email="user@example.com"))
# With phone
result = sdk.auth.register_otp(InitiateOTPOptions(phone="+1234567890"))
auth.confirm_otp(options)
Confirms OTP and completes registration/sign-in. Covers POST /auth/sign-in/confirm.
Parameters:
email(str, optional): User's email addressphone(str, optional): User's phone numberotp(str): The OTP code received by the user
Returns: TokenResponse
access_token(str): JWT access tokenrefresh_token(str): JWT refresh token
Example:
from dcid_server_sdk import ConfirmOTPOptions
tokens = sdk.auth.confirm_otp(
ConfirmOTPOptions(
email="user@example.com",
otp="123456"
)
)
# Set tokens for authenticated requests (done automatically)
sdk.set_tokens(tokens)
auth.refresh_token(options)
Refreshes the access token using refresh token. Covers POST /auth/refresh-token.
Parameters:
refresh_token(str): The refresh token
Returns: TokenResponse
Example:
from dcid_server_sdk import RefreshTokenOptions
new_tokens = sdk.auth.refresh_token(
RefreshTokenOptions(refresh_token="your-refresh-token")
)
Identity Methods
Encryption
from dcid_server_sdk import GenerateEncryptionKeyOptions, GetEncryptedKeyOptions
# Generate encryption key (will auto-refresh token if expired)
result = sdk.identity.encryption.generate_key(
GenerateEncryptionKeyOptions(
did="did:iden3:dcid:main:...",
owner_email="user@example.com"
)
)
# Get encrypted key
result = sdk.identity.encryption.get_key(
GetEncryptedKeyOptions(did="did:iden3:dcid:main:...")
)
Issuer
from dcid_server_sdk import IssueCredentialOptions, GetCredentialOfferOptions
# Issue a credential
result = sdk.identity.issuer.issue_credential(
IssueCredentialOptions(
did="did:iden3:dcid:main:...",
credential_name="KYCAgeCredential",
values={"birthday": 25, "documentType": 2},
owner_email="user@example.com"
)
)
# Get credential offer (for MTP credentials)
result = sdk.identity.issuer.get_credential_offer(
GetCredentialOfferOptions(
claim_id="abc123...",
tx_id="0x1234567890abcdef..."
)
)
IPFS
from dcid_server_sdk import (
StoreCredentialOptions,
RetrieveUserCredentialOptions,
GetAllUserCredentialsOptions
)
# Store credential to IPFS
result = sdk.identity.ipfs.store_credential(
StoreCredentialOptions(
did="did:iden3:dcid:main:...",
credential_type="KYCAgeCredential",
credential="U2FsdGVkX1+vupppZksvRf...",
encrypted=True
)
)
# Retrieve user credential
result = sdk.identity.ipfs.retrieve_user_credential(
RetrieveUserCredentialOptions(
did="did:iden3:dcid:main:...",
credential_type="KYCAgeCredential",
include_cid_only=False
)
)
# Get all user credentials
result = sdk.identity.ipfs.get_all_user_credentials(
GetAllUserCredentialsOptions(
did="did:iden3:dcid:main:...",
include_credential_data=False
)
)
Verification
from dcid_server_sdk import (
VerifySignInOptions,
GetLinkStoreOptions,
VerifyCallbackOptions
)
# Initiate verification
result = sdk.identity.verification.verify_sign_in(
VerifySignInOptions(credential_name="ProofOfAgeCredential")
)
# Get proof request
proof_request = sdk.identity.verification.get_link_store(
GetLinkStoreOptions(id="3297636436")
)
# Submit and verify proof
result = sdk.identity.verification.verify_callback(
VerifyCallbackOptions(
session_id="3297636436",
token="eyJhbGciOiJncm90aDE2..."
)
)
Analytics Methods
from dcid_server_sdk.modules.analytics.types import StartSessionEvent, EndSessionEvent
# Start a session
result = sdk.analytics.start_session(
StartSessionEvent(
user_id="user123",
page_location="https://example.com/page"
)
)
# End a session
result = sdk.analytics.end_session(
EndSessionEvent(
session_id=result.session_id,
user_id="user123"
)
)
Test Server
The Python SDK includes a test server that exposes HTTP endpoints for all SDK methods.
Running the Test Server
# Install server dependencies
pip install -r requirements-server.txt
# Set environment variables
export DCID_API_KEY="your-api-key"
export DCID_ENVIRONMENT="dev" # or "prod"
export PORT="8080" # optional, defaults to 8080
# Run the server
python test_server/main.py
Or using uvicorn directly:
uvicorn test_server.main:app --host 0.0.0.0 --port 8080 --reload
Test Server Endpoints
The test server provides the following endpoints:
Health Check
GET /health- Health check endpoint
Authentication
POST /api/auth/register-otp- Register OTPPOST /api/auth/confirm-otp- Confirm OTPPOST /api/auth/admin-login- Admin loginPOST /api/auth/refresh-token- Refresh token
Identity - Encryption
POST /api/identity/encryption/generate-key- Generate encryption keyPOST /api/identity/encryption/get-key- Get encrypted key
Identity - Issuer
POST /api/identity/issuer/issue-credential- Issue credentialGET /api/identity/issuer/get-credential-offer- Get credential offer
Identity - IPFS
POST /api/identity/ipfs/store-credential- Store credentialPOST /api/identity/ipfs/retrieve-user-credential- Retrieve user credentialPOST /api/identity/ipfs/get-all-user-credentials- Get all user credentials
Identity - Verification
POST /api/identity/verification/verify-sign-in- Verify sign-inGET /api/identity/verification/link-store- Get link storePOST /api/identity/verification/link-store- Post link storePOST /api/identity/verification/callback- Verify callback
Analytics
POST /api/analytics/start-session- Start sessionPOST /api/analytics/end-session- End session
Example Usage
# Register OTP
curl -X POST http://localhost:8080/api/auth/register-otp \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com"}'
# Confirm OTP
curl -X POST http://localhost:8080/api/auth/confirm-otp \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com", "otp": "123456"}'
# Start analytics session
curl -X POST http://localhost:8080/api/analytics/start-session \
-H "Content-Type: application/json" \
-d '{"userId": "user123", "pageLocation": "https://example.com"}'
Error Handling
The SDK uses custom exception classes for different error types:
DCIDServerSDKError: Base error classNetworkError: Network connectivity issuesAuthenticationError: API-KEY or JWT token issuesServerError: Backend or gateway errors
from dcid_server_sdk import DCIDServerSDKError, NetworkError, AuthenticationError, ServerError
try:
result = sdk.auth.register_otp(InitiateOTPOptions(email="user@example.com"))
except AuthenticationError as e:
print(f"Authentication error: {e}")
print(f"Is API key error: {e.is_api_key_error}")
except NetworkError as e:
print(f"Network error: {e}")
except ServerError as e:
print(f"Server error: {e}")
except DCIDServerSDKError as e:
print(f"SDK error: {e}")
Python Version Support
- Python 3.8+
License
ISC
Metadata
Release files for dcid-server-sdk 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| dcid_server_sdk-0.1.0.tar.gz | 29.3 kB | Without provenance | Details for dcid_server_sdk-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| dcid_server_sdk-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for dcid_server_sdk-0.1.0-py3-none-any.whl |
Total release size: 53.8 kB
Release files / dcid_server_sdk-0.1.0.tar.gz
| Download URL | dcid_server_sdk-0.1.0.tar.gz |
|---|---|
| Size | 29.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
26930fdefd5bab532931f99b604823ba0c58f0f45d013ac43b1ca18cb6a71238
|
|
BLAKE2b-256 checksum How to use checksums |
36cdf2424ecdf87e1b9620f6f7ccaa414d8beabfe5757b83cda0772492c3fdd8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.2
|
Release files / dcid_server_sdk-0.1.0-py3-none-any.whl
| Download URL | dcid_server_sdk-0.1.0-py3-none-any.whl |
|---|---|
| Size | 24.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
10d2027a6f97634c62820e1e740efb0940ab65f744d659ad722058324627a20f
|
|
BLAKE2b-256 checksum How to use checksums |
088428c7d0aa8afb2257968527ae0ba24f59b15d3a7c6df3683c9c17b75c7e5e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.2
|
Security for dcid-server-sdk 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.