Nexus PDP configuration reference
This reference lists the environment variables that configure Permit Nexus PDP (permitio/nexus-pdp), a self-hosted policy decision point (PDP). It is for operators who deploy and tune Nexus PDP. The only required setting is a key: PDP_API_KEY, or a project or organization API key with the environment to serve. For deployment requirements such as volumes, probes, and memory, see Deploy Nexus PDP.
As of September 2026, Nexus PDP is in early access. Permit can rename, replace, or remove the variables and defaults on this page before general availability. Pin the Nexus PDP image as described in Image name and tags, not to a moving tag such as 0-beta, and check this page when you upgrade. If you depend on a specific variable, tell Permit support at support@permit.io.
The container PDP (the Edge PDP image permitio/pdp-v2) uses a different set of variables. See the container PDP configuration reference. A variable with the same name can mean something different on each PDP type.
Credentials
| Variable | Default | Description |
|---|---|---|
PDP_API_KEY | Required, unless a project or organization key is set | The Nexus PDP API key of the Permit environment this Nexus PDP serves, from the Permit dashboard. As of November 2026, the dashboard labels this action Copy Nexus PDP API Key. The ordinary environment API key does not work. |
PDP_PROJECT_API_KEY | None | A project API key. Use it with PDP_ACTIVE_ENV instead of PDP_API_KEY. |
PDP_ORG_API_KEY | None | An organization API key. Use it with PDP_ACTIVE_PROJECT and PDP_ACTIVE_ENV instead of PDP_API_KEY. |
PDP_ACTIVE_PROJECT | None | The ID or key of the project, with PDP_ORG_API_KEY. Ignored with PDP_PROJECT_API_KEY. |
PDP_ACTIVE_ENV | None | The ID or key of the environment this Nexus PDP serves, with PDP_PROJECT_API_KEY or PDP_ORG_API_KEY. |
PDP_BACKEND_URL | https://api.permit.io | The Permit API that Nexus PDP asks for the environment's Nexus PDP API key when it starts with a project or organization key. It must use https, except for localhost and loopback addresses. |
Start with a project or organization API key
Instead of the environment's Nexus PDP API key, you can give Nexus PDP a project or organization API key and name the environment to serve, as with the container PDP. When it starts, Nexus PDP uses that key to get the environment's Nexus PDP API key from the Permit API, and from then on runs exactly as if you had set PDP_API_KEY.
- With
PDP_PROJECT_API_KEY, setPDP_ACTIVE_ENV. The project is the API key's own project. If you also setPDP_ACTIVE_PROJECT, Nexus PDP ignores it and logs a warning. - With
PDP_ORG_API_KEY, setPDP_ACTIVE_PROJECTandPDP_ACTIVE_ENV. - If
PDP_API_KEYis also set,PDP_API_KEYwins and Nexus PDP logs a warning. If both a project and an organization key are set, the project key wins. - The API key needs write access to the environment. A read-only key is refused.
- Nexus PDP serves one environment. To serve another, start another Nexus PDP.
If Nexus PDP cannot get the key, it stops at startup with one of these errors:
| Error | What to check |
|---|---|
| The key is invalid or revoked | The project or organization API key in PDP_PROJECT_API_KEY or PDP_ORG_API_KEY. |
| The key is an environment key | Set an environment's Nexus PDP API key as PDP_API_KEY instead. |
| The key has no access to the environment | The environment must be in the key's project (or organization), and the key needs write access. |
| No such project or environment | PDP_ACTIVE_PROJECT and PDP_ACTIVE_ENV. |
| The environment has no Nexus PDP | Enable Nexus PDP for the environment in the Permit dashboard first. |
If the Permit API is unreachable or busy, Nexus PDP retries for up to two minutes, then stops so that your orchestrator restarts it.
PDP_API_KEY is the only credential Nexus PDP needs when you set it. The PDP_API_KEY value:
- binds the container to exactly one Permit environment,
- authenticates the container to Permit's control plane,
- carries the address of the control plane, so Nexus PDP connects without a separate URL setting,
- is the bearer token that the Nexus PDP authorization API accepts from your services,
- is accepted by the Permit API with the same access as the environment API key, so protect it the same way.
Leave PDP_CONTROL_PLANE unset unless Permit support asks you to set it. On the container PDP, PDP_CONTROL_PLANE is the Permit API URL. On Nexus PDP, PDP_CONTROL_PLANE overrides the control-plane address that PDP_API_KEY carries. The Permit API URL that Nexus PDP calls with a project or organization key is PDP_BACKEND_URL.
Storage and ports
| Variable | Default | Description |
|---|---|---|
EDGE_DB_PATH | /var/lib/edge-pdp/db | Directory of the embedded database. Must be on a persistent volume. |
EDGE_DATA_DIR | /var/lib/edge-pdp | Directory of the event store and generated credentials. Must be on a persistent volume. |
EDGE_PUBLIC_PORT | 7000 | Port of the authorization API, the only port your services call. |
EDGE_HEALTH_PORT | 7001 | Port of the health and readiness endpoints. Point probes at this port, not at the authorization port. |
Both storage paths must be on persistent storage that survives restarts. On ephemeral storage, every restart runs a full cold start. See Nexus PDP deployment requirements.
Nexus PDP also uses ports 7002, 7003, 8181, 4222, and 8222 internally, bound to loopback only. See Ports used by Nexus PDP. Expose only the ports set by EDGE_PUBLIC_PORT and EDGE_HEALTH_PORT.
Behavior and tuning
| Variable | Default | Description |
|---|---|---|
RUST_LOG | info | Log level of Nexus PDP. Set info,edge_pdp=debug to add Nexus PDP debug logs. |
PDP_DEBUG | Unset (off) | Set to true to add debug information to policy evaluation requests. |
OPA_TIMEOUT_MS | 2000 | Timeout for each policy evaluation request to Open Policy Agent (OPA), in milliseconds: the deadline of a whole decision (except the list endpoints, /user-permissions, /user-tenants, /authorized_users and the AuthZEN searches, which run on their own longer deadline set by PDP_ABAC_LIST_TIMEOUT_MS). Keep it above QUERY_DEFAULT_TIMEOUT_MS, which Nexus PDP warns about at startup when it is not, and below your client's own timeout. |
QUERY_DEFAULT_TIMEOUT_MS | 1000 | Time limit for each data query OPA makes during a decision, in milliseconds. A query that runs past it fails, and the check is denied: Nexus PDP returns its normal deny answer, and only a Failed to query warning in the Nexus PDP log tells it apart from a real deny. |
EDGE_PARALLELISM | 4 | Number of change transactions Nexus PDP applies concurrently. |
EDGE_DECISION_LOG_OPT_OUT | false | Set to true to stop sending decision logs to Permit. |
EDGE_DRAIN_TIMEOUT_SECS | 10 | Seconds that in-flight requests have to finish during shutdown before Nexus PDP aborts them. |
EDGE_CHILD_TERMINATION_TIMEOUT_SECS | 30 | Seconds that OPA and the NATS leaf node have to stop after SIGTERM before Nexus PDP sends SIGKILL. |
Set the Kubernetes terminationGracePeriodSeconds to at least EDGE_DRAIN_TIMEOUT_SECS plus EDGE_CHILD_TERMINATION_TIMEOUT_SECS, which is 40 seconds at the defaults. See Nexus PDP deployment requirements.
Child process logging
| Variable | Default | Description |
|---|---|---|
EDGE_NATS_LOG_LEVEL | Follows RUST_LOG | Log level of the NATS leaf node that connects to the control plane: info, debug, or trace. |
EDGE_OPA_LOG_LEVEL | Follows RUST_LOG | Log level of OPA: debug, info, or error. |
EDGE_NATS_LOG_LEVEL=trace logs raw message payloads, which contain your authorization data. EDGE_OPA_LOG_LEVEL=debug logs authorization request and response bodies. Set these levels only for short debugging sessions, and remove them before the container serves production traffic.
Storage engine
The Nexus PDP embedded database (SurrealDB on RocksDB) uses storage-engine defaults sized for large workloads, not for a small container. These variables have the largest effect on memory use:
| Variable | Default | Effect |
|---|---|---|
SURREAL_ROCKSDB_BLOCK_CACHE_SIZE | 536870912 (512 MiB) | Size of the read cache. The largest contributor to resident memory. |
SURREAL_ROCKSDB_WRITE_BUFFER_SIZE | 268435456 (256 MiB) | Size of each in-memory write buffer before RocksDB flushes it to disk. |
SURREAL_ROCKSDB_MAX_WRITE_BUFFER_NUMBER | 32 | Maximum number of write buffers in memory at once. |
SURREAL_ROCKSDB_BACKGROUND_THREADS | 4 | Number of background compaction threads. |
At these defaults, a container with a memory limit of a few hundred MiB is killed for running out of memory (OOM) at startup. Start with 4 GiB of memory, then lower these values while you load test against your own data set. See Nexus PDP resource footprint.
Next steps
- Deploy Nexus PDP: storage, probes, logs, and the security model
- How Nexus PDP syncs data: sync, consistency, cold start, and sizing
- Nexus PDP architecture: the processes and ports inside the container
- Nexus PDP feature parity: supported endpoints and capabilities
- Container PDP configuration reference: environment variables for
permitio/pdp-v2