Sites
Create, clone, suspend, and delete serverless WordPress sites, and manage their CDN, WAF, SSH keys, logs, imports, and databases.
Manage serverless WordPress sites deployed on Vector infrastructure. Sites are the primary resource representing customer applications, each with associated environments (staging/production), deployments, and CDN configurations.
Sites are created with a pending status and transition to active once provisioning
completes. You can suspend sites to reduce costs during low-traffic periods.
Site Status Lifecycle
pending- Site creation initiated, provisioning in progressactive- Site is fully operational and serving trafficsuspended- Site is paused to reduce costs (can be unsuspended)terminating- Site deletion in progressterminated- Site has been fully removed
List Sites
Retrieves a paginated list of all sites for the authenticated account. Results include each site's environments and their associated domains.
Use search to filter by customer ID or subdomain, status to filter by
site lifecycle state, and sort/direction to control ordering. The
last_deployed_at field is computed from the most recent completed
deployment across all environments and can also be used as a sort field.
Query Parameters
| Name | Type | Description |
|---|---|---|
per_page optional | integer | Number of items per page (max 100). Default: 15. Example: 25 |
search optional | string | Search by Example: "acme" |
status optional | string | Filter by site status. Must be one of: Example: "active" |
sort optional | string | Sort results by the given field. Must be one of: Example: "your_customer_id" |
direction optional | string | Sort direction. Must be Example: "asc" |
page optional | integer | Page number for pagination. Default: 1. Example: 1 |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites?per_page=25&search=acme&status=active&sort=your_customer_id&direction=asc&page=1" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$sites = $client->sites->list([
'per_page' => 25,
'search' => 'acme',
'status' => 'active',
'sort' => 'your_customer_id',
'direction' => 'asc',
'page' => 1,
]);const sites = await client.sites.list({
per_page: 25,
search: 'acme',
status: 'active',
sort: 'your_customer_id',
direction: 'asc',
page: 1,
});Response
{
"data": [
{
"id": "01jfgxk4nqrst5vwx9yz0abcde",
"your_customer_id": "cust_12345",
"status": "active",
"status_label": "Active",
"dev_php_version": "8.3",
"tags": [
"wordpress",
"production"
],
"dev_domain": "dev.wispy-dust.vectorpages.com",
"dev_db_host": "dev-cluster.abc123.us-east-1.rds.amazonaws.com",
"dev_db_name": "db_01jfgxk4nqrst5vwx9yz0abcde",
"dev_sftp": {
"hostname": "ssh.vectorpages.com",
"port": 22,
"username": "wispy-dust"
},
"last_deployed_at": "2025-06-10T14:30:00+00:00",
"environments": [
{
"id": "01jfgxk4nqrst5vwx9yz0abcdg",
"name": "production",
"is_production": true,
"status": "active",
"status_label": "Active",
"php_version": "8.3",
"platform_domain": "wispy-dust--prod.vectorpages.com",
"custom_domain": "example.com",
"custom_domain_certificate_status": "issued",
"dns_status_state": "verified",
"requires_dns_action": false,
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
}
],
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
}
],
"links": {},
"meta": {},
"message": "Sites retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"errors": {
"status": [
"The status must be a valid site status."
]
},
"message": "Validation failed",
"http_status": 422
}Get Site
Retrieves details of a specific site including its environments and domains.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$site = $client->sites->get('01jfgxk4nqrst5vwx9yz0abcde');const site = await client.sites.get('01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcde",
"your_customer_id": "cust_12345",
"status": "active",
"status_label": "Active",
"tags": [
"wordpress",
"production"
],
"dev_domain": "dev.wispy-dust.vectorpages.com",
"dev_db_host": "dev-cluster.abc123.us-east-1.rds.amazonaws.com",
"dev_db_name": "db_01jfgxk4nqrst5vwx9yz0abcde",
"environments": [
{
"id": "01jfgxk4nqrst5vwx9yz0abcdg",
"name": "production",
"is_production": true,
"status": "active",
"status_label": "Active",
"php_version": "8.3",
"platform_domain": "wispy-dust--prod.vectorpages.com",
"custom_domain": "example.com",
"custom_domain_certificate_status": "issued",
"dns_status_state": "verified",
"requires_dns_action": false,
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
}
],
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
},
"message": "Site retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Create Site
Creates a new site for the authenticated account. The site is created with a
pending status and will transition to active once provisioning completes.
A development container is automatically provisioned for the site, accessible
via the dev_domain in the response.
Body Parameters
| Name | Type | Description |
|---|---|---|
your_customer_id required | string | Your internal customer identifier. Used to correlate sites with your billing or CRM system. Example: "cust_12345" |
dev_php_version required | string | The PHP version for the development container. Must be one of: 7.2, 7.3, 7.4, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5. Example: "8.3" |
tags optional | string[] | Optional array of tags for categorizing the site. Each tag must be slug format (lowercase letters, numbers, hyphens), max 100 characters, and unique. Example: ["wordpress","production"] |
production_domain optional | string | Optional custom domain for the production environment. Must be a valid fully qualified domain name, max 253 chars. When provided, SSL certificate provisioning begins automatically. The domain owner must create DNS records to complete provisioning — see the Example: "example.com" |
staging_domain optional | string | Optional custom domain for the staging environment. Must be a valid fully qualified domain name, max 253 chars. When provided, SSL certificate provisioning begins automatically. The domain owner must create DNS records to complete provisioning — see the Example: "staging.example.com" |
wp_admin_email optional | string | Optional email address for WordPress auto-install. When provided, WordPress will be automatically installed in the dev container on first boot. The Example: "admin@example.com" |
wp_admin_user optional | string | Optional WordPress admin username. Only used when Example: "myadmin" |
wp_site_title optional | string | Optional WordPress site title. Only used when Example: "My Blog" |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"your_customer_id":"cust_12345","dev_php_version":"8.3","tags":["wordpress","production"],"production_domain":"example.com","staging_domain":"staging.example.com","wp_admin_email":"admin@example.com","wp_admin_user":"myadmin","wp_site_title":"My Blog"}'$site = $client->sites->create([
'your_customer_id' => 'cust_12345',
'dev_php_version' => '8.3',
'tags' => ['wordpress', 'production'],
'production_domain' => 'example.com',
'staging_domain' => 'staging.example.com',
'wp_admin_email' => 'admin@example.com',
'wp_admin_user' => 'myadmin',
'wp_site_title' => 'My Blog',
]);const site = await client.sites.create({
your_customer_id: 'cust_12345',
dev_php_version: '8.3',
tags: ['wordpress', 'production'],
production_domain: 'example.com',
staging_domain: 'staging.example.com',
wp_admin_email: 'admin@example.com',
wp_admin_user: 'myadmin',
wp_site_title: 'My Blog',
});Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcde",
"your_customer_id": "cust_12345",
"status": "pending",
"status_label": "Pending",
"dev_php_version": "8.3",
"tags": [
"wordpress",
"production"
],
"dev_domain": "dev.wispy-dust.vectorpages.com",
"dev_db_host": "dev-cluster.abc123.us-east-1.rds.amazonaws.com",
"dev_db_name": "db_01jfgxk4nqrst5vwx9yz0abcde",
"dev_sftp": {
"hostname": "ssh.vectorpages.com",
"port": 22,
"username": "wispy-dust",
"password": "aBcD1234!@#$EfGh5678"
},
"dev_db_username": "db_01jfgxk4nqrst5vwx9yz0abcde",
"dev_db_password": "aBcD1234!@#$EfGh5678",
"wp_admin": {
"user": "myadmin",
"email": "admin@example.com",
"password": "xYz9876!@#$AbCd5432",
"site_title": "My Blog"
},
"environments": [
{
"id": "01jfgxk4nqrst5vwx9yz0abcdg",
"name": "production",
"is_production": true,
"status": "pending",
"status_label": "Pending",
"php_version": "8.3",
"platform_domain": "wispy-dust--prod.vectorpages.com",
"custom_domain": "example.com",
"custom_domain_certificate_status": "pending",
"dns_status_state": "pending",
"requires_dns_action": true,
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
},
{
"id": "01jfgxk4nqrst5vwx9yz0abcdh",
"name": "staging",
"is_production": false,
"status": "pending",
"status_label": "Pending",
"php_version": "8.3",
"platform_domain": "wispy-dust--staging.vectorpages.com",
"custom_domain": null,
"custom_domain_certificate_status": null,
"dns_status_state": "not_required",
"requires_dns_action": false,
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
}
],
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
},
"message": "Vector site creation initiated",
"http_status": 201
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"errors": {
"your_customer_id": [
"The partner customer id field is required."
]
},
"message": "Validation failed",
"http_status": 422
}{
"data": {},
"errors": {
"cluster": [
"No Vector cluster is configured for your account."
]
},
"message": "No Vector cluster available for this account",
"http_status": 422
}Update Site
Updates an existing site's metadata. Only the fields provided will be updated.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
your_customer_id optional | string | Your internal customer identifier. Example: "cust_67890" |
tags optional | string[] | Array of tags for categorizing the site. Each tag must be slug format (lowercase letters, numbers, hyphens), max 100 characters, and unique. Pass Example: ["wordpress","staging"] |
Request
curl -X PUT \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"your_customer_id":"cust_67890","tags":["wordpress","staging"]}'$site = $client->sites->update(
'01jfgxk4nqrst5vwx9yz0abcde',
[
'your_customer_id' => 'cust_67890',
'tags' => ['wordpress', 'staging'],
]
);const site = await client.sites.update(
'01jfgxk4nqrst5vwx9yz0abcde',
{
your_customer_id: 'cust_67890',
tags: ['wordpress', 'staging'],
}
);Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcde",
"your_customer_id": "cust_67890",
"status": "active",
"status_label": "Active",
"tags": [
"wordpress",
"staging"
],
"dev_domain": "dev.wispy-dust.vectorpages.com",
"dev_db_host": "dev-cluster.abc123.us-east-1.rds.amazonaws.com",
"dev_db_name": "db_01jfgxk4nqrst5vwx9yz0abcde",
"environments": [],
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
},
"message": "Vector site updated successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"tags": [
"Tags must be an array of strings."
]
},
"message": "Validation failed",
"http_status": 422
}Delete Site
Initiates deletion of a site. This terminates the site's development container
and CDN resources. The site status transitions to terminating and eventually
terminated.
Important: By default, all environments must be terminated before the site
can be deleted — use the environment delete endpoint to terminate each
environment first, or pass delete_environments: true to have any remaining
deployed environments terminated inline as part of the site deletion job.
This operation is irreversible. All site data and configurations will be permanently removed.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
delete_environments optional | boolean | Optional. When true, any remaining deployed environments are terminated as part of the site deletion job (each environment is terminated in sequence before the dev container and Ymir project are removed). When omitted or false, the request is rejected with 422 if deployed environments still exist. Example: true |
Request
curl -X DELETE \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $client->sites->delete('01jfgxk4nqrst5vwx9yz0abcde');const response = await client.sites.delete('01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcde",
"your_customer_id": "cust_12345",
"status": "termination_requested",
"status_label": "Termination Requested",
"tags": [],
"dev_domain": "dev.wispy-dust.vectorpages.com",
"dev_db_host": "dev-cluster.abc123.us-east-1.rds.amazonaws.com",
"dev_db_name": "db_01jfgxk4nqrst5vwx9yz0abcde",
"environments": [],
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
},
"message": "Vector site deletion initiated",
"http_status": 202
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"site": [
"Cannot delete site with deployed environments. Please terminate all deployed environments first, or pass delete_environments=true to terminate them as part of the site deletion."
]
},
"message": "Cannot delete site with deployed environments. Please terminate all deployed environments first, or pass delete_environments=true to terminate them as part of the site deletion.",
"http_status": 422
}Clone Site
Creates a new site by cloning an existing site's development container, including files and database. Only the development container is cloned; production and staging environments are not copied. The new site is created with fresh, empty environments.
This workflow is useful for testing larger redesigns or refactors in isolation while still allowing maintenance of the original site. The cloned site operates independently, so changes to one do not affect the other.
The new site inherits attributes from the source site unless overridden in
the request. The cloned site is created with a pending status and will
transition to active once the clone operation completes.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The source site ID to clone from. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
your_customer_id optional | string | Optional customer identifier. Inherits from source if not provided. Example: "cust_12345" |
dev_php_version optional | string | Optional PHP version. Inherits from source if not provided. Example: "8.3" |
tags optional | string[] | Optional tags. Inherits from source if not provided. Example: ["wordpress","clone"] |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/clone" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"your_customer_id":"cust_12345","dev_php_version":"8.3","tags":["wordpress","clone"]}'$site = $client->sites->clone(
'01jfgxk4nqrst5vwx9yz0abcde',
[
'your_customer_id' => 'cust_12345',
'dev_php_version' => '8.3',
'tags' => ['wordpress', 'clone'],
]
);const site = await client.sites.clone(
'01jfgxk4nqrst5vwx9yz0abcde',
{
your_customer_id: 'cust_12345',
dev_php_version: '8.3',
tags: ['wordpress', 'clone'],
}
);Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcdf",
"your_customer_id": "cust_12345",
"status": "pending",
"status_label": "Pending",
"tags": [
"wordpress",
"clone"
],
"dev_domain": "dev.wispy-dust.vectorpages.com",
"dev_db_username": "db_01jfgxk4nqrst5vwx9yz0abcdf",
"dev_db_password": "aBcD1234!@#$EfGh5678",
"environments": [],
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
},
"message": "Vector site clone initiated",
"http_status": 201
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"site": [
"Source site must be in active state to clone."
]
},
"message": "Validation failed",
"http_status": 422
}{
"data": {},
"errors": {
"site": [
"Source site must have a dev container to clone."
]
},
"message": "Validation failed",
"http_status": 422
}Suspend Site
Suspends a site's development container by scaling the ECS service to zero. This reduces costs during low-traffic periods while preserving container resources for quick resumption.
The site must be in active status to be suspended. Suspended sites can be
resumed using the unsuspend endpoint.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X PUT \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/suspend" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json"$response = $vectorPro
->sites.suspend
->put('01jfgxk4nqrst5vwx9yz0abcde');const response = await vectorPro
.sites.suspend
.put('01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcde",
"your_customer_id": "cust_12345",
"status": "suspended",
"status_label": "Suspended",
"tags": [],
"dev_domain": "dev.wispy-dust.vectorpages.com",
"environments": [],
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
},
"message": "Vector site suspension initiated",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"status": [
"Site cannot be suspended from current state 'pending'. Site must be 'active' to be suspended."
]
},
"message": "Site cannot be suspended from current state 'pending'. Site must be 'active' to be suspended.",
"http_status": 422
}Unsuspend Site
Resumes a previously suspended site's development container by scaling the
ECS service back to one. The site must be in suspended status to be unsuspended.
After unsuspension, the site transitions back to active status and resumes
serving traffic.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X PUT \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/unsuspend" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json"$response = $vectorPro
->sites.unsuspend
->put('01jfgxk4nqrst5vwx9yz0abcde');const response = await vectorPro
.sites.unsuspend
.put('01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcde",
"your_customer_id": "cust_12345",
"status": "active",
"status_label": "Active",
"tags": [],
"dev_domain": "dev.wispy-dust.vectorpages.com",
"environments": [],
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
},
"message": "Vector site unsuspension initiated",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"status": [
"Site cannot be unsuspended from current state 'active'. Site must be 'suspended' to be unsuspended."
]
},
"message": "Site cannot be unsuspended from current state 'active'. Site must be 'suspended' to be unsuspended.",
"http_status": 422
}CDN
Purge CDN cache for a site. Supports full cache purge, purge by cache tag, or purge of specific URLs.
Purge Cache
Purges the CDN cache for a site. Can purge the entire cache, by cache tag, or a specific URL.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
cache_tag optional | string | Purge only content with this cache tag. Example: "images" |
url optional | string | Purge a specific URL. Example: "https://example.com/style.css" |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/purge-cache" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"cache_tag":"images","url":"https://example.com/style.css"}'$response = $client->sites->purgeCache(
'01jfgxk4nqrst5vwx9yz0abcde',
[
'cache_tag' => 'images',
'url' => 'https://example.com/style.css',
]
);const response = await client.sites.purgeCache('01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {},
"message": "Cache purged successfully",
"http_status": 200
}{
"data": {
"cache_tag": "images"
},
"message": "Cache purged successfully for tag: images",
"http_status": 200
}{
"data": {
"url": "https://example.com/style.css"
},
"message": "URL purged successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"url": [
"The url field must be a valid URL."
]
},
"message": "Validation failed",
"http_status": 422
}CDN: Caching
Manage CDN caching configuration including smart cache, vary headers, origin shield, request coalescing, and stale content settings.
Get Caching Settings
Retrieves the current CDN caching configuration for a site.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/cdn/caching" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $vectorPro
->sites.cdn.caching
->get('01jfgxk4nqrst5vwx9yz0abcde');const response = await vectorPro
.sites.cdn.caching
.get('01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {
"enable_smart_cache": true,
"cache_control_max_age_override": 2592000,
"cache_control_public_max_age_override": 0,
"disable_cookies": true,
"cache_error_responses": false,
"enable_query_string_ordering": true,
"ignore_query_strings": false,
"query_string_vary_parameters": [],
"enable_hostname_vary": false,
"enable_mobile_vary": false,
"enable_webp_vary": true,
"enable_avif_vary": true,
"enable_country_code_vary": false,
"enable_cookie_vary": false,
"cookie_vary_parameters": [],
"enable_origin_shield": false,
"origin_shield_zone_code": "",
"origin_shield_enable_concurrency_limit": false,
"origin_shield_max_concurrent_requests": 5000,
"origin_shield_queue_max_wait_time": 30,
"origin_shield_max_queued_requests": 1000,
"enable_request_coalescing": false,
"request_coalescing_timeout": 30,
"use_stale_while_updating": true,
"use_stale_while_offline": true,
"use_background_update": true,
"enable_cache_slice": false
},
"message": "Caching settings retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Update Caching Settings
Updates CDN caching configuration for a site. All fields are optional — only include fields you want to change. Omitted fields retain their current values.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
enable_smart_cache optional | boolean | Enable smart cache. Example: true |
cache_control_max_age_override optional | integer | Server cache expiration in seconds. Use -1 to respect origin headers. Example: 2592000 |
cache_control_public_max_age_override optional | integer | Browser cache expiration in seconds. Example: 0 |
disable_cookies optional | boolean | Automatically strip cookies from responses. Example: true |
cache_error_responses optional | boolean | Cache error responses from origin. Example: false |
enable_query_string_ordering optional | boolean | Sort query string parameters for better cache hit rates. Example: true |
ignore_query_strings optional | boolean | Ignore query strings when serving cached objects. Example: false |
query_string_vary_parameters optional | string[] | Query string parameters to vary cache by. Example: ["utm_source","ref"] |
enable_hostname_vary optional | boolean | Vary cache by hostname. Example: false |
enable_mobile_vary optional | boolean | Vary cache by device type (mobile/desktop). Example: false |
enable_webp_vary optional | boolean | Vary cache by WebP support. Example: true |
enable_avif_vary optional | boolean | Vary cache by AVIF support. Example: true |
enable_country_code_vary optional | boolean | Vary cache by country code. Example: false |
enable_cookie_vary optional | boolean | Vary cache by cookie values. Example: false |
cookie_vary_parameters optional | string[] | Cookie names to vary cache by. Example: ["wordpress_logged_in"] |
enable_origin_shield optional | boolean | Enable origin shield. Example: false |
origin_shield_zone_code optional | string | Origin shield zone code (e.g., "FR", "NY"). Example: "FR" |
origin_shield_enable_concurrency_limit optional | boolean | Enable origin shield concurrency limit. Example: false |
origin_shield_max_concurrent_requests optional | integer | Max concurrent requests to origin (1-10000). Example: 5000 |
origin_shield_queue_max_wait_time optional | integer | Max queue wait time in seconds. Example: 30 |
origin_shield_max_queued_requests optional | integer | Max queued origin requests (0-30000). Example: 1000 |
enable_request_coalescing optional | boolean | Enable request coalescing. Example: false |
request_coalescing_timeout optional | integer | Request coalescing lock time in seconds. Example: 30 |
use_stale_while_updating optional | boolean | Serve stale content while cache is updating. Example: true |
use_stale_while_offline optional | boolean | Serve stale content while origin is offline. Example: true |
use_background_update optional | boolean | Update cache in background. Example: true |
enable_cache_slice optional | boolean | Enable cache slicing (optimize for video). Example: false |
Request
curl -X PUT \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/cdn/caching" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"enable_smart_cache":true,"cache_control_max_age_override":2592000,"cache_control_public_max_age_override":0,"disable_cookies":true,"cache_error_responses":false,"enable_query_string_ordering":true,"ignore_query_strings":false,"query_string_vary_parameters":["utm_source","ref"],"enable_hostname_vary":false,"enable_mobile_vary":false,"enable_webp_vary":true,"enable_avif_vary":true,"enable_country_code_vary":false,"enable_cookie_vary":false,"cookie_vary_parameters":["wordpress_logged_in"],"enable_origin_shield":false,"origin_shield_zone_code":"FR","origin_shield_enable_concurrency_limit":false,"origin_shield_max_concurrent_requests":5000,"origin_shield_queue_max_wait_time":30,"origin_shield_max_queued_requests":1000,"enable_request_coalescing":false,"request_coalescing_timeout":30,"use_stale_while_updating":true,"use_stale_while_offline":true,"use_background_update":true,"enable_cache_slice":false}'$response = $vectorPro
->sites.cdn.caching
->put('01jfgxk4nqrst5vwx9yz0abcde', [
'enable_smart_cache' => true,
'cache_control_max_age_override' => 2592000,
'cache_control_public_max_age_override' => 0,
'disable_cookies' => true,
'cache_error_responses' => false,
'enable_query_string_ordering' => true,
'ignore_query_strings' => false,
'query_string_vary_parameters' => ['utm_source', 'ref'],
'enable_hostname_vary' => false,
'enable_mobile_vary' => false,
'enable_webp_vary' => true,
'enable_avif_vary' => true,
'enable_country_code_vary' => false,
'enable_cookie_vary' => false,
'cookie_vary_parameters' => ['wordpress_logged_in'],
'enable_origin_shield' => false,
'origin_shield_zone_code' => 'FR',
'origin_shield_enable_concurrency_limit' => false,
'origin_shield_max_concurrent_requests' => 5000,
'origin_shield_queue_max_wait_time' => 30,
'origin_shield_max_queued_requests' => 1000,
'enable_request_coalescing' => false,
'request_coalescing_timeout' => 30,
'use_stale_while_updating' => true,
'use_stale_while_offline' => true,
'use_background_update' => true,
'enable_cache_slice' => false,
]);const response = await vectorPro
.sites.cdn.caching
.put('01jfgxk4nqrst5vwx9yz0abcde', {
enable_smart_cache: true,
cache_control_max_age_override: 2592000,
cache_control_public_max_age_override: 0,
disable_cookies: true,
cache_error_responses: false,
enable_query_string_ordering: true,
ignore_query_strings: false,
query_string_vary_parameters: ['utm_source', 'ref'],
enable_hostname_vary: false,
enable_mobile_vary: false,
enable_webp_vary: true,
enable_avif_vary: true,
enable_country_code_vary: false,
enable_cookie_vary: false,
cookie_vary_parameters: ['wordpress_logged_in'],
enable_origin_shield: false,
origin_shield_zone_code: 'FR',
origin_shield_enable_concurrency_limit: false,
origin_shield_max_concurrent_requests: 5000,
origin_shield_queue_max_wait_time: 30,
origin_shield_max_queued_requests: 1000,
enable_request_coalescing: false,
request_coalescing_timeout: 30,
use_stale_while_updating: true,
use_stale_while_offline: true,
use_background_update: true,
enable_cache_slice: false,
});Response
{
"data": {
"enable_smart_cache": true,
"cache_control_max_age_override": 2592000,
"disable_cookies": true
},
"message": "Caching settings updated successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"origin_shield_max_concurrent_requests": [
"The max concurrent requests must not exceed 10,000."
]
},
"message": "Validation failed",
"http_status": 422
}CDN: Edge Rules
Manage CDN edge rules for request/response manipulation, redirects, caching overrides, and security controls.
Each edge rule defines:
- Action: What to do when triggered (redirect, set header, block, override cache, etc.)
- Triggers: Conditions to match against (URL, headers, country, IP, cookies, etc.)
- Extra Actions: Additional actions to perform alongside the primary action
List Edge Rules
Retrieves all edge rules configured for a site.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/cdn/edge-rules" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $vectorPro
->sites.cdn.edgeRules
->get('01jfgxk4nqrst5vwx9yz0abcde');const response = await vectorPro
.sites.cdn.edgeRules
.get('01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": [
{
"guid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"description": "Force SSL",
"enabled": true,
"action_type": "force-ssl",
"action_parameter_1": null,
"action_parameter_2": null,
"trigger_matching_type": "match-any",
"triggers": [
{
"type": "url",
"pattern_matching_type": "match-any",
"pattern_matches": [
"*"
],
"parameter_1": null
}
],
"extra_actions": []
}
],
"message": "Edge rules retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Get Edge Rule
Retrieves a specific edge rule by GUID.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
rule required | string | Example: "architecto" |
ruleId required | string | The edge rule GUID. Example: "a1b2c3d4-e5f6-7890-abcd-ef1234567890" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/cdn/edge-rules/architecto" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $vectorPro
->sites.cdn.edgeRules
->get('01jfgxk4nqrst5vwx9yz0abcde', 'architecto', 'a1b2c3d4-e5f6-7890-abcd-ef1234567890');const response = await vectorPro
.sites.cdn.edgeRules
.get('01jfgxk4nqrst5vwx9yz0abcde', 'architecto', 'a1b2c3d4-e5f6-7890-abcd-ef1234567890');Response
{
"data": {
"guid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"description": "Force SSL",
"enabled": true,
"action_type": "force-ssl",
"action_parameter_1": null,
"action_parameter_2": null,
"trigger_matching_type": "match-any",
"triggers": [
{
"type": "url",
"pattern_matching_type": "match-any",
"pattern_matches": [
"*"
],
"parameter_1": null
}
],
"extra_actions": []
},
"message": "Edge rule retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Edge rule not found",
"http_status": 404
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Create Edge Rule
Creates a new edge rule for a site.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
description required | string | The rule description (max 255 characters). Example: "Force SSL on all requests" |
enabled optional | boolean | Whether the rule is enabled. Defaults to true. Example: true |
action_type required | string | The primary action type. Must be a valid edge rule action type (e.g., force-ssl, redirect, set-response-header, block-request, override-cache-time). Example: "force-ssl" |
action_parameter_1 optional | string | Action parameter 1 (usage depends on action type). Example: "https://example.com/" |
action_parameter_2 optional | string | Action parameter 2 (usage depends on action type). Example: "architecto" |
trigger_matching_type required | string | How triggers are combined. Must be match-any, match-all, or match-none. Example: "match-any" |
triggers required | object[] | At least one trigger condition. Example: [{"type":"url","pattern_matching_type":"match-any","pattern_matches":["*"]}] |
extra_actions optional | object[] | Additional actions to perform. Example: [[]] |
triggers[].type required | string | The trigger type. Example: "url" |
triggers[].pattern_matching_type required | string | How patterns are matched. Example: "match-any" |
triggers[].pattern_matches required | string[] | Patterns to match against. Example: ["*"] |
triggers[].parameter_1 optional | string | Optional trigger parameter. Example: "architecto" |
extra_actions[].action_type required | string | The extra action type. Example: "set-response-header" |
extra_actions[].action_parameter_1 optional | string | Action parameter 1. Example: "X-Custom-Header" |
extra_actions[].action_parameter_2 optional | string | Action parameter 2. Example: "custom-value" |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/cdn/edge-rules" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"description":"Force SSL on all requests","enabled":true,"action_type":"force-ssl","action_parameter_1":"https://example.com/","action_parameter_2":"architecto","trigger_matching_type":"match-any","triggers":[{"type":"url","pattern_matching_type":"match-any","pattern_matches":["*"]}],"extra_actions":[{"action_type":"set-response-header","action_parameter_1":"X-Custom-Header","action_parameter_2":"custom-value"}]}'$response = $vectorPro
->sites.cdn.edgeRules
->post('01jfgxk4nqrst5vwx9yz0abcde', [
'description' => 'Force SSL on all requests',
'enabled' => true,
'action_type' => 'force-ssl',
'action_parameter_1' => 'https://example.com/',
'action_parameter_2' => 'architecto',
'trigger_matching_type' => 'match-any',
'triggers' => [[
'type' => 'url',
'pattern_matching_type' => 'match-any',
'pattern_matches' => ['*'],
]],
'extra_actions' => [[
'action_type' => 'set-response-header',
'action_parameter_1' => 'X-Custom-Header',
'action_parameter_2' => 'custom-value',
]],
]);const response = await vectorPro
.sites.cdn.edgeRules
.post('01jfgxk4nqrst5vwx9yz0abcde', {
description: 'Force SSL on all requests',
enabled: true,
action_type: 'force-ssl',
action_parameter_1: 'https://example.com/',
action_parameter_2: 'architecto',
trigger_matching_type: 'match-any',
triggers: [{
type: 'url',
pattern_matching_type: 'match-any',
pattern_matches: ['*'],
}],
extra_actions: [{
action_type: 'set-response-header',
action_parameter_1: 'X-Custom-Header',
action_parameter_2: 'custom-value',
}],
});Response
{
"data": {
"guid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"description": "Force SSL on all requests",
"enabled": true,
"action_type": "force-ssl",
"action_parameter_1": null,
"action_parameter_2": null,
"trigger_matching_type": "match-any",
"triggers": [
{
"type": "url",
"pattern_matching_type": "match-any",
"pattern_matches": [
"*"
],
"parameter_1": null
}
],
"extra_actions": []
},
"message": "Edge rule created successfully",
"http_status": 201
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"action_type": [
"The action type must be a valid edge rule action type."
],
"triggers": [
"The triggers field is required."
]
},
"message": "Validation failed",
"http_status": 422
}Update Edge Rule
Updates an existing edge rule. All fields are optional — only include fields you want to change. Omitted fields retain their current values.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
rule required | string | Example: "architecto" |
ruleId required | string | The edge rule GUID. Example: "a1b2c3d4-e5f6-7890-abcd-ef1234567890" |
Body Parameters
| Name | Type | Description |
|---|---|---|
description optional | string | The rule description (max 255 characters). Example: "Updated description" |
enabled optional | boolean | Whether the rule is enabled. Example: false |
action_type optional | string | The primary action type. Example: "redirect" |
action_parameter_1 optional | string | Action parameter 1. Example: "https://example.com/new-location" |
action_parameter_2 optional | string | Action parameter 2. Example: "architecto" |
trigger_matching_type optional | string | How triggers are combined. Must be match-any, match-all, or match-none. Example: "match-all" |
triggers optional | object[] | Trigger conditions (replaces all existing triggers). Example: [[]] |
extra_actions optional | object[] | Extra actions (replaces all existing extra actions). Example: [[]] |
triggers[].type required | string | The trigger type. Example: "url" |
triggers[].pattern_matching_type required | string | How patterns are matched. Example: "match-any" |
triggers[].pattern_matches required | string[] | Patterns to match against. Example: ["/old-page"] |
triggers[].parameter_1 optional | string | Optional trigger parameter. Example: "architecto" |
extra_actions[].action_type required | string | The extra action type. Example: "set-response-header" |
extra_actions[].action_parameter_1 optional | string | Action parameter 1. Example: "X-Redirect" |
extra_actions[].action_parameter_2 optional | string | Action parameter 2. Example: "true" |
Request
curl -X PUT \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/cdn/edge-rules/architecto" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"description":"Updated description","enabled":false,"action_type":"redirect","action_parameter_1":"https://example.com/new-location","action_parameter_2":"architecto","trigger_matching_type":"match-all","triggers":[{"type":"url","pattern_matching_type":"match-any","pattern_matches":["/old-page"],"parameter_1":"architecto"}],"extra_actions":[{"action_type":"set-response-header","action_parameter_1":"X-Redirect","action_parameter_2":"true"}]}'$response = $vectorPro
->sites.cdn.edgeRules
->put('01jfgxk4nqrst5vwx9yz0abcde', 'architecto', 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', [
'description' => 'Updated description',
'enabled' => false,
'action_type' => 'redirect',
'action_parameter_1' => 'https://example.com/new-location',
'action_parameter_2' => 'architecto',
'trigger_matching_type' => 'match-all',
'triggers' => [[
'type' => 'url',
'pattern_matching_type' => 'match-any',
'pattern_matches' => ['/old-page'],
'parameter_1' => 'architecto',
]],
'extra_actions' => [[
'action_type' => 'set-response-header',
'action_parameter_1' => 'X-Redirect',
'action_parameter_2' => 'true',
]],
]);const response = await vectorPro
.sites.cdn.edgeRules
.put('01jfgxk4nqrst5vwx9yz0abcde', 'architecto', 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', {
description: 'Updated description',
enabled: false,
action_type: 'redirect',
action_parameter_1: 'https://example.com/new-location',
action_parameter_2: 'architecto',
trigger_matching_type: 'match-all',
triggers: [{
type: 'url',
pattern_matching_type: 'match-any',
pattern_matches: ['/old-page'],
parameter_1: 'architecto',
}],
extra_actions: [{
action_type: 'set-response-header',
action_parameter_1: 'X-Redirect',
action_parameter_2: 'true',
}],
});Response
{
"data": {
"guid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"description": "Updated description",
"enabled": false,
"action_type": "redirect",
"action_parameter_1": "https://example.com/new-location",
"action_parameter_2": null,
"trigger_matching_type": "match-all",
"triggers": [
{
"type": "url",
"pattern_matching_type": "match-any",
"pattern_matches": [
"/old-page"
],
"parameter_1": null
}
],
"extra_actions": []
},
"message": "Edge rule updated successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"action_type": [
"The action type must be a valid edge rule action type."
]
},
"message": "Validation failed",
"http_status": 422
}Delete Edge Rule
Permanently deletes an edge rule. This action cannot be undone.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
rule required | string | Example: "architecto" |
ruleId required | string | The edge rule GUID. Example: "a1b2c3d4-e5f6-7890-abcd-ef1234567890" |
Request
curl -X DELETE \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/cdn/edge-rules/architecto" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $vectorPro
->sites.cdn.edgeRules
->delete('01jfgxk4nqrst5vwx9yz0abcde', 'architecto', 'a1b2c3d4-e5f6-7890-abcd-ef1234567890');const response = await vectorPro
.sites.cdn.edgeRules
.delete('01jfgxk4nqrst5vwx9yz0abcde', 'architecto', 'a1b2c3d4-e5f6-7890-abcd-ef1234567890');Response
{
"data": {},
"message": "Edge rule deleted successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}CDN: Optimizer
Manage CDN optimizer configuration including image optimization, asset minification, and quality settings.
Get Optimizer Settings
Retrieves the current CDN optimizer configuration for a site.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/cdn/optimizer" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $vectorPro
->sites.cdn.optimizer
->get('01jfgxk4nqrst5vwx9yz0abcde');const response = await vectorPro
.sites.cdn.optimizer
.get('01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {
"optimizer_enabled": true,
"optimizer_enable_webp": true,
"optimizer_automatic_optimization_enabled": true,
"optimizer_enable_manipulation_engine": false,
"optimizer_watermark_enabled": false,
"optimizer_minify_css": true,
"optimizer_minify_javascript": true,
"optimizer_image_quality": 85,
"optimizer_mobile_image_quality": 70,
"optimizer_desktop_max_width": 1600,
"optimizer_mobile_max_width": 800
},
"message": "Optimizer settings retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Update Optimizer Settings
Updates CDN optimizer configuration for a site. All fields are optional — only include fields you want to change. Omitted fields retain their current values.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
optimizer_enabled optional | boolean | Enable Bunny Optimizer. Example: true |
optimizer_enable_webp optional | boolean | Enable WebP image compression. Example: true |
optimizer_automatic_optimization_enabled optional | boolean | Enable automatic smart image optimization. Example: true |
optimizer_enable_manipulation_engine optional | boolean | Enable dynamic image processing engine. Example: false |
optimizer_watermark_enabled optional | boolean | Enable image watermarking. Example: false |
optimizer_minify_css optional | boolean | Enable CSS minification. Example: true |
optimizer_minify_javascript optional | boolean | Enable JavaScript minification. Example: true |
optimizer_image_quality optional | integer | Desktop image quality (1-100). Example: 85 |
optimizer_mobile_image_quality optional | integer | Mobile image quality (1-100). Example: 70 |
optimizer_desktop_max_width optional | integer | Max automatic image width for desktop (0-5000). Example: 1600 |
optimizer_mobile_max_width optional | integer | Max automatic image width for mobile (0-5000). Example: 800 |
Request
curl -X PUT \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/cdn/optimizer" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"optimizer_enabled":true,"optimizer_enable_webp":true,"optimizer_automatic_optimization_enabled":true,"optimizer_enable_manipulation_engine":false,"optimizer_watermark_enabled":false,"optimizer_minify_css":true,"optimizer_minify_javascript":true,"optimizer_image_quality":85,"optimizer_mobile_image_quality":70,"optimizer_desktop_max_width":1600,"optimizer_mobile_max_width":800}'$response = $vectorPro
->sites.cdn.optimizer
->put('01jfgxk4nqrst5vwx9yz0abcde', [
'optimizer_enabled' => true,
'optimizer_enable_webp' => true,
'optimizer_automatic_optimization_enabled' => true,
'optimizer_enable_manipulation_engine' => false,
'optimizer_watermark_enabled' => false,
'optimizer_minify_css' => true,
'optimizer_minify_javascript' => true,
'optimizer_image_quality' => 85,
'optimizer_mobile_image_quality' => 70,
'optimizer_desktop_max_width' => 1600,
'optimizer_mobile_max_width' => 800,
]);const response = await vectorPro
.sites.cdn.optimizer
.put('01jfgxk4nqrst5vwx9yz0abcde', {
optimizer_enabled: true,
optimizer_enable_webp: true,
optimizer_automatic_optimization_enabled: true,
optimizer_enable_manipulation_engine: false,
optimizer_watermark_enabled: false,
optimizer_minify_css: true,
optimizer_minify_javascript: true,
optimizer_image_quality: 85,
optimizer_mobile_image_quality: 70,
optimizer_desktop_max_width: 1600,
optimizer_mobile_max_width: 800,
});Response
{
"data": {
"optimizer_enabled": true,
"optimizer_minify_css": true,
"optimizer_image_quality": 85
},
"message": "Optimizer settings updated successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"optimizer_image_quality": [
"The image quality must not exceed 100."
]
},
"message": "Validation failed",
"http_status": 422
}Databases
Manage database credentials for the site's development container. Each site has a dedicated MySQL database for local development with credentials that can be reset for security.
Create Export
Start a database export operation. Dispatches an async job to create the export and upload it to S3. Poll the status endpoint to check progress and retrieve the download URL when complete.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
format optional | string | Export format. Currently only "sql" is supported. Default: sql. Example: "sql" |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/db/export" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"format":"sql"}'$exportStatus = $client->sites->db->createExport(
'01jfgxk4nqrst5vwx9yz0abcde',
[
'format' => 'sql',
]
);const exportSession = await client.sites.db.createExport(
'01jfgxk4nqrst5vwx9yz0abcde',
{
format: 'sql',
}
);Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcdg",
"vector_site_id": "01jfgxk4nqrst5vwx9yz0abcde",
"status": "pending",
"status_label": "Pending",
"format": "sql",
"size_bytes": null,
"duration_ms": null,
"error_message": null,
"download_expires_at": null,
"created_at": "2025-01-15T12:00:00+00:00",
"started_at": null,
"completed_at": null
},
"message": "Database export started",
"http_status": 202
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"format": [
"The selected format is invalid."
]
},
"message": "Validation failed",
"http_status": 422
}Get Export Status
Get the current status of a database export operation. If complete and not expired, includes a presigned download URL valid for 1 hour.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
export required | string | The export ID. Example: "01jfgxk4nqrst5vwx9yz0abcdg" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/db/exports/01jfgxk4nqrst5vwx9yz0abcdg" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$exportStatus = $client->sites->db->getExportStatus(
'01jfgxk4nqrst5vwx9yz0abcde',
'01jfgxk4nqrst5vwx9yz0abcdg'
);const exportStatus = await client.sites.db.getExportStatus(
'01jfgxk4nqrst5vwx9yz0abcde',
'01jfgxk4nqrst5vwx9yz0abcdg'
);Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcdg",
"vector_site_id": "01jfgxk4nqrst5vwx9yz0abcde",
"status": "completed",
"status_label": "Completed",
"format": "sql",
"size_bytes": 52428800,
"duration_ms": 30000,
"error_message": null,
"download_url": "https://s3.amazonaws.com/bucket/exports/01jfgxk4nqrst5vwx9yz0abcdg.sql?X-Amz-Expires=3600",
"download_expires_at": "2025-01-15T13:00:00+00:00",
"created_at": "2025-01-15T12:00:00+00:00",
"started_at": "2025-01-15T12:00:01+00:00",
"completed_at": "2025-01-15T12:00:31+00:00"
},
"message": "Export retrieved successfully",
"http_status": 200
}{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcdg",
"vector_site_id": "01jfgxk4nqrst5vwx9yz0abcde",
"status": "processing",
"status_label": "Processing",
"format": "sql",
"size_bytes": null,
"duration_ms": null,
"error_message": null,
"download_expires_at": null,
"created_at": "2025-01-15T12:00:00+00:00",
"started_at": "2025-01-15T12:00:01+00:00",
"completed_at": null
},
"message": "Export retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Export not found",
"http_status": 404
}Reset Password
Generates a new database password for the site's development container. The old password is immediately invalidated.
The new password is returned ONLY in this response. Store it securely—it cannot be retrieved again.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/db/reset-password" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json"$response = $vectorPro
->sites.db.resetPassword
->post('01jfgxk4nqrst5vwx9yz0abcde');const response = await vectorPro
.sites.db.resetPassword
.post('01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcde",
"your_customer_id": null,
"status": "active",
"status_label": "Active",
"dev_php_version": "8.3",
"tags": [],
"dev_domain": "dev.wispy-dust.vectorpages.com",
"dev_db_username": "db_01jfgxk4nqrst5vwx9yz0abcde",
"dev_db_password": "aBcD1234!@#$EfGh5678",
"environments": [],
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
},
"message": "Database password reset successfully. Store the new password securely - it will not be shown again.",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Deployments List deployments across all environments of a site.
List Site Deployments
Retrieves a paginated list of deployments across all non-terminated environments belonging to the given site, ordered by most recent first.
Optionally filter by environment name to narrow results to a single
environment (e.g. production or staging).
Deployments attached to terminated environments are always excluded,
even when an explicit environment filter matches one.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site. Example: "architecto" |
vectorSite required | string | The site ID or subdomain. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Query Parameters
| Name | Type | Description |
|---|---|---|
environment optional | string | Filter deployments to a specific environment by name. Example: "production" |
per_page optional | integer | Number of items per page (max 100). Default: 15. Example: 25 |
page optional | integer | Page number for pagination. Default: 1. Example: 1 |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/architecto/deployments?environment=production&per_page=25&page=1" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $vectorPro
->sites.deployments
->get('architecto', '01jfgxk4nqrst5vwx9yz0abcde', [
'environment' => 'production',
'per_page' => 25,
'page' => 1,
]);const response = await vectorPro
.sites.deployments
.get('architecto', '01jfgxk4nqrst5vwx9yz0abcde', {
environment: 'production',
per_page: 25,
page: 1,
});Response
{
"data": [
{
"id": "01jfgxk4nqrst5vwx9yz0abcdh",
"vector_environment_id": "01jfgxk4nqrst5vwx9yz0abcdg",
"is_auto_deploy": false,
"status": "deployed",
"status_label": "Deployed",
"stdout": "Deployment output...",
"stderr": null,
"actor": "user@example.com",
"environment": {
"id": "01jfgxk4nqrst5vwx9yz0abcdg",
"vector_site_id": "01jfgxk4nqrst5vwx9yz0abcde",
"your_customer_id": "cust_12345",
"name": "production",
"is_production": true,
"status": "active",
"status_label": "Active",
"php_version": "8.3",
"tags": [
"wordpress"
],
"fqdn": "example.com",
"custom_domain": "example.com",
"subdomain": "wispy-dust",
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
},
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
}
],
"links": {},
"meta": {},
"message": "Deployments retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"per_page": [
"Maximum items per page is 100."
]
},
"message": "Validation failed",
"http_status": 422
}Imports
Get Import Status
Get the current status of an archive import operation. If the import is still pending and not expired, includes fresh presigned upload URL(s).
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
import required | string | The import ID. Example: "01jfgxk4nqrst5vwx9yz0abcdh" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/imports/01jfgxk4nqrst5vwx9yz0abcdh" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $vectorPro
->sites.imports
->get('01jfgxk4nqrst5vwx9yz0abcde', '01jfgxk4nqrst5vwx9yz0abcdh');const response = await vectorPro
.sites.imports
.get('01jfgxk4nqrst5vwx9yz0abcde', '01jfgxk4nqrst5vwx9yz0abcdh');Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcdh",
"vector_site_id": "01jfgxk4nqrst5vwx9yz0abcde",
"status": "pending",
"status_label": "Pending",
"scope": null,
"filename": "backup.sql.gz",
"content_length": 52428800,
"is_multipart": false,
"part_count": null,
"checksum": {
"provided_md5": "d41d8cd98f00b204e9800998ecf8427e",
"s3_etag": null
},
"metadata": null,
"options": {
"drop_tables": true,
"disable_foreign_keys": true,
"search_replace": null
},
"duration_ms": null,
"error_message": null,
"created_at": "2025-01-15T12:00:00+00:00",
"uploaded_at": null,
"started_at": null,
"completed_at": null,
"upload_url": "https://s3.amazonaws.com/bucket/imports/...",
"upload_expires_at": "2025-01-16T12:00:00+00:00"
},
"message": "Import retrieved successfully",
"http_status": 200
}{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcdh",
"vector_site_id": "01jfgxk4nqrst5vwx9yz0abcde",
"status": "completed",
"status_label": "Completed",
"scope": "full",
"scope_label": "Full",
"filename": "backup.sql.gz",
"content_length": 52428800,
"is_multipart": false,
"part_count": null,
"checksum": {
"provided_md5": "d41d8cd98f00b204e9800998ecf8427e",
"s3_etag": "d41d8cd98f00b204e9800998ecf8427e"
},
"metadata": null,
"options": {
"drop_tables": true,
"disable_foreign_keys": true,
"search_replace": null
},
"duration_ms": 30000,
"error_message": null,
"created_at": "2025-01-15T12:00:00+00:00",
"uploaded_at": "2025-01-15T12:00:01+00:00",
"started_at": "2025-01-15T12:00:02+00:00",
"completed_at": "2025-01-15T12:00:32+00:00"
},
"message": "Import retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Import not found",
"http_status": 404
}Create Import Session
Create an archive import session. Returns presigned S3 upload URL(s) that can be used to upload the archive file directly to storage.
The maximum file size is 50GB by default. Higher limits can be configured per-cluster on request.
For files larger than the multipart threshold (~100MB), returns multiple
presigned URLs (one per part) along with an upload_id. Parts are 100MB each,
so a 1GB file requires 10 parts. For smaller files, returns a single presigned
upload URL.
After uploading, call the "Run Import" endpoint to execute the import.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
scope optional | string | Example: "database"Enum: database |
filename optional | string | The archive filename. Example: "backup.sql.gz" |
content_length required | integer | The file size in bytes. Example: 104857600 |
content_md5 optional | string | The MD5 hash of the file (32 hex characters). Example: "d41d8cd98f00b204e9800998ecf8427e" |
options optional | object | Import options. Example: [] |
options.drop_tables optional | boolean | Drop existing tables before import. Default: true. Example: true |
options.disable_foreign_keys optional | boolean | Disable foreign key checks during import. Default: true. Example: true |
options.search_replace optional | object | Search and replace configuration. Example: [] |
options.search_replace.from optional | string | The value to search for. Example: "example.org" |
options.search_replace.to optional | string | The replacement value. Example: "example.com" |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/imports" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"scope":"database","filename":"backup.sql.gz","content_length":104857600,"content_md5":"d41d8cd98f00b204e9800998ecf8427e","options":{"drop_tables":true,"disable_foreign_keys":true,"search_replace":{"from":"example.org","to":"example.com"}}}'$response = $vectorPro
->sites.imports
->post('01jfgxk4nqrst5vwx9yz0abcde', [
'scope' => 'database',
'filename' => 'backup.sql.gz',
'content_length' => 104857600,
'content_md5' => 'd41d8cd98f00b204e9800998ecf8427e',
'options' => [
'drop_tables' => true,
'disable_foreign_keys' => true,
'search_replace' => [
'from' => 'example.org',
'to' => 'example.com',
],
],
]);const response = await vectorPro
.sites.imports
.post('01jfgxk4nqrst5vwx9yz0abcde', {
scope: 'database',
filename: 'backup.sql.gz',
content_length: 104857600,
content_md5: 'd41d8cd98f00b204e9800998ecf8427e',
options: {
drop_tables: true,
disable_foreign_keys: true,
search_replace: {
from: 'example.org',
to: 'example.com',
},
},
});Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcdh",
"vector_site_id": "01jfgxk4nqrst5vwx9yz0abcde",
"status": "pending",
"status_label": "Pending",
"scope": null,
"filename": "backup.sql.gz",
"content_length": 52428800,
"is_multipart": false,
"part_count": null,
"checksum": {
"provided_md5": "d41d8cd98f00b204e9800998ecf8427e",
"s3_etag": null
},
"metadata": null,
"options": {
"drop_tables": true,
"disable_foreign_keys": true,
"search_replace": null
},
"duration_ms": null,
"error_message": null,
"created_at": "2025-01-15T12:00:00+00:00",
"uploaded_at": null,
"started_at": null,
"completed_at": null,
"upload_url": "https://s3.amazonaws.com/bucket/imports/...",
"upload_expires_at": "2025-01-16T12:00:00+00:00"
},
"message": "Import session created successfully",
"http_status": 201
}{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcdh",
"vector_site_id": "01jfgxk4nqrst5vwx9yz0abcde",
"status": "pending",
"status_label": "Pending",
"scope": null,
"filename": "backup.tar.gz",
"content_length": 161061273600,
"is_multipart": true,
"part_count": 30,
"checksum": {
"provided_md5": null,
"s3_etag": null
},
"metadata": null,
"options": {
"drop_tables": true,
"disable_foreign_keys": true,
"search_replace": null
},
"duration_ms": null,
"error_message": null,
"created_at": "2025-01-15T12:00:00+00:00",
"uploaded_at": null,
"started_at": null,
"completed_at": null,
"upload_id": "abc123",
"upload_parts": [
{
"part_number": 1,
"url": "https://s3.amazonaws.com/..."
}
],
"upload_expires_at": "2025-01-16T12:00:00+00:00"
},
"message": "Import session created successfully",
"http_status": 201
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"site": [
"Site must be in active state to import."
]
},
"message": "Validation failed",
"http_status": 422
}Run Import
Execute an archive import from S3 after the file has been uploaded via the presigned URL(s). Dispatches an async job to perform the import.
For multipart uploads, provide the parts array containing the
part_number and etag for each uploaded part. Each part can be up to
5GB. The server will finalize the multipart upload before starting the
import job.
The import must be in pending or uploaded status and not expired.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
import required | string | The import ID. Example: "01jfgxk4nqrst5vwx9yz0abcdh" |
Body Parameters
| Name | Type | Description |
|---|---|---|
parts optional | string[] | Multipart upload parts (required for multipart uploads). Example: ["architecto"] |
parts[].part_number required | integer | The part number. Example: 1 |
parts[].etag required | string | The ETag returned by S3 for this part. Example: "\"d41d8cd98f00b204e9800998ecf8427e\"" |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/imports/01jfgxk4nqrst5vwx9yz0abcdh/run" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"parts":["architecto"]}'$response = $vectorPro
->sites.imports.run
->post('01jfgxk4nqrst5vwx9yz0abcde', '01jfgxk4nqrst5vwx9yz0abcdh', [
'parts' => ['architecto'],
]);const response = await vectorPro
.sites.imports.run
.post('01jfgxk4nqrst5vwx9yz0abcde', '01jfgxk4nqrst5vwx9yz0abcdh', {
parts: ['architecto'],
});Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcdh",
"vector_site_id": "01jfgxk4nqrst5vwx9yz0abcde",
"status": "uploaded",
"status_label": "Uploaded",
"scope": null,
"filename": "backup.sql.gz",
"content_length": 52428800,
"is_multipart": false,
"part_count": null,
"checksum": {
"provided_md5": "d41d8cd98f00b204e9800998ecf8427e",
"s3_etag": null
},
"metadata": null,
"options": {
"drop_tables": true,
"disable_foreign_keys": true,
"search_replace": null
},
"duration_ms": null,
"error_message": null,
"created_at": "2025-01-15T12:00:00+00:00",
"uploaded_at": "2025-01-15T12:00:01+00:00",
"started_at": null,
"completed_at": null
},
"message": "Archive import started",
"http_status": 202
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Import not found",
"http_status": 404
}{
"data": {},
"errors": {
"status": [
"Import must be in pending or uploaded status"
]
},
"message": "Import is not ready to run",
"http_status": 422
}{
"data": {},
"errors": {
"expires_at": [
"Please create a new import session"
]
},
"message": "Import session has expired",
"http_status": 422
}{
"data": {},
"errors": {
"parts": [
"Failed to complete multipart upload"
]
},
"message": "Failed to finalize upload",
"http_status": 422
}Logs
Fetch logs for a Vector site. Supports filtering by time range, environment, deployment, and log level. Rate limited to 60 queries per hour per account.
Get Logs
Retrieves logs for the specified Vector site. Logs are returned in reverse chronological order (newest first).
Use the environment, deployment_id, and level filters to narrow down results.
Use cursor-based pagination for large result sets.
Rate limited to 60 queries per hour per account. Query time window is limited to 24 hours.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Query Parameters
| Name | Type | Description |
|---|---|---|
start_time optional | string | Start time for log query. RFC3339 format or relative (e.g., "now-1h"). Default: now-1h. Example: "now-24h" |
end_time optional | string | End time for log query. RFC3339 format or relative. Default: now. Example: "now" |
limit optional | integer | Maximum number of log entries to return (1-1000). Default: 100. Example: 500 |
environment required | string | The environment name (e.g., prod, staging, dev). Must be an environment that belongs to the site. Example: "prod" |
deployment_id optional | string | Filter by deployment ID. Example: "01jfgxk4nqrst5vwx9yz0abcdh" |
cursor optional | string | Pagination cursor from previous response. Example: "abc123xyz" |
level optional | string | Filter by log level (e.g., error, warning, info). Example: "error" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/logs?start_time=now-24h&end_time=now&limit=500&environment=prod&deployment_id=01jfgxk4nqrst5vwx9yz0abcdh&cursor=abc123xyz&level=error" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $client->sites->getLogs(
'01jfgxk4nqrst5vwx9yz0abcde',
[
'start_time' => 'now-24h',
'end_time' => 'now',
'limit' => 500,
'environment' => 'prod',
'deployment_id' => '01jfgxk4nqrst5vwx9yz0abcdh',
'cursor' => 'abc123xyz',
'level' => 'error',
]
);const logs = await client.sites.getLogs(
'01jfgxk4nqrst5vwx9yz0abcde',
{
start_time: 'now-24h',
end_time: 'now',
limit: 500,
environment: 'prod',
deployment_id: '01jfgxk4nqrst5vwx9yz0abcdh',
cursor: 'abc123xyz',
level: 'error',
}
);Response
{
"data": {
"logs": {
"tables": [
{
"name": "0",
"columns": [
{
"name": "_time",
"type": "datetime"
},
{
"name": "message",
"type": "string"
},
{
"name": "level",
"type": "string"
}
],
"rows": [
[
"2025-01-15T12:00:00+00:00",
"Request completed",
"info"
]
]
}
],
"status": {
"rowsExamined": 1000,
"rowsMatched": 50
}
},
"cursor": "abc123xyz",
"has_more": true
},
"message": "Logs retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"time_window": [
"The query time window cannot exceed 24 hours."
]
},
"message": "Validation failed",
"http_status": 422
}{
"data": {},
"message": "Too many log queries. Rate limit: 60 per hour.",
"http_status": 429
}SFTP
Manage SFTP access to your site's development container. SFTP provides secure file transfer for uploading themes, plugins, and other files directly to your dev environment.
Reset Password
Generates a new SFTP password for the site's development container. The old password is immediately invalidated.
The new password is returned ONLY in this response. Store it securely—it cannot be retrieved again.
SFTP connection details:
- hostname: ssh.{partner-domain} (e.g., ssh.vectorpages.com)
- port: 22
- username: site subdomain (e.g., my-site)
- password: the generated password
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/sftp/reset-password" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json"$response = $client->sites->resetSftpPassword('01jfgxk4nqrst5vwx9yz0abcde');const response = await client.sites.resetSftpPassword('01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcde",
"your_customer_id": null,
"status": "active",
"status_label": "Active",
"dev_php_version": "8.3",
"tags": [],
"dev_domain": "dev.wispy-dust.vectorpages.com",
"dev_sftp": {
"hostname": "ssh.vectorpages.com",
"port": 22,
"username": "wispy-dust",
"password": "aBcD1234!@#$EfGh5678"
},
"environments": [],
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
},
"message": "SFTP password reset successfully. Store the new password securely - it will not be shown again.",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}SSH Keys
Manage SSH keys installed on specific dev sites. These keys are actually deployed to the site's container and grant SSH access.
When a new dev site is created, account-level default SSH keys are
automatically installed on the site. Use these endpoints to manage
site-specific keys. Account-level defaults are returned by the list
endpoint (flagged with is_account_default: true) but must be managed
via the account-level SSH key endpoints.
List SSH Keys
Retrieves all SSH keys installed on a specific dev site. The response
includes site-specific keys plus any account-level default keys
(flagged with is_account_default: true), which are automatically
installed on every site in the account. Account-level defaults are
read-only from this endpoint — use the account SSH key endpoints to
manage them.
Results are ordered with site-specific keys first, then account-level defaults, each group sorted alphabetically by name.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcdi" |
Query Parameters
| Name | Type | Description |
|---|---|---|
per_page optional | integer | Number of items per page (max 100). Default: 15. Example: 25 |
page optional | integer | Page number for pagination. Default: 1. Example: 1 |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcdi/ssh-keys?per_page=25&page=1" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $client->sites->sshKeys->list('01jfgxk4nqrst5vwx9yz0abcdi');const sshKeys = await client.sites.sshKeys.list('01jfgxk4nqrst5vwx9yz0abcdi');Response
{
"data": [
{
"id": "01jfgxk4nqrst5vwx9yz0abcdi",
"account_id": 1,
"vector_site_id": "01jfgxk4nqrst5vwx9yz0abcdj",
"name": "developer key",
"fingerprint": "SHA256:abc123def456...",
"public_key_preview": "ssh-rsa AAAAB3NzaC1yc2EA...user@host",
"is_account_default": false,
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
},
{
"id": "01jfgxk4nqrst5vwx9yz0abcdl",
"account_id": 1,
"vector_site_id": null,
"name": "account default key",
"fingerprint": "SHA256:def789abc012...",
"public_key_preview": "ssh-ed25519 AAAAC3NzaC1l...team@account",
"is_account_default": true,
"created_at": "2025-01-10T09:00:00+00:00",
"updated_at": "2025-01-10T09:00:00+00:00"
}
],
"links": {},
"meta": {},
"message": "SSH keys retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Add SSH Key
Adds a new SSH key to a specific dev site. The key will be deployed to the site's container and grant SSH access.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcdi" |
Body Parameters
| Name | Type | Description |
|---|---|---|
name required | string | A friendly name for the SSH key. Example: "developer key" |
public_key required | string | The SSH public key in OpenSSH format. Example: "ssh-rsa AAAAB3NzaC1yc2EA... user@host" |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcdi/ssh-keys" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"name":"developer key","public_key":"ssh-rsa AAAAB3NzaC1yc2EA... user@host"}'$response = $client->sites->sshKeys->add(
'01jfgxk4nqrst5vwx9yz0abcdi',
[
'name' => 'developer key',
'public_key' => 'ssh-rsa AAAAB3NzaC1yc2EA... user@host',
]
);const response = await client.sites.sshKeys.add(
'01jfgxk4nqrst5vwx9yz0abcdi',
{
name: 'developer key',
public_key: 'ssh-rsa AAAAB3NzaC1yc2EA... user@host',
}
);Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcdi",
"account_id": 1,
"vector_site_id": "01jfgxk4nqrst5vwx9yz0abcdj",
"name": "developer key",
"fingerprint": "SHA256:abc123def456...",
"public_key_preview": "ssh-rsa AAAAB3NzaC1yc2EA...user@host",
"is_account_default": false,
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
},
"message": "SSH key added to site successfully",
"http_status": 201
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"public_key": [
"Unable to parse SSH public key. Ensure it is in valid OpenSSH format."
]
},
"message": "Validation failed",
"http_status": 422
}{
"data": {},
"errors": {
"public_key": [
"This SSH key is already installed on this site."
]
},
"message": "Validation failed",
"http_status": 422
}Remove SSH Key
Removes a site-specific SSH key from a dev site. The key will be removed from the site's container and SSH access will be revoked.
Only keys that belong to this specific site may be removed here —
account-level default keys (is_account_default: true) are scoped
out and will return 404 via this endpoint. Manage those via the
account SSH key endpoints; removing an account-level key propagates
to every site in the account.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcdi" |
key required | string | The SSH key ID. Example: "01jfgxk4nqrst5vwx9yz0abcdk" |
Request
curl -X DELETE \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcdi/ssh-keys/01jfgxk4nqrst5vwx9yz0abcdk" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $client->sites->sshKeys->remove(
'01jfgxk4nqrst5vwx9yz0abcdi',
'01jfgxk4nqrst5vwx9yz0abcdk'
);const response = await client.sites.sshKeys.remove(
'01jfgxk4nqrst5vwx9yz0abcdi',
'01jfgxk4nqrst5vwx9yz0abcdk'
);Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcdk",
"account_id": 1,
"vector_site_id": "01jfgxk4nqrst5vwx9yz0abcdj",
"name": "developer key",
"fingerprint": "SHA256:abc123def456...",
"public_key_preview": "ssh-rsa AAAAB3NzaC1yc2EA...user@host",
"is_account_default": false,
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
},
"message": "SSH key removed from site successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "SSH key not found on this site",
"http_status": 404
}{
"data": {},
"message": "Site not found",
"http_status": 404
}WAF: Access Lists
Manage WAF access lists including managed threat feeds and custom IP/CIDR/ASN/domain lists. Managed lists are curated threat intelligence feeds that can be enabled/disabled. Custom lists allow you to create your own allowlists or blocklists.
List Access Lists
Retrieves all access lists (managed and custom) for a site, including usage limits.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site. Example: "architecto" |
vectorSite required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/architecto/waf/access-lists" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $vectorPro
->sites.waf.accessLists
->get('architecto', '01jfgxk4nqrst5vwx9yz0abcde');const response = await vectorPro
.sites.waf.accessLists
.get('architecto', '01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {
"managed_lists": [
{
"list_id": 1,
"configuration_id": 42,
"name": "TOR Exit Nodes",
"description": "Known TOR exit node IP addresses",
"is_enabled": true,
"type": 0,
"category": 32,
"action": 0,
"required_plan": 0,
"entry_count": 12345,
"update_frequency": "1.00:00:00",
"last_updated": "2026-04-01T00:00:00Z"
}
],
"custom_lists": [],
"custom_entry_count": 0,
"custom_entry_limit": 10000,
"custom_list_count": 0,
"custom_list_limit": 25
},
"message": "Access lists retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Get Custom Access List
Retrieves a single custom access list with its content.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site. Example: "architecto" |
listId required | integer | The access list ID. Example: 1 |
vectorSite required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/architecto/waf/access-lists/1" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $vectorPro
->sites.waf.accessLists
->get('architecto', 1, '01jfgxk4nqrst5vwx9yz0abcde');const response = await vectorPro
.sites.waf.accessLists
.get('architecto', 1, '01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {
"id": 1,
"name": "Office IPs",
"description": "Trusted office IP ranges",
"type": 0,
"content": "203.0.113.0/24\n198.51.100.1",
"checksum": "abc123",
"entry_count": 2,
"last_modified": "2026-04-01T00:00:00Z"
},
"message": "Custom access list retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Create Custom Access List
Creates a new custom access list with the provided entries.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site. Example: "architecto" |
vectorSite required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
name required | string | The list name (max 255 characters). Example: "Office IPs" |
description optional | string | A description of the list (max 1000 characters). Example: "Trusted office IP ranges" |
type required | integer | The list type (0=IP, 1=CIDR, 2=ASN, 3=Country, 4=Domain, 5=Header). Example: 0 |
content required | string | Newline-separated list entries. Example: "203.0.113.0/24\\n198.51.100.1" |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites/architecto/waf/access-lists" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"name":"Office IPs","description":"Trusted office IP ranges","type":0,"content":"203.0.113.0/24\\n198.51.100.1"}'$response = $vectorPro
->sites.waf.accessLists
->post('architecto', '01jfgxk4nqrst5vwx9yz0abcde', [
'name' => 'Office IPs',
'description' => 'Trusted office IP ranges',
'type' => 0,
'content' => '203.0.113.0/24\n198.51.100.1',
]);const response = await vectorPro
.sites.waf.accessLists
.post('architecto', '01jfgxk4nqrst5vwx9yz0abcde', {
name: 'Office IPs',
description: 'Trusted office IP ranges',
type: 0,
content: '203.0.113.0/24\n198.51.100.1',
});Response
{
"data": {
"id": 1,
"name": "Office IPs",
"description": "Trusted office IP ranges",
"type": 0,
"content": "203.0.113.0/24\n198.51.100.1",
"checksum": "abc123",
"entry_count": 2,
"last_modified": "2026-04-01T00:00:00Z"
},
"message": "Custom access list created successfully",
"http_status": 201
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"name": [
"The name field is required."
]
},
"message": "Validation failed",
"http_status": 422
}Update Custom Access List
Updates a custom access list's name and/or content. Only include fields you want to change.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site. Example: "architecto" |
listId required | integer | The access list ID. Example: 1 |
vectorSite required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
name optional | string | The list name (max 255 characters). Example: "Updated Office IPs" |
content optional | string | Newline-separated list entries. Example: "203.0.113.0/24\\n198.51.100.1\\n10.0.0.0/8" |
Request
curl -X PATCH \
"https://api.builtfast.com/api/v1/vector/sites/architecto/waf/access-lists/1" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"name":"Updated Office IPs","content":"203.0.113.0/24\\n198.51.100.1\\n10.0.0.0/8"}'$response = $vectorPro
->sites.waf.accessLists
->patch('architecto', 1, '01jfgxk4nqrst5vwx9yz0abcde', [
'name' => 'Updated Office IPs',
'content' => '203.0.113.0/24\n198.51.100.1\n10.0.0.0/8',
]);const response = await vectorPro
.sites.waf.accessLists
.patch('architecto', 1, '01jfgxk4nqrst5vwx9yz0abcde', {
name: 'Updated Office IPs',
content: '203.0.113.0/24\n198.51.100.1\n10.0.0.0/8',
});Response
{
"data": {
"id": 1,
"name": "Updated Office IPs",
"description": "Trusted office IP ranges",
"type": 0,
"content": "203.0.113.0/24\n198.51.100.1\n10.0.0.0/8",
"checksum": "def456",
"entry_count": 3,
"last_modified": "2026-04-07T00:00:00Z"
},
"message": "Custom access list updated successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"name": [
"The name must be a string."
]
},
"message": "Validation failed",
"http_status": 422
}Delete Custom Access List
Permanently deletes a custom access list. This action cannot be undone.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site. Example: "architecto" |
listId required | integer | The access list ID. Example: 1 |
vectorSite required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X DELETE \
"https://api.builtfast.com/api/v1/vector/sites/architecto/waf/access-lists/1" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $vectorPro
->sites.waf.accessLists
->delete('architecto', 1, '01jfgxk4nqrst5vwx9yz0abcde');const response = await vectorPro
.sites.waf.accessLists
.delete('architecto', 1, '01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {},
"message": "Custom access list deleted successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Update Access List Configuration
Updates the configuration (enable/disable and action) for any access list (managed or custom).
Use the configuration_id from the index response, not the list_id.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site. Example: "architecto" |
configId required | integer | The access list configuration ID. Example: 42 |
vectorSite required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
is_enabled optional | boolean | Whether the list is enabled. Example: true |
action optional | integer | The action to take (0=Block, 1=Log, 2=Allow, 3=Challenge, 4=Captcha, 5=Bypass). Example: 0 |
Request
curl -X PATCH \
"https://api.builtfast.com/api/v1/vector/sites/architecto/waf/access-lists/configurations/42" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"is_enabled":true,"action":0}'$response = $vectorPro
->sites.waf.accessLists.configurations
->patch('architecto', 42, '01jfgxk4nqrst5vwx9yz0abcde', [
'is_enabled' => true,
'action' => 0,
]);const response = await vectorPro
.sites.waf.accessLists.configurations
.patch('architecto', 42, '01jfgxk4nqrst5vwx9yz0abcde', {
is_enabled: true,
action: 0,
});Response
{
"data": {},
"message": "Access list configuration updated successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"action": [
"The action must be 0 (Block), 1 (Log), 2 (Allow), 3 (Challenge), 4 (Captcha), or 5 (Bypass)."
]
},
"message": "Validation failed",
"http_status": 422
}Get Access List Enums
Retrieves available enum values for access list types, actions, and categories.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site. Example: "architecto" |
vectorSite required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/architecto/waf/access-lists/enums" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $vectorPro
->sites.waf.accessLists.enums
->get('architecto', '01jfgxk4nqrst5vwx9yz0abcde');const response = await vectorPro
.sites.waf.accessLists.enums
.get('architecto', '01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {},
"message": "Access list enums retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}WAF: Blocked IPs
Block specific IP addresses or CIDR ranges from accessing your site.
Blocked IPs receive a 403 Forbidden response.
- Single IPs:
192.0.2.1 - CIDR ranges:
198.51.100.0/24
List Blocked IPs
Retrieves all blocked IP addresses for a site.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/waf/blocked-ips" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $client->sites->waf->listBlockedIPs('01jfgxk4nqrst5vwx9yz0abcde');const blockedIPs = await client.sites.waf.listBlockedIPs('01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": [
{
"ip": "192.0.2.1"
},
{
"ip": "198.51.100.0/24"
}
],
"message": "Blocked IPs retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Add Blocked IP
Adds an IP address to the blocked list. Supports both IPv4 and IPv6 addresses.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
ip required | string | The IP address to block. Example: "192.0.2.1" |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/waf/blocked-ips" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"ip":"192.0.2.1"}'$response = $client->sites->waf->addBlockedIP(
'01jfgxk4nqrst5vwx9yz0abcde',
[
'ip' => '192.0.2.1',
]
);const response = await client.sites.waf.addBlockedIP(
'01jfgxk4nqrst5vwx9yz0abcde',
{
ip: '192.0.2.1',
}
);Response
{
"data": {
"ip": "192.0.2.1"
},
"message": "Blocked IP added successfully",
"http_status": 201
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"ip": [
"The ip field is required."
]
},
"message": "Validation failed",
"http_status": 422
}Remove Blocked IP
Removes an IP address from the blocked list.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
ip required | string | The IP address to remove. Example: "192.0.2.1" |
Request
curl -X DELETE \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/waf/blocked-ips/192.0.2.1" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $client->sites->waf->removeBlockedIP(
'01jfgxk4nqrst5vwx9yz0abcde',
'192.0.2.1'
);const response = await client.sites.waf.removeBlockedIP(
'01jfgxk4nqrst5vwx9yz0abcde',
'192.0.2.1'
);Response
{
"data": {
"ip": "192.0.2.1"
},
"message": "Blocked IP removed successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Blocked IP not found",
"http_status": 404
}{
"data": {},
"message": "Site not found",
"http_status": 404
}WAF: Bot Detection
Manage bot detection settings including execution mode, sensitivity levels, and browser fingerprint configuration.
Get Bot Detection Settings
Retrieves the current bot detection configuration for a site.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site. Example: "architecto" |
vectorSite required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/architecto/waf/bot-detection" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $vectorPro
->sites.waf.botDetection
->get('architecto', '01jfgxk4nqrst5vwx9yz0abcde');const response = await vectorPro
.sites.waf.botDetection
.get('architecto', '01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {
"execution_mode": 1,
"request_integrity_sensitivity": 2,
"ip_address_sensitivity": 1,
"browser_fingerprint_sensitivity": 2,
"browser_fingerprint_aggression": 1,
"browser_fingerprint_complex_enabled": false
},
"message": "Bot detection settings retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Update Bot Detection Settings
Updates bot detection configuration for a site. All fields are optional — only include fields you want to change. Omitted fields retain their current values.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site. Example: "architecto" |
vectorSite required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
execution_mode optional | integer | Execution mode (0=Off, 1=On). Example: 1 |
request_integrity_sensitivity optional | integer | Request integrity sensitivity (0=Off, 1=Low, 2=Medium, 3=High). Example: 2 |
ip_address_sensitivity optional | integer | IP address sensitivity (0=Off, 1=Low, 2=Medium, 3=High). Example: 1 |
browser_fingerprint_sensitivity optional | integer | Browser fingerprint sensitivity (0=Off, 1=Low, 2=Medium, 3=High). Example: 2 |
browser_fingerprint_aggression optional | integer | Browser fingerprint aggression (0=Off, 1=Low, 2=Medium, 3=High, 4=VeryHigh). Example: 1 |
browser_fingerprint_complex_enabled optional | boolean | Enable complex browser fingerprinting. Example: false |
Request
curl -X PUT \
"https://api.builtfast.com/api/v1/vector/sites/architecto/waf/bot-detection" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"execution_mode":1,"request_integrity_sensitivity":2,"ip_address_sensitivity":1,"browser_fingerprint_sensitivity":2,"browser_fingerprint_aggression":1,"browser_fingerprint_complex_enabled":false}'$response = $vectorPro
->sites.waf.botDetection
->put('architecto', '01jfgxk4nqrst5vwx9yz0abcde', [
'execution_mode' => 1,
'request_integrity_sensitivity' => 2,
'ip_address_sensitivity' => 1,
'browser_fingerprint_sensitivity' => 2,
'browser_fingerprint_aggression' => 1,
'browser_fingerprint_complex_enabled' => false,
]);const response = await vectorPro
.sites.waf.botDetection
.put('architecto', '01jfgxk4nqrst5vwx9yz0abcde', {
execution_mode: 1,
request_integrity_sensitivity: 2,
ip_address_sensitivity: 1,
browser_fingerprint_sensitivity: 2,
browser_fingerprint_aggression: 1,
browser_fingerprint_complex_enabled: false,
});Response
{
"data": {
"execution_mode": 1,
"request_integrity_sensitivity": 2,
"ip_address_sensitivity": 1,
"browser_fingerprint_sensitivity": 2,
"browser_fingerprint_aggression": 1,
"browser_fingerprint_complex_enabled": false
},
"message": "Bot detection settings updated successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"execution_mode": [
"The execution mode must be 0 (Off) or 1 (On)."
]
},
"message": "Validation failed",
"http_status": 422
}WAF: DDoS Protection
Manage DDoS protection settings including sensitivity, execution mode, and challenge window.
Get DDoS Protection Settings
Retrieves the current DDoS protection configuration for a site.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site. Example: "architecto" |
vectorSite required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/architecto/waf/ddos" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $vectorPro
->sites.waf.ddos
->get('architecto', '01jfgxk4nqrst5vwx9yz0abcde');const response = await vectorPro
.sites.waf.ddos
.get('architecto', '01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {
"enabled": true,
"protection_type": 1,
"sensitivity": 2,
"execution_mode": 1,
"challenge_window": 30
},
"message": "DDoS protection settings retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Update DDoS Protection Settings
Updates DDoS protection configuration for a site. All fields are optional — only include fields you want to change. Omitted fields retain their current values.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site. Example: "architecto" |
vectorSite required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
enabled optional | boolean | Enable or disable DDoS protection. Example: true |
protection_type optional | integer | Protection type (0=DetectOnly, 1=ActiveStandard, 2=ActiveAggressive). Example: 1 |
sensitivity optional | integer | Shield sensitivity (0=Off, 1=Low, 2=Medium, 3=High, 4=VeryHigh). Example: 2 |
execution_mode optional | integer | Execution mode (0=Off, 1=On). Example: 1 |
challenge_window optional | integer | Challenge window in seconds. Example: 30 |
Request
curl -X PUT \
"https://api.builtfast.com/api/v1/vector/sites/architecto/waf/ddos" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"enabled":true,"protection_type":1,"sensitivity":2,"execution_mode":1,"challenge_window":30}'$response = $vectorPro
->sites.waf.ddos
->put('architecto', '01jfgxk4nqrst5vwx9yz0abcde', [
'enabled' => true,
'protection_type' => 1,
'sensitivity' => 2,
'execution_mode' => 1,
'challenge_window' => 30,
]);const response = await vectorPro
.sites.waf.ddos
.put('architecto', '01jfgxk4nqrst5vwx9yz0abcde', {
enabled: true,
protection_type: 1,
sensitivity: 2,
execution_mode: 1,
challenge_window: 30,
});Response
{
"data": {
"enabled": true,
"protection_type": 1,
"sensitivity": 2,
"execution_mode": 1,
"challenge_window": 30
},
"message": "DDoS protection settings updated successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"sensitivity": [
"The sensitivity must be 0 (Off), 1 (Low), 2 (Medium), 3 (High), or 4 (VeryHigh)."
]
},
"message": "Validation failed",
"http_status": 422
}WAF: Profiles
List available WAF profiles that can be assigned to a site.
List WAF Profiles
Retrieves the available WAF profiles that can be assigned to a site.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site. Example: "architecto" |
vectorSite required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/architecto/waf/profiles" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $vectorPro
->sites.waf.profiles
->get('architecto', '01jfgxk4nqrst5vwx9yz0abcde');const response = await vectorPro
.sites.waf.profiles
.get('architecto', '01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": [
{
"Id": 1,
"Name": "Default"
},
{
"Id": 2,
"Name": "WordPress"
}
],
"message": "WAF profiles retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}WAF: Rate Limits
Protect against DDoS, brute force, and API abuse by limiting request frequency.
Each rule defines:
- Threshold: Requests allowed within a time window
- Block Duration: How long to block offending clients (30s to 1 hour)
- Matching Criteria: Target specific paths, methods, or request patterns
Maximum 25 rate limit rules per site.
List Rate Limits
Retrieves all rate limit rules configured for a site.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/waf/rate-limits" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $client->sites->waf->listRateLimits('01jfgxk4nqrst5vwx9yz0abcde');const rateLimits = await client.sites.waf.listRateLimits('01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": [
{
"id": 12345,
"name": "API Rate Limit",
"description": "Limit API requests to 100/second",
"shield_zone_id": 67890,
"configuration": {
"request_count": 100,
"timeframe": 1,
"block_time": 60,
"value": "/api/*",
"action": "rate-limit",
"operator": "begins-with",
"variables": [
"request-uri"
],
"transformations": [
"lowercase"
]
}
}
],
"message": "Rate limits retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Get Rate Limit
Retrieves a specific rate limit rule by ID.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
rule required | integer | The rate limit rule ID. Example: 12345 |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/waf/rate-limits/12345" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $client->sites->waf->getRateLimit(
'01jfgxk4nqrst5vwx9yz0abcde',
'12345'
);const rateLimit = await client.sites.waf.getRateLimit(
'01jfgxk4nqrst5vwx9yz0abcde',
'12345'
);Response
{
"data": {
"id": 12345,
"name": "API Rate Limit",
"description": "Limit API requests to 100/second",
"shield_zone_id": 67890,
"configuration": {
"request_count": 100,
"timeframe": 1,
"block_time": 60,
"value": "/api/*",
"action": "rate-limit",
"operator": "begins-with",
"variables": [
"request-uri"
],
"transformations": [
"lowercase"
]
}
},
"message": "Rate limit retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Rate limit not found",
"http_status": 404
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Create Rate Limit
Creates a new rate limit rule for a site. Maximum 25 rate limit rules per zone.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
name required | string | The rule name (max 255 characters). Example: "API Rate Limit" |
description optional | string | The rule description (max 1000 characters). Example: "Limit API requests to prevent abuse" |
request_count required | integer | Number of requests allowed within the timeframe. Must be between 1 and 1,000,000. Example: 100 |
timeframe required | integer | Time window for counting requests. Must be exactly 1 (per second) or 10 (per 10 seconds). Example: 1 |
block_time required | integer | Duration to block clients who exceed the limit, in seconds. Must be one of: 30, 60, 300, 900, 1800, 3600. Example: 60 |
value optional | string | URL path or pattern to match against. Max 2048 characters. Example: "/api/*" |
operator optional | string | Match operator for comparing against the value. Must be one of: begins-with, ends-with, contains, contains-word, str-match, eq, ge, gt, le, lt, within, regex, str-eq, detect-sqli, detect-xss. Example: "begins-with" |
transformations optional | string[] | Transformations to apply to variable values before matching. Each must be one of: cmdline, compress-whitespace, css-decode, hex-encode, html-entity-decode, js-decode, length, lowercase, md5, normalize-path, normalise-path, normalize-path-win, normalise-path-win, remove-comments, remove-nulls, remove-whitespace, replace-comments, sha1, url-decode, url-decode-uni, utf8-to-unicode. Example: ["lowercase","url-decode"] |
variables optional | string[] | Request variables to inspect when matching. Each must be one of: request-uri, request-uri-raw, args, args-combined-size, args-get, args-get-names, args-post, args-post-names, files-names, geo, remote-addr, query-string, request-basename, request-body, request-cookies-names, request-cookies, request-filename, request-headers-names, request-headers, request-line, request-method, request-protocol, response-body, response-headers, response-status. Example: ["request-uri"] |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/waf/rate-limits" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"name":"API Rate Limit","description":"Limit API requests to prevent abuse","request_count":100,"timeframe":1,"block_time":60,"value":"/api/*","operator":"begins-with","transformations":["lowercase","url-decode"],"variables":["request-uri"]}'$response = $client->sites->waf->createRateLimit(
'01jfgxk4nqrst5vwx9yz0abcde',
[
'name' => 'API Rate Limit',
'description' => 'Limit API requests to prevent abuse',
'request_count' => 100,
'timeframe' => 1,
'block_time' => 60,
'value' => '/api/*',
'operator' => 'begins-with',
'transformations' => ['lowercase', 'url-decode'],
'variables' => ['request-uri'],
]
);const rateLimit = await client.sites.waf.createRateLimit(
'01jfgxk4nqrst5vwx9yz0abcde',
{
name: 'API Rate Limit',
description: 'Limit API requests to prevent abuse',
request_count: 100,
timeframe: 1,
block_time: 60,
value: '/api/*',
operator: 'begins-with',
transformations: ['lowercase', 'url-decode'],
variables: ['request-uri'],
}
);Response
{
"data": {
"id": 12345,
"name": "API Rate Limit",
"description": "Limit API requests to prevent abuse",
"shield_zone_id": 67890,
"configuration": {
"request_count": 100,
"timeframe": 1,
"block_time": 60,
"value": "/api/*",
"action": "rate-limit",
"operator": "begins-with",
"variables": [
"request-uri"
],
"transformations": [
"lowercase",
"url-decode"
]
}
},
"message": "Rate limit created successfully",
"http_status": 201
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"timeframe": [
"The timeframe field must be a valid enum value."
],
"block_time": [
"The block duration field must be a valid enum value."
]
},
"message": "Validation failed",
"http_status": 422
}{
"data": {},
"message": "Rate limit rule limit reached (25 rules per zone)",
"http_status": 422
}Update Rate Limit
Updates an existing rate limit rule. All fields are optional - only include fields you want to change. Omitted fields retain their current values.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
rule required | integer | The rate limit rule ID. Example: 12345 |
Body Parameters
| Name | Type | Description |
|---|---|---|
name optional | string | The rule name (max 255 characters). Example: "Updated Rate Limit" |
description optional | string | The rule description (max 1000 characters). Example: "Updated description for the rule" |
request_count optional | integer | Number of requests allowed within the timeframe. Must be between 1 and 1,000,000. Example: 200 |
timeframe optional | integer | Time window for counting requests. Must be exactly 1 (per second) or 10 (per 10 seconds). Example: 10 |
block_time optional | integer | Duration to block clients who exceed the limit, in seconds. Must be one of: 30, 60, 300, 900, 1800, 3600. Example: 300 |
value optional | string | URL path or pattern to match against. Max 2048 characters. Example: "/api/v2/*" |
operator optional | string | Match operator for comparing against the value. Must be one of: begins-with, ends-with, contains, contains-word, str-match, eq, ge, gt, le, lt, within, regex, str-eq, detect-sqli, detect-xss. Example: "regex" |
transformations optional | string[] | Transformations to apply to variable values before matching. Each must be one of: cmdline, compress-whitespace, css-decode, hex-encode, html-entity-decode, js-decode, length, lowercase, md5, normalize-path, normalise-path, normalize-path-win, normalise-path-win, remove-comments, remove-nulls, remove-whitespace, replace-comments, sha1, url-decode, url-decode-uni, utf8-to-unicode. Example: ["lowercase"] |
variables optional | string[] | Request variables to inspect when matching. Each must be one of: request-uri, request-uri-raw, args, args-combined-size, args-get, args-get-names, args-post, args-post-names, files-names, geo, remote-addr, query-string, request-basename, request-body, request-cookies-names, request-cookies, request-filename, request-headers-names, request-headers, request-line, request-method, request-protocol, response-body, response-headers, response-status. Example: ["request-uri","query-string"] |
Request
curl -X PUT \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/waf/rate-limits/12345" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"name":"Updated Rate Limit","description":"Updated description for the rule","request_count":200,"timeframe":10,"block_time":300,"value":"/api/v2/*","operator":"regex","transformations":["lowercase"],"variables":["request-uri","query-string"]}'$response = $client->sites->waf->updateRateLimit(
'01jfgxk4nqrst5vwx9yz0abcde',
'12345',
[
'name' => 'Updated Rate Limit',
'description' => 'Updated description for the rule',
'request_count' => 200,
'timeframe' => 10,
'block_time' => 300,
'value' => '/api/v2/*',
'operator' => 'regex',
'transformations' => ['lowercase'],
'variables' => ['request-uri', 'query-string'],
]
);const rateLimit = await client.sites.waf.updateRateLimit(
'01jfgxk4nqrst5vwx9yz0abcde',
'12345',
{
name: 'Updated Rate Limit',
description: 'Updated description for the rule',
request_count: 200,
timeframe: 10,
block_time: 300,
value: '/api/v2/*',
operator: 'regex',
transformations: ['lowercase'],
variables: ['request-uri', 'query-string'],
}
);Response
{
"data": {
"id": 12345,
"name": "Updated Rate Limit",
"description": "Updated description for the rule",
"shield_zone_id": 67890,
"configuration": {
"request_count": 200,
"timeframe": 10,
"block_time": 300,
"value": "/api/v2/*",
"action": "rate-limit",
"operator": "regex",
"variables": [
"request-uri",
"query-string"
],
"transformations": [
"lowercase"
]
}
},
"message": "Rate limit updated successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Rate limit not found",
"http_status": 404
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"operator": [
"The match operator field must be a valid enum value."
]
},
"message": "Validation failed",
"http_status": 422
}Delete Rate Limit
Permanently deletes a rate limit rule. This action cannot be undone.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
rule required | integer | The rate limit rule ID. Example: 12345 |
Request
curl -X DELETE \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/waf/rate-limits/12345" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $client->sites->waf->deleteRateLimit(
'01jfgxk4nqrst5vwx9yz0abcde',
'12345'
);const response = await client.sites.waf.deleteRateLimit(
'01jfgxk4nqrst5vwx9yz0abcde',
'12345'
);Response
{
"data": {},
"message": "Rate limit deleted successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Rate limit not found",
"http_status": 404
}{
"data": {},
"message": "Site not found",
"http_status": 404
}WAF: Referrers
Control which sites can link to your content using referrer-based rules.
- Blocked Referrers: Block hotlinking from specific domains
- Allowed Referrers: Restrict access to requests from approved domains only
Supports wildcards: *.example.com matches all subdomains.
List Allowed Referrers
Retrieves all allowed referrer hostnames for a site.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/waf/allowed-referrers" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $client->sites->waf->listAllowedReferrers('01jfgxk4nqrst5vwx9yz0abcde');const referrers = await client.sites.waf.listAllowedReferrers('01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": [
{
"hostname": "example.com"
},
{
"hostname": "*.example.net"
}
],
"message": "Allowed referrers retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Add Allowed Referrer
Adds a hostname to the allowed referrers list. Wildcards are supported (e.g., *.example.com).
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
hostname required | string | The hostname to allow. Example: "example.com" |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/waf/allowed-referrers" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"hostname":"example.com"}'$response = $client->sites->waf->addAllowedReferrer(
'01jfgxk4nqrst5vwx9yz0abcde',
[
'hostname' => 'example.com',
]
);const response = await client.sites.waf.addAllowedReferrer(
'01jfgxk4nqrst5vwx9yz0abcde',
{
hostname: 'example.com',
}
);Response
{
"data": {
"hostname": "example.com"
},
"message": "Allowed referrer added successfully",
"http_status": 201
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"hostname": [
"The hostname field is required."
]
},
"message": "Validation failed",
"http_status": 422
}Remove Allowed Referrer
Removes a hostname from the allowed referrers list.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
hostname required | string | The hostname to remove. Example: "example.com" |
Request
curl -X DELETE \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/waf/allowed-referrers/example.com" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $client->sites->waf->removeAllowedReferrer(
'01jfgxk4nqrst5vwx9yz0abcde',
'example.com'
);const response = await client.sites.waf.removeAllowedReferrer(
'01jfgxk4nqrst5vwx9yz0abcde',
'example.com'
);Response
{
"data": {
"hostname": "example.com"
},
"message": "Allowed referrer removed successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Allowed referrer not found",
"http_status": 404
}{
"data": {},
"message": "Site not found",
"http_status": 404
}List Blocked Referrers
Retrieves all blocked referrer hostnames for a site.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/waf/blocked-referrers" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $client->sites->waf->listBlockedReferrers('01jfgxk4nqrst5vwx9yz0abcde');const referrers = await client.sites.waf.listBlockedReferrers('01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": [
{
"hostname": "spam.example.com"
},
{
"hostname": "*.example.net"
}
],
"message": "Blocked referrers retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Add Blocked Referrer
Adds a hostname to the blocked referrers list. Wildcards are supported (e.g., *.example.com).
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
hostname required | string | The hostname to block. Example: "spam.example.com" |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/waf/blocked-referrers" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"hostname":"spam.example.com"}'$response = $client->sites->waf->addBlockedReferrer(
'01jfgxk4nqrst5vwx9yz0abcde',
[
'hostname' => 'spam.example.com',
]
);const response = await client.sites.waf.addBlockedReferrer(
'01jfgxk4nqrst5vwx9yz0abcde',
{
hostname: 'spam.example.com',
}
);Response
{
"data": {
"hostname": "spam.example.com"
},
"message": "Blocked referrer added successfully",
"http_status": 201
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"hostname": [
"The hostname field is required."
]
},
"message": "Validation failed",
"http_status": 422
}Remove Blocked Referrer
Removes a hostname from the blocked referrers list.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
hostname required | string | The hostname to remove. Example: "spam.example.com" |
Request
curl -X DELETE \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/waf/blocked-referrers/spam.example.com" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $client->sites->waf->removeBlockedReferrer(
'01jfgxk4nqrst5vwx9yz0abcde',
'spam.example.com'
);const response = await client.sites.waf.removeBlockedReferrer(
'01jfgxk4nqrst5vwx9yz0abcde',
'spam.example.com'
);Response
{
"data": {
"hostname": "spam.example.com"
},
"message": "Blocked referrer removed successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Blocked referrer not found",
"http_status": 404
}{
"data": {},
"message": "Site not found",
"http_status": 404
}WAF: Settings
Manage WAF core configuration including execution mode, profiles, rule groups, and payload limits.
Get WAF Settings
Retrieves the current WAF configuration for a site.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site. Example: "architecto" |
vectorSite required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X GET \
"https://api.builtfast.com/api/v1/vector/sites/architecto/waf/settings" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json"$response = $vectorPro
->sites.waf.settings
->get('architecto', '01jfgxk4nqrst5vwx9yz0abcde');const response = await vectorPro
.sites.waf.settings
.get('architecto', '01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {
"enabled": true,
"learning_mode": false,
"profile_id": 1,
"execution_mode": 1,
"disabled_rules": [],
"log_only_rules": [],
"request_header_logging": false,
"request_body_limit_action": 0,
"response_body_limit_action": 0,
"realtime_threat_intelligence": true
},
"message": "WAF settings retrieved successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}Update WAF Settings
Updates WAF configuration for a site. All fields are optional — only include fields you want to change. Omitted fields retain their current values.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site. Example: "architecto" |
vectorSite required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Body Parameters
| Name | Type | Description |
|---|---|---|
enabled optional | boolean | Enable or disable WAF. Example: true |
learning_mode optional | boolean | Enable learning mode (log without blocking). Example: false |
profile_id optional | integer | WAF profile ID. Example: 1 |
execution_mode optional | integer | WAF execution mode (0=Log, 1=Block). Example: 1 |
disabled_rules optional | string[] | Array of individual disabled rule IDs. Example: ["rule-1"] |
log_only_rules optional | string[] | Array of rules set to log-only mode. Example: ["rule-2"] |
request_header_logging optional | boolean | Log request headers. Example: false |
request_body_limit_action optional | integer | Request body limit action (0=ProcessPartial, 1=Reject, 2=Ignore). Example: 0 |
response_body_limit_action optional | integer | Response body limit action (0=ProcessPartial, 1=Reject, 2=Ignore). Example: 0 |
realtime_threat_intelligence optional | boolean | Enable realtime threat intelligence feeds. Example: true |
Request
curl -X PUT \
"https://api.builtfast.com/api/v1/vector/sites/architecto/waf/settings" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"enabled":true,"learning_mode":false,"profile_id":1,"execution_mode":1,"disabled_rules":["rule-1"],"log_only_rules":["rule-2"],"request_header_logging":false,"request_body_limit_action":0,"response_body_limit_action":0,"realtime_threat_intelligence":true}'$response = $vectorPro
->sites.waf.settings
->put('architecto', '01jfgxk4nqrst5vwx9yz0abcde', [
'enabled' => true,
'learning_mode' => false,
'profile_id' => 1,
'execution_mode' => 1,
'disabled_rules' => ['rule-1'],
'log_only_rules' => ['rule-2'],
'request_header_logging' => false,
'request_body_limit_action' => 0,
'response_body_limit_action' => 0,
'realtime_threat_intelligence' => true,
]);const response = await vectorPro
.sites.waf.settings
.put('architecto', '01jfgxk4nqrst5vwx9yz0abcde', {
enabled: true,
learning_mode: false,
profile_id: 1,
execution_mode: 1,
disabled_rules: ['rule-1'],
log_only_rules: ['rule-2'],
request_header_logging: false,
request_body_limit_action: 0,
response_body_limit_action: 0,
realtime_threat_intelligence: true,
});Response
{
"data": {
"enabled": true,
"learning_mode": false,
"execution_mode": 1
},
"message": "WAF settings updated successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"execution_mode": [
"The execution mode must be 0 (Log) or 1 (Block)."
]
},
"message": "Validation failed",
"http_status": 422
}WordPress
Manage WordPress configuration for your site's development container.
Regenerate wp-config.php
Regenerates the wp-config.php file for the site's development container with current database credentials, WP_HOME/WP_SITEURL, and HMAC secret.
URL Parameters
| Name | Type | Description |
|---|---|---|
site required | string | The site ID. Example: "01jfgxk4nqrst5vwx9yz0abcde" |
Request
curl -X POST \
"https://api.builtfast.com/api/v1/vector/sites/01jfgxk4nqrst5vwx9yz0abcde/wp/reconfig" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json"$response = $vectorPro
->sites.wp.reconfig
->post('01jfgxk4nqrst5vwx9yz0abcde');const response = await vectorPro
.sites.wp.reconfig
.post('01jfgxk4nqrst5vwx9yz0abcde');Response
{
"data": {
"id": "01jfgxk4nqrst5vwx9yz0abcde",
"your_customer_id": null,
"status": "active",
"status_label": "Active",
"dev_php_version": "8.3",
"tags": [],
"dev_domain": "wispy-dust.vectorpages.com",
"environments": [],
"created_at": "2025-01-15T12:00:00+00:00",
"updated_at": "2025-01-15T12:00:00+00:00"
},
"message": "WordPress configuration regenerated successfully",
"http_status": 200
}{
"data": {},
"message": "Unauthenticated",
"http_status": 401
}{
"data": {},
"message": "Site not found",
"http_status": 404
}{
"data": {},
"errors": {
"status": [
"Site must be active to regenerate wp-config. Current state: 'pending'."
]
},
"message": "Site must be active to regenerate wp-config. Current state: 'pending'.",
"http_status": 422
}