@lap v0.3
# Machine-readable API spec. Each @endpoint block is one API call.
@api Developer API - Upstash
@base https://api.upstash.com/v2
@version 1.0.0
@auth Bearer basic
@endpoints 58
@hint download_for_search
@toc redis(22), teams(4), auditlogs(1), team(2), vector(10), search(9), qstash(10)

@group redis
@endpoint GET /redis/databases
@desc List Databases
@returns(200) OK

@endpoint GET /redis/database/{id}
@desc Get Database
@required {id: str # The ID of the database}
@optional {credentials: str # Set to 'hide' to remove credentials from the response.}
@returns(200) {database_id: str, database_name: str, region: str, port: int(int64), creation_time: int(int64), state: str, endpoint: str, tls: bool, db_max_clients: int(int64), db_max_request_size: int(int64), db_disk_threshold: int(int64), db_max_entry_size: int(int64), db_memory_threshold: int(int64), db_max_commands_per_second: int(int64), db_request_limit: int(int64), type: str, budget: int(int64), primary_region: str, primary_members: [str], all_members: [str], eviction: bool, auto_upgrade: bool, consistent: bool, modifying_state: str, db_resource_size: str, db_type: str, db_conn_idle_timeout: int(int64), db_lua_timeout: int(int64), db_lua_credits_per_min: int(int64), db_store_max_idle: int(int64), db_max_loads_per_sec: int(int64), db_acl_enabled: str, db_acl_default_user_status: str, db_eviction: bool, last_plan_upgrade_time: int(int64), replicas: int, customer_id: str, daily_backup_enabled: bool, read_regions: [str], securityAddons: map{ipWhitelisting: bool, vpcPeering: bool, privateLink: bool, tlsMutualAuth: bool, encryptionAtRest: bool}, prometheus_enabled: str, prod_pack_enabled: bool} # OK

@endpoint DELETE /redis/database/{id}
@desc Delete Database
@required {id: str # The ID of the database to be deleted}
@returns(200) OK

@endpoint POST /redis/database
@desc Create Redis Database
@required {database_name: str # Name of the database, platform: str(aws/gcp) # Desired cloud platform for the database., primary_region: str(us-east-1/us-east-2/us-west-1/us-west-2/ca-central-1/eu-central-1/eu-west-1/eu-west-2/sa-east-1/ap-south-1/ap-northeast-1/ap-southeast-1/ap-southeast-2/af-south-1/us-central1/us-east4/europe-west1/asia-northeast1) # Primary Region of the Global Database}
@optional {read_regions: [str] # Array of Read Regions of the Database, plan: str(free/payg/fixed_250mb/fixed_1gb/fixed_5gb/fixed_10gb/fixed_50gb/fixed_100gb/fixed_500gb) # Specifies the fixed plan type for the database. If omitted, the database defaults to either the pay-as-you-go or free plan, based on the account type., budget: int # Monthly budget of the database, eviction: bool # Whether to enable eviction for the database, tls: bool # Whether to enable TLS for the database}
@returns(200) {database_id: str, database_name: str, region: str, port: int(int64), creation_time: int(int64), state: str, endpoint: str, tls: bool, db_max_clients: int(int64), db_max_request_size: int(int64), db_disk_threshold: int(int64), db_max_entry_size: int(int64), db_memory_threshold: int(int64), db_max_commands_per_second: int(int64), db_request_limit: int(int64), type: str, budget: int(int64), primary_region: str, primary_members: [str], all_members: [str], eviction: bool, auto_upgrade: bool, consistent: bool, modifying_state: str, db_resource_size: str, db_type: str, db_conn_idle_timeout: int(int64), db_lua_timeout: int(int64), db_lua_credits_per_min: int(int64), db_store_max_idle: int(int64), db_max_loads_per_sec: int(int64), db_acl_enabled: str, db_acl_default_user_status: str, db_eviction: bool, last_plan_upgrade_time: int(int64), replicas: int, customer_id: str, daily_backup_enabled: bool, read_regions: [str], securityAddons: map{ipWhitelisting: bool, vpcPeering: bool, privateLink: bool, tlsMutualAuth: bool, encryptionAtRest: bool}, prometheus_enabled: str, prod_pack_enabled: bool} # Database created successfully

@endpoint POST /redis/rename/{id}
@desc Rename Database
@required {id: str # The ID of the database to be renamed, name: str # The new name of the database}
@returns(200) {database_id: str, database_name: str, region: str, port: int(int64), creation_time: int(int64), state: str, endpoint: str, tls: bool, db_max_clients: int(int64), db_max_request_size: int(int64), db_disk_threshold: int(int64), db_max_entry_size: int(int64), db_memory_threshold: int(int64), db_max_commands_per_second: int(int64), db_request_limit: int(int64), type: str, budget: int(int64), primary_region: str, primary_members: [str], all_members: [str], eviction: bool, auto_upgrade: bool, consistent: bool, modifying_state: str, db_resource_size: str, db_type: str, db_conn_idle_timeout: int(int64), db_lua_timeout: int(int64), db_lua_credits_per_min: int(int64), db_store_max_idle: int(int64), db_max_loads_per_sec: int(int64), db_acl_enabled: str, db_acl_default_user_status: str, db_eviction: bool, last_plan_upgrade_time: int(int64), replicas: int, customer_id: str, daily_backup_enabled: bool, read_regions: [str], securityAddons: map{ipWhitelisting: bool, vpcPeering: bool, privateLink: bool, tlsMutualAuth: bool, encryptionAtRest: bool}, prometheus_enabled: str, prod_pack_enabled: bool} # Database renamed successfully

@endpoint POST /redis/reset-password/{id}
@desc Reset Password
@required {id: str # The ID of the database to reset password}
@returns(200) {database_id: str, database_name: str, region: str, port: int(int64), creation_time: int(int64), state: str, endpoint: str, tls: bool, db_max_clients: int(int64), db_max_request_size: int(int64), db_disk_threshold: int(int64), db_max_entry_size: int(int64), db_memory_threshold: int(int64), db_max_commands_per_second: int(int64), db_request_limit: int(int64), type: str, budget: int(int64), primary_region: str, primary_members: [str], all_members: [str], eviction: bool, auto_upgrade: bool, consistent: bool, modifying_state: str, db_resource_size: str, db_type: str, db_conn_idle_timeout: int(int64), db_lua_timeout: int(int64), db_lua_credits_per_min: int(int64), db_store_max_idle: int(int64), db_max_loads_per_sec: int(int64), db_acl_enabled: str, db_acl_default_user_status: str, db_eviction: bool, last_plan_upgrade_time: int(int64), replicas: int, customer_id: str, daily_backup_enabled: bool, read_regions: [str], securityAddons: map{ipWhitelisting: bool, vpcPeering: bool, privateLink: bool, tlsMutualAuth: bool, encryptionAtRest: bool}, prometheus_enabled: str, prod_pack_enabled: bool} # Password reset successfully

@endpoint POST /redis/enable-tls/{id}
@desc Enable TLS
@required {id: str # The ID of the database to enable TLS}
@returns(200) {database_id: str, database_name: str, region: str, port: int(int64), creation_time: int(int64), state: str, endpoint: str, tls: bool, db_max_clients: int(int64), db_max_request_size: int(int64), db_disk_threshold: int(int64), db_max_entry_size: int(int64), db_memory_threshold: int(int64), db_max_commands_per_second: int(int64), db_request_limit: int(int64), type: str, budget: int(int64), primary_region: str, primary_members: [str], all_members: [str], eviction: bool, auto_upgrade: bool, consistent: bool, modifying_state: str, db_resource_size: str, db_type: str, db_conn_idle_timeout: int(int64), db_lua_timeout: int(int64), db_lua_credits_per_min: int(int64), db_store_max_idle: int(int64), db_max_loads_per_sec: int(int64), db_acl_enabled: str, db_acl_default_user_status: str, db_eviction: bool, last_plan_upgrade_time: int(int64), replicas: int, customer_id: str, daily_backup_enabled: bool, read_regions: [str], securityAddons: map{ipWhitelisting: bool, vpcPeering: bool, privateLink: bool, tlsMutualAuth: bool, encryptionAtRest: bool}, prometheus_enabled: str, prod_pack_enabled: bool} # TLS enabled successfully

@endpoint POST /redis/enable-eviction/{id}
@desc Enable Eviction
@required {id: str # The ID of the database to enable eviction}
@returns(200) Eviction enabled successfully

@endpoint POST /redis/disable-eviction/{id}
@desc Disable Eviction
@required {id: str # The ID of the database to disable eviction}
@returns(200) Eviction disabled successfully

@endpoint POST /redis/enable-autoupgrade/{id}
@desc Enable Auto Upgrade
@required {id: str # The ID of the database to enable auto upgrade}
@returns(200) Auto upgrade enabled successfully

@endpoint POST /redis/disable-autoupgrade/{id}
@desc Disable Auto Upgrade
@required {id: str # The ID of the database to disable auto upgrade}
@returns(200) Auto upgrade disabled successfully

@endpoint POST /redis/change-plan/{id}
@desc Change Database Plan
@required {id: str # The ID of the database whose plan will be changed, plan_name: str(free/payg/fixed_250mb/fixed_1gb/fixed_5gb/fixed_10gb/fixed_50gb/fixed_100gb/fixed_500gb) # The new plan for the database}
@optional {database_id: str # ID of the database, auto_upgrade: bool # Whether to enable automatic upgrade for the database, prod_pack_enabled: bool # Whether to enable the production pack for the database}
@returns(200) Plan changed successfully

@endpoint PATCH /redis/update-budget/{id}
@desc Update Database Budget
@required {id: str # The ID of the database whose budget will be updated, budget: int # The new monthly budget for the database}
@returns(200) Budget updated successfully

@endpoint POST /redis/update-regions/{id}
@desc Update Regions
@required {id: str # The ID of your database, read_regions: [str] # Array of Read Regions of the Database}
@returns(200) Regions updated successfully

@endpoint POST /redis/move-to-team
@desc Move To Team
@required {team_id: str # The ID of the target team, database_id: str # The ID of the database to be moved}
@returns(200) Database moved successfully

@endpoint GET /redis/stats/{id}
@desc Get Database Stats
@required {id: str # The ID of the database}
@returns(200) {monitor_count: map{x: str, y: num}, daily_net_commands: int, daily_read_requests: int, daily_write_requests: int, connection_count: [map], keyspace: [map], throughput: [map], diskusage: [map], latencymean: [map], latency_99: [map], read_latency_mean: [map], read_latency_99: [map], write_latency_mean: [map], write_latency_99: [map], hits: [map], misses: [map], read: [map], write: [map], dailyrequests: [map], days: [str], dailybilling: [map], dailybandwidth: int, bandwidths: [map], total_monthly_bandwidth: int, total_monthly_requests: int, total_monthly_read_requests: int, total_monthly_write_requests: int, total_monthly_script_requests: int, queue_optimized: bool, total_monthly_storage: int, current_storage: int, total_monthly_billing: num(float), command_counts: [map]} # Database stats retrieved successfully

@endpoint GET /redis/list-backup/{id}
@desc List Backup
@required {id: str # The ID of the Redis database}
@returns(200) Backups retrieved successfully

@endpoint POST /redis/create-backup/{id}
@desc Create Backup
@required {id: str # The ID of the Redis database, name: str # Name of the backup}
@returns(200) Backup created successfully

@endpoint DELETE /redis/delete-backup/{id}/{backup_id}
@desc Delete Backup
@required {id: str # The ID of the Redis database, backup_id: str # The ID of the backup to delete}
@returns(200) Backup deleted successfully

@endpoint POST /redis/restore-backup/{id}
@desc Restore Backup
@required {id: str # The ID of the Redis database, backup_id: str # ID of the backup to restore}
@returns(200) Backup restored successfully

@endpoint PATCH /redis/enable-dailybackup/{id}
@desc Enable Daily Backup
@required {id: str # The ID of the Redis database}
@returns(200) Daily backup enabled successfully

@endpoint PATCH /redis/disable-dailybackup/{id}
@desc Disable Daily Backup
@required {id: str # The ID of the Redis database}
@returns(200) Daily backup disabled successfully

@endgroup

@group teams
@endpoint GET /teams
@desc List Teams
@returns(200) Teams retrieved successfully

@endgroup

@group auditlogs
@endpoint GET /auditlogs
@desc List Audit Logs
@returns(200) Audit logs retrieved successfully

@endgroup

@group team
@endpoint POST /team
@desc Create Team
@required {team_name: str # Name of the new team, copy_cc: bool # Whether to copy existing credit card information to team or not}
@returns(200) {team_id: str, team_name: str, copy_cc: bool} # Team created successfully

@endpoint DELETE /team/{id}
@desc Delete Team
@required {id: str # The ID of the team to delete}
@returns(200) Team deleted successfully

@endgroup

@group teams
@endpoint GET /teams/{team_id}
@desc Get Team Members
@required {team_id: str # ID of the team}
@returns(200) Team members retrieved successfully

@endpoint POST /teams/member
@desc Add Team Member
@required {team_id: str # Id of the team to add the member to, member_email: str # Email of the new team member, member_role: str(admin/dev/finance) # Role of the new team member}
@returns(200) {team_id: str, team_name: str, member_email: str, member_role: str, copy_cc: bool} # Team member added successfully

@endpoint DELETE /teams/member
@desc Delete Team Member
@required {team_id: str # Id of the team to remove the member from, member_email: str # Email of the team member to remove}
@returns(200) Team member deleted successfully

@endgroup

@group vector
@endpoint GET /vector/index
@desc List Indices
@returns(200) Indices retrieved successfully

@endpoint POST /vector/index
@desc Create Index
@required {name: str # Name of the index, region: str(eu-west-1/us-east-1/us-central1) # Region of the database, similarity_function: str(COSINE/EUCLIDEAN/DOT_PRODUCT) # Similarity function that's used to calculate the distance between two vectors, dimension_count: num # The amount of values in a single vector}
@optional {type: str(payg/fixed/paid) # The payment plan of your index, embedding_model: str(BGE_SMALL_EN_V1_5/BGE_BASE_EN_V1_5/BGE_LARGE_EN_V1_5/BGE_M3) # The embedding model to use for the index, index_type: str(DENSE/SPARSE/HYBRID) # The type of the vector index, sparse_embedding_model: str(BM25/BGE_M3) # The sparse embedding model to be used for indexes}
@returns(200) {customer_id: str, id: str, name: str, similarity_function: str, dimension_count: num, embedding_model: str, sparse_embedding_model: str, endpoint: str, token: str, read_only_token: str, type: str, region: str, max_vector_count: num, max_daily_updates: num, max_daily_queries: num, max_monthly_bandwidth: num, max_writes_per_second: num, max_query_per_second: num, max_reads_per_request: num, max_writes_per_request: num, max_total_metadata_size: num, reserved_price: num, creation_time: num, index_type: str, throughput_vector: [map]} # Index created successfully

@endpoint GET /vector/index/{id}
@desc Get Index
@required {id: str # The unique ID of the index to fetch}
@returns(200) {customer_id: str, id: str, name: str, similarity_function: str, dimension_count: num, embedding_model: str, sparse_embedding_model: str, endpoint: str, token: str, read_only_token: str, type: str, region: str, max_vector_count: num, max_daily_updates: num, max_daily_queries: num, max_monthly_bandwidth: num, max_writes_per_second: num, max_query_per_second: num, max_reads_per_request: num, max_writes_per_request: num, max_total_metadata_size: num, reserved_price: num, creation_time: num, index_type: str, throughput_vector: [map]} # Index retrieved successfully

@endpoint DELETE /vector/index/{id}
@desc Delete Index
@required {id: str # The unique ID of the index to be deleted}
@returns(200) Index deleted successfully

@endpoint POST /vector/index/{id}/rename
@desc Rename Index
@required {id: str # The unique ID of the index to be renamed, name: str # The new name of the index}
@returns(200) Index renamed successfully

@endpoint POST /vector/index/{id}/reset-password
@desc Reset Index Passwords
@required {id: str # The unique ID of the index to reset the password for}
@returns(200) Index passwords reset successfully

@endpoint POST /vector/index/{id}/setplan
@desc Set Index Plan
@required {id: str # The unique ID of the index to change plan for, target_plan: str(free/payg/fixed) # The new plan for the index}
@returns(200) Index plan changed successfully

@endpoint POST /vector/index/{id}/transfer
@desc Transfer Index
@required {id: str # The unique ID of the index to be transferred, target_account: str # The team ID of the target team.}
@returns(200) Index transferred successfully

@endpoint GET /vector/index/stats
@desc Get Vector Stats
@returns(200) {record_count: int, request: int, bandwidth: int, storage: int, billing: num(float), rerank_count: int} # Statistics for the vector indices retrieved successfully

@endpoint GET /vector/index/{id}/stats
@desc Get Index Stats
@required {id: str # The ID of the vector index}
@optional {period: str(1h/3h/12h/1d/3d/7d/30d)=1h # Time period for statistics aggregation. Each period returns 60 datapoints  with intervals adjusted to the period length.   Exceptionally for 30 days, it returns 240 datapoints with 3-hour intervals for increased granularity.}
@returns(200) {pending_index_count: int, current_vector_count: int, daily_query_count: int, daily_update_count: int, monthly_query_count: int, monthly_update_count: int, monthly_bandwidth_usage: int, storage_usage: int, monthly_cost: num(float), daily_update_requests: [map], daily_query_requests: [map], daily_bandwidths: [map], days: [str], query_throughput: [map], update_throughput: [map], query_latency_mean: [map], query_latency_99: [map], update_latency_mean: [map], update_latency_99: [map], embeds_latency_mean: [map], embeds_latency_99: [map], vector_count: [map], data_size: [map], daily_rerank_count: int, monthly_rerank_count: int, daily_rerank_requests: [map], rerank_latency_mean: [map], rerank_latency_99: [map]} # Statistics for the specified vector index retrieved successfully

@endgroup

@group search
@endpoint GET /search
@desc List Search Indexes
@returns(200) Successfully retrieved list of search indices.

@endpoint POST /search
@desc Create Search Index
@required {name: str # Name of the search index, region: str(eu-west-1/us-central1) # Region of the index, type: str(free/payg/fixed) # Index payment type. Currently 'free' and 'payg' are available.}
@returns(200) {customer_id: str, id: str(uuid), name: str, endpoint: str, type: str, region: str, vercel_email: str, token: str, read_only_token: str, max_vector_count: int, max_monthly_reranks: int, max_daily_updates: int, max_daily_queries: int, max_monthly_bandwidth: int, max_writes_per_second: int, max_query_per_second: int, max_reads_per_request: int, max_writes_per_request: int, creation_time: int(int64), input_enrichment_enabled: bool, throughput_vector: [map]} # Index created successfully

@endpoint GET /search/{id}
@desc Get Search Index
@required {id: str # The unique ID of the search index to be retrieved}
@returns(200) {customer_id: str, id: str(uuid), name: str, endpoint: str, type: str, region: str, vercel_email: str, token: str, read_only_token: str, max_vector_count: int, max_monthly_reranks: int, max_daily_updates: int, max_daily_queries: int, max_monthly_bandwidth: int, max_writes_per_second: int, max_query_per_second: int, max_reads_per_request: int, max_writes_per_request: int, creation_time: int(int64), input_enrichment_enabled: bool, throughput_vector: [map]} # Successfully retrieved specified search index

@endpoint DELETE /search/{id}
@desc Delete Search Index
@required {id: str # The unique ID of the search index to be deleted}
@returns(200) Search Index Deleted Successfully

@endpoint GET /search/stats
@desc Get Search Stats
@returns(200) {record_count: int, request: int, bandwidth: int, storage: int, billing: num(float), rerank_count: int} # Statistics for the search indices retrieved successfully

@endpoint GET /search/{id}/stats
@desc Get Index Stats
@required {id: str # The ID of the search index}
@optional {period: str(1h/3h/12h/1d/3d/7d/30d)=1h # Time period for statistics aggregation. Each period returns 60 datapoints  with intervals adjusted to the period length.   Exceptionally for 30 days, it returns 240 datapoints with 3-hour intervals for increased granularity.}
@returns(200) {pending_index_count: int, current_vector_count: int, daily_query_count: int, daily_update_count: int, monthly_query_count: int, monthly_update_count: int, monthly_bandwidth_usage: int, storage_usage: int, monthly_cost: num(float), daily_update_requests: [map], daily_query_requests: [map], daily_bandwidths: [map], days: [str], query_throughput: [map], update_throughput: [map], query_latency_mean: [map], query_latency_99: [map], update_latency_mean: [map], update_latency_99: [map], embeds_latency_mean: [map], embeds_latency_99: [map], vector_count: [map], data_size: [map], daily_rerank_count: int, monthly_rerank_count: int, daily_rerank_requests: [map], rerank_latency_mean: [map], rerank_latency_99: [map]} # Statistics for the specified search index retrieved successfully

@endpoint POST /search/{id}/reset-password
@desc Reset Password
@required {id: str # The ID of the search index}
@returns(200) Search index passwords reset successfully

@endpoint POST /search/{id}/transfer
@desc Transfer Search Index
@required {id: str # The ID of the search index, target_account: str # The ID of the target team account.}
@returns(200) Search index transferred successfully

@endpoint POST /search/{id}/rename
@desc Rename Search Index
@required {id: str # The ID of the search index, name: str # New name for the index}
@returns(200) Search index renamed successfully

@endgroup

@group qstash
@endpoint GET /qstash/users
@desc List QStash Users
@returns(200) Successful response

@endpoint GET /qstash/user/{id}
@desc Get QStash
@required {id: str # QStash user ID}
@returns(200) {customer_id: str, id: str(uuid), password: str, token: str, active: bool, state: str, modifying_state: str, last_plan_upgrade_time: int(int64), max_message_size: int, max_requests_per_day: int, max_requests_per_day_hard: int, max_endpoints_per_topic: int, max_requests_per_second: int, max_dlq_size: int, max_completion_tokens_per_day: int, max_completion_tokens_per_minute: int, max_completions_per_day: int, max_completions_per_minute: int, max_retries: int, max_topics: int, max_schedules: int, max_events_size: int, max_dlq_retention_time_milis: int(int64), max_delay: int, max_parallelism: int, max_global_parallelism: int, max_queues: int, retention: int, timeout: int, rate_limit: int, type: str, reserved_type: str, reserved_price: num(float), prod_pack_enabled: bool, prometheus_enabled: str, enterprise: map{enabled: bool}, region: str, budget: int, created_by: str, creation_time: int(int64)} # Successful response

@endpoint POST /qstash/rotate-token/{id}
@desc Reset QStash Token
@required {id: str # QStash user ID}
@returns(200) {customer_id: str, id: str(uuid), password: str, token: str, active: bool, state: str, modifying_state: str, last_plan_upgrade_time: int(int64), max_message_size: int, max_requests_per_day: int, max_requests_per_day_hard: int, max_endpoints_per_topic: int, max_requests_per_second: int, max_dlq_size: int, max_completion_tokens_per_day: int, max_completion_tokens_per_minute: int, max_completions_per_day: int, max_completions_per_minute: int, max_retries: int, max_topics: int, max_schedules: int, max_events_size: int, max_dlq_retention_time_milis: int(int64), max_delay: int, max_parallelism: int, max_global_parallelism: int, max_queues: int, retention: int, timeout: int, rate_limit: int, type: str, reserved_type: str, reserved_price: num(float), prod_pack_enabled: bool, prometheus_enabled: str, enterprise: map{enabled: bool}, region: str, budget: int, created_by: str, creation_time: int(int64)} # Token reset successfully, returns updated user information with new credentials

@endpoint POST /qstash/set-plan/{id}
@desc Set QStash Plan
@required {id: str # QStash user ID, plan_name: str(paid/qstash_fixed_1m/qstash_fixed_10m/qstash_fixed_100m) # Target plan to upgrade to}
@returns(200) QStash plan changed successfully

@endpoint GET /qstash/stats/{id}
@desc Get QStash Stats
@required {id: str # QStash user ID}
@optional {period: str(1h/3h/12h/1d/3d/7d/30d)=1h # Time period for statistics aggregation. Each period returns 60 datapoints with intervals adjusted to the period length.  Exceptionally for 30 days, it returns 240 datapoints with 3-hour intervals for increased granularity.}
@returns(200) {days: [str], daily_requests: [map], daily_billings: [map], daily_bandwidths: [map], daily_used: [map], daily_used_workflow: [map], daily_qstash_messages: [map], daily_workflow_messages: [map], dlq_message_count: int, daily_bandwidth_used: [map], total_monthly_billing: num(float)} # Successful response with usage statistics

@endpoint GET /qstash/ipv4
@desc Get QStash IPv4 Addresses
@returns(200) List of IPv4 CIDR blocks

@endpoint POST /qstash/move-to-team
@desc Move QStash to Team
@required {qstash_id: str # ID of the QStash instance to move, target_team_id: str # ID of the target team}
@returns(200) QStash moved successfully

@endpoint PATCH /qstash/update-budget/{id}
@desc Update QStash Budget
@required {id: str # QStash user ID, budget: int # Monthly spending budget limit in dollars. Minimum 20, maximum 10000, or 0 for no limit.}
@returns(200) Budget updated successfully

@endpoint POST /qstash/enable-prodpack/{id}
@desc Enable Production Pack
@required {id: str # QStash user ID}
@returns(200) Production pack enabled successfully

@endpoint POST /qstash/disable-prodpack/{id}
@desc Disable Production Pack
@required {id: str # QStash user ID}
@returns(200) Production pack disabled successfully

@endgroup

@end
