curl --request PUT \
--url https://api.veryfront.com/projects/{project_reference}/inference-policy \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"allowed_jurisdictions": [
"<string>"
],
"allowed_host_ids": [
"<string>"
],
"denied_host_ids": [
"<string>"
],
"allowed_models": [
"<string>"
],
"denied_models": [
"<string>"
]
}
'import requests
url = "https://api.veryfront.com/projects/{project_reference}/inference-policy"
payload = {
"allowed_jurisdictions": ["<string>"],
"allowed_host_ids": ["<string>"],
"denied_host_ids": ["<string>"],
"allowed_models": ["<string>"],
"denied_models": ["<string>"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
allowed_jurisdictions: ['<string>'],
allowed_host_ids: ['<string>'],
denied_host_ids: ['<string>'],
allowed_models: ['<string>'],
denied_models: ['<string>']
})
};
fetch('https://api.veryfront.com/projects/{project_reference}/inference-policy', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.veryfront.com/projects/{project_reference}/inference-policy",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'allowed_jurisdictions' => [
'<string>'
],
'allowed_host_ids' => [
'<string>'
],
'denied_host_ids' => [
'<string>'
],
'allowed_models' => [
'<string>'
],
'denied_models' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.veryfront.com/projects/{project_reference}/inference-policy"
payload := strings.NewReader("{\n \"allowed_jurisdictions\": [\n \"<string>\"\n ],\n \"allowed_host_ids\": [\n \"<string>\"\n ],\n \"denied_host_ids\": [\n \"<string>\"\n ],\n \"allowed_models\": [\n \"<string>\"\n ],\n \"denied_models\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.veryfront.com/projects/{project_reference}/inference-policy")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"allowed_jurisdictions\": [\n \"<string>\"\n ],\n \"allowed_host_ids\": [\n \"<string>\"\n ],\n \"denied_host_ids\": [\n \"<string>\"\n ],\n \"allowed_models\": [\n \"<string>\"\n ],\n \"denied_models\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.veryfront.com/projects/{project_reference}/inference-policy")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"allowed_jurisdictions\": [\n \"<string>\"\n ],\n \"allowed_host_ids\": [\n \"<string>\"\n ],\n \"denied_host_ids\": [\n \"<string>\"\n ],\n \"allowed_models\": [\n \"<string>\"\n ],\n \"denied_models\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"configured": true,
"enforced": true,
"min_tier": "<string>",
"min_quantization": "<string>",
"allowed_jurisdictions": [
"<string>"
],
"allowed_host_ids": [
"<string>"
],
"denied_host_ids": [
"<string>"
],
"allowed_models": [
"<string>"
],
"denied_models": [
"<string>"
],
"standard_tier_opt_in_at": "<string>",
"standard_tier_opt_in_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"standard_tier_opt_in_source": "<string>",
"allow_non_eu_hosting": true,
"created_at": "<string>",
"updated_at": "<string>",
"updated_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"type": "https://api.veryfront.com/errors/validation-failed",
"title": "Validation Failed",
"status": 400,
"cause": "schedule_concurrency_forbidden",
"idempotency": {
"state": "in_progress",
"operation": "<string>",
"retryable": true,
"retry_after_seconds": 1,
"expires_at": "<string>",
"recovery": {
"available": true,
"description": "<string>",
"resource_url": "<string>"
}
},
"code": "RUN_INVALID_INPUT",
"detail": "The 'email' field must be a valid email address",
"instance": "/projects/my-project/members",
"slug": "validation-failed",
"category": "VALIDATION",
"suggestion": "Check the request body and query parameters against the API documentation.",
"errors": [
{
"field": "email",
"message": "Invalid email format",
"code": "INVALID_FORMAT"
}
]
}{
"type": "https://api.veryfront.com/errors/validation-failed",
"title": "Validation Failed",
"status": 400,
"cause": "schedule_concurrency_forbidden",
"idempotency": {
"state": "in_progress",
"operation": "<string>",
"retryable": true,
"retry_after_seconds": 1,
"expires_at": "<string>",
"recovery": {
"available": true,
"description": "<string>",
"resource_url": "<string>"
}
},
"code": "RUN_INVALID_INPUT",
"detail": "The 'email' field must be a valid email address",
"instance": "/projects/my-project/members",
"slug": "validation-failed",
"category": "VALIDATION",
"suggestion": "Check the request body and query parameters against the API documentation.",
"errors": [
{
"field": "email",
"message": "Invalid email format",
"code": "INVALID_FORMAT"
}
]
}{
"type": "https://api.veryfront.com/errors/validation-failed",
"title": "Validation Failed",
"status": 400,
"cause": "schedule_concurrency_forbidden",
"idempotency": {
"state": "in_progress",
"operation": "<string>",
"retryable": true,
"retry_after_seconds": 1,
"expires_at": "<string>",
"recovery": {
"available": true,
"description": "<string>",
"resource_url": "<string>"
}
},
"code": "RUN_INVALID_INPUT",
"detail": "The 'email' field must be a valid email address",
"instance": "/projects/my-project/members",
"slug": "validation-failed",
"category": "VALIDATION",
"suggestion": "Check the request body and query parameters against the API documentation.",
"errors": [
{
"field": "email",
"message": "Invalid email format",
"code": "INVALID_FORMAT"
}
]
}{
"type": "https://api.veryfront.com/errors/validation-failed",
"title": "Validation Failed",
"status": 400,
"cause": "schedule_concurrency_forbidden",
"idempotency": {
"state": "in_progress",
"operation": "<string>",
"retryable": true,
"retry_after_seconds": 1,
"expires_at": "<string>",
"recovery": {
"available": true,
"description": "<string>",
"resource_url": "<string>"
}
},
"code": "RUN_INVALID_INPUT",
"detail": "The 'email' field must be a valid email address",
"instance": "/projects/my-project/members",
"slug": "validation-failed",
"category": "VALIDATION",
"suggestion": "Check the request body and query parameters against the API documentation.",
"errors": [
{
"field": "email",
"message": "Invalid email format",
"code": "INVALID_FORMAT"
}
]
}{
"type": "https://api.veryfront.com/errors/validation-failed",
"title": "Validation Failed",
"status": 400,
"cause": "schedule_concurrency_forbidden",
"idempotency": {
"state": "in_progress",
"operation": "<string>",
"retryable": true,
"retry_after_seconds": 1,
"expires_at": "<string>",
"recovery": {
"available": true,
"description": "<string>",
"resource_url": "<string>"
}
},
"code": "RUN_INVALID_INPUT",
"detail": "The 'email' field must be a valid email address",
"instance": "/projects/my-project/members",
"slug": "validation-failed",
"category": "VALIDATION",
"suggestion": "Check the request body and query parameters against the API documentation.",
"errors": [
{
"field": "email",
"message": "Invalid email format",
"code": "INVALID_FORMAT"
}
]
}Replace inference policy
Replace inference policy. Requires project.settings.manage.
curl --request PUT \
--url https://api.veryfront.com/projects/{project_reference}/inference-policy \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"allowed_jurisdictions": [
"<string>"
],
"allowed_host_ids": [
"<string>"
],
"denied_host_ids": [
"<string>"
],
"allowed_models": [
"<string>"
],
"denied_models": [
"<string>"
]
}
'import requests
url = "https://api.veryfront.com/projects/{project_reference}/inference-policy"
payload = {
"allowed_jurisdictions": ["<string>"],
"allowed_host_ids": ["<string>"],
"denied_host_ids": ["<string>"],
"allowed_models": ["<string>"],
"denied_models": ["<string>"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
allowed_jurisdictions: ['<string>'],
allowed_host_ids: ['<string>'],
denied_host_ids: ['<string>'],
allowed_models: ['<string>'],
denied_models: ['<string>']
})
};
fetch('https://api.veryfront.com/projects/{project_reference}/inference-policy', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.veryfront.com/projects/{project_reference}/inference-policy",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'allowed_jurisdictions' => [
'<string>'
],
'allowed_host_ids' => [
'<string>'
],
'denied_host_ids' => [
'<string>'
],
'allowed_models' => [
'<string>'
],
'denied_models' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.veryfront.com/projects/{project_reference}/inference-policy"
payload := strings.NewReader("{\n \"allowed_jurisdictions\": [\n \"<string>\"\n ],\n \"allowed_host_ids\": [\n \"<string>\"\n ],\n \"denied_host_ids\": [\n \"<string>\"\n ],\n \"allowed_models\": [\n \"<string>\"\n ],\n \"denied_models\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.veryfront.com/projects/{project_reference}/inference-policy")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"allowed_jurisdictions\": [\n \"<string>\"\n ],\n \"allowed_host_ids\": [\n \"<string>\"\n ],\n \"denied_host_ids\": [\n \"<string>\"\n ],\n \"allowed_models\": [\n \"<string>\"\n ],\n \"denied_models\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.veryfront.com/projects/{project_reference}/inference-policy")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"allowed_jurisdictions\": [\n \"<string>\"\n ],\n \"allowed_host_ids\": [\n \"<string>\"\n ],\n \"denied_host_ids\": [\n \"<string>\"\n ],\n \"allowed_models\": [\n \"<string>\"\n ],\n \"denied_models\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"configured": true,
"enforced": true,
"min_tier": "<string>",
"min_quantization": "<string>",
"allowed_jurisdictions": [
"<string>"
],
"allowed_host_ids": [
"<string>"
],
"denied_host_ids": [
"<string>"
],
"allowed_models": [
"<string>"
],
"denied_models": [
"<string>"
],
"standard_tier_opt_in_at": "<string>",
"standard_tier_opt_in_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"standard_tier_opt_in_source": "<string>",
"allow_non_eu_hosting": true,
"created_at": "<string>",
"updated_at": "<string>",
"updated_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"type": "https://api.veryfront.com/errors/validation-failed",
"title": "Validation Failed",
"status": 400,
"cause": "schedule_concurrency_forbidden",
"idempotency": {
"state": "in_progress",
"operation": "<string>",
"retryable": true,
"retry_after_seconds": 1,
"expires_at": "<string>",
"recovery": {
"available": true,
"description": "<string>",
"resource_url": "<string>"
}
},
"code": "RUN_INVALID_INPUT",
"detail": "The 'email' field must be a valid email address",
"instance": "/projects/my-project/members",
"slug": "validation-failed",
"category": "VALIDATION",
"suggestion": "Check the request body and query parameters against the API documentation.",
"errors": [
{
"field": "email",
"message": "Invalid email format",
"code": "INVALID_FORMAT"
}
]
}{
"type": "https://api.veryfront.com/errors/validation-failed",
"title": "Validation Failed",
"status": 400,
"cause": "schedule_concurrency_forbidden",
"idempotency": {
"state": "in_progress",
"operation": "<string>",
"retryable": true,
"retry_after_seconds": 1,
"expires_at": "<string>",
"recovery": {
"available": true,
"description": "<string>",
"resource_url": "<string>"
}
},
"code": "RUN_INVALID_INPUT",
"detail": "The 'email' field must be a valid email address",
"instance": "/projects/my-project/members",
"slug": "validation-failed",
"category": "VALIDATION",
"suggestion": "Check the request body and query parameters against the API documentation.",
"errors": [
{
"field": "email",
"message": "Invalid email format",
"code": "INVALID_FORMAT"
}
]
}{
"type": "https://api.veryfront.com/errors/validation-failed",
"title": "Validation Failed",
"status": 400,
"cause": "schedule_concurrency_forbidden",
"idempotency": {
"state": "in_progress",
"operation": "<string>",
"retryable": true,
"retry_after_seconds": 1,
"expires_at": "<string>",
"recovery": {
"available": true,
"description": "<string>",
"resource_url": "<string>"
}
},
"code": "RUN_INVALID_INPUT",
"detail": "The 'email' field must be a valid email address",
"instance": "/projects/my-project/members",
"slug": "validation-failed",
"category": "VALIDATION",
"suggestion": "Check the request body and query parameters against the API documentation.",
"errors": [
{
"field": "email",
"message": "Invalid email format",
"code": "INVALID_FORMAT"
}
]
}{
"type": "https://api.veryfront.com/errors/validation-failed",
"title": "Validation Failed",
"status": 400,
"cause": "schedule_concurrency_forbidden",
"idempotency": {
"state": "in_progress",
"operation": "<string>",
"retryable": true,
"retry_after_seconds": 1,
"expires_at": "<string>",
"recovery": {
"available": true,
"description": "<string>",
"resource_url": "<string>"
}
},
"code": "RUN_INVALID_INPUT",
"detail": "The 'email' field must be a valid email address",
"instance": "/projects/my-project/members",
"slug": "validation-failed",
"category": "VALIDATION",
"suggestion": "Check the request body and query parameters against the API documentation.",
"errors": [
{
"field": "email",
"message": "Invalid email format",
"code": "INVALID_FORMAT"
}
]
}{
"type": "https://api.veryfront.com/errors/validation-failed",
"title": "Validation Failed",
"status": 400,
"cause": "schedule_concurrency_forbidden",
"idempotency": {
"state": "in_progress",
"operation": "<string>",
"retryable": true,
"retry_after_seconds": 1,
"expires_at": "<string>",
"recovery": {
"available": true,
"description": "<string>",
"resource_url": "<string>"
}
},
"code": "RUN_INVALID_INPUT",
"detail": "The 'email' field must be a valid email address",
"instance": "/projects/my-project/members",
"slug": "validation-failed",
"category": "VALIDATION",
"suggestion": "Check the request body and query parameters against the API documentation.",
"errors": [
{
"field": "email",
"message": "Invalid email format",
"code": "INVALID_FORMAT"
}
]
}Authorizations
Use a JWT bearer token or a Veryfront API key in the Authorization header.
Path Parameters
Project slug, UUID, or domain that identifies the project.
Body
Full replacement of the policy constraints. Omitted constraints are removed; fields are not merged with the existing policy. The policy can restrict sovereignty tier, precision, jurisdictions, hosts, and models; it can tighten the environment policy but cannot broaden it. Recorded standard-tier consent is preserved. The audit record identifies the caller.
Lowest sovereignty tier this project will be served from. Null is served as "eu-resident": every project is EU-only by default. "standard" is the lowest, admits hosting outside the EU, and is refused (400) until the project has accepted standard-tier serving through the standard-tier opt-in (REST POST /projects/{project_reference}/inference-policy/standard-tier-opt-in, GraphQL optInProjectInferencePolicyStandardTier, MCP create_project_inference_policy_standard_tier_opt_in); after that it may be set like any other floor.
qualified-sovereign, eu-owned, eu-resident, standard, null Lowest model precision this project will be served at
bf16, fp16, fp8, nvfp4, fp4, int4, null Operator jurisdiction codes for this project (ISO 3166-1 alpha-2). Null removes the constraint; an empty list permits nothing.
500^[A-Z]{2}$Catalog host IDs this project permits. Null removes the constraint; an empty list permits nothing.
5001 - 200^[a-z0-9][a-z0-9._/-]*$Catalog host IDs this project refuses. Null or an empty list adds no denials; a denial overrides an allowance.
5001 - 200^[a-z0-9][a-z0-9._/-]*$Canonical model IDs this project permits, from list_models. Null removes the constraint; an empty list permits nothing.
500Model ID returned by list_models. Known catalog aliases are normalized to canonical IDs. Policy IDs use letters, digits, dots, underscores, slashes, and hyphens; arbitrary provider model strings are not accepted.
1 - 200^[a-z0-9][a-z0-9._/-]*$Canonical model IDs this project refuses, from list_models. Null or an empty list adds no denials; a denial overrides an allowance.
500Model ID returned by list_models. Known catalog aliases are normalized to canonical IDs. Policy IDs use letters, digits, dots, underscores, slashes, and hyphens; arbitrary provider model strings are not accepted.
1 - 200^[a-z0-9][a-z0-9._/-]*$Response
The policy as it now stands
Whether the project states a policy. False returns the defaults the project is served under: EU-only, with an eu-resident minimum tier. A row that constrains nothing is routed exactly like no row; routing changes begin at the first non-null constraint.
Whether the gateway can apply this stored policy. True for every readable policy: each stated constraint, the "eu-resident" tier floor included, is enforced. False only when a stored value (a tier or precision) is one this build cannot read, because the gateway then refuses every request for the project instead of applying it.
Returns the stored minimum tier: qualified-sovereign, eu-owned, eu-resident, or standard. Null means no stored floor and is served as "eu-resident": every project is EU-only by default. Unknown values from newer builds remain readable.
Returns the stored minimum precision: bf16, fp16, fp8, nvfp4, fp4, or int4. Null means no stored precision constraint. Unknown values from newer builds remain readable.
Lists allowed operator jurisdictions as uppercase ISO 3166-1 alpha-2 codes. Null adds no jurisdiction constraint; an empty list permits none.
Lists allowed catalog host IDs. Null adds no host allowlist constraint; an empty list permits none.
Lists denied catalog host IDs. Null or an empty list adds no host denials. Denials override allowances.
Lists canonical model IDs the project may use. Null adds no model allowlist constraint; an empty list permits none.
Lists canonical model IDs the project may not use. Null or an empty list adds no model denials. Denials override allowances.
ISO 8601 timestamp, or null when no acceptance is recorded. When standard-tier consent was recorded. Survives later changes to the minimum tier; opting in again does not change it. Cleared when the policy is removed.
Administrator who recorded standard-tier consent. Null when no actor is recorded.
How the recorded acceptance was granted: "admin" when a project admin accepted it through this API, "grandfather" when the one-off migration recorded it for inference the project was already running before the default tier floor existed. Null when no acceptance is recorded. Read-only.
Whether this project has opted in to non-EU hosting: the standard-tier opt-in is recorded and min_tier is "standard", which drops the default "eu-resident" floor. False by default: a project is EU-only, and a min_tier of null is served as "eu-resident". True does not mean the project is served outside the EU: its other constraints (for example allowed_jurisdictions or allowed_host_ids) may still restrict serving to the EU. Read-only; derived.
Records policy creation in ISO 8601 format, or null when no policy row exists.
Records the last policy update in ISO 8601 format, or null when no policy row exists.
Records the user ID responsible for the last policy update, or null when no actor is recorded.