Version: 2.0.0
Compiler-as-a-Service for adblock filter lists. Transform, optimize, and combine filter lists from multiple sources with real-time progress tracking.
- 🎯 Multi-Source Compilation
- ⚡ Performance (Gzip compression, caching, request deduplication)
- 🔄 Circuit Breaker with retry logic
- 📊 Visual Diff between compilations
- 📡 Real-time progress via SSE and WebSocket
- 🎪 Batch Processing
- 🌍 Universal (Deno, Node.js, Cloudflare Workers, browsers)
- Production server:
https://adblock-compiler.jayson-knight.workers.dev - Local development server:
http://localhost:8787
Summary: Get API information
Returns API version, available endpoints, and usage examples
Operation ID: getApiInfo
Responses:
200: API information
Summary: Get performance metrics
Returns aggregated metrics for the last 30 minutes
Operation ID: getMetrics
Responses:
200: Performance metrics
Summary: Get latest deployment version
Returns the current version from deployment history
Operation ID: getApiVersion
Responses:
200: Version information503: No description
Summary: Get deployment history
Returns deployment history records
Operation ID: getDeployments
Parameters:
limit(query): Maximum number of records to returnversion(query): Filter by versionstatus(query): Filter by deployment statusbranch(query): Filter by branch name
Responses:
200: Deployment history503: No description
Summary: Get deployment statistics
Returns aggregated deployment statistics
Operation ID: getDeploymentStats
Responses:
200: Deployment statistics503: No description
Summary: Get Turnstile configuration
Returns the Cloudflare Turnstile site key and whether it is enabled
Operation ID: getTurnstileConfig
Responses:
200: Turnstile configuration
Summary: Get JSON Schemas for all public request/response types
Returns JSON Schema representations of all public Zod schemas (ConfigurationSchema, CompileRequestSchema, SourceSchema, BenchmarkMetricsSchema) for use by API testers and external tooling. Anonymous access. Cached for 1 hour.
Operation ID: getApiSchemas
Responses:
200: JSON Schema definitions.429: No description
Summary: Compile filter list (JSON)
Compile filter lists and return results as JSON. Results are cached for 1 hour. Supports request deduplication for concurrent identical requests.
Operation ID: compileJson
Request Body:
- Content-Type:
application/json- Schema:
CompileRequest
- Schema:
Responses:
200: Compilation successful400: No description429: No description500: No description
Summary: Batch compile multiple lists
Compile multiple filter lists in parallel (max 10 per batch)
Operation ID: compileBatch
Request Body:
- Content-Type:
application/json- Schema:
BatchCompileRequest
- Schema:
Responses:
200: Batch compilation results400: No description429: No description
Summary: Parse filter rules into AST
Parses adblock filter rules into an Abstract Syntax Tree representation
Operation ID: parseAST
Request Body:
- Content-Type:
application/json- Schema:
ASTParseRequest
- Schema:
Responses:
200: Parsed AST400: Invalid request (must provide rules or text)500: Parse error
Summary: Compile with real-time progress (SSE)
Compile filter lists with real-time progress updates via Server-Sent Events. Streams events including source downloads, transformations, diagnostics, cache operations, network events, and metrics.
Operation ID: compileStream
Request Body:
- Content-Type:
application/json- Schema:
CompileRequest
- Schema:
Responses:
200: Event stream400: No description429: No description
Summary: Queue async compilation job
Queue a compilation job for asynchronous processing. Returns immediately with a request ID. Use GET /queue/results/{requestId} to retrieve results when complete.
Operation ID: compileAsync
Request Body:
- Content-Type:
application/json- Schema:
CompileRequest
- Schema:
Responses:
202: Job queued successfully400: No description500: No description
Summary: Queue batch async compilation
Queue multiple compilations for async processing
Operation ID: compileBatchAsync
Request Body:
- Content-Type:
application/json- Schema:
BatchCompileRequest
- Schema:
Responses:
202: Batch queued successfully400: No description500: No description
Summary: Get queue statistics
Returns queue health metrics and job statistics
Operation ID: getQueueStats
Responses:
200: Queue statistics
Summary: Get async job results
Retrieve results for a completed async compilation job
Operation ID: getQueueResults
Parameters:
requestId(path) (required): Request ID returned from async endpoints
Responses:
200: Job results404: Job not found
Summary: Get queue job history
Returns job history and queue depth over time
Operation ID: getQueueHistory
Responses:
200: Queue history
Summary: Cancel a pending queue job
Cancels a pending queue job by its requestId. Returns 409 if the job is already completed, failed, or cancelled. Requires authentication (free tier or above).
Operation ID: cancelQueueJob
Parameters:
requestId(path) (required): The requestId of the queue job to cancel.
Responses:
200: Job cancelled successfully.400: No description401: No description403: Cloudflare Access JWT invalid or missing.429: No description
Summary: WebSocket endpoint for real-time compilation
Bidirectional WebSocket connection for real-time compilation with event streaming.
Client → Server Messages:
compile- Start compilationcancel- Cancel running compilationping- Heartbeat ping
Server → Client Messages:
welcome- Connection establishedpong- Heartbeat responsecompile:started- Compilation startedevent- Compilation event (source, transformation, progress, diagnostic, cache, network, metric)compile:complete- Compilation finished successfullycompile:error- Compilation failedcompile:cancelled- Compilation cancellederror- Error message
Features:
- Up to 3 concurrent compilations per connection
- Automatic heartbeat (30s interval)
- Connection timeout (5 minutes idle)
- Session-based compilation tracking
- Cancellation support
Operation ID: websocketCompile
Responses:
101: WebSocket connection established426: Upgrade required (not a WebSocket request)
Summary: Get system compilation defaults and limits
Returns the system defaults and hard limits that apply to every compilation. No authentication required (anonymous tier).
Operation ID: getConfigurationDefaults
Responses:
200: Defaults and limits.429: No description
Summary: Validate a configuration object against the schema
Validates a configuration object against the Zod ConfigurationSchema.
Requires a Cloudflare Turnstile token when TURNSTILE_SECRET_KEY is configured.
Operation ID: validateConfiguration
Request Body:
- Content-Type:
application/json
Responses:
200: Validation result.400: No description403: Turnstile verification failed.429: No description
Summary: Merge configuration layers and return effective IConfiguration
Merges one or more configuration layers (base config + optional override) and
returns the effective IConfiguration. Useful for previewing the result of a
config + environment overlay before submitting a compile job.
Requires a Cloudflare Turnstile token when TURNSTILE_SECRET_KEY is configured.
Operation ID: resolveConfiguration
Request Body:
- Content-Type:
application/json
Responses:
200: Resolved configuration.400: No description403: Turnstile verification failed.429: No description
Summary: Get storage statistics
Returns database table counts and expired entry counts
Operation ID: getAdminStorageStats
Responses:
200: Storage statistics401: No description503: No description
Summary: Clear expired entries
Deletes all expired entries from storage tables
Operation ID: clearExpiredEntries
Responses:
200: Entries cleared401: No description503: No description
Summary: Clear cache entries
Deletes all cache entries from storage tables
Operation ID: clearCacheEntries
Responses:
200: Cache cleared401: No description503: No description
Summary: Export storage data
Exports storage entries as JSON (includes storage entries, filter cache, and compilation metadata; returned amounts subject to implementation limits)
Operation ID: exportStorage
Responses:
200: Storage export401: No description503: No description
Summary: Vacuum database
Runs VACUUM on the D1 database to reclaim space
Operation ID: vacuumDatabase
Responses:
200: Vacuum completed401: No description503: No description
Summary: List database tables
Returns all tables and indexes in the D1 database
Operation ID: listStorageTables
Responses:
200: Table listing401: No description503: No description
Summary: Execute read-only SQL query
Executes a SELECT-only SQL query against the D1 database for debugging
Operation ID: queryStorage
Request Body:
- Content-Type:
application/json- Schema:
AdminQueryRequest
- Schema:
Responses:
200: Query results400: Invalid or disallowed SQL401: No description503: No description
Summary: Create user
Creates a new user account. Requires Hyperdrive (PostgreSQL) binding.
Operation ID: createUser
Request Body:
- Content-Type:
application/json- Schema:
CreateUserRequest
- Schema:
Responses:
201: User created400: No description401: No description409: User with this email already exists503: No description
Summary: List API keys
Lists API keys for a user (without key hashes). Requires Hyperdrive (PostgreSQL) binding.
Operation ID: listApiKeys
Parameters:
userId(query) (required): User ID to list API keys for
Responses:
200: List of API keys400: No description401: No description503: No description
Summary: Create API key
Creates a new API key for a user. Requires Hyperdrive (PostgreSQL) binding.
Important: The raw API key is only returned once. Store it securely.
Operation ID: createApiKey
Request Body:
- Content-Type:
application/json- Schema:
CreateApiKeyRequest
- Schema:
Responses:
201: API key created400: No description401: No description404: User not found503: No description
Summary: Revoke API key
Revokes an API key by ID or key prefix. Requires Hyperdrive (PostgreSQL) binding.
Operation ID: revokeApiKey
Request Body:
- Content-Type:
application/json- Schema:
RevokeApiKeyRequest
- Schema:
Responses:
200: API key revoked400: No description401: No description404: API key not found or already revoked503: No description
Summary: Validate API key
Validates an API key without authenticating a full request. Useful for the admin UI to test keys.
Operation ID: validateApiKey
Request Body:
- Content-Type:
application/json- Schema:
ValidateApiKeyRequest
- Schema:
Responses:
200: Validation result400: No description401: No description503: No description
Summary: Migrate D1 data to PostgreSQL
One-time migration that reads data from Cloudflare D1 (SQLite) and writes it to PostgreSQL via Hyperdrive.
Migrates the following tables: storage_entries, filter_cache, compilation_metadata.
The migration is:
- Idempotent: uses ON CONFLICT DO NOTHING to skip existing rows
- Batched: processes rows in chunks of 100
- Read-only on D1: never modifies the source database
- Resumable: can be re-run safely if interrupted
Operation ID: migrateD1ToPg
Parameters:
dryRun(query): Count rows without writing (dry run)tables(query): Comma-separated list of tables to migrate (default: all)
Responses:
200: Migration result400: No description401: No description503: No description
Summary: Backend health status
Returns health and connectivity status of both D1 and PostgreSQL backends
Operation ID: getBackendStatus
Responses:
200: Backend status401: No description
Summary: PostgreSQL storage statistics
Returns storage statistics from the PostgreSQL backend (mirrors /admin/storage/stats for D1)
Operation ID: getPgStorageStats
Responses:
200: PostgreSQL storage statistics401: No description503: No description
Summary: Export PostgreSQL data
Exports data from the PostgreSQL backend (mirrors /admin/storage/export for D1)
Operation ID: exportPgData
Responses:
200: PostgreSQL data export401: No description503: No description
Summary: Clear expired PostgreSQL entries
Deletes all expired entries from PostgreSQL storage and cache tables
Operation ID: clearPgExpiredEntries
Responses:
200: Entries cleared401: No description503: No description
Summary: Clear PostgreSQL cache
Deletes all cache entries from PostgreSQL tables
Operation ID: clearPgCache
Responses:
200: Cache cleared401: No description503: No description
Summary: Execute read-only PostgreSQL query
Executes a SELECT-only SQL query against PostgreSQL for debugging (mirrors /admin/storage/query for D1)
Operation ID: queryPg
Request Body:
- Content-Type:
application/json- Schema:
AdminQueryRequest
- Schema:
Responses:
200: Query results400: Invalid or disallowed SQL401: No description503: No description
Summary: List local auth users
Returns a paginated list of all local auth users.
Responses never include password_hash.
Requires Admin tier + admin role.
Operation ID: adminListLocalUsers
Parameters:
limit(query): Maximum number of users to returnoffset(query): Number of users to skip (for pagination)
Responses:
200: Paginated user list401: No description403: No description503: No description
Summary: Create a local auth user
Create a new local auth user with any valid role and tier.
Admins can create users with privileged roles (e.g. admin) that cannot be self-registered.
Requires Admin tier + admin role.
Operation ID: adminCreateLocalUser
Request Body:
- Content-Type:
application/json- Schema:
AdminCreateLocalUserRequest
- Schema:
Responses:
201: User created400: No description401: No description403: No description409: An account with this identifier already exists503: No description
Summary: Get a local auth user
Returns the public profile of a single local auth user by UUID. Requires Admin tier + admin role.
Operation ID: adminGetLocalUser
Parameters:
userId(path) (required): Local auth user UUID
Responses:
200: User profile401: No description403: No description404: User not found503: No description
Summary: Update a local auth user
Update a user's tier, role, and/or api_disabled flag.
Tier and role are independent fields — changing role does not automatically change tier unless
no explicit tier is provided (in which case the role's default tier is applied).
Requires Admin tier + admin role.
Operation ID: adminUpdateLocalUser
Parameters:
userId(path) (required): Local auth user UUID
Request Body:
- Content-Type:
application/json- Schema:
AdminUpdateLocalUserRequest
- Schema:
Responses:
200: Updated user profile400: No description401: No description403: No description404: User not found503: No description
Summary: Delete a local auth user
Permanently deletes a local auth user by UUID. Requires Admin tier + admin role.
Operation ID: adminDeleteLocalUser
Parameters:
userId(path) (required): Local auth user UUID
Responses:
200: User deleted401: No description403: No description404: User not found503: No description
Summary: Inspect active auth registries
Returns a read-only snapshot of all three extensibility registries at runtime:
LOCAL_ROLE_REGISTRY— all defined roles, their tiers, and self-register flagTIER_REGISTRY— all tiers with rate limits and orderingROUTE_PERMISSION_REGISTRY— all registered route permission rules
Also reports which auth provider is active (local-jwt vs clerk).
Requires Admin tier + admin role.
Operation ID: adminAuthConfig
Responses:
200: Active auth configuration snapshot401: No description403: No description
Summary: Get per-user API usage statistics
Returns KV-backed API usage counters for a specific user:
total— lifetime request count, first/last seen timestampsdays— per-day breakdown for the requested lookback window (max 90 days)
Requires Admin tier + admin role.
Operation ID: adminGetUserUsage
Parameters:
userId(path) (required): User ID (UUID or Clerk user ID)days(query): Number of past days to include in the daily breakdown
Responses:
200: Per-user usage statistics401: No description403: No description
Summary: Start async compilation workflow
Creates a durable Cloudflare Workflow instance for compilation
Operation ID: startWorkflowCompile
Request Body:
- Content-Type:
application/json- Schema:
CompileRequest
- Schema:
Responses:
202: Workflow started400: No description503: No description
Summary: Start async batch compilation workflow
Creates a durable Cloudflare Workflow instance for batch compilation
Operation ID: startWorkflowBatch
Request Body:
- Content-Type:
application/json- Schema:
BatchCompileRequest
- Schema:
Responses:
202: Workflow started400: No description503: No description
Summary: Start cache warming workflow
Triggers manual cache warming for specified configurations
Operation ID: startWorkflowCacheWarm
Request Body:
- Content-Type:
application/json- Schema:
CacheWarmRequest
- Schema:
Responses:
202: Workflow started400: No description503: No description
Summary: Start health monitoring workflow
Triggers manual health check for specified filter list sources
Operation ID: startWorkflowHealthCheck
Request Body:
- Content-Type:
application/json- Schema:
HealthCheckRequest
- Schema:
Responses:
202: Workflow started400: No description503: No description
Summary: Get workflow instance status
Returns the current status and output of a workflow instance
Operation ID: getWorkflowStatus
Parameters:
workflowType(path) (required): Type of workflowinstanceId(path) (required): Workflow instance ID
Responses:
200: Workflow status400: Unknown workflow type404: Workflow instance not found503: No description
Summary: Get workflow metrics
Returns aggregated metrics for all workflow types
Operation ID: getWorkflowMetrics
Responses:
200: Workflow metrics
Summary: Get workflow events
Returns progress events for a specific workflow instance
Operation ID: getWorkflowEvents
Parameters:
workflowId(path) (required): Workflow instance IDsince(query): Return only events after this timestamp
Responses:
200: Workflow events
Summary: Get latest health check results
Returns the results of the most recent health monitoring workflow run
Operation ID: getLatestHealth
Responses:
200: Latest health check data
Summary: Basic health check
Returns current service health status and version
Operation ID: getHealth
Responses:
200: Service is healthy
Summary: List user's API keys
Lists all API keys belonging to the authenticated user. Returns metadata only — never the key hash or plaintext. Requires Clerk JWT authentication.
Operation ID: userListApiKeys
Responses:
200: List of API keys401: No description
Summary: Create API key
Creates a new API key for the authenticated user.
The raw API key (with abc_ prefix) is returned only once — store it securely.
Requires Clerk JWT authentication.
Operation ID: userCreateApiKey
Request Body:
- Content-Type:
application/json- Schema:
UserCreateApiKeyRequest
- Schema:
Responses:
201: API key created400: No description401: No description
Summary: Update API key
Updates an API key's name or scopes. Only the key owner can update their own keys. Requires Clerk JWT authentication.
Operation ID: userUpdateApiKey
Parameters:
keyId(path) (required): ID of the API key to update
Request Body:
- Content-Type:
application/json- Schema:
UserUpdateApiKeyRequest
- Schema:
Responses:
200: API key updated400: No description401: No description404: API key not found or already revoked
Summary: Revoke API key
Revokes (soft-deletes) an API key. The key remains in the database for audit purposes but is no longer valid for authentication. Only the key owner can revoke their own keys.
Operation ID: userRevokeApiKey
Parameters:
keyId(path) (required): ID of the API key to revoke
Responses:
200: API key revoked401: No description404: API key not found or already revoked
Summary: Clerk webhook receiver
Receives Clerk webhook events (user.created, user.updated, user.deleted, session.created). Verified via Svix webhook signature. This endpoint is called by Clerk's webhook infrastructure and should not be called directly.
Operation ID: clerkWebhook
Parameters:
svix-id(header) (required): Svix webhook IDsvix-timestamp(header) (required): Svix webhook timestampsvix-signature(header) (required): Svix webhook signature
Request Body:
- Content-Type:
application/json
Responses:
200: Webhook processed successfully400: Invalid webhook signature or payload401: Webhook signature verification failed
Summary: Resolve canonical URL via browser
Navigates to a URL using the Cloudflare Browser Rendering binding and returns the final canonical URL after all redirects. Useful for discovering the true destination of redirect chains or URL shorteners before scheduling a filter-list download.
Requires the BROWSER binding to be configured in wrangler.toml.
Operation ID: browserResolveUrl
Request Body:
- Content-Type:
application/json- Schema:
BrowserResolveRequest
- Schema:
Responses:
200: Resolved URL400: Invalid request body502: Browser navigation failed503: BROWSER binding not configured
Summary: Monitor filter-list sources for reachability
Performs parallel browser-based health checks on a list of filter-list source URLs. For each URL a headless browser navigates to the page, verifies non-empty text content, and optionally captures a full-page PNG screenshot stored in R2.
The full result set is persisted under the KV key browser:monitor:latest
and is retrievable via GET /api/browser/monitor/latest.
Requires the BROWSER binding. FILTER_STORAGE (R2) is required for
screenshot capture. COMPILATION_CACHE (KV) is required for result persistence.
Operation ID: browserMonitor
Request Body:
- Content-Type:
application/json- Schema:
SourceMonitorRequest
- Schema:
Responses:
200: Per-source reachability results400: Invalid request body503: BROWSER binding not configured
Summary: Retrieve the latest monitor results
Returns the most recent result set written by POST /api/browser/monitor. Reads
the KV key browser:monitor:latest from COMPILATION_CACHE.
Requires the COMPILATION_CACHE binding.
Operation ID: browserMonitorLatest
Responses:
200: Latest monitor results404: No monitor results available yet503: COMPILATION_CACHE binding not configured
Summary: Validate a single adblock rule
Parses and validates a single adblock/DNS rule, returning its AST representation, type, and optional URL match result.
Operation ID: validateRule
Request Body:
- Content-Type:
application/json- Schema:
ValidateRuleRequest
- Schema:
Responses:
200: Rule validation result400: Invalid request body
Summary: List saved rule sets
Returns all saved rule sets stored in the KV namespace.
Operation ID: listRuleSets
Responses:
200: List of rule sets500: Internal server error
Summary: Create a new rule set
Creates and stores a new named rule set in the KV namespace.
Operation ID: createRuleSet
Request Body:
- Content-Type:
application/json- Schema:
RuleSetCreateRequest
- Schema:
Responses:
201: Rule set created400: Invalid request body
Summary: Get a rule set by ID
Operation ID: getRuleSet
Responses:
200: Rule set found404: Rule set not found
Summary: Update a rule set by ID
Operation ID: updateRuleSet
Request Body:
- Content-Type:
application/json- Schema:
RuleSetUpdateRequest
- Schema:
Responses:
200: Rule set updated400: Invalid request body404: Rule set not found
Summary: Delete a rule set by ID
Operation ID: deleteRuleSet
Responses:
200: Rule set deleted404: Rule set not found
Summary: Send a notification event to configured webhook targets
Delivers a notification event (e.g. error, warning, info) to one or more configured targets — generic HTTP webhook (WEBHOOK_URL), Sentry (SENTRY_DSN), and/or Datadog (DATADOG_API_KEY). At least one target must be configured in the worker environment.
Operation ID: notify
Request Body:
- Content-Type:
application/json- Schema:
WebhookNotifyRequest
- Schema:
Responses:
200: Notification delivered to at least one target400: Invalid request body502: All configured notification targets failed to receive the event503: No notification targets configured (set WEBHOOK_URL, SENTRY_DSN, or DATADOG_API_KEY)
Summary: Register a new local account
Create a new account using an email address or E.164 phone number and password.
All self-registered users receive the user role (Free tier).
Admin role must be granted via POST /admin/local-users.
Rate limited (anonymous tier). Returns a signed HS256 JWT on success.
Only active when
CLERK_JWKS_URLis not configured. When Clerk is live, sign up via the Clerk-hosted UI instead.
Operation ID: localSignup
Request Body:
- Content-Type:
application/json- Schema:
LocalSignupRequest
- Schema:
Responses:
201: Account created — JWT returned400: No description409: An account with this identifier already exists429: No description503: No description
Summary: Authenticate and receive a JWT
Authenticate with an identifier (email or phone) and password. Returns a signed HS256 JWT valid for 24 hours.
Timing-safe: always runs full PBKDF2 derivation even for unknown identifiers to prevent user enumeration via timing side-channels.
Rate limited (anonymous tier).
Operation ID: localLogin
Request Body:
- Content-Type:
application/json- Schema:
LocalLoginRequest
- Schema:
Responses:
200: Authentication successful — JWT returned400: No description401: Invalid credentials (generic — no user enumeration)429: No description503: No description
Summary: Get current user profile
Returns the authenticated user's public profile.
Requires a valid Authorization: Bearer <jwt> header.
Operation ID: localMe
Responses:
200: Current user profile401: No description404: User record not found (deleted since token was issued)503: No description
Summary: Change the current user's password
Update the authenticated user's password.
Requires a valid Authorization: Bearer <jwt> header and the correct current password.
Operation ID: localChangePassword
Request Body:
- Content-Type:
application/json- Schema:
LocalChangePasswordRequest
- Schema:
Responses:
200: Password updated successfully400: No description401: Not authenticated or current password is wrong503: No description
Summary: Proxy fetch a single URL
Fetches the content of a remote HTTPS URL on behalf of the client.
This endpoint exists to allow browser-based (local mode) and hybrid mode compilation to download source filter lists that would otherwise be blocked by browser CORS policies.
SSRF protection — private/loopback/link-local IP ranges and cloud metadata endpoints (169.254.169.254, metadata.google.internal) are blocked.
Caching — responses are cached in KV for 5 minutes to reduce upstream load.
Auth — anonymous callers must pass a valid Cloudflare Turnstile token via the X-Turnstile-Token request header or turnstileToken query parameter. Authenticated (Free+) callers are exempt.
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
url |
string |
✅ | Fully-qualified HTTPS URL to fetch (URL-encoded) |
turnstileToken |
string |
— | Turnstile token for anonymous callers |
Responses:
200: Raw text content of the proxied URL (text/plain)400: Invalid or unsafe URL403: Turnstile verification failed429: Rate limit exceeded502: Upstream fetch failed
Summary: Batch proxy fetch multiple URLs
Fetches the content of multiple remote HTTPS URLs in parallel.
Used by hybrid mode: the Worker fetches source filter lists and returns the raw content to the browser, which then runs the transformation pipeline locally via WorkerCompiler.
Requires Pro tier.
Maximum 20 URLs per request.
Request Body (application/json):
urls(required):string[]— HTTPS URLs to fetch (min 1, max 20)
Response Body (application/json):
{
"success": true,
"results": {
"https://example.com/list.txt": {
"content": "! EasyList\n||example.com^"
},
"https://bad-url.example.com/": {
"error": "Fetch failed: upstream HTTP 404"
}
}
}Responses:
200: Map of URL →{ content?: string; error?: string }400: Invalid request body or unsafe URL detected401: Authentication required (Pro tier)
Properties:
success:boolean-error:string-
Properties:
configuration(required):Configuration-preFetchedContent:object- Map of source keys to pre-fetched contentbenchmark:boolean- Include detailed performance metricsturnstileToken:string- Cloudflare Turnstile token (if enabled)priority:string- Job processing priority (used for async compilation)
Properties:
name(required):string- Name of the compiled listdescription:string- Description of the listhomepage:string- Homepage URLlicense:string- License identifierversion:string- Version stringsources(required):array-transformations:array- Global transformations to applyexclusions:array- Rules to exclude (supports wildcards and regex)exclusions_sources:array- Files containing exclusion rulesinclusions:array- Rules to include (supports wildcards and regex)inclusions_sources:array- Files containing inclusion rules
Properties:
source(required):string- URL or key for pre-fetched contentname:string- Name of the sourcetype:string- Source typetransformations:array-exclusions:array-inclusions:array-
Available transformations (applied in this order):
- ConvertToAscii: Convert internationalized domains to ASCII
- RemoveComments: Remove comment lines
- Compress: Convert hosts format to adblock syntax
- RemoveModifiers: Strip unsupported modifiers
- Validate: Remove invalid/dangerous rules
- ValidateAllowIp: Like Validate but keeps IP addresses
- Deduplicate: Remove duplicate rules
- InvertAllow: Convert blocking rules to allowlist
- RemoveEmptyLines: Remove blank lines
- TrimLines: Remove leading/trailing whitespace
- InsertFinalNewLine: Add final newline
Enum values:
ConvertToAsciiRemoveCommentsCompressRemoveModifiersValidateValidateAllowIpDeduplicateInvertAllowRemoveEmptyLinesTrimLinesInsertFinalNewLine
Properties:
requests(required):array-
Properties:
id(required):string- Unique request identifierconfiguration(required):Configuration-preFetchedContent:object-benchmark:boolean-
Properties:
success(required):boolean-rules:array- Compiled filter rulesruleCount:integer- Number of rulesmetrics:CompilationMetrics-compiledAt:string-previousVersion:PreviousVersion-cached:boolean- Whether result was served from cachededuplicated:boolean- Whether request was deduplicatederror:string- Error message if success=false
Properties:
totalDurationMs:integer-sourceCount:integer-ruleCount:integer-transformationMetrics:array-
Properties:
rules:array-ruleCount:integer-compiledAt:string-
Properties:
success:boolean-results:array-
Properties:
success:boolean-message:string-requestId:string-priority:string-note:string- Informational note about the queued jobbatchSize:integer- Number of items in the batch (only for batch async requests)
Properties:
success:boolean-status:string-jobInfo:object-
Properties:
pending:integer-completed:integer-failed:integer-cancelled:integer-totalProcessingTime:integer-averageProcessingTime:integer-processingRate:number- Jobs per minutequeueLag:integer- Average time in queue (ms)lastUpdate:string-history:array-depthHistory:array-
Properties:
requestId:string-configName:string-status:string-duration:integer-timestamp:string-error:string-ruleCount:integer-
Properties:
window:string-timestamp:string-endpoints:object-
Properties:
name:string-version:string-endpoints:object-example:object-
Properties:
success(required):boolean-version(required):string- Semantic version stringbuildNumber:integer-fullVersion:string- Full version string including build numbergitCommit:string-gitBranch:string-deployedAt:string- Deployment timestamp as stored by SQLite datetime('now') in 'YYYY-MM-DD HH:MM:SS' formatdeployedBy:string-status:string-message:string- Present when no deployment history is available
Properties:
success(required):boolean-deployments(required):array-count(required):integer- Total number of deployments returned
Properties:
success(required):boolean-totalDeployments(required):integer-successfulDeployments(required):integer-failedDeployments(required):integer-latestVersion:string-
Properties:
siteKey:string- Cloudflare Turnstile site keyenabled:boolean- Whether Turnstile verification is enabled
Properties:
version(required):string-buildNumber(required):integer-fullVersion(required):string-gitCommit(required):string-gitBranch(required):string-deployedAt(required):string- Deployment timestamp as stored by SQLite datetime('now') in 'YYYY-MM-DD HH:MM:SS' formatdeployedBy(required):string-status(required):string-metadata:object-
Properties:
history:array-depthHistory:array-
Properties:
success:boolean-message:string-note:string- Note that job may still process if already started
Either 'rules' or 'text' must be provided
Properties:
rules:array- Array of filter rule strings to parsetext:string- Raw text containing filter rules (newline-separated)
Properties:
success:boolean-parsedRules:array- Array of parsed rule AST objectssummary:object- Summary statistics about the parsed rules (e.g., total rules, rule types, parse errors)
Properties:
success:boolean-stats:StorageStats-timestamp:string-
Properties:
storage_entries:integer-filter_cache:integer-compilation_metadata:integer-expired_storage:integer-expired_cache:integer-
Properties:
success:boolean-deleted:integer- Number of entries deleted (for clear operations)message:string-
Properties:
success:boolean-exportedAt:string-storage_entries:array-filter_cache:array-compilation_metadata:array-
Properties:
success:boolean-tables:array-
Properties:
name:string-type:string-
Properties:
sql(required):string- SELECT-only SQL query to execute
Properties:
success:boolean-rows:array-rowCount:integer-meta:object- Query metadata (e.g., column names, types, execution time)
Properties:
success:boolean-message:string-workflowId:string-workflowType:string-batchSize:integer- Number of items in the batch (batch workflows only)configurationsCount:string- Number of configurations to warm, or 'default' for all default configurations (cache-warming only)sourcesCount:string- Number of sources to check, or 'default' for all default sources (health-monitoring only)
Properties:
configurations:array- Configurations to warm (uses defaults if empty)
Properties:
sources:array- Sources to health-check (uses defaults if empty)alertOnFailure:boolean-
Properties:
success:boolean-workflowId:string-workflowType:string-status:string-output:object-error:string-
Properties:
success:boolean-timestamp:string-workflows:object- Metrics grouped by workflow type
Properties:
success:boolean-workflowId:string-workflowType:string-startedAt:string-completedAt:string-progress:number-isComplete:boolean-events:array-
Properties:
type:string-workflowId:string-workflowType:string-timestamp:string-step:string-progress:number-message:string-data:object- Step-specific data (structure varies by workflow type and step)
Properties:
success(required):boolean-message:string- Present when no health data is availabletimestamp:string- ISO timestamp of when this health check ranrunId:string- Unique identifier for the health monitoring workflow runresults:array- Per-source health check resultssummary:object- Aggregate counts for the health check run
Properties:
name(required):string-url(required):string-healthy(required):boolean-statusCode:integer-responseTimeMs:number-ruleCount:integer-error:string-lastChecked(required):string-
Properties:
status:string-version:string- Current service version
Properties:
email(required):string- User email addressdisplayName:string- Display namerole:string- User role
Properties:
success:boolean-data:object-
Properties:
userId(required):string- ID of the user to create the key forname(required):string- Descriptive name for the API keyscopes:array- Permission scopes for the keyrateLimitPerMinute:integer- Rate limit override for this keyexpiresAt:string- Expiry date for the key
Properties:
success:boolean-data:object-
Properties:
success:boolean-data:object-
Properties:
id:string-name:string-keyPrefix:string-scopes:array-rateLimitPerMinute:integer-createdAt:string-expiresAt:string-revokedAt:string-lastUsedAt:string-status:string-
Properties:
apiKeyId:string- ID of the API key to revokekeyPrefix:string- Prefix of the API key to revoke
Properties:
success:boolean-data:object-
Properties:
apiKey(required):string- The API key to validate
Properties:
success:boolean-data:object-
Properties:
name(required):string- Human-readable name for the keyscopes:array- Permissions granted to this key (defaults to ["compile"])expiresInDays:integer- Days until expiration (omit for no expiry)
Properties:
success:boolean-id:string-key:string- The plaintext API key (returned only once on creation). Starts withabc_.keyPrefix:string- First 8 characters of the key (e.g. abc_XXXX)name:string-scopes:array-rateLimitPerMinute:integer-expiresAt:string-createdAt:string-
Properties:
id:string-keyPrefix:string-name:string-scopes:array-rateLimitPerMinute:integer-lastUsedAt:string-expiresAt:string-revokedAt:string-createdAt:string-updatedAt:string-isActive:boolean- Whether the key is currently usable (not revoked and not expired)
Properties:
success:boolean-keys:array-total:integer-
At least one of name or scopes must be provided.
Properties:
name:string- New name for the keyscopes:array- New scopes for the key
Properties:
success:boolean-id:string-keyPrefix:string-name:string-scopes:array-rateLimitPerMinute:integer-lastUsedAt:string-expiresAt:string-createdAt:string-updatedAt:string-
Properties:
success:boolean-data:object-
Properties:
table:string-sourceCount:integer-migratedCount:integer-skippedCount:integer-errorCount:integer-durationMs:integer-
Properties:
success:boolean-data:object-
Properties:
available:boolean-latencyMs:integer-host:string- Host name (PostgreSQL only)error:string- Error message if unavailable
Properties:
success:boolean-data:object-
Properties:
type(required):string-sessionId(required):string-configuration(required):Configuration-preFetchedContent:object-benchmark:boolean-
Properties:
type(required):string-sessionId(required):string-
Properties:
type(required):string-
Properties:
type(required):string-version(required):string-connectionId(required):string-capabilities(required):object-
Properties:
type(required):string-timestamp:string-
Properties:
type(required):string-sessionId(required):string-configurationName(required):string-
Properties:
type(required):string-sessionId(required):string-eventType(required):string-data(required):object-
Properties:
type(required):string-sessionId(required):string-rules(required):array-ruleCount(required):integer-metrics:object-compiledAt:string-
Properties:
type(required):string-sessionId(required):string-error(required):string-details:object-
Playwright waitUntil navigation event. networkidle (default) waits until
there are no more than 0 network connections for at least 500 ms — suitable for
most filter-list sources. Use load for fastest navigation.
Enum values:
loaddomcontentloadednetworkidle
Properties:
url(required):string- The URL to navigate to and resolve.waitUntil:BrowserWaitUntil-
Properties:
success(required):boolean-resolvedUrl(required):string- The canonical URL after all JavaScript redirects have settled.originalUrl(required):string- The original URL that was submitted.
Properties:
url(required):string- The source URL that was checked.reachable(required):boolean- Whether the URL was reachable and returned non-empty content.checkedAt(required):string- ISO-8601 timestamp of when this URL was checked.screenshotKey:string- R2 object key for the captured screenshot (only present when captureScreenshots is true).error:string- Error message, present only when the URL could not be fetched.
Properties:
urls(required):array- One or more filter-list source URLs to check (max 10).captureScreenshots:boolean- When true, a full-page PNG screenshot is captured and stored in R2 per URL.screenshotPrefix:string- R2 key prefix for screenshots (alphanumeric, hyphens, underscores only). Defaults to the current ISO date.timeout:integer- Per-URL navigation timeout in milliseconds.waitUntil:BrowserWaitUntil-
Properties:
success(required):boolean-results(required):array-total(required):integer- Total number of URLs checked.reachable(required):integer- Number of reachable URLs.unreachable(required):integer- Number of unreachable URLs.