API Access Guide
This document explains how to securely access the ZoneFeeds APIs using an API key. It covers authentication, request structure, pagination behavior, response formats, and access related best practices. Detailed endpoint definitions and parameter specifications are documented separately in API Reference.
1. Prerequisites
To access the ZoneFeeds API, you must have:
- An approved ZoneFeeds user account with an active subscription
- An active API key associated with your account
- Network access to the ZoneFeeds API endpoints
How to get your API key:
- Account Registration – Create a new ZoneFeeds account via the registration page at https://zonefeeds.com
- Account Approval – After submission, your account will be approved by an administrator
- Subscription Activated – Upon approval, a 7-day trial subscription is created automatically
- API Key Issued – A default API key is generated and sent via email along with your subscription details
Account registration, approval, and API key generation are described in Register Account
2. Base URL
All API requests use the following base URL:
Endpoint paths are appended to this base URL.
3. Authentication
All protected API endpoints require authentication via an API key.
Authorization Header
Include the API key in every request using the Bearer token format:
Requests without a valid API key will be rejected with 401 Unauthorized.
If your subscription has expired, API requests will receive 403 Forbidden with a structured error indicating the subscription status and a URL to renew.
Subscription Requirement
In addition to a valid API key, your account must have an active subscription. If your subscription has expired, API requests will be rejected with 403 Forbidden and a message indicating that your subscription has expired.
4. API Key Management
- API keys are issued after account approval
- A default API key is generated automatically upon approval
- Keys are bound to a specific user account
- API key default validity matches your subscription tier:
- Trial: 7 days
- Basic: 365 days
- Enterprise: 365 days
- Important: API keys have their own expiry independent of your subscription. When your subscription renews, existing API keys are not automatically extended. You must generate new keys from your dashboard or API.
- Users can generate additional keys via the API
- Keys can be revoked by the user or by administrators
Security Recommendations
- Never embed API keys in client side or frontend applications
- Store keys securely using environment variables or secret managers
- Use separate keys for development and production environments
- Rotate keys immediately if exposure is suspected
5. Request Structure
Each API request consists of:
- HTTP method (
GET) - Fully qualified endpoint URL
- Authorization header
- Optional query parameters
Example request structure:
Supported Query Parameters
| Parameter | Type | Description |
|---|---|---|
start |
ISO 8601 datetime | Start of the time window (UTC). Required for trial users. |
end |
ISO 8601 datetime | End of the time window (UTC). Optional. |
search |
string | Domain name or keyword filter. |
limit |
integer (1–10,000) | Maximum records returned. Clamped to your tier's maximum. |
Example Request:
GET https://zonefeeds.com/api/api/v1/download/com.zone?start=2025-12-20T10:30:00Z&end=2025-12-25T10:30:00Z&limit=1000&search=technology
6. Query Capabilities by Tier
Available features depend on your subscription tier:
| Capability | Trial | Basic | Enterprise |
|---|---|---|---|
| TLD-based queries | Yes | Yes | Yes |
| Domain/keyword search | Yes | Yes | Yes |
Wildcard search (*) |
No | Yes (max 5,000 records) | Yes (max 5,000 records) |
| Browse without filter | No | Yes | Yes |
| Max records per query | 1,000 | 5,000 | 10,000 |
| Historical data window | 7 days | 30 days | 180 days |
| Punycode/IDN search | Yes | Yes | Yes |
Trial users must provide a start date with every request (a search term alone is not sufficient).
Refer to API Reference for detailed parameter definitions.
7. Internationalized Domains and Punycode
ZoneFeeds APIs expect Punycode encoded values when querying internationalized domains or TLDs.
- Unicode domains must be converted to Punycode before submission
- Both TLD and domain fields accept Punycode values
- The platform decodes and normalizes Unicode internally for analysis
This enables detection of multilingual phishing and homograph abuse.
8. Pagination and Result Navigation
ZoneFeeds uses cursor based pagination to ensure consistent and high performance queries.
Pagination Fields
| Field | Description |
|---|---|
pit |
Elasticsearch Point In Time identifier |
after |
Base64 encoded cursor for the next page |
limit |
Number of records to return (clamped to tier maximum) |
Pagination Flow
- The initial request returns a
pitvalue - If additional records exist, a
next_cursorvalue is returned - To fetch the next page, include:
pit=<PIT_ID>after=<CURSOR_BASE64>- Continue until no
next_cursoris returned
Example:
If your initial request was:
GET https://zonefeeds.com/api/api/v1/download/com.zone?start=2025-12-20T10:30:00Z&end=2025-12-25T10:30:00Z&limit=1000&search=technology
and the response returned:
Your next page request must include the original query parameters along with the pagination values:
GET https://zonefeeds.com/api/api/v1/download/com.zone?start=2025-12-20T10:30:00Z&end=2025-12-25T10:30:00Z&limit=1000&search=technology&after=WzEyODg2XQ==&pit=w8abBAYN...
Note: Omitting the original parameters will result in incorrect or inconsistent page results.
Important Notes
- PIT values remain valid for 2 minutes
- If a PIT expires, a
410 Goneerror is returned — start a new query from page 1 - Cursor continuation requests are not counted toward your query quota
9. JSON Response Format
All API responses are returned in JSON format.
Common Response Fields
| Field | Description |
|---|---|
results |
Array of domain observation objects. Each object represents a single domain state observation. |
domain |
Fully qualified domain name (FQDN) observed in the registry zone dataset (e.g., example.com). |
status |
Domain presence state — active (present in zone) or inactive (no longer present). |
data |
DNS record value associated with the domain (e.g., ns1.example.com.). |
timestamp |
Time the domain state was observed. Not the domain registration or expiry date. |
pit |
Point-In-Time identifier for consistent pagination. Valid for 2 minutes. |
next_cursor |
Encoded cursor for the next page. Absent when no more results exist. |
10. Access Errors and Status Codes
| Status Code | Meaning | Detail Format | Description |
|---|---|---|---|
| 400 | Bad Request | String | Invalid parameters, search pattern, or future dates |
| 401 | Unauthorized | String | Invalid, missing, or expired API key |
| 403 | Forbidden | String or Object | Subscription expired, feature not available on tier, or data window exceeded |
| 404 | Not Found | String | No data available for the selected timeframe or no domains found |
| 410 | Gone | String | Pagination session (PIT) expired — restart from page 1 |
| 429 | Too Many Requests | Object | Query quota exceeded — includes message, limit, used, and resets_at fields |
Error Response Format
Errors return a JSON object with a detail field. The detail value is either a string or an object:
String detail (most errors):
Subscription expired (structured):
{
"detail": {
"error": "subscription_expired",
"message": "Your Basic subscription has expired. Please renew to continue.",
"renew_url": "/pricing"
}
}
Object detail (quota and data window errors):
{
"detail": {
"message": "Query limit exceeded. Your trial plan allows 100 queries per 7 days. Resets on Apr 02, 2026.",
"tier": "trial",
"limit": 100,
"used": 100,
"resets_at": "2026-04-02T12:00:00+00:00"
}
}
11. Rate Limiting and Quotas
API usage is limited based on your subscription tier. Quotas reset monthly, aligned to the day of the month you subscribed.
| Tier | Query Quota | Reset Period |
|---|---|---|
| Trial | 100 queries | 7-day trial period |
| Basic | 1,000 queries | Monthly |
| Enterprise | 10,000 queries | Monthly |
- Cursor-based pagination requests (using
pitandafter) are not counted toward your quota - When your quota is exceeded, the API returns
429with the reset date - Implement retry logic with exponential backoff for production integrations
See Subscription for full plan details.
12. Best Practices
- Validate request inputs before sending
- Use pagination for large result sets — cursor requests don't count toward quota
- Monitor API responses and handle errors gracefully
- Restart queries when PIT expires (410 response)
- Check your usage dashboard to track quota consumption
13. Support
For API access issues or assistance:
- Contact the ZoneFeeds support team at sales@zonefeeds.com
- Use the Upgrade button in the web app to request a plan change