Domain Security Info

API

Updated May 1, 2026, 8:25 AM

The admin API gives you programmatic access to manage brands, tags, verified domains, IP prefixes, verified ASNs, and system statistics. You can use it to automate data management tasks or integrate with other tools.

Authentication#

All admin API requests require a valid Cloudflare Access token. The token is passed through Cloudflare Access headers after you authenticate through the identity provider. Requests without a valid token receive a 403 Forbidden response.

Conventions#

  • All request and response bodies use JSON.
  • Successful responses return 200 (for reads and updates) or 201 (for creates).
  • Error responses include an error field with a human-readable description.
  • Timestamps are in ISO 8601 format.
  • List endpoints support pagination with page and limit query parameters.
  • PUT and PATCH both work for updates.

Brands#

List all brands#

GET /api/v1/brands

Returns an array of all brands.

Get a single brand#

GET /api/v1/brands/:id

Returns one brand by its ID.

Get brand dependencies#

GET /api/v1/brands/:id/dependencies

Returns counts of everything linked to this brand: tags, verified domains, IP prefixes, and verified ASNs. Check this before deleting a brand.

Create a brand#

POST /api/v1/brands
FieldTypeRequiredDescription
brandIdstringYesA unique short identifier (for example, google). Cannot be changed later.
namestringYesThe display name shown in badges.
colorstringNoA hex color code for the badge background (for example, #4285F4).
urlstringNoA link to the brand's website.
locationstringNoThe brand's headquarters or primary location.

Bulk create brands#

POST /api/v1/brands?action=bulk

Send an array of brand objects. Each object uses the same fields as single creation.

Update a brand#

PUT /api/v1/brands/:id

Send only the fields you want to change. You cannot change the brandId.

Delete a brand#

DELETE /api/v1/brands/:id

Check dependencies first. Deleting a brand may affect associated tags, domains, and prefixes.


TXT record tags#

List all TXT tags#

GET /api/v1/txt-tags

Get a single TXT tag#

GET /api/v1/txt-tags/:id

Create a TXT tag#

POST /api/v1/txt-tags
FieldTypeRequiredDescription
patternstringYesThe text pattern to match against TXT records. Must be unique.
brandIdstringNoThe brand this tag belongs to.
serviceNamestringNoA custom name for the badge (defaults to the brand name).
colorstringNoOverrides the brand's default badge color.
urlstringNoA clickable link on the badge.

Bulk create TXT tags#

POST /api/v1/txt-tags?action=bulk

Send an array of tag objects.

Update a TXT tag#

PUT /api/v1/txt-tags/:id

Delete a TXT tag#

DELETE /api/v1/txt-tags/:id

MX record tags#

Uses the same endpoint structure and fields as TXT tags, at /api/v1/mx-tags.

EndpointMethod
/api/v1/mx-tagsGET (list), POST (create)
/api/v1/mx-tags/:idGET (read), PUT (update), DELETE (delete)

Request body fields are the same as TXT tags. The pattern field is matched against MX record hostnames using suffix matching.


NS record tags#

Uses the same endpoint structure and fields as TXT tags, at /api/v1/ns-tags.

EndpointMethod
/api/v1/ns-tagsGET (list), POST (create)
/api/v1/ns-tags/:idGET (read), PUT (update), DELETE (delete)

Request body fields are the same as TXT tags. The pattern field is matched against nameserver hostnames using suffix matching.


Verified domains#

List all verified domains#

GET /api/v1/verified-domains

Get a single verified domain#

GET /api/v1/verified-domains/:id

Create a verified domain#

POST /api/v1/verified-domains
FieldTypeRequiredDescription
apexDomainstringYesThe registered domain (for example, google.com). Must be unique.
brandIdstringYesThe brand this domain belongs to.
secondaryLinestringNoExtra context shown below the brand name.
tertiaryLinestringNoA third line of context.
subdomainTreatmentstringNoHow subdomains are handled: noSubdomains (default), allSubdomains, or pattern.
verificationTypestringNoHow ownership was confirmed (for example, manual, dns).

Update a verified domain#

PUT /api/v1/verified-domains/:id

Delete a verified domain#

DELETE /api/v1/verified-domains/:id

IP prefixes#

List all IP prefixes#

GET /api/v1/ip-prefixes

Get a single IP prefix#

GET /api/v1/ip-prefixes/:id

Create an IP prefix#

POST /api/v1/ip-prefixes
FieldTypeRequiredDescription
ipPrefixstringYesThe IP range in CIDR notation (for example, 8.8.8.0/24). Must be unique.
ipVersionintegerYes4 for IPv4, 6 for IPv6.
brandIdstringYesThe brand that owns this IP range.
descriptionstringNoA note about what this prefix is used for.

Update an IP prefix#

PUT /api/v1/ip-prefixes/:id

Delete an IP prefix#

DELETE /api/v1/ip-prefixes/:id

Statistics#

Overview#

GET /api/v1/stats/overview

Returns counts for all main data types: brands, tags, verified domains, IP prefixes, and verified ASNs.

Data integrity#

GET /api/v1/stats/integrity

Returns results of the latest data integrity check, including foreign key validation and orphaned record detection.

Recent changes#

GET /api/v1/stats/recent-changes?limit=20

Returns the most recent changes across all data types. The limit parameter controls how many results to return (default: 20).


GET /api/v1/search?q=query

Searches across all entity types (brands, tags, domains, prefixes) for records matching the query string.

GET /api/v1/search-brands?q=query

Searches brands by name or ID.


Change history#

List recent history#

GET /api/v1/history

Returns revision history entries across all data types.

Get a specific history entry#

GET /api/v1/history/:id

Audit logs#

List audit log entries#

GET /api/v1/audit-logs

Returns audit log entries. Supports filters for user, action type, entity type, and date range.

Get a specific audit entry#

GET /api/v1/audit-logs/:id

Data management#

Export#

GET /api/v1/export?type=all

Exports system data as JSON. The type parameter can be all, brands, txt-tags, mx-tags, ns-tags, or verified-domains.

Import#

POST /api/v1/import

Imports previously exported JSON data. Uses "insert or ignore" โ€” existing records are not overwritten.


Scan management#

Trigger a scan#

POST /api/admin/scans/trigger

Manually triggers a scheduled scan. Send the scheduledScanId in the request body, or omit it to trigger all active scans.

Activate scheduled scans#

POST /api/admin/scans/activate

Activates scheduled scans by setting the next run time and enabling the active flag.

Test a single domain scan#

GET /api/admin/test-scan?domain=example.com&profile=standard

Runs a one-off scan of a single domain for testing. Returns the analysis results.


Health check#

GET /health

Returns the service health status. No authentication required.


Public API#

The public website provides a JSON endpoint that anyone can use without authentication:

Domain lookup#

GET /raw/{domain}

Returns a JSON object with the domain's current DNS records, security status (DNSSEC, SPF, DMARC, DKIM, HSTS, HSTS Preload, MTA-STS, TLS-RPT), WHOIS data, and identified services.

This endpoint returns the current, real-time state of the domain. It does not include historical analysis data, change history, or security scores โ€” those are only available through the admin interface.


Error responses#

All errors follow this format:

{
  "error": "A description of what went wrong",
  "status": 400
}
CodeWhat it means
400Bad request โ€” a required field is missing or a value is invalid.
403Forbidden โ€” you are not authenticated, or you don't have permission.
404Not found โ€” the item you requested doesn't exist.
409Conflict โ€” a record with the same unique field already exists.
500Server error โ€” something went wrong on the server side.