Overview

The Surety Rate Calculator API provides programmatic access to rate management, calculations, and share link functionality. All endpoints return JSON responses.

Base URL: /api/v1

Response Format

All responses follow a consistent format:

{
  "success": true,
  "data": { ... }
}

Error responses include an error object:

{
  "success": false,
  "error": {
    "code": "ERROR_CODE",
    "message": "Human-readable message"
  }
}

Authentication

All API endpoints require authentication via API key. Include your key in one of these headers:

X-API-Key Header

curl -H "X-API-Key: rk_live_your_key_here" \
  http://ratecalc.pcl.vrfy.it/api/v1/rates

Authorization Bearer

curl -H "Authorization: Bearer rk_live_your_key_here" \
  http://ratecalc.pcl.vrfy.it/api/v1/rates

Scopes

API keys can have different permission scopes:

ScopeDescription
readRead rates, shares, and perform calculations
writeCreate, update, and delete rates and shares
adminManage API keys (includes read and write)

Creating an API Key

Generate a new API key using the command line:

npm run create-api-key -- "Key Name" "read,write"

Store your API key securely. It is only shown once at creation.

Rates API

Manage premium and commission rate schedules.

GET /api/v1/rates read

List all rate schedules with optional filtering.

Query Parameters

ParameterTypeDescription
typestringFilter by type: Premium or Commission
activebooleanFilter by active status (default: true)
limitintegerMax results to return (default: 100)
offsetintegerNumber of results to skip (default: 0)

Example

curl -H "X-API-Key: YOUR_KEY" \
  "http://ratecalc.pcl.vrfy.it/api/v1/rates?type=Premium&limit=10"
GET /api/v1/rates/:id read

Get a single rate schedule by ID.

Example

curl -H "X-API-Key: YOUR_KEY" \
  "http://ratecalc.pcl.vrfy.it/api/v1/rates/15"
POST /api/v1/rates write

Create a new rate schedule.

Request Body

FieldTypeRequiredDescription
namestringYesUnique name for the rate
typestringYesPremium or Commission
bond_typestringNoContract or Commercial
tier1_size - tier5_sizenumberNoUpper limit for each tier
tier1_rate - tier6_ratenumberNoRate as decimal (0.025 = 2.5%)
is_flatbooleanNoUse tier6_rate for all amounts
max_ratenumberNoCap effective rate
sourcestringNoContract or SOV
term_periodstringNoNone, Month, or Year
term_skipintegerNoPeriods before term rate applies
term_ratenumberNoSupplemental rate per period

Example

curl -X POST -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Custom Premium Rate",
    "type": "Premium",
    "tier1_size": 100000,
    "tier1_rate": 0.025,
    "tier2_size": 500000,
    "tier2_rate": 0.015,
    "tier6_rate": 0.01
  }' \
  "http://ratecalc.pcl.vrfy.it/api/v1/rates"
PUT /api/v1/rates/:id write

Update an existing rate schedule. Partial updates are supported.

DELETE /api/v1/rates/:id write

Deactivate a rate schedule (soft delete).

Calculator API

Perform premium and commission calculations.

POST /api/v1/calculate read

Calculate premium and commission for a bond.

Request Body

FieldTypeRequiredDescription
premium_rate_idintegerYesID of the premium rate to use
commission_rate_idintegerNoID of the commission rate (optional)
contract_amountnumberYesContract amount in dollars
maintenance_amountnumberNoMaintenance bond amount
maintenance_percentnumberNoAuto-calculate maintenance as % of contract
surchargenumberNoSurcharge percentage (e.g., 5 for 5%)
termintegerNoTerm in years (default: 1)
durationintegerNoDuration in months (default: 12)
project_namestringNoProject name for reference
client_namestringNoClient name for reference
datestringNoDate in YYYY-MM-DD format

Example

curl -X POST -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "premium_rate_id": 15,
    "commission_rate_id": 28,
    "contract_amount": 5000000,
    "maintenance_percent": 100,
    "term": 2,
    "duration": 24,
    "project_name": "Highway Project",
    "client_name": "ABC Construction"
  }' \
  "http://ratecalc.pcl.vrfy.it/api/v1/calculate"

Response

{
  "success": true,
  "data": {
    "input": {
      "project_name": "Highway Project",
      "contract_amount": 5000000,
      ...
    },
    "premium": {
      "rate_name": "TX Class B",
      "penalty": 5000000,
      "tiered": true,
      "tiers": [
        { "tier": 1, "amount": 100000, "rate": 0.025, "premium": 2500 },
        ...
      ],
      "base_premium": 47250,
      "supplemental_premium": 5670,
      "total_premium": 62445
    },
    "commission": {
      "rate_name": "SureTec 35%",
      "total_commission": 19318
    },
    "totals": {
      "total_premium": 62445,
      "total_commission": 19318
    }
  }
}

Shares API

Manage shareable calculator links for clients.

GET /api/v1/shares read

List all share links with optional filtering.

Query Parameters

ParameterTypeDescription
activebooleanFilter by active status
limitintegerMax results (default: 100)
offsetintegerResults to skip (default: 0)
GET /api/v1/shares/:id read

Get a share link by ID.

GET /api/v1/shares/token/:token read

Get a share link by its public token.

POST /api/v1/shares write

Create a new share link.

Request Body

FieldTypeRequiredDescription
namestringYesInternal name for the share
premium_rate_idintegerYesPremium rate to use
client_namestringNoClient name to display
surchargenumberNoSurcharge % (e.g., 5 for 5%)

Example

curl -X POST -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Client Rate Calculator",
    "premium_rate_id": 15,
    "client_name": "ABC Construction",
    "surcharge": 5
  }' \
  "http://ratecalc.pcl.vrfy.it/api/v1/shares"

Response

{
  "success": true,
  "data": {
    "id": 5,
    "token": "abc123xyz789def0",
    "name": "Client Rate Calculator",
    "share_url": "http://ratecalc.pcl.vrfy.it/s/abc123xyz789def0",
    ...
  }
}
PUT /api/v1/shares/:id write

Update an existing share link.

DELETE /api/v1/shares/:id write

Deactivate a share link (soft delete).

API Keys API

Manage API keys. Requires admin scope.

GET /api/v1/api-keys admin

List all API keys (metadata only, keys are never returned).

POST /api/v1/api-keys admin

Create a new API key. The key is only returned once.

Request Body

FieldTypeRequiredDescription
namestringYesName for the key
descriptionstringNoDescription
scopesstringNoComma-separated scopes (default: read)
rate_limitintegerNoRequests per hour (null = unlimited)
expires_atstringNoExpiration datetime (ISO 8601)

Response

{
  "success": true,
  "data": {
    "id": 2,
    "key": "rk_live_abc123...",
    "key_prefix": "rk_live_abc1",
    "name": "Production API",
    "scopes": "read,write",
    "warning": "Store this API key securely. It will not be shown again."
  }
}
PUT /api/v1/api-keys/:id admin

Update API key metadata (scopes, rate limit, etc.).

DELETE /api/v1/api-keys/:id admin

Revoke an API key.

Error Handling

The API uses standard HTTP status codes and returns detailed error information.

StatusCodeDescription
400BAD_REQUESTInvalid request parameters
400VALIDATION_ERRORInput validation failed
401UNAUTHORIZEDMissing API key
401INVALID_API_KEYInvalid or inactive key
401API_KEY_EXPIREDKey has expired
403INSUFFICIENT_SCOPEKey lacks required scope
404NOT_FOUNDResource not found
409CONFLICTResource already exists
500INTERNAL_ERRORServer error

Example Error Response

{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "premium_rate_id is required"
  }
}