Before you begin
Confirm the following requirements before you install the hook:- An admin has completed the prerequisites, including creating an API key with the AI Audit User role.
- The target machine runs macOS, Linux, or Windows with the Codex CLI installed.
- endorctl is on
PATH. See endorctl CLI. - The shell that launches Codex has these environment variables set:
ENDOR_API(for example,https://api.endorlabs.com)ENDOR_NAMESPACEENDOR_API_CREDENTIALS_KEYENDOR_API_CREDENTIALS_SECRET
[hooks] table in config.toml. Use the following configuration.
Codex also accepts the same events in a sibling
hooks.json file, and it runs both sources additively. Define each event in one place only, or the hook fires twice per event.Install for one developer
Use this for a single-machine trial or a personal install.- Open
~/.codex/config.tomlin a text editor. Create the file if it does not exist. - Append the
[hooks]configuration shown in Before you begin. - Save the file and start a new Codex session.
CODEX_HOME is set, edit config.toml in that directory instead.
Install on a managed fleet
Codex reads system-managed configuration from a fixed directory per platform. Use your MDM, such as Jamf, Intune, Kandji, or JumpCloud, to deliver the hook configuration to each managed machine. Also deliver the four Endor Labs environment variables in the shell that launches Codex.- On macOS and Linux, deliver
/etc/codex/hooks.json, or add the[hooks]table to/etc/codex/requirements.toml. Settings inrequirements.tomltake precedence over the other configuration layers. - On Windows, deliver
%ProgramData%\OpenAI\Codex\hooks.jsonor%ProgramData%\OpenAI\Codex\requirements.toml.
On macOS, environment variables set in
~/.zshrc reach apps launched from a terminal but not apps launched from Spotlight. Ship the variables through your MDM payload (for example, a launchctl setenv profile or an ~/.zprofile snippet) for full coverage.Per-repository overrides
Add the[hooks] table to <repository>/.codex/config.toml and commit it. Repository hooks let security-sensitive projects extend the configuration.
Codex loads repository configuration only after the developer trusts the project. A committed hook configuration takes effect once the project’s trust_level is trusted in the developer’s Codex configuration.
Codex hook events used by Coding Agent Governance
Enforcement hooks fail open. If the hook itself errors out, Codex allows the action rather than blocking it and keeps working. The usual cause is a missing binary. An unreadable local policy cache does not disable enforcement, because the hook falls back to the built-in system policies. A successfully evaluated Block policy still stops the action. Codex handles the Ask Permission action differently from other agents:- At
PreToolUse, Codex honors only a deny response and cannot pause for approval. An Ask Permission policy fails closed and denies the call, carrying the ask message so the developer sees why. - At
PermissionRequest, an Ask Permission policy defers to Codex’s own approval prompt, which asks the developer directly. Only a Block policy denies the escalation outright.
apply_patch tool. File Access policies match each file in the patch individually, and a Write, Edit, or apply_patch matcher all target the same tool.
Tune the hook
For an audit-only rollout, setENDOR_AI_AUDIT_NO_BLOCKING=true in the hook environment. endorctl ai-audit then downgrades every Block action to Alert at evaluation time. For Cursor, set it in the shell that launches the IDE. For Claude Code, set it in the env block of settings.json. Policies still record violations under Policy Violations, but the hook never denies a . Use this to seed a new policy without interrupting developers, then unset the variable when you’re ready to enforce.
Any value parsable as a Go bool (such as true, 1, or t) turns the option on. Unset, empty, or unparseable values keep enforcement on.
Verify hooks are firing
- Start a session in and ask the agent to run a benign shell command, such as
ls. - Select Agent Governance from the left sidebar, then select Workstation Inventory.
- Confirm the developer’s row shows a recent value under Last Active.
What developers see when a policy fires
When a policy with the Block action matches an event, the hook returns a deny response to . stops the and surfaces the User Message to the developer. The agent receives a deny response that carries the User Message, explains that a governance policy denied the action, and tells the agent not to work around the block. When a policy with the Ask Permission action matches, the hook returns an ask response. pauses and asks the developer to confirm or deny before the agent proceeds. When a policy with the Alert action matches, the hook allows the action to proceed. Endor Labs records the event under Policy Violations for your security team to review.Troubleshoot a quiet machine
Run these checks if a developer’s actions never appear under Workstation Inventory or Policy Violations:- Confirm the developer has started at least one session. With the event cache enabled, the hook batches events and flushes them within about 30 seconds of hook activity, and fully at session start and end, so inventory Sessions, Last Active, and counts can lag the newest actions by that interval.
- Hook errors fail open. If the hook cannot run or reach the Endor Labs API, allows the . The event is missing from inventory rather than surfacing an error. The remaining checks rule out the common causes.
- Confirm endorctl is on
PATHin the environment that runs the hook. The hook fails silently if the binary is not found. Runendorctl versionfrom the same shell to verify. - Confirm only one endorctl installation is active. If
endorctl ai-auditfails withFailed with non-blocking status code: No stderr output, conflicting installations are the likely cause, such as annpx-provisioned endorctl alongside a Homebrew install. Keep one installation method per machine, remove the others, then runendorctl versionto confirm. - Confirm
ENDOR_API,ENDOR_NAMESPACE,ENDOR_API_CREDENTIALS_KEY, andENDOR_API_CREDENTIALS_SECRETare set for the process that runs the hook. Cursor reads them from the shell that launched it. Claude Code reads them from theenvblock insettings.json. - Confirm
ENDOR_TOKENis not also exported alongside your Coding Agent Governance API key credentials in the hook environment. Hooks rely only onENDOR_API_CREDENTIALS_KEYandENDOR_API_CREDENTIALS_SECRET.ENDOR_TOKENis redundant and, on older versions of endorctl, triggered a mixed-authentication error that blockedendorctl ai-audit. - Confirm the API key has the AI Audit User role and has not expired.
- Confirm the developer restarted after the hooks file changed. reads the configuration at session start.
- Confirm the developer restarted after a policy edit. The local policy cache refreshes at session start.
- Confirm the JSON file parses. A trailing comma silently disables every hook in the file.
- Confirm the Endor Labs API is reachable from the environment that runs the hook. Network failures appear as gaps in the inventory.
Next steps
With hooks deployed, continue with the following pages:- See Triage policy violations to set your daily review workflow.
- See Read the Coding Agent Governance overview to track adoption and enforcement trends.