Data Ingestion API¶
Push KYC verification data into the Circuit network. This endpoint is used by banks and financial institutions to share verified identity data.
Endpoint¶
Authentication¶
Requires X-API-Key header with your API key.
Request Body¶
{
"email": "user@example.com",
"phone_number": "+15551234567",
"full_name": "John Doe",
"date_of_birth": "1990-01-15",
"kyc_status": "APPROVED",
"tier": "Tier1",
"document_reference": "doc_abc123",
"kyc_expires_at": "2025-01-15T00:00:00Z",
"extra_data": {
"verification_method": "document_scan",
"document_type": "passport"
}
}
Request Fields¶
| Field | Type | Required | Description |
|---|---|---|---|
email |
string | Yes | User's email address |
phone_number |
string | Yes | Phone number in E.164 format |
full_name |
string | Yes | User's full legal name |
date_of_birth |
string | No | Date of birth (YYYY-MM-DD) |
kyc_status |
string | Yes | Status: APPROVED, REJECTED, PENDING_REVIEW, EXPIRED |
tier |
string | No | KYC tier level (default: Tier1) |
document_reference |
string | No | Reference to evidence document |
data_source_id |
string | No | Identifier for your data source |
kyc_expires_at |
string | No | KYC expiration date (ISO 8601) |
extra_data |
object | No | Additional bank-specific data |
Response¶
{
"status": "received",
"ingestion_id": "b4322eab-0ff6-4b53-af8d-26fc5c1eedc2",
"timestamp": "2024-01-15T10:30:00.282712+00:00",
"message": "Payload queued for processing"
}
| Field | Type | Description |
|---|---|---|
status |
string | Always received on success |
ingestion_id |
string | Unique ID for tracking this ingestion |
timestamp |
string | When the data was received |
message |
string | Status message |
KYC Status Values¶
| Status | Description |
|---|---|
APPROVED |
Identity verified and approved |
REJECTED |
Identity verification failed |
PENDING_REVIEW |
Manual review required |
EXPIRED |
Previous verification has expired |
Example¶
curl -X POST https://api.circuitkyc.com/api/v1/ingest \
-H "Content-Type: application/json" \
-H "X-API-Key: sk_live_your_api_key" \
-d '{
"email": "john.doe@example.com",
"phone_number": "+15551234567",
"full_name": "John Doe",
"date_of_birth": "1990-01-15",
"kyc_status": "APPROVED",
"tier": "Tier1"
}'
from circuit_kyc import CircuitKYC
client = CircuitKYC(api_key="sk_live_your_api_key")
result = client.ingest(
email="john.doe@example.com",
phone_number="+15551234567",
full_name="John Doe",
date_of_birth="1990-01-15",
kyc_status="APPROVED",
tier="Tier1"
)
print(f"Ingestion ID: {result.ingestion_id}")
import { CircuitKYC } from '@circuit-kyc/sdk';
const client = new CircuitKYC({ apiKey: 'sk_live_your_api_key' });
const result = await client.ingest({
email: 'john.doe@example.com',
phoneNumber: '+15551234567',
fullName: 'John Doe',
dateOfBirth: '1990-01-15',
kycStatus: 'APPROVED',
tier: 'Tier1'
});
console.log(`Ingestion ID: ${result.ingestionId}`);
Credit Cost¶
FREE - Data ingestion is free to encourage data sharing.
Processing¶
Ingested data is:
- Validated for format and completeness
- Queued to Kafka for async processing
- Encrypted and stored in the identity registry
- Made available for eligibility checks
Processing typically completes within 1-5 seconds.
Webhooks¶
You can configure webhooks to receive notifications when:
- Data processing completes
- Identity status changes
- Verification expires
See Webhooks Guide for configuration.
Best Practices¶
- Batch wisely - For bulk uploads, use reasonable batch sizes
- Idempotency - Re-ingesting the same identity updates the existing record
- Data freshness - Re-ingest when verification is renewed
- Phone format - Always use E.164 format (+country code)