Driftwatch

Vercel / Vercel REST API /

Breakingdirection flip: their tools call this safe

type can now return "response_code"

What changed

Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

Affects active.conditions[].conditionGroup[].conditions[].type on GET /v1/security/firewall/config.

New value: response_code.

can now return "response_code"

Who is affected

Code that reads GET /v1/security/firewall/config (active.conditions[].conditionGroup[].conditions[].type).

Before and after

WhereBeforeAfter
GET /v1/security/firewall/config · active.conditions[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
GET /v1/security/firewall/config · active.rules[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
GET /v1/security/firewall/config · active.rulesets[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
GET /v1/security/firewall/config · draft.conditions[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
GET /v1/security/firewall/config · draft.rules[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
GET /v1/security/firewall/config · draft.rulesets[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
GET /v1/security/firewall/config · versions[].conditions[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
GET /v1/security/firewall/config · versions[].rules[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
GET /v1/security/firewall/config · versions[].rulesets[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
PUT /v1/security/firewall/config · active.conditions[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
PUT /v1/security/firewall/config · active.rules[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
PUT /v1/security/firewall/config · active.rulesets[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
GET /v1/security/firewall/config/{configVersion} · conditions[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
GET /v1/security/firewall/config/{configVersion} · rules[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
GET /v1/security/firewall/config/{configVersion} · rulesets[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
POST /v1/security/firewall/config/{configVersion}/activate · conditions[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
POST /v1/security/firewall/config/{configVersion}/activate · rules[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"
POST /v1/security/firewall/config/{configVersion}/activate · rulesets[].conditionGroup[].conditions[].type"bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent""bot_category", "bot_name", "bot_protection", "bot_status", "cookie", "domain_environment", "environment", "geo_as_number", "geo_city", "geo_continent", "geo_country", "geo_country_region", "header", "host", "ip_address", "ja3_digest", "ja4_digest", "method", "path", "protocol", "query", "rate_limit_api_id", "raw_path", "region", "response_code", "route", "ruleset", "scheme", "server_action", "shared_condition", "target_path", "traffic_source", "trusted_source", "user_agent"

Code that breaks

switch (response.active.conditions[0].conditionGroup[0].conditions[0].type) {
  // existing branches …
  // no branch for "response_code"
  default:
    throw new Error("unexpected type");
}

Based on Vercel’s published API specification. How severity is decided.