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 GitHubJanuary 25, 2026
Select agents to install to:
npx add-skill https://github.com/yonatangross/orchestkit/blob/main/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