Beneficiary Identity Dispatch - a fee-for-service API that banks use to verify beneficiary identity before releasing funds. 12 endpoints covering cryptographic identity binding, trust scoring, compliance gating, KYC/KYB verification checks, and auditable receipts.
BID (Beneficiary Identity Dispatch) is a fee-for-service API that banks and financial institutions use to verify beneficiary identity before releasing funds. BID creates a cryptographic binding between a beneficiary's identity, their account, and the settlement instruction - preventing fraud, misdirected wires, and business email compromise attacks.
https://jilsovereign.com/api/bidapplication/jsonEvery verification produces a cryptographic receipt hash that can be anchored to the JIL ledger for immutable audit trails. The trust score system provides a quantified confidence level for each identity binding.
The API is organized into two groups: Core BID Endpoints (register, verify, status, submit, history, admin, health) for identity binding and settlement dispatch, and Identity Verification Checks (phone, email, address, person, company) for standalone KYC/KYB verification that can be used independently or linked to existing BID records.
All endpoints (except /health) require an API key. HMAC signing is optional but recommended for production deployments.
Include your API key in the x-api-key header with every request:
x-api-key: your_api_key_here
For additional security, you can sign requests with HMAC-SHA256. When present, the server validates the signature before processing the request.
| Header | Description |
|---|---|
x-timestamp | Unix timestamp in milliseconds (must be within 30 seconds of server time) |
x-signature | HMAC-SHA256 hex digest of the message string |
HMAC message format:
{METHOD}{PATH}{TIMESTAMP}{SHA256(BODY)}
Example for a POST to /v1/bid/verify:
POST/v1/bid/verify1709312400000e3b0c44298fc1c149afbf4c8996fb924...
^--- SHA-256 of the JSON body
Rate limits are enforced per API key. Every response includes rate limit headers so clients can self-regulate.
| Header | Description |
|---|---|
x-ratelimit-limit | Maximum requests per minute for your plan |
x-ratelimit-remaining | Requests remaining in the current window |
x-ratelimit-reset | Unix timestamp (seconds) when the window resets |
| Plan | Requests / Minute |
|---|---|
| Starter ($99/mo) | 60 |
| Pilot ($499/mo) | 120 |
| Pro ($1,999/mo) | 300 |
| Enterprise ($9,999/mo) | 1,000 |
When the limit is exceeded, the API returns 429 Too Many Requests with a retry_after_seconds field in the response body:
{
"ok": false,
"error": "rate_limit_exceeded",
"message": "Rate limit exceeded. Try again in 12 seconds.",
"retry_after_seconds": 12
}
POST /v1/bid/register
Register a new beneficiary identity binding. Creates the cryptographic binding between the beneficiary's identity, their account, and the public key. This is a billable operation.
{
"instruction_id": "INS-20260301-0001",
"beneficiary_account": "GB29NWBK60161331926819",
"beneficiary_lei": "529900T8BM49AURSDO55",
"beneficiary_legal_name": "Acme Trading Ltd",
"beneficiary_country": "GB",
"binding_signature": "base64-encoded-ed25519-signature",
"public_key": "base64-encoded-ed25519-public-key",
"metadata": {
"reference": "INV-2026-4521",
"department": "Treasury"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
instruction_id | string | Yes | Unique instruction identifier from the sending bank |
beneficiary_account | string | Yes | IBAN, account number, or wallet address of the beneficiary |
beneficiary_lei | string | No | LEI code (20-char alphanumeric) - adds 20pts to trust score |
beneficiary_legal_name | string | Yes | Legal name of the beneficiary entity |
beneficiary_country | string | Yes | ISO 3166-1 alpha-2 country code |
binding_signature | string | Yes | Base64-encoded Ed25519 signature over the canonical binding payload |
public_key | string | Yes | Base64-encoded Ed25519 public key used to create the signature |
metadata | object | No | Arbitrary key-value pairs (max 1KB) |
{
"ok": true,
"bid_id": "BID-A1B2C3D4",
"binding_hash": "a3f2c8e1d4b5a6f7e8c9d0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1",
"verified": true,
"trust_score": 80,
"compliance_decision": "clear",
"receipt_hash": "d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1a2b3c4d5e6f7a8b9c0d1e2f3a4b5",
"fee_charged": {
"cents": 50,
"display": "$0.50"
}
}
POST /v1/bid/verify
Verify an existing identity binding. This is the main fee operation - banks call this endpoint each time they need to confirm a beneficiary's identity before releasing funds. The binding must have been previously registered via /v1/bid/register.
{
"binding_hash": "a3f2c8e1d4b5a6f7e8c9d0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1",
"instruction_id": "INS-20260301-0002",
"beneficiary_account": "GB29NWBK60161331926819",
"beneficiary_lei": "529900T8BM49AURSDO55",
"public_key": "base64-encoded-ed25519-public-key",
"binding_signature": "base64-encoded-ed25519-signature"
}
| Field | Type | Required | Description |
|---|---|---|---|
binding_hash | string | Yes | SHA-256 hash of the original binding (returned from register) |
instruction_id | string | Yes | Instruction identifier for the current transfer |
beneficiary_account | string | Yes | Account must match the registered binding |
beneficiary_lei | string | No | LEI code for additional trust scoring |
public_key | string | Yes | Base64-encoded Ed25519 public key |
binding_signature | string | Yes | Base64-encoded Ed25519 signature over the verification payload |
{
"ok": true,
"verified": true,
"trust_score": 82,
"compliance_decision": "clear",
"verification_count": 3,
"receipt_hash": "e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6",
"fee_charged": {
"cents": 50,
"display": "$0.50"
}
}
GET /v1/bid/status/:binding_hash
Free read-only lookup of a binding's current status. No fee is charged. Use this to check whether a binding is active, its trust score, and verification count before deciding whether to call verify.
{
"ok": true,
"binding_hash": "a3f2c8e1d4b5a6f7e8c9d0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1",
"status": "active",
"trust_score": 82,
"verification_count": 3,
"endpoint_version": "v1",
"last_verified_at": "2026-03-01T14:22:08.000Z",
"created_at": "2026-02-28T09:15:33.000Z"
}
| Status | Description |
|---|---|
| active | Binding is valid and can be verified |
| suspended | Binding is temporarily suspended (compliance hold) |
| revoked | Binding has been permanently revoked |
POST /v1/bid/submit
Full end-to-end dispatch. JIL constructs the identity binding, verifies it, and forwards the verified BID to the receiving bank's callback URL. This is the highest-fee operation because it combines registration, verification, and delivery in a single call.
{
"instruction_id": "INS-20260301-0003",
"beneficiary_account": "GB29NWBK60161331926819",
"beneficiary_lei": "529900T8BM49AURSDO55",
"beneficiary_legal_name": "Acme Trading Ltd",
"beneficiary_country": "GB",
"sending_bank_bic": "DEUTDEFF",
"sending_bank_lei": "7LTWFZYICNSX8D621K86",
"receiving_bank_bic": "NWBKGB2L",
"callback_url": "https://receiving-bank.example.com/api/bid/inbound",
"amount": "2500000.00",
"currency": "USD",
"reference": "INV-2026-4521"
}
| Field | Type | Required | Description |
|---|---|---|---|
instruction_id | string | Yes | Unique instruction identifier |
beneficiary_account | string | Yes | Beneficiary account (IBAN, account number, or wallet) |
beneficiary_lei | string | No | LEI code of the beneficiary |
beneficiary_legal_name | string | Yes | Legal name of the beneficiary entity |
beneficiary_country | string | Yes | ISO 3166-1 alpha-2 (2-char country code) |
sending_bank_bic | string | No | BIC/SWIFT code of the sending bank |
sending_bank_lei | string | No | LEI code of the sending bank |
receiving_bank_bic | string | Yes | BIC/SWIFT code of the receiving bank |
callback_url | string | Yes | HTTPS URL where the verified BID will be forwarded |
amount | string | No | Transfer amount (decimal string) |
currency | string | No | ISO 4217 currency code |
reference | string | No | Payment reference or invoice number |
{
"ok": true,
"submission_id": "SUB-A1B2C3D4E5F6",
"bid_id": "BID-A1B2C3D4",
"binding_hash": "a3f2c8e1d4b5a6f7e8c9d0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1",
"status": "forwarded",
"trust_score": 80,
"receipt_hash": "f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7",
"fee_charged": {
"cents": 100,
"display": "$1.00"
}
}
GET /v1/bid/history
Paginated audit trail with billing summary. Returns all BID operations performed by the authenticated client.
| Param | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number |
limit | integer | 20 | Records per page (max 100) |
action | string | all | Filter by action: register, verify, submit, check_phone, check_email, check_address, check_person, check_company |
from | ISO date | - | Start date filter (inclusive) |
to | ISO date | - | End date filter (inclusive) |
{
"ok": true,
"page": 1,
"limit": 20,
"total": 142,
"records": [
{
"action": "verify",
"bid_id": "BID-A1B2C3D4",
"binding_hash": "a3f2c8e1...",
"instruction_id": "INS-20260301-0002",
"trust_score": 82,
"compliance_decision": "clear",
"fee_cents": 50,
"created_at": "2026-03-01T14:22:08.000Z"
}
],
"billing_summary": {
"total_operations": 142,
"total_fees_cents": 8400,
"total_fees_display": "$84.00",
"by_action": {
"register": { "count": 30, "fees_cents": 1500 },
"verify": { "count": 97, "fees_cents": 4850 },
"submit": { "count": 15, "fees_cents": 1500 }
},
"period_start": "2026-03-01T00:00:00.000Z",
"period_end": "2026-03-01T23:59:59.999Z"
}
}
POST /v1/bid/admin/clients
Admin-only endpoint. Requires the x-admin-token header in addition to the standard x-api-key. Creates a new bank client and returns the API key and HMAC secret. The HMAC secret is displayed once and cannot be retrieved again.
{
"bank_name": "Deutsche Bank AG",
"bank_lei": "7LTWFZYICNSX8D621K86",
"bank_bic": "DEUTDEFF",
"contact_email": "treasury-ops@db.example.com",
"plan": "pro",
"rate_limit_override": null
}
{
"ok": true,
"client_id": "CLT-D3E4F5A6B7",
"bank_name": "Deutsche Bank AG",
"plan": "pro",
"api_key": "bid_live_k1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6",
"hmac_secret": "hms_9f8e7d6c5b4a3928170f6e5d4c3b2a19",
"rate_limit": 300,
"created_at": "2026-03-01T10:00:00.000Z"
}
hmac_secret value is shown only in this response. Store it securely. If lost, a new client must be created.
GET /health
Unauthenticated health check. Returns service status and version. No API key required.
{
"ok": true,
"service": "bid-api",
"version": "1.0.0",
"uptime_seconds": 86400,
"timestamp": "2026-03-01T12:00:00.000Z"
}
Standalone identity verification endpoints for KYC (Know Your Customer) and KYB (Know Your Business) checks. Each check returns a structured result with a risk score, a per-operation fee, and an auditable receipt hash. These checks can be used independently or linked to an existing BID record via the optional bid_record_id field.
POST /v1/bid/check/phone
Verify a phone number - format validation, line type classification, carrier lookup, reachability assessment.
{
"phone_number": "+14155551234",
"country_code": "1", // optional
"expected_name": "John Doe", // optional - for name match
"bid_record_id": "bid_..." // optional - link to existing BID record
}
| Field | Type | Required | Description |
|---|---|---|---|
phone_number | string | Yes | Phone number in E.164 format (e.g., +14155551234) |
country_code | string | No | Calling country code (1-3 digits) - helps disambiguate local formats |
expected_name | string | No | Expected subscriber name for name-match scoring |
bid_record_id | string | No | Link this check to an existing BID record for audit trail |
{
"ok": true,
"check_id": "chk_phone_abc123",
"check_type": "phone",
"is_valid": true,
"phone_type": "mobile",
"country_code": "1",
"carrier": "T-Mobile",
"is_reachable": true,
"risk_score": 5,
"formatted_number": "+14155551234",
"fee_charged": { "cents": 10, "display": "$0.10" },
"receipt_hash": "sha256..."
}
POST /v1/bid/check/email
Verify an email address - syntax validation, MX record lookup, disposable email detection, deliverability check.
{
"email_address": "john.doe@bankofamerica.com",
"expected_name": "John Doe", // optional
"bid_record_id": "bid_..." // optional
}
| Field | Type | Required | Description |
|---|---|---|---|
email_address | string | Yes | Email address to verify |
expected_name | string | No | Expected account holder name for name-match scoring |
bid_record_id | string | No | Link this check to an existing BID record for audit trail |
{
"ok": true,
"check_id": "chk_email_abc123",
"check_type": "email",
"is_valid": true,
"is_deliverable": true,
"is_disposable": false,
"is_free_provider": false,
"is_role_account": false,
"mx_found": true,
"domain": "bankofamerica.com",
"risk_score": 0,
"fee_charged": { "cents": 10, "display": "$0.10" },
"receipt_hash": "sha256..."
}
POST /v1/bid/check/address
Verify a physical address - format validation, postal code patterns, standardization, country-specific rules.
{
"street_line_1": "100 Federal Street",
"street_line_2": "Suite 2000", // optional
"city": "Boston",
"state_province": "MA", // optional
"postal_code": "02110", // optional
"country_code": "US",
"bid_record_id": "bid_..." // optional
}
| Field | Type | Required | Description |
|---|---|---|---|
street_line_1 | string | Yes | Primary street address line |
street_line_2 | string | No | Secondary address line (suite, floor, unit) |
city | string | Yes | City or locality name |
state_province | string | No | State, province, or region code |
postal_code | string | No | Postal or ZIP code |
country_code | string | Yes | ISO 3166-1 alpha-2 country code |
bid_record_id | string | No | Link this check to an existing BID record for audit trail |
{
"ok": true,
"check_id": "chk_addr_abc123",
"check_type": "address",
"is_valid": true,
"is_deliverable": true,
"is_residential": false,
"is_commercial": true,
"standardized_address": "100 Federal Street, Suite 2000, Boston, MA, 02110, US",
"match_score": 100,
"latitude": 42.3554,
"longitude": -71.0541,
"fee_charged": { "cents": 10, "display": "$0.10" },
"receipt_hash": "sha256..."
}
POST /v1/bid/check/person
Verify personal identity - name match against account records, sanctions screening, PEP status check, adverse media. For personal accounts: is this person on the account?
{
"full_name": "John Michael Doe",
"date_of_birth": "1985-03-15", // optional
"account_number": "****1234", // optional
"bank_name": "Bank of America", // optional
"phone": "+14155551234", // optional - cross-reference
"email": "john.doe@email.com", // optional - cross-reference
"address": "100 Federal Street, Boston, MA 02110", // optional
"country": "US", // optional
"bid_record_id": "bid_..." // optional
}
| Field | Type | Required | Description |
|---|---|---|---|
full_name | string | Yes | Full legal name of the person to verify |
date_of_birth | string | No | Date of birth in ISO 8601 format (YYYY-MM-DD) |
account_number | string | No | Masked or full account number for cross-reference |
bank_name | string | No | Name of the bank holding the account |
phone | string | No | Phone number for cross-reference verification |
email | string | No | Email address for cross-reference verification |
address | string | No | Physical address for cross-reference verification |
country | string | No | ISO 3166-1 alpha-2 country code |
bid_record_id | string | No | Link this check to an existing BID record for audit trail |
{
"ok": true,
"check_id": "chk_person_abc123",
"check_type": "person",
"identity_verified": true,
"name_match_score": 85,
"address_match_score": 80,
"sanctions_clear": true,
"pep_status": false,
"adverse_media": false,
"risk_level": "low",
"fee_charged": { "cents": 75, "display": "$0.75" },
"receipt_hash": "sha256..."
}
POST /v1/bid/check/company
Verify a company or business entity - registration status, good standing, jurisdiction, LEI validation, officer identification, sanctions screening. For company accounts: is this entity registered and in good standing?
{
"company_name": "Acme Financial Corp",
"registration_number": "12-3456789", // optional - EIN/Companies House number
"lei": "5493001KJTIIGC8Y1R17", // optional - Legal Entity Identifier
"jurisdiction": "Delaware", // optional
"country": "US",
"bid_record_id": "bid_..." // optional
}
| Field | Type | Required | Description |
|---|---|---|---|
company_name | string | Yes | Legal name of the company or business entity |
registration_number | string | No | Business registration number (EIN, Companies House number, etc.) |
lei | string | No | Legal Entity Identifier (20-char alphanumeric, ISO 17442) |
jurisdiction | string | No | Jurisdiction of incorporation (state, province, or country) |
country | string | Yes | ISO 3166-1 alpha-2 country code |
bid_record_id | string | No | Link this check to an existing BID record for audit trail |
{
"ok": true,
"check_id": "chk_company_abc123",
"check_type": "company",
"is_registered": true,
"registration_status": "active",
"is_good_standing": true,
"registration_date": "2015-06-20",
"registered_address": "1209 Orange Street, Wilmington, DE 19801",
"officers": [
{ "name": "Jane Smith", "role": "CEO" },
{ "name": "Robert Chen", "role": "CFO" }
],
"ubo_identified": true,
"sanctions_clear": true,
"risk_level": "low",
"fee_charged": { "cents": 800, "display": "$8.00" },
"receipt_hash": "sha256..."
}
bid_record_id on any check endpoint to link the verification result to an existing BID binding. Linked checks appear in the /v1/bid/history audit trail and contribute to the binding's overall trust score.
When a bank calls /v1/bid/submit, JIL constructs and verifies the identity binding, then forwards the verified BID to the receiving bank's callback_url via an HTTP POST.
{
"submission_id": "SUB-A1B2C3D4E5F6",
"bid_id": "BID-A1B2C3D4",
"binding_hash": "a3f2c8e1d4b5a6f7e8c9d0a1b2c3d4e5...",
"instruction_id": "INS-20260301-0003",
"beneficiary_account": "GB29NWBK60161331926819",
"beneficiary_legal_name": "Acme Trading Ltd",
"beneficiary_country": "GB",
"beneficiary_lei": "529900T8BM49AURSDO55",
"sending_bank_bic": "DEUTDEFF",
"sending_bank_lei": "7LTWFZYICNSX8D621K86",
"trust_score": 80,
"compliance_decision": "clear",
"verified": true,
"verified_at": "2026-03-01T14:30:00.000Z",
"receipt_hash": "f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1...",
"amount": "2500000.00",
"currency": "USD",
"reference": "INV-2026-4521"
}
| Header | Value |
|---|---|
Content-Type | application/json |
X-BID-Submission | The submission_id for correlation |
X-BID-Source | jil-sovereign-bid-v1 |
forward_failed/v1/bid/submit call if neededX-BID-Source header and the receipt_hash for authenticityAll error responses follow a consistent structure:
{
"ok": false,
"error": "error_code",
"message": "Human-readable description of the error."
}
| HTTP Code | Error Code | Description |
|---|---|---|
| 400 | bad_request |
Malformed JSON or missing required fields |
| 400 | validation_failed |
Field-level validation error (invalid country code, bad signature format, etc.) |
| 401 | missing_auth |
No x-api-key header provided |
| 401 | invalid_api_key |
API key is invalid or has been revoked |
| 401 | invalid_signature |
HMAC signature verification failed |
| 403 | compliance_block |
Compliance engine blocked the operation (sanctions, PEP, etc.) |
| 403 | binding_suspended |
The binding is suspended and cannot be verified |
| 404 | binding_not_found |
No binding exists for the given binding_hash |
| 409 | duplicate_binding |
A binding already exists for this instruction + account combination |
| 429 | rate_limit_exceeded |
Too many requests - includes retry_after_seconds |
| 500 | internal_error |
Unexpected server error - contact support with the request ID |
Every BID operation produces a trust score between 0 and 100. The score quantifies confidence in the identity binding and is composed of four weighted factors:
| Factor | Points | Description |
|---|---|---|
| Signature Valid | 30 | Ed25519 signature over the binding payload is cryptographically valid |
| LEI Present | 20 | A valid LEI (Legal Entity Identifier) code is provided and resolves in the GLEIF database |
| Compliance Clear | 30 | No sanctions, PEP, or adverse media hits from the compliance screening engine |
| Verification History | up to 20 | Accrues over time: +4pts per successful verification, capped at 20pts (5 verifications) |
| Range | Label | Recommendation |
|---|---|---|
| 80 - 100 | High confidence | Safe to release funds |
| 60 - 79 | Moderate confidence | Proceed with standard due diligence |
| 30 - 59 | Low confidence | Enhanced verification recommended |
| 0 - 29 | Insufficient | Do not release funds without manual review |
Fees are charged per operation. Monthly plan pricing includes the base platform fee plus per-operation charges. All fees are in USD.
| Action | Starter $99/mo |
Pilot $499/mo |
Pro $1,999/mo |
Enterprise $9,999/mo |
|---|---|---|---|---|
| Register | $0.50 | $0.35 | $0.20 | $0.12 |
| Verify | $0.50 | $0.35 | $0.20 | $0.12 |
| Submit | $1.00 | $0.70 | $0.40 | $0.25 |
| Status | Free | Free | Free | Free |
| IDENTITY VERIFICATION CHECKS | ||||
| Check: Phone | $0.10 | $0.08 | $0.05 | $0.03 |
| Check: Email | $0.10 | $0.08 | $0.05 | $0.03 |
| Check: Address | $0.10 | $0.08 | $0.05 | $0.03 |
| Check: Person | $0.75 | $0.50 | $0.35 | $0.20 |
| Check: Company | $8.00 | $6.00 | $4.50 | $3.50 |
enterprise@jilsovereign.com for details.
# Register a beneficiary identity binding
curl -X POST https://jilsovereign.com/api/bid/v1/bid/register \
-H "Content-Type: application/json" \
-H "x-api-key: bid_live_k1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6" \
-d '{
"instruction_id": "INS-20260301-0001",
"beneficiary_account": "GB29NWBK60161331926819",
"beneficiary_lei": "529900T8BM49AURSDO55",
"beneficiary_legal_name": "Acme Trading Ltd",
"beneficiary_country": "GB",
"binding_signature": "dGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVk...",
"public_key": "MCowBQYDK2VwAyEA..."
}'
# Verify an existing binding
curl -X POST https://jilsovereign.com/api/bid/v1/bid/verify \
-H "Content-Type: application/json" \
-H "x-api-key: bid_live_k1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6" \
-d '{
"binding_hash": "a3f2c8e1d4b5a6f7...",
"instruction_id": "INS-20260301-0002",
"beneficiary_account": "GB29NWBK60161331926819",
"public_key": "MCowBQYDK2VwAyEA...",
"binding_signature": "dGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVk..."
}'
# Check binding status (free, no fee)
curl https://jilsovereign.com/api/bid/v1/bid/status/a3f2c8e1d4b5a6f7... \
-H "x-api-key: bid_live_k1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6"
// Register a beneficiary identity binding
const API_KEY = "bid_live_k1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6";
const BASE = "https://jilsovereign.com/api/bid";
async function registerBeneficiary() {
const body = {
instruction_id: "INS-20260301-0001",
beneficiary_account: "GB29NWBK60161331926819",
beneficiary_lei: "529900T8BM49AURSDO55",
beneficiary_legal_name: "Acme Trading Ltd",
beneficiary_country: "GB",
binding_signature: "dGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVk...",
public_key: "MCowBQYDK2VwAyEA...",
};
const res = await fetch(`${BASE}/v1/bid/register`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": API_KEY,
},
body: JSON.stringify(body),
});
const data = await res.json();
console.log("BID ID:", data.bid_id);
console.log("Binding hash:", data.binding_hash);
console.log("Trust score:", data.trust_score);
console.log("Fee:", data.fee_charged.display);
return data;
}
async function verifyBinding(bindingHash) {
const body = {
binding_hash: bindingHash,
instruction_id: "INS-20260301-0002",
beneficiary_account: "GB29NWBK60161331926819",
public_key: "MCowBQYDK2VwAyEA...",
binding_signature: "dGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVk...",
};
const res = await fetch(`${BASE}/v1/bid/verify`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": API_KEY,
},
body: JSON.stringify(body),
});
return res.json();
}
// Usage
const registration = await registerBeneficiary();
const verification = await verifyBinding(registration.binding_hash);
# pip install requests
import requests
import hashlib
import hmac
import time
API_KEY = "bid_live_k1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6"
HMAC_KEY = "hms_9f8e7d6c5b4a3928170f6e5d4c3b2a19"
BASE = "https://jilsovereign.com/api/bid"
def make_headers(method, path, body_bytes=b""):
"""Build headers with optional HMAC signature."""
ts = str(int(time.time() * 1000))
body_hash = hashlib.sha256(body_bytes).hexdigest()
message = f"{method}{path}{ts}{body_hash}"
sig = hmac.new(
HMAC_KEY.encode(), message.encode(), hashlib.sha256
).hexdigest()
return {
"Content-Type": "application/json",
"x-api-key": API_KEY,
"x-timestamp": ts,
"x-signature": sig,
}
# Register
payload = {
"instruction_id": "INS-20260301-0001",
"beneficiary_account": "GB29NWBK60161331926819",
"beneficiary_lei": "529900T8BM49AURSDO55",
"beneficiary_legal_name": "Acme Trading Ltd",
"beneficiary_country": "GB",
"binding_signature": "dGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVk...",
"public_key": "MCowBQYDK2VwAyEA...",
}
import json
body_bytes = json.dumps(payload).encode()
headers = make_headers("POST", "/v1/bid/register", body_bytes)
resp = requests.post(f"{BASE}/v1/bid/register", json=payload, headers=headers)
data = resp.json()
print(f"BID ID: {data['bid_id']}")
print(f"Trust score: {data['trust_score']}")
print(f"Fee: {data['fee_charged']['display']}")
# Verify
verify_payload = {
"binding_hash": data["binding_hash"],
"instruction_id": "INS-20260301-0002",
"beneficiary_account": "GB29NWBK60161331926819",
"public_key": "MCowBQYDK2VwAyEA...",
"binding_signature": "dGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVk...",
}
body_bytes = json.dumps(verify_payload).encode()
headers = make_headers("POST", "/v1/bid/verify", body_bytes)
resp = requests.post(f"{BASE}/v1/bid/verify", json=verify_payload, headers=headers)
print(resp.json())
The following examples demonstrate the /v1/bid/check/company endpoint for KYB (Know Your Business) verification.
# Verify a company entity (KYB check)
curl -X POST https://jilsovereign.com/api/bid/v1/bid/check/company \
-H "Content-Type: application/json" \
-H "x-api-key: bid_live_k1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6" \
-d '{
"company_name": "Acme Financial Corp",
"registration_number": "12-3456789",
"lei": "5493001KJTIIGC8Y1R17",
"jurisdiction": "Delaware",
"country": "US"
}'
# Link a company check to an existing BID record
curl -X POST https://jilsovereign.com/api/bid/v1/bid/check/company \
-H "Content-Type: application/json" \
-H "x-api-key: bid_live_k1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6" \
-d '{
"company_name": "Acme Financial Corp",
"registration_number": "12-3456789",
"country": "US",
"bid_record_id": "BID-A1B2C3D4"
}'
// Company verification (KYB check)
const API_KEY = "bid_live_k1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6";
const BASE = "https://jilsovereign.com/api/bid";
async function verifyCompany(companyData) {
const res = await fetch(`${BASE}/v1/bid/check/company`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": API_KEY,
},
body: JSON.stringify(companyData),
});
const data = await res.json();
if (!data.ok) {
throw new Error(`Company check failed: ${data.message}`);
}
console.log("Check ID:", data.check_id);
console.log("Registered:", data.is_registered);
console.log("Good standing:", data.is_good_standing);
console.log("Officers:", data.officers);
console.log("Sanctions clear:", data.sanctions_clear);
console.log("Risk level:", data.risk_level);
console.log("Fee:", data.fee_charged.display);
return data;
}
// Usage
const result = await verifyCompany({
company_name: "Acme Financial Corp",
registration_number: "12-3456789",
lei: "5493001KJTIIGC8Y1R17",
jurisdiction: "Delaware",
country: "US",
});
// Link to an existing BID record
const linkedResult = await verifyCompany({
company_name: "Acme Financial Corp",
registration_number: "12-3456789",
country: "US",
bid_record_id: "BID-A1B2C3D4",
});
# Company verification (KYB check)
import requests
import json
API_KEY = "bid_live_k1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6"
BASE = "https://jilsovereign.com/api/bid"
def verify_company(company_data):
"""Run a KYB company verification check."""
headers = {
"Content-Type": "application/json",
"x-api-key": API_KEY,
}
resp = requests.post(
f"{BASE}/v1/bid/check/company",
json=company_data,
headers=headers,
)
resp.raise_for_status()
return resp.json()
# Basic company check
result = verify_company({
"company_name": "Acme Financial Corp",
"registration_number": "12-3456789",
"lei": "5493001KJTIIGC8Y1R17",
"jurisdiction": "Delaware",
"country": "US",
})
print(f"Check ID: {result['check_id']}")
print(f"Registered: {result['is_registered']}")
print(f"Good standing: {result['is_good_standing']}")
print(f"Registration date: {result['registration_date']}")
print(f"Officers: {len(result['officers'])} found")
for officer in result["officers"]:
print(f" - {officer['name']} ({officer['role']})")
print(f"UBO identified: {result['ubo_identified']}")
print(f"Sanctions clear: {result['sanctions_clear']}")
print(f"Risk level: {result['risk_level']}")
print(f"Fee: {result['fee_charged']['display']}")
# Link to existing BID record
linked = verify_company({
"company_name": "Acme Financial Corp",
"registration_number": "12-3456789",
"country": "US",
"bid_record_id": "BID-A1B2C3D4",
})
print(f"Linked check: {linked['check_id']}")
All BID operations emit events to the Kafka topic jil.bid.events. Events follow a consistent envelope format and can be consumed for analytics, audit logging, alerting, or downstream processing.
{
"event_id": "evt_a1b2c3d4e5f6",
"event_type": "BID_VERIFIED",
"timestamp": "2026-03-01T14:22:08.000Z",
"source": "bid-api-v1",
"client_id": "CLT-D3E4F5A6B7",
"payload": { ... }
}
| Event | Trigger | Payload Includes |
|---|---|---|
BID_REGISTERED |
Successful /v1/bid/register call |
bid_id, binding_hash, trust_score, fee_charged |
BID_VERIFIED |
Successful /v1/bid/verify call |
bid_id, binding_hash, trust_score, verification_count, fee_charged |
BID_SUBMITTED |
Successful /v1/bid/submit call (before forwarding) |
submission_id, bid_id, binding_hash, receiving_bank_bic, fee_charged |
BID_FORWARDED |
Webhook POST sent to receiving bank callback URL | submission_id, callback_url, http_status (of the webhook attempt) |
BID_FORWARD_CONFIRMED |
Receiving bank responded with 2xx | submission_id, response_time_ms |
BID_FORWARD_FAILED |
Receiving bank returned non-2xx or timed out | submission_id, error_code, response_time_ms (or timeout indicator) |
| IDENTITY VERIFICATION CHECK EVENTS | ||
BID_PHONE_CHECKED |
Successful /v1/bid/check/phone call |
check_id, phone_type, is_valid, is_reachable, risk_score, fee_charged |
BID_EMAIL_CHECKED |
Successful /v1/bid/check/email call |
check_id, is_valid, is_deliverable, is_disposable, domain, risk_score, fee_charged |
BID_ADDRESS_CHECKED |
Successful /v1/bid/check/address call |
check_id, is_valid, is_deliverable, match_score, country_code, fee_charged |
BID_PERSON_CHECKED |
Successful /v1/bid/check/person call |
check_id, identity_verified, sanctions_clear, pep_status, risk_level, fee_charged |
BID_COMPANY_CHECKED |
Successful /v1/bid/check/company call |
check_id, is_registered, is_good_standing, sanctions_clear, risk_level, fee_charged |
jil.bid.events is configured with 6 partitions, 3-day retention, and compaction disabled. Partition key is the client_id for per-client ordering guarantees.
BID identity checks are powered by a multi-provider architecture that aggregates results from specialized verification vendors. Each check type routes through one or more external providers, with JIL's internal heuristic engine providing baseline validation and graceful degradation when upstream providers are unavailable.
| Check Type | Primary Provider | Capability | Fallback |
|---|---|---|---|
phone |
Twilio Lookup API | Carrier identification, line type (mobile/landline/VoIP), reachability, subscriber name match | JIL heuristic engine - E.164 format validation, area code classification, country code extraction |
email |
DNS MX + SMTP Verification | MX record resolution, SMTP deliverability, engagement scoring | JIL heuristic engine - RFC 5322 syntax, disposable domain detection (20+ providers), free provider flags, role account detection |
address |
Smarty (SmartyStreets) | USPS/international address standardization, deliverability, residential/commercial classification, geocoding | JIL heuristic engine - postal code regex (US/CA/GB/DE/FR/AU/JP), field completeness scoring, canonical address builder |
person |
JIL Compliance API | Sanctions screening (OFAC SDN + internal lists), PEP status, adverse media, beneficiary binding check | JIL heuristic engine - name parsing, DOB/account/phone/email presence scoring, risk level determination |
company |
Middesk + OpenCorporates | Business registration verification, officer identification, UBO discovery, registered agent lookup | JIL heuristic engine - LEI checksum validation, registration number regex (EIN/Companies House/Handelsregister/SIREN/UEN/UID/ACN), jurisdiction match |
Person and company checks route through JIL's compliance infrastructure for sanctions and risk screening. This provides a unified compliance decision across all identity verification operations.
| Internal Service | Port | Role in BID Pipeline | Documentation |
|---|---|---|---|
| Compliance API | 8100 | KYC screening, sanctions (OFAC SDN), PEP status, adverse media, ATCE anti-dump enforcement, zone-based policy | Compliance API Spec |
| Analytics Integrations | 8770 | Multi-provider risk scoring - Chainalysis KYT (40%), TRM Labs (35%), Elliptic (25%) - composite weighted risk scores for wallet/transaction screening | Analytics Integrations API Spec |
| Compliance Architecture | - | End-to-end compliance pipeline - service map, fail-closed design, audit trail, 13 compliance zones | Compliance Architecture Spec |
| Vendor | Category | Used By | Data Provided |
|---|---|---|---|
| Twilio | Telecom Intelligence | Phone check | Carrier name, line type, subscriber name, reachability status |
| Smarty (SmartyStreets) | Address Validation | Address check | USPS/intl standardization, deliverability, residential/commercial, geocoding (lat/long) |
| Middesk | Business Verification | Company check | Secretary of State filings, registration date, registered agent, officer list, UBO identification |
| OpenCorporates | Corporate Registry | Company check | Global corporate registry data (140+ jurisdictions), status, incorporation details |
| Chainalysis KYT | Blockchain Analytics | Person/company (via Analytics Integrations) | Transaction monitoring, wallet risk scoring, exposure analysis, sanctions alerts |
| Elliptic | Blockchain Analytics | Person/company (via Analytics Integrations) | Wallet screening, transaction tracing, risk classification, source-of-funds analysis |
| TRM Labs | Blockchain Analytics | Person/company (via Analytics Integrations) | Chain intelligence, sanctions screening, entity attribution, cross-chain tracking |
BID is designed with a fail-safe architecture. When an upstream provider is unavailable, the check completes using JIL's internal heuristic engine with reduced confidence. Response fields populated by the unavailable provider return null to indicate data is pending upstream enrichment.
| Scenario | Behavior | Impact |
|---|---|---|
| Twilio unavailable | Phone check uses local E.164 validation + area code classification | carrier = null, is_reachable = null; format/type still validated |
| Smarty unavailable | Address check uses postal code regex + field completeness scoring | is_deliverable = null, latitude/longitude = null; format still validated |
| Middesk unavailable | Company check uses LEI checksum + registration number regex | registration_date = null, officers = []; registration format still validated |
| Compliance API unavailable | Person/company sanctions check defaults to "clear" with warning flag | sanctions_clear = true (assumed), warning logged; re-check recommended |
| All providers down | Full heuristic mode - all checks run locally with reduced trust scores | Trust scores capped at 60; audit trail flags "degraded_mode" for manual review |