Authentication
Authenticate by including your API key in the Authorization header. API keys use the `ssa_` prefix. Generate keys from your dashboard under Settings > API Keys.
Authorization: Bearer ssa_your_api_key_hereBase URL
All API requests use the following base URL:
https://app.ssltrackr.com/api/v1Rate Limiting
API requests are rate-limited per user. When exceeded, the API returns 429 Too Many Requests.
POST /check — 10 requests per minutePOST /api-keys — 5 requests per minute
Error Handling
The API uses standard HTTP status codes. Error responses include a JSON body with an `error` field.
{
"error": "Invalid request"
}| Status | Description |
|---|---|
400 | Bad Request — Invalid parameters |
401 | Unauthorized — Missing or invalid API key |
403 | Forbidden — Insufficient permissions |
404 | Not Found — Resource does not exist |
409 | Conflict — Resource already exists |
429 | Too Many Requests — Rate limit exceeded |
500 | Internal Server Error |
Domains
/domainsList Domains
Retrieve a paginated list of your monitored domains with optional filtering and sorting.
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
page | integer | No | 1 | Page number |
per_page | integer | No | 20 | Items per page (1-100) |
status | string | No | all | Filter: all, valid, warning, critical, expired, error |
search | string | No | — | Search by hostname |
sort | string | No | created_at | Sort: hostname, ssl_days_remaining, whois_days_remaining, created_at |
order | string | No | desc | Order: asc, desc |
{
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"hostname": "example.com",
"port": 443,
"is_active": true,
"ssl_grade": "A+",
"ssl_days_remaining": 45,
"whois_days_remaining": 320,
"tags": ["production"],
"created_at": "2026-01-15T10:00:00.000Z"
}
],
"pagination": {
"page": 1,
"per_page": 20,
"total": 1,
"total_pages": 1
}
}/domainsCreate Domain
Add a new domain to your monitoring list. Automatically triggers SSL and WHOIS checks.
Request Body
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
hostname | string | Yes | — | Domain FQDN (e.g. example.com) |
port | integer | No | 443 | SSL port (1-65535) |
notes | string | No | — | Optional notes (max 500 chars) |
tags | string[] | No | [] | Tags (max 10, each max 50 chars) |
{
"hostname": "example.com",
"port": 443,
"notes": "Production server",
"tags": ["production", "web"]
}{
"id": "550e8400-e29b-41d4-a716-446655440000",
"hostname": "example.com",
"port": 443,
"is_active": true,
"notes": "Production server",
"tags": ["production", "web"],
"ssl_grade": null,
"ssl_days_remaining": null,
"whois_days_remaining": null,
"created_at": "2026-02-23T14:30:00.000Z",
"updated_at": "2026-02-23T14:30:00.000Z"
}{
"error": "This domain is already being monitored"
}/domains/{id}Get Domain
Retrieve details for a specific domain.
Path Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
id | uuid | Yes | — | Domain ID |
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"hostname": "example.com",
"port": 443,
"is_active": true,
"ssl_grade": "A+",
"ssl_days_remaining": 45,
"whois_days_remaining": 320,
"notes": "Production server",
"tags": ["production"],
"created_at": "2026-01-15T10:00:00.000Z",
"updated_at": "2026-02-20T08:00:00.000Z"
}/domains/{id}Update Domain
Update properties of a monitored domain.
Path Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
id | uuid | Yes | — | Domain ID |
Request Body
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
hostname | string | No | — | Domain FQDN |
port | integer | No | — | SSL port (1-65535) |
is_active | boolean | No | — | Enable or disable monitoring |
notes | string | No | — | Optional notes (max 500 chars) |
tags | string[] | No | — | Tags (max 10, each max 50 chars) |
{
"is_active": false,
"notes": "Deprecated server"
}{
"id": "550e8400-e29b-41d4-a716-446655440000",
"hostname": "example.com",
"port": 443,
"is_active": false,
"notes": "Deprecated server",
"tags": ["production"],
"ssl_grade": "A+",
"ssl_days_remaining": 45,
"whois_days_remaining": 320,
"created_at": "2026-01-15T10:00:00.000Z",
"updated_at": "2026-02-23T15:00:00.000Z"
}/domains/{id}Delete Domain
Remove a domain from your monitoring list.
Path Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
id | uuid | Yes | — | Domain ID |
{
"message": "Domain deleted"
}{
"error": "Domain not found"
}SSL Checks
/domains/{id}/sslGet Latest SSL Check
Retrieve the most recent SSL certificate check for a domain.
Path Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
id | uuid | Yes | — | Domain ID |
{
"id": "660e8400-e29b-41d4-a716-446655440001",
"domain_id": "550e8400-e29b-41d4-a716-446655440000",
"subject": "CN=example.com",
"issuer": "CN=Let's Encrypt Authority X3",
"valid_from": "2025-12-01T00:00:00.000Z",
"valid_to": "2026-04-01T00:00:00.000Z",
"days_remaining": 45,
"serial_number": "03:a1:b2:c3:...",
"tls_version": "TLSv1.3",
"chain_valid": true,
"hsts": true,
"sans": ["example.com", "www.example.com"],
"grade": "A+",
"checked_at": "2026-02-23T06:00:00.000Z"
}WHOIS Checks
/domains/{id}/whoisGet Latest WHOIS Check
Retrieve the most recent WHOIS lookup for a domain.
Path Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
id | uuid | Yes | — | Domain ID |
{
"id": "770e8400-e29b-41d4-a716-446655440002",
"domain_id": "550e8400-e29b-41d4-a716-446655440000",
"registrar": "Gandi SAS",
"created_date": "2020-03-15T00:00:00.000Z",
"expiry_date": "2027-03-15T00:00:00.000Z",
"days_remaining": 320,
"dnssec": false,
"nameservers": ["ns1.example.com", "ns2.example.com"],
"checked_at": "2026-02-23T06:00:00.000Z"
}Manual Check
/checkTrigger Check
Trigger an immediate SSL and WHOIS check for a domain. Rate limited to 10 requests per minute.
Request Body
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
domain_id | uuid | Yes | — | Domain ID to check |
{
"domain_id": "550e8400-e29b-41d4-a716-446655440000"
}{
"ssl": {
"subject": "CN=example.com",
"issuer": "CN=Let's Encrypt Authority X3",
"valid_to": "2026-04-01T00:00:00.000Z",
"days_remaining": 45,
"grade": "A+",
"tls_version": "TLSv1.3",
"chain_valid": true,
"checked_at": "2026-02-23T15:30:00.000Z"
},
"whois": {
"registrar": "Gandi SAS",
"expiry_date": "2027-03-15T00:00:00.000Z",
"days_remaining": 320,
"checked_at": "2026-02-23T15:30:00.000Z"
}
}{
"error": "Rate limit exceeded. Try again in 60 seconds."
}Alerts
/alertsList Alerts
Retrieve your alert history with optional filtering by domain.
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
page | integer | No | 1 | Page number |
per_page | integer | No | 20 | Items per page (1-100) |
domain_id | uuid | No | — | Filter by domain ID |
{
"data": [
{
"id": "880e8400-e29b-41d4-a716-446655440003",
"domain_id": "550e8400-e29b-41d4-a716-446655440000",
"hostname": "example.com",
"alert_type": "ssl_expiry",
"severity": "warning",
"title": "SSL certificate expires in 30 days",
"message": "The SSL certificate for example.com expires on 2026-03-25. 30 days remaining.",
"threshold_days": 30,
"triggered_at": "2026-02-23T12:00:00.000Z"
}
],
"pagination": {
"page": 1,
"per_page": 20,
"total": 1,
"total_pages": 1
}
}API Keys
/api-keysCreate API Key
Generate a new API key. The full key is returned only once — store it securely.
Request Body
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
label | string | Yes | — | Human-readable label |
permissions | string[] | No | ["read"] | Scopes: read, write |
expires_at | datetime | No | — | Optional expiration date (ISO 8601) |
{
"label": "CI/CD Pipeline",
"permissions": ["read", "write"],
"expires_at": "2027-01-01T00:00:00.000Z"
}{
"id": "990e8400-e29b-41d4-a716-446655440004",
"label": "CI/CD Pipeline",
"key": "ssa_live_abc123def456ghi789...",
"permissions": ["read", "write"],
"expires_at": "2027-01-01T00:00:00.000Z",
"last_used_at": null,
"created_at": "2026-02-23T16:00:00.000Z"
}{
"error": "Rate limit exceeded. Try again in 60 seconds."
}