CCDV-F - Fact Sheet¶
Quick Reference¶
| Detail | Info |
|---|---|
| Exam Code | CCDV-F |
| Full Name | Claude Certified Developer - Foundations |
| Provider | Anthropic |
| Duration | 120 minutes |
| Questions | 53 multiple-choice and multiple-response |
| Passing Score | 720 / 1000 |
| Cost | $125 USD |
| Delivery | Pearson VUE - online proctored or test center |
| Validity | 12 months (free non-proctored renewal via Partner Academy) |
| Prerequisites | None |
| Registration | Anthropic Partner Academy (requires free Claude Partner Network membership) |
| Retakes | 14 days after attempt 1, 30 after attempt 2, 90 after attempt 3; max 4 per rolling 12 months |
Exam Domains (blueprint v1.0, effective July 2026)¶
| # | Domain | Weight | Focus |
|---|---|---|---|
| 1 | Applications and Integration | 33.1% | Messages API, streaming, files, batching, errors, SDKs |
| 2 | Model Selection and Optimization | 16.8% | Model family, caching economics, cost and latency levers |
| 3 | Agents and Workflows | 14.7% | Workflow patterns, agent loops, Agent SDK, reliability |
| 4 | Prompt and Context Engineering | 11.0% | System prompts, structure, context management |
| 5 | Tools and MCPs | 10.6% | Tool use lifecycle, tool design, Model Context Protocol |
| 6 | Security and Safety | 8.1% | Key handling, prompt injection, validation, moderation |
| 7 | Claude Code | 3.1% | CLAUDE.md, settings, hooks, MCP config, headless use |
| 8 | Eval, Testing, and Debugging | 2.6% | Graders, regression suites, debugging tool calls |
Models (mid-2026)¶
| Model | Tier | Use |
|---|---|---|
| Claude Opus 5 | Most capable | Deep reasoning, hard agentic and coding work |
| Claude Sonnet 5 | Balanced | Default workhorse for most applications |
| Claude Haiku 4.5 | Fastest, cheapest | Throughput, classification, routing, sub-agents |
Model lineups change. Check current IDs and pricing at https://docs.anthropic.com/en/docs/about-claude/models before the exam. See notes/08 for selection criteria.
Authentication¶
- Header:
x-api-key: <key> - Header:
anthropic-version: 2023-06-01 - Beta features:
anthropic-beta: <feature>
Bedrock and Vertex use IAM and service accounts respectively, not the API key.
Messages API Essentials¶
Request Shape (Minimal)¶
{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello"}
]
}
Required Fields¶
modelmax_tokensmessages
Optional Fields¶
system- system prompt (string or array of content blocks)temperature- 0 to 1top_p,top_kstop_sequencesstream- booleantools,tool_choicethinking- extended thinking configmetadata- user_id for abuse tracking
Response Shape¶
{
"id": "msg_...",
"type": "message",
"role": "assistant",
"model": "claude-sonnet-4-6",
"content": [{"type": "text", "text": "..."}],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 12,
"output_tokens": 30,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 0
}
}
Stop Reasons¶
end_turn- natural completionmax_tokens- hit max_tokens capstop_sequence- hit a stop_sequencetool_use- Claude wants to call a toolpause_turn- long-running response paused (rare)refusal- model declined to respond
Content Block Types¶
- text
- image (base64 or URL)
- document (PDF, base64 or file_id)
- tool_use (Claude's request to call a tool)
- tool_result (your response to a tool_use)
- thinking (Claude's internal reasoning)
Streaming Events¶
In order:
message_start- message metadata- For each content block:
content_block_startcontent_block_delta(one or more)content_block_stopmessage_delta- usage and stop_reason updatesmessage_stop- end of stream
Delta types:
text_delta- text incrementsinput_json_delta- tool_use input buildingthinking_delta- thinking contentsignature_delta- thinking signature
Also: ping events for keepalive.
Tool Use Lifecycle¶
- Define tools in the request:
tools: [{name, description, input_schema}] - Set
tool_choice:auto(default),any,{type: "tool", name: "..."}, ornone - Claude responds with
stop_reason: tool_useand one or moretool_useblocks - Execute the tool(s) in your code
- Send a new message with role
userand atool_resultcontent block per tool_use - Continue the loop until
stop_reason: end_turn
Forced Structured Output¶
To guarantee JSON matching a schema:
tools = [{
"name": "extract_invoice",
"description": "Extract structured invoice fields.",
"input_schema": {...JSON schema...}
}]
tool_choice = {"type": "tool", "name": "extract_invoice"}
The tool's input will be the structured output.
Prompt Caching¶
- Mark blocks with
cache_control: {"type": "ephemeral"} - Default TTL: 5 minutes
- 1-hour TTL:
cache_control: {"type": "ephemeral", "ttl": "1h"}(where supported) - Up to 4 cache breakpoints per request
- Minimum cacheable prefix varies by model (roughly 1024-4096 tokens; below the minimum a marker silently does nothing)
- Cache writes ~1.25x input rate
- Cache reads ~0.1x input rate
usage.cache_creation_input_tokensandusage.cache_read_input_tokensreport per request
What to Cache (in order)¶
- System prompt
- Tool definitions
- Stable reference docs
- Few-shot examples
- Conversation prefix
Batch API¶
| Aspect | Value |
|---|---|
| Discount | 50% off real-time |
| SLA | Within 24 hours |
| Max requests per batch | 100,000 |
| Max batch size | 256 MB |
Workflow¶
- Submit batch:
POST /v1/messages/batcheswith array of requests - Poll:
GET /v1/messages/batches/{id}for status - Retrieve:
GET /v1/messages/batches/{id}/results(JSONL stream) - Each item succeeds or fails independently
Batch Statuses¶
- in_progress
- canceling
- ended
Per-item results: succeeded, errored, expired, canceled.
Files API¶
- Upload:
POST /v1/files(multipart) - Reference by
file_idin subsequent messages - Supported types: PDF, images, plain text, JSON, more
- File size limits and storage TTL per docs
- Use to avoid re-uploading the same artifact across requests
Citations¶
Enables Claude to cite specific spans of input documents in its response. Wrap source documents in document content blocks with citations: {enabled: true}. Claude returns citations arrays alongside text spans.
Use cases:
- Grounded RAG with source attribution
- Compliance use cases requiring traceability
- UI rendering of "sources" beneath generated answers
Vision and PDF¶
Images¶
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": "..."}}
Or by URL or file_id.
PDFs¶
{"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": "..."}}
Or by URL or file_id. Claude reads text and visual layout.
Error Codes¶
| Code | Meaning | Action |
|---|---|---|
| 400 | invalid_request_error | Fix request |
| 401 | authentication_error | Check API key |
| 403 | permission_error | Check permissions |
| 404 | not_found_error | Check ID/endpoint |
| 413 | request_too_large | Trim payload |
| 429 | rate_limit_error | Retry with backoff per Retry-After |
| 500 | api_error | Retry with backoff |
| 529 | overloaded_error | Retry with backoff |
Rate Limit Headers¶
anthropic-ratelimit-requests-limitanthropic-ratelimit-requests-remaininganthropic-ratelimit-requests-resetanthropic-ratelimit-tokens-limitanthropic-ratelimit-tokens-remaininganthropic-ratelimit-tokens-resetretry-afteron 429 / 529
Retry Patterns¶
- Exponential backoff with jitter
- Cap retries (3-5)
- Honor
retry-afterwhen present - Distinguish retryable (429, 500, 529, network) from non-retryable (400, 401, 403, 404)
SDK Highlights¶
Python¶
from anthropic import Anthropic
client = Anthropic() # reads ANTHROPIC_API_KEY
msg = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Hi"}],
)
Async: from anthropic import AsyncAnthropic.
Streaming helper:
with client.messages.stream(...) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
final = stream.get_final_message()
Bedrock: from anthropic import AnthropicBedrock. Vertex: from anthropic import AnthropicVertex.
TypeScript¶
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const msg = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 1024,
messages: [{ role: "user", content: "Hi" }],
});
Streaming:
const stream = client.messages.stream({...});
for await (const event of stream) { ... }
const final = await stream.finalMessage();
New-Domain Quick Facts¶
Model Selection and Optimization (Domain 2, 16.8%)¶
- Choose by capability need, latency budget, and cost per token: Opus for the hardest reasoning, Sonnet as the default, Haiku for high-volume simple tasks.
- Cost levers in rough order of impact: prompt caching, Batch API (50% off), model routing (cheap model for easy requests), truncating or summarizing history, right-sizing
max_tokens. - Extended thinking spends output tokens on reasoning; control the spend with the model's thinking or effort configuration and leave
max_tokensheadroom. - Count tokens with the token counting endpoint, never a third-party tokenizer.
- Full detail: notes/08.
Agents and Workflows (Domain 3, 14.7%)¶
- Workflow = your code orchestrates fixed steps. Agent = the model decides the next step in a tool-use loop.
- Know the five workflow patterns: prompt chaining, routing, parallelization, orchestrator-workers, evaluator-optimizer.
- Agent reliability: iteration caps, budget limits, human-in-the-loop gates for destructive actions.
- The Claude Agent SDK packages the Claude Code harness (tools, loop, permissions) as a library.
- Full detail: notes/09.
Security and Safety (Domain 6, 8.1%)¶
- API keys live in environment variables or a secrets manager, never in code or client-side bundles.
- Prompt injection: treat all retrieved or user-supplied content as untrusted; least-privilege tools; human approval for irreversible actions.
- Validate tool inputs and model outputs at system boundaries; handle
stop_reason: "refusal"before reading content. - Full detail: notes/10.
Claude Code (Domain 7, 3.1%)¶
- CLAUDE.md = persistent project context; settings.json = permissions and config; hooks = shell commands on lifecycle events; MCP servers configured per project or user.
- Headless mode (
claude -p) and the Agent SDK enable CI and programmatic use. - Full detail: notes/10.
Eval, Testing, and Debugging (Domain 8, 2.6%)¶
- Grader types: exact match / string checks (cheap, rigid), code graders (deterministic properties), LLM-as-judge (subjective quality, needs its own validation).
- Build the eval set before tuning prompts; run it as a regression suite on every prompt or model change.
- Debug tool-call failures by logging full request and response bodies, including
tool_use_idpairing andstop_reason. - Full detail: notes/10.
High-Yield Exam Tips¶
max_tokensis required.- System prompts go in the
systemfield, not as a message. stop_reason: tool_userequires you to sendtool_resultnext, not a regular user message.- Tool results go in a
userrole message withtool_resultcontent blocks. cache_controlbelongs on individual content blocks, not on the request.- Cache writes cost more; cache reads cost much less; break-even ~2 reads.
- Batch API is async; poll or use webhooks.
- The Retry-After header overrides your default backoff.
- The SDK is thread-safe; reuse the client.
- Bedrock and Vertex have separate SDK clients but the same Messages interface.
Common Traps¶
- Putting the system prompt as a user message (use
systemfield). - Forgetting to send tool_result and instead sending a fresh user message.
- Caching content that changes per request.
- Missing
cache_creation_input_tokensaccounting in cost reports. - Treating Batch results as in-order; they are not.
- Retrying 400 errors blindly.
- Hardcoding model IDs without env config.
- Ignoring
pause_turnstop reason on long responses. - Confusing
tool_choice: anywithtool_choice: {type: "tool", name: ...}. - Streaming without consuming events to completion (resource leak).