RFC 9457 Problem Details for standardized HTTP API error responses. Use when implementing problem details format, structured API errors, error registries, or migrating from RFC 7807.
View on GitHubyonatangross/skillforge-claude-plugin
ork-fastapi
plugins/ork-fastapi/skills/error-handling-rfc9457/SKILL.md
January 25, 2026
Select agents to install to:
npx add-skill https://github.com/yonatangross/skillforge-claude-plugin/blob/main/plugins/ork-fastapi/skills/error-handling-rfc9457/SKILL.md -a claude-code --skill error-handling-rfc9457Installation paths:
.claude/skills/error-handling-rfc9457/# RFC 9457 Problem Details
Standardize API error responses with machine-readable problem details.
## RFC 9457 vs RFC 7807
| Feature | RFC 7807 (Old) | RFC 9457 (Current) |
|---------|----------------|---------------------|
| Status | Obsolete | Active Standard |
| Multiple problems | Not specified | Explicitly supported |
| Error registry | No | Yes (IANA registry) |
| Extension fields | Implicit | Explicitly allowed |
## Problem Details Schema
```python
from pydantic import BaseModel, Field, HttpUrl
from typing import Any
class ProblemDetail(BaseModel):
"""RFC 9457 Problem Details for HTTP APIs."""
type: HttpUrl = Field(
default="about:blank",
description="URI identifying the problem type"
)
title: str = Field(
description="Short, human-readable summary"
)
status: int = Field(
ge=400, le=599,
description="HTTP status code"
)
detail: str | None = Field(
default=None,
description="Human-readable explanation specific to this occurrence"
)
instance: str | None = Field(
default=None,
description="URI reference identifying the specific occurrence"
)
model_config = {"extra": "allow"} # Allow extension fields
```
## FastAPI Integration
### Exception Classes
```python
from fastapi import HTTPException
from typing import Any
class ProblemException(HTTPException):
"""Base exception for RFC 9457 problem details."""
def __init__(
self,
status_code: int,
problem_type: str,
title: str,
detail: str | None = None,
instance: str | None = None,
**extensions: Any,
):
self.problem_type = problem_type
self.title = title
self.detail = detail
self.instance = instance
self.extensions = extensions
super().__init__(status_code=status_code, detail=detail)
def to_problem_detail(self) -> dict[str, Any]:
result = {
"type": se