Repository navigation
VAP15-80 docs: document public-key model URL rejection - #1404
Merged
jeffrey-hoekman-vapi merged 4 commits intoNov 9, 2026
Merged
jeffrey-hoekman-vapi merged 4 commits into
jeffrey-hoekman-vapi merged 4 commits into
Conversation
VAPSEC-618 changed a documented contract: a web call or chat (POST /call/web, /chat/web, /chat/web/responses) authenticated with a public API key or a public JWT now gets a 403 if model.url appears anywhere in the request body. The docs still presented transient assistants and assistantOverrides as interchangeable with saved configuration from the browser, so a customer hitting the 403 had no page explaining it. The cohort email needs a stable URL to link to. - transient-vs-permanent-configurations.mdx: a "Model URLs on public-key requests" section covering scope, the request-body locations, who is unaffected, the literal 403 body, and the two fixes (save the assistant and pass assistantId, or start the call server-side with a private key). - using-your-server.mdx: a Note under the Custom LLM URL step pointing to that section. The 403 message is quoted verbatim from CALLER_MODEL_URL_REJECTION_MESSAGE so support can search for it. Scope says "public API key or public JWT", not "public key". The enforced auth paths are api-key-public, customer-jwt-public and customer-jwt-untagged; VAPSEC-618 deliverable 4 settled that both JWT paths stay enforced, since Origin is caller-controlled and the token type is the only boundary an attacker can't forge. org-jwt and workos-jwt (dashboard) callers are not enforced and are excluded. The ramp is deliberately not described. fern check: 0 errors, no warnings on the edited pages. Refs VAP15-80, VAPSEC-618, VAPSEC-906 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
|
🌿 Preview your docs: https://vapi-preview-01a1b693-53de-764a-bf93-a66daa237e41.docs.buildwithfern.com |
Contributor
|
🌿 Preview your docs: https://vapi-preview-01a1c154-dcde-75b4-849c-085b8f2b910d.docs.buildwithfern.com |
stephenvapiai
left a comment
Contributor
There was a problem hiding this comment.
Thanks, this reads clearly. A few small editorial suggestions inline, none blocking.
stephenvapiai
approved these changes
Nov 9, 2026
stephenvapiai
left a comment
Contributor
There was a problem hiding this comment.
Approved with some comments.
- Use "stored assistant" throughout, matching the page and the 403 body - Name the Custom LLM URL field next to model.url - List squad.membersOverrides as its own location - Clarify private keys and private JWTs are unaffected on POST /call and /chat - Add a phased-rollout Note - Note variableValues is the only override on the public chat routes - Add private JWT to the server-side fix; fold the Warning into it - Trim the custom LLM Note per review Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
|
🌿 Preview your docs: https://vapi-preview-01a1c17b-ebe9-72f8-8f7c-da6653a7b491.docs.buildwithfern.com |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
|
🌿 Preview your docs: https://vapi-preview-01a1c1cf-bba5-720a-8fda-7227ebd2d438.docs.buildwithfern.com |
stephenvapiai
approved these changes
Nov 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
VAPSEC-618 changed a documented contract. A web call or chat (
POST /call/web,/chat/web,/chat/web/responses) authenticated with a public API key or a public JWT now gets a403ifmodel.urlappears anywhere in the request body. No page explained this, and the cohort email needs a stable URL to link to.fern/assistants/concepts/transient-vs-permanent-configurations.mdx: new Model URLs on public-key requests section (anchor#model-urls-on-public-key-requests). It covers scope, the request-body locations, who is unaffected, the literal 403 body, and two fixes: save the assistant and passassistantId, or start the call server-side with a private key.fern/customization/custom-llm/using-your-server.mdx: a Note under the Custom LLM URL step that links to that section.Notes for reviewers
CALLER_MODEL_URL_REJECTION_MESSAGEso support can search for it.api-key-public,customer-jwt-publicandcustomer-jwt-untagged. VAPSEC-618 deliverable 4 keeps both JWT paths enforced, becauseOriginis caller-controlled and the token type is the only boundary an attacker can't forge. Org JWT and dashboard (workos-jwt) callers are not enforced.Merge gate
Merge before the VAPSEC-618 cohort email is sent (the email links to this anchor) and before the VAPSEC-906 creation cutoff.
Test plan
fern check: 0 errors, no warnings on the edited pagesRefs VAP15-80, VAPSEC-618, VAPSEC-906
🤖 Generated with Claude Code