Claude Certified Developer – Foundations (CCDV-F) Exam Guide
Everything you need to know about the Claude Certified Developer – Foundations (CCDV-F) exam. Review the format, track your readiness, and learn test-taking strategies.
Claude Certified Developer – Foundations
Exam Format
- •All multiple choice — 1 correct answer, 3 distractors
- •53 scored items
- •120-minute time limit
- •No penalty for guessing — answer every question
Scoring
- •Scaled score: 100 – 1,000
- •Passing threshold: 720/1000
- •Each domain weighted independently toward final score
Who Is This For?
Intended for technical professionals who build, integrate, and ship production-grade AI solutions using LLMs, particularly Claude — primarily AI/ML engineers, technical leads, and senior software engineers with one to five years of software engineering experience and at least six months hands-on with Claude or comparable LLM systems. Candidates build agents and workflows using the Claude Agent SDK, integrate Claude through the API and client SDKs, operate Claude Code for codebase modernization, write effective prompts and apply context engineering, design and run evals, and build custom tools and MCP servers. Proficient in Python and/or TypeScript, fluent with REST APIs and CLI tools. Not intended for non-technical or casual Claude users, or roles limited to prompt writing without broader application-development responsibility.
Key competencies tested:
Domain Weights
- Applications & Integration33.1%
- Model Selection16.8%
- Agents & Workflows14.7%
- Prompt & Context11%
- Tools & MCPs10.6%
- Security & Safety8.1%
- Claude Code3.1%
- Eval & Debugging2.6%
Domain Readiness
Exam weight vs. your current mastery across all domains.
Exam Scenarios
Scenario walkthroughs are coming with the practice question bank for this certification.
Strategy & Pitfalls
Principles that appear repeatedly in exam answer logic. Internalize these to quickly eliminate distractors.
Requirements Drive the Design, Not Habit
Don't default to the biggest model, the realtime API, or the most autonomous architecture — extract latency, volume, criticality, data sensitivity, and cost from the stated requirement first.
The exam repeatedly rewards resisting the pull toward a familiar default: reaching for the biggest model when a smaller tier fits, calling the synchronous Messages API when a requirement describes an overnight, cost-sensitive job (which is a Message Batches API candidate), or escalating to a full agent when a fixed workflow pattern already covers the task's known steps. "Cost is the primary concern and results aren't needed until morning" is a batch requirement, not a reason to parallelize synchronous calls to finish faster. Every architectural choice — model tier, workflow vs. agent, realtime vs. batch, vendor — should trace back to the requirement's latency, volume, criticality, data-sensitivity, and cost profile, not to whichever option is most capable or most familiar.
Deterministic Enforcement Beats Prompt-Level Guidance
Don't rely on a system-prompt sentence to enforce a hard limit or block a destructive action — use a hook (PreToolUse, PostToolUse) or a settings.json permission rule that fires in code every time.
A prompt instruction is probabilistic: the model usually follows it, but a hook is ordinary code that runs at a fixed point in the loop regardless of what the model decides. This is the single most recurring distinction across the exam — it separates CLAUDE.md (memory the model reads) from settings.json (the deterministic control surface for permissions, hooks, tool allow/deny lists, and environment), and it's the correct answer whenever a question asks how to prevent a destructive or high-stakes tool call. The same logic applies to prompt injection: isolating untrusted content and applying least privilege are structural defenses, while raising temperature, adding a polite prompt caveat, or upgrading to a bigger model do nothing — a more capable, more instruction-following model can even be more susceptible.
Localize the Failure to Its Layer Before Patching
Don't rewrite the prompt when the bug is a parsing crash, a truncated response, or a transport error — inspect the raw response (status, stop_reason, usage, content blocks) before touching anything.
A JSON parse crash on an HTTP 200 response with stop_reason: end_turn is an integration-layer bug in your parser, not evidence the model is wrong. Malformed-looking JSON that's actually just cut off usually means stop_reason: max_tokens — the fix is raising max_tokens, not rewriting the schema or lowering temperature. In a multi-step agent, a bad final answer is usually the end of a chain; trace analysis across every logged model call, tool call, and intermediate message finds the earliest deviation, and fixing only the last step just relocates the symptom. Match the recovery strategy to the actual failure class: exponential backoff with jitter for transient 429/529/5xx, fix-and-resend for 400/401 (retrying an unchanged request is pointless), defensive parsing/reprompt for malformed structured output, and grounding/human-in-the-loop for hallucination.
Curation Beats Capacity in the Context Window
Don't treat a bigger context window, resending the full transcript, or a lower temperature as a substitute for pruning, compaction, isolation, or retrieval.
The context window is one shared budget across the system prompt, tool schemas, conversation history, tool results, and the response — not separate per-category allowances — and a bigger window only permits more tokens; it doesn't make them cheaper or curation unnecessary. Context rot comes from irrelevant or stale content crowding the window, not from running out of room, so raising temperature or adding more prohibitions doesn't fix it. Compaction (summarizing older turns into a compact recap) is not the same as truncation (blindly dropping tokens and losing critical facts), and delegating a heavy subtask to a subagent with its own context window is a first-class fix for context bloat, not merely "more prompts."
Separate Trusted Instructions from Untrusted Data
Don't place user input, retrieved documents, or tool output directly alongside instructions — delimit untrusted content clearly (e.g., XML-style tags) so it can never be read as an instruction.
There is no syntactic boundary between instructions and data in natural language, unlike SQL injection's parameterized queries — so an application has to create that boundary itself through delimiting, isolation, and least privilege. No single mitigation is sufficient on its own: isolation, least privilege, guardrails/hooks, and input/output validation are layered defenses, not alternatives. Broadening a tool's access so an agent can "self-correct" increases risk rather than reducing it, and least privilege limits the blast radius even when isolation itself fails — an agent that structurally cannot delete data cannot be tricked into deleting it.
Evaluation Is a Repeatable Measurement, Not a Spot-Check
Don't treat "it looks fixed on one example" as verification, and don't skip re-running the eval after a model upgrade, prompt change, or cost/latency optimization.
Non-deterministic, model-version-dependent output means a single equality assertion or manual spot-check can never verify a fix — an eval needs a representative test set, a defined scoring method (exact match, rubric, or LLM-as-judge), and a target metric, run repeatably. This governs the whole lifecycle: model-version pinning exists because a newer release can change behavior even with an unchanged API contract, so every upgrade is gated behind re-run evals just like an initial model choice; prompts and model IDs are reviewable, versioned artifacts that go through the same version-control and code-review discipline as code.
Match the Extension Mechanism and Transport to the Reuse Profile
Don't hand-roll a one-off integration for a capability many apps will share, and don't reach for an MCP server (or its network transport) for a single-use, single-app need.
Built-in tools cost the least effort when the capability already exists (web search, code execution, computer use); custom tools fit app-specific logic that lives with a single application; Skills package reusable know-how without a running service; and an MCP server is the right answer specifically when a capability must be reused across multiple apps and maintained independently — the same reuse-and-maintenance logic that separates stdio (local, single-user) from streamable HTTP/sockets (remote, multi-client) transport.
The Messages API Is Stateless, Typed, and Branches on stop_reason
Don't assume the API remembers prior turns, that the system prompt is a role: "system" message, or that a response always ends the same way — ground every integration decision in the API's actual mechanics.
The Messages API keeps no memory between calls, so the full conversation must be resent every request; the system prompt is a separate, top-level system parameter, not a message with role: "system"; and integration code must branch on stop_reason (end_turn, max_tokens, stop_sequence, tool_use) rather than assuming generation always completes naturally. Streaming changes when tokens arrive, not how many are billed; extended thinking tokens are billed as output tokens; prompt caching only pays off when many requests share a long, unchanging prefix; and the Message Batches API trades latency for a substantial per-token discount on asynchronous, 24-hour-tolerant work — distinct levers that are not interchangeable.
Domain Study Guides
Master what each domain of the CCDV-F exam tests. The knowledge is the goal, and every skill here is independently valuable.
Agents and Workflows
14.7% of examKey Insight
The exam's most repeated setup is a task with fixed, known steps dressed up to look like it needs an agent. The correct instinct is always "find the simplest solution first": a workflow is a fixed code path wired around LLM calls, while an agent is what you get when the LLM is handed control over its own looping and tool-selection decisions. Agentic autonomy is a tradeoff (better task performance on open-ended work, in exchange for higher and more variable latency and cost), not a default upgrade.
What the exam rewards
- ✓Distinguish workflows (predefined code paths orchestrate LLM calls) from agents (the LLM dynamically directs its own steps and tool use) before reaching for either
- ✓Match the workflow pattern to the task's shape: chaining for ordered pipelines, routing for distinct input categories, sectioning/voting for independent or redundancy-benefiting parallel work, orchestrator-workers when the subtask breakdown can't be known in advance, evaluator-optimizer when a generate-then-critique loop measurably improves quality
- ✓Reserve a manager/subagent hierarchy for tasks that are genuinely separable and heavy enough to justify coordination overhead — context isolation, not "more prompts," is the defining benefit
- ✓Choose the Claude Agent SDK when managed loop mechanics suffice, and a custom loop over the Messages API when full control over dispatch, logging, or stopping conditions is required
- ✓Place guardrails against destructive or high-stakes tool calls in a PreToolUse/PostToolUse hook, since hooks are deterministic code callbacks and a prompt sentence is only probabilistic guidance
- ✓Recognize the tool-use loop, subagent delegation, memory, and context-window management as recurring patterns any abstraction framework (LangGraph, PydanticAI, Strands, Agent SDK) packages — understand the underlying API calls before adopting a framework
Anti-patterns to reject
- ✕"Agents are always better than workflows" — the simplest thing that works is the right default; an agent adds latency, cost, and unpredictability a fixed-step task doesn't need
- ✕Confusing orchestrator-workers (subtasks decided dynamically at runtime) with parallelization sectioning (subtasks known and split up front)
- ✕Treating subagents as merely "more prompts" rather than a separate context window — their defining benefit is context isolation
- ✕Putting a safety rule only in the system prompt and calling it a guardrail, instead of a deterministic hook
- ✕Assuming a framework removes the need to understand the tool-use loop and context management it wraps
Applications and Integration
33.1% of examKey Insight
This is the single largest domain across the entire exam, and its throughline is that a Claude application is ordinary software that happens to call a probabilistic model — not a special case exempt from requirements analysis, the SDLC, REST/JSON mechanics, async I/O, version control, or idiomatic error handling. The recurring trap is defaulting to the biggest model or the realtime API instead of extracting latency, volume, criticality, data sensitivity, and cost from the actual requirement.
What the exam rewards
- ✓Translate a business requirement into functional and infrastructure requirements using the five extraction questions — latency, volume, accuracy/criticality, data sensitivity, cost — before picking an architecture
- ✓Run Claude applications through the standard SDLC, adding evaluation as a first-class phase, model-version pinning with regression testing, and continuous production monitoring in place of single equality asserts
- ✓Construct Messages API requests correctly: messages alternate user/assistant, system is a top-level parameter (not a role: "system" message), max_tokens is required, and integration code branches on stop_reason
- ✓Reserve extended thinking for steps whose reasoning depth pays for the added cost and latency; cache a stable, reused prefix; route latency-tolerant, high-volume, cost-sensitive work to the Message Batches API instead of parallelized synchronous calls
- ✓Treat the Claude API as standard REST/JSON, use async/await for I/O-bound calls, and apply exponential backoff with jitter to transient 429/529/5xx errors while fixing (not retrying) 400/401 errors
- ✓Match the instruction mechanism to the interface in play — system param + messages/tools for the API, chat + Project instructions for claude.ai, CLAUDE.md + settings.json for Claude Code — since none transfer verbatim across surfaces
- ✓Delimit untrusted content from trusted instructions, design output schemas strict but not brittle, and explicitly track enabled plugins/MCP servers with their permissions and versions
- ✓Version every configuration layer — CLAUDE.md, settings.json, model IDs, prompts, plugin dependencies — with the same discipline as code, pinning explicit model IDs and gating upgrades behind re-run evals
Anti-patterns to reject
- ✕Defaulting to the biggest model or the realtime API regardless of the requirement
- ✕Believing the system prompt is a role: "system" message, forgetting max_tokens is required, or assuming streaming reduces total tokens/cost rather than just perceived latency
- ✕Applying the same backoff-and-retry strategy to a 400/401 as to a 429/529
- ✕Assuming a CLAUDE.md configures a raw Messages API call, or that one interface's instruction mechanism generalizes to another
- ✕Relying on a floating "latest" model alias in production, or treating prompts/model IDs/config files as untracked local files rather than versioned configuration
Claude Code
3.1% of examKey Insight
The signature distinction in this domain is the same probabilistic-vs-deterministic split that runs through the whole exam, localized to two specific files: CLAUDE.md is memory and instructions the model reads, while settings.json is executable configuration — permissions, hooks, tool allow/deny lists, environment — that enforces a boundary regardless of what the model proposes.
What the exam rewards
- ✓Know the five core component types — Rules, Skills, Commands, Agents, and Agent Memory — and that CLAUDE.md is the primary instance of Agent Memory
- ✓Apply the four-level CLAUDE.md hierarchy (enterprise/system, user, project, subdirectory) knowing more specific files layer on top of broader ones, and commit project-level CLAUDE.md to version control
- ✓Configure settings.json for tool permissions, hooks, environment variables, model selection, and MCP servers — the deterministic control surface, never CLAUDE.md
- ✓Distinguish built-in slash commands from custom slash commands (Markdown prompt files in .claude/commands/)
- ✓Treat headless mode (non-interactive execution for CI/scripting) and auto-mode (reduced-confirmation autonomy) as independent axes, not synonyms
Anti-patterns to reject
- ✕Putting permission rules, hooks, or tool allow/deny lists in CLAUDE.md instead of settings.json
- ✕Treating CLAUDE.md as executable configuration rather than context/memory loaded into the model's prompt
- ✕Confusing headless mode (interactivity) with auto-mode (autonomy) as if they were the same setting
- ✕Treating a project-level CLAUDE.md as a personal, untracked scratch file instead of version-controlled team guidance
- ✕Assuming a more specific CLAUDE.md replaces a broader one rather than layering on top of it
Eval, Testing, and Debugging
2.6% of examKey Insight
The domain's central move is refusing to guess which layer broke. A JSON parse crash on a 200 response with stop_reason: end_turn is your parser's bug, not the model's; malformed-looking output that's actually cut off means stop_reason: max_tokens; and a bad final answer from a multi-step agent is usually the end of a chain that trace analysis has to follow back to its earliest deviation.
What the exam rewards
- ✓Sort a failure into one of five buckets — transport/HTTP, request error, parsing/validation, model-output, or tool-loop — before touching any fix
- ✓Reproduce with the exact failing request, then inspect the raw response (status, stop_reason, usage, content blocks) before any post-processing code runs
- ✓Check stop_reason before concluding an invalid-JSON symptom is a model-output error — max_tokens truncation is fixed by raising the limit, not by rewriting the schema
- ✓In a multi-step workflow, log every model call, tool call, argument set, and tool result, and trace back to the earliest deviation rather than patching only the final failing output
- ✓Match the recovery strategy to the failure class: exponential backoff with jitter for transient 429/529/5xx, fix-and-resend for 400/401, defensive parsing/reprompt for malformed structured output, grounding for hallucination
- ✓Verify every fix with a representative eval set and a defined metric — a single manual spot-check cannot verify non-deterministic output
Anti-patterns to reject
- ✕Rewriting the prompt when a JSON parse crash on a successful response is actually an integration-layer parsing bug
- ✕Treating truncated (stop_reason: max_tokens) output as a schema or prompt problem instead of raising max_tokens
- ✕Debugging only the final output of a multi-step agent instead of tracing back through logged calls to the first faulty step
- ✕Treating "it looks fixed on one example" as verification instead of running it through an eval set and metric
- ✕Applying the same recovery strategy to every failure instead of matching the strategy to the actual failure class
Model Selection and Optimization
16.8% of examKey Insight
The exam wants you to know the mechanics well enough to spot when a claimed benefit doesn't hold: temperature 0 reduces randomness but never guarantees identical output, a bigger context window permits more tokens rather than making them cheaper, and batching lowers cost but not latency (caching and smaller models lower both). Every lever — model tier, caching, batching, thinking budget — has a distinct mechanism and tradeoff, and none substitute for each other.
What the exam rewards
- ✓Know that a token is roughly 3-4 characters of English, generation is autoregressive, and both input and output tokens are billed against one shared context-window budget
- ✓Remember temperature 0 reduces randomness without guaranteeing identical output — test with evals, not equality assertions
- ✓Reserve extended thinking for hard, multi-step reasoning steps, since thinking tokens are billed as output tokens and add latency
- ✓Right-size model tier to task difficulty — Haiku for high-volume simple tasks, Sonnet as the balanced workhorse, Opus for hard reasoning — and route each workflow step to its own fitting tier
- ✓Pin an explicit production model version rather than floating to "latest," and re-run evaluations before adopting any new release
- ✓Model cost as tokens-per-request-type times per-token price, using the usage field for real-time instrumentation, and cap max_tokens to a realistic ceiling
- ✓Cache a large, stable, reused prefix (writes cost slightly more, reads are heavily discounted, savings come from reuse) and route latency-tolerant, high-volume work to the Message Batches API — batching cuts cost, not latency
Anti-patterns to reject
- ✕"Temperature 0 makes Claude deterministic" — it reduces randomness but does not guarantee identical output
- ✕"Bigger context window means cheaper" — a larger window just permits more tokens, which usually costs more
- ✕"Always pick the most capable model to be safe" — right-sizing per task/step is the intended answer
- ✕Assuming a cache write is cheap like a cache read — writes cost slightly more; savings come from reuse across many calls
- ✕Assuming batching reduces latency, or that caching/smaller models don't reduce latency
Prompt and Context Engineering
11% of examKey Insight
The exam's favorite reversal in this domain is system/user placement: durable role, rules, and constraints belong in the system prompt, while the specific request and per-request data belong in the user message. The second favorite reversal is context: a bigger window and more prohibitions both feel like they should help, but curation (pruning, compaction, isolation, retrieval) is what actually fixes context rot and drift.
What the exam rewards
- ✓State the task, constraints, and desired output explicitly and positively rather than relying on long negative "don't" lists
- ✓Keep durable role, rules, and output-shape constraints in the system prompt and the specific request plus per-request data in the user message
- ✓Use worked examples (zero-/one-/multi-shot) to lock in format and style, and with long input material, place the document first and the key instruction near the end
- ✓Delimit instructions from data with XML-style tags/headings so untrusted input can't be read as an instruction, then iterate: diagnose the gap, change one thing, re-run
- ✓Treat the context window as one shared budget across system prompt, tool schemas, history, tool results, and retrieved docs — aim for the smallest set of high-signal tokens, not the largest window
- ✓Counter context rot and drift with compaction, pruning, isolation, and just-in-time retrieval — complementary techniques, not interchangeable ones
- ✓Request machine-readable output via an explicit JSON schema plus tool-forcing rather than trusting temperature 0 to guarantee valid JSON
- ✓Validate both structure and semantics of model output, tolerate extra prose or truncation with defensive parsing, and stay skeptical of confident-sounding output on high-stakes claims
Anti-patterns to reject
- ✕Putting per-request data in the system prompt and stable rules in the user turn — the reverse of the correct split
- ✕"More prohibitions = safer" — positive, specific instructions steer better than long "don't" lists
- ✕Burying the key instruction at the top of a huge document instead of placing it after the material, near the end
- ✕"Just use the biggest context window and stuff everything in" — curation beats capacity
- ✕Confusing compaction (summarize to reclaim budget) with truncation (blindly dropping tokens and losing critical facts)
- ✕Trusting output because it sounds confident, or parsing it with brittle string operations instead of schema validation
Security and Safety
8.1% of examKey Insight
The exam is blunt about what does not defeat prompt injection: raising temperature, a polite system-prompt caveat, or upgrading to a bigger, more instruction-following model. The correct pattern is always structural: isolate and delimit untrusted content, apply least privilege so tools can't be misused even if isolation fails, back both with hooks/guardrails, and never rely on any single layer.
What the exam rewards
- ✓Recognize prompt injection (malicious instructions hidden inside data) and jailbreaks (direct attempts to bypass safety) as distinct threats — there is no syntactic boundary between instructions and data in natural language
- ✓Isolate and delimit untrusted content, apply least privilege to tools, and back both with guardrails/hooks and input/output validation — no single mitigation is sufficient alone
- ✓Minimize PII sent to the model, redact or tokenize sensitive identifiers before they reach it, and scope tool/data access per user
- ✓Never place secrets in prompts or logs — store API keys in environment variables or a secrets manager, use separate keys per environment, rotate on a schedule
- ✓Layer guardrails as independent controls — input filtering, restricted permissions, output validation, monitoring — and route hard rules to deterministic hooks rather than prompt text
- ✓Authenticate every request and separately verify authorization/access level before an agent acts on a caller's behalf, and log both authorized and attempted access
Anti-patterns to reject
- ✕Believing raising temperature, a polite prompt caveat, or a bigger/more capable model defeats prompt injection
- ✕Broadening a tool's access so an agent can "self-correct" — this increases risk rather than reducing it
- ✕Putting secrets in prompts, logs, or hard-coding an API key instead of using environment variables or a secrets manager
- ✕Relying on a single guardrail layer instead of independent, layered defenses
- ✕Treating a system-prompt instruction as an enforceable control for a destructive action instead of routing it to a deterministic hook
Tools and MCPs
10.6% of examKey Insight
The exam's central correction here is that Claude never executes a tool itself — it only requests a call, and your application code is what actually runs it and returns a tool_result. The choice among built-in tools, custom tools, Skills, and MCP servers is a reuse-and-maintenance decision, not a sophistication ladder: an MCP server earns its overhead specifically when a capability must be reused across multiple apps and maintained independently.
What the exam rewards
- ✓Internalize the tool-use loop: send a tools array, Claude emits a tool_use block, your code executes it, you return a tool_result matched by tool_use_id, and Claude continues or ends the turn
- ✓Write tool descriptions that state what the tool does, when to use it, and what each parameter means — description quality is the top driver of correct tool selection
- ✓Return structured, informative tool errors so Claude can recover or retry instead of guessing, and right-size the tool set since too many overlapping tools cause misuse and context bloat
- ✓Gate sensitive or destructive tools behind an approval pattern before they execute
- ✓Recognize MCP as an open standard exposing tools (actions), resources (readable data), and prompts (reusable templates), not just tools
- ✓Match MCP transport to deployment shape: stdio for local, single-user subprocess integrations; streamable HTTP/sockets for remote or shared servers
- ✓Choose the extension mechanism by reuse profile: built-in tools for capabilities that already exist, custom tools for app-specific logic, Skills for packaged reusable know-how, MCP servers when reuse across apps with independent maintenance is required
Anti-patterns to reject
- ✕"Claude executes the tool" — it only requests the call; your application code runs it and returns the result
- ✕Vague tool descriptions — the description, not just the input schema, is the top cause of wrong tool selection
- ✕Forgetting to return a tool_result matched by tool_use_id, breaking the loop's continuation
- ✕Hard-coding integration logic into each app's own prompt for a capability that multiple apps need — an MCP server is the reusable answer
- ✕Assuming a built-in tool can reach any internal REST API — built-ins have fixed capabilities
- ✕Defaulting to one MCP transport regardless of deployment shape instead of matching stdio to local/single-user and HTTP/sockets to remote/multi-client
Readiness Assessment
Personalized readiness score based on your mastery across all domains.
Overall Readiness
0%
Applications & Integration
0%
Needs WorkModel Selection
0%
Needs WorkAgents & Workflows
0%
Needs WorkPrompt & Context
0%
Needs WorkTools & MCPs
0%
Needs WorkSecurity & Safety
0%
AlmostClaude Code
0%
AlmostEval & Debugging
0%
AlmostWeak Areas
Action Items
- ●Focus on Applications & Integration — your weakest domain at 0% mastery.
- ●Review task statement: Translate business requirements into functional and infrastructure requirements (0% mastery).
More preparation needed — follow the action items above