You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
6.3 KiB
Python
195 lines
6.3 KiB
Python
"""
|
|
Pydantic schemas for SEC filing endpoints.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from typing import Any, Dict, List, Optional
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
|
|
class FilingDocumentInfo(BaseModel):
|
|
model_config = ConfigDict(json_schema_extra={
|
|
"example": {
|
|
"type": "EX-99.1",
|
|
"description": "Press Release",
|
|
"filename": "ex991pressrelease.htm",
|
|
"url": "https://www.sec.gov/Archives/edgar/data/320193/000032019324000006/ex991pressrelease.htm",
|
|
"size": "42 KB",
|
|
}
|
|
})
|
|
|
|
type: Optional[str] = None
|
|
description: Optional[str] = None
|
|
filename: Optional[str] = None
|
|
url: Optional[str] = None
|
|
size: Optional[str] = None
|
|
|
|
|
|
class FilingSummary(BaseModel):
|
|
model_config = ConfigDict(json_schema_extra={
|
|
"example": {
|
|
"accession_number": "0000320193-24-000006",
|
|
"form_type": "8-K",
|
|
"filing_date": "2024-02-01",
|
|
"accepted_at": "2024-02-01T21:00:05+00:00",
|
|
"primary_document": "a8-k20240201.htm",
|
|
"filing_description": "Results of Operations and Financial Condition",
|
|
"documents_count": 4,
|
|
}
|
|
})
|
|
|
|
accession_number: str
|
|
form_type: str
|
|
filing_date: str
|
|
accepted_at: Optional[str] = None
|
|
primary_document: Optional[str] = None
|
|
filing_description: Optional[str] = None
|
|
documents_count: Optional[int] = None
|
|
|
|
|
|
class FilingSearchResponse(BaseModel):
|
|
model_config = ConfigDict(json_schema_extra={
|
|
"example": {
|
|
"ticker": "AAPL",
|
|
"filings": [
|
|
{
|
|
"accession_number": "0000320193-24-000006",
|
|
"form_type": "8-K",
|
|
"filing_date": "2024-02-01",
|
|
"accepted_at": "2024-02-01T21:00:05+00:00",
|
|
"primary_document": "a8-k20240201.htm",
|
|
"filing_description": "Results of Operations and Financial Condition",
|
|
"documents_count": 4,
|
|
}
|
|
],
|
|
"total_count": 42,
|
|
"metadata": {"limit": 20, "offset": 0, "form_types": ["8-K"]},
|
|
}
|
|
})
|
|
|
|
ticker: str
|
|
filings: List[FilingSummary]
|
|
total_count: int
|
|
metadata: dict = Field(default_factory=dict)
|
|
|
|
|
|
class FilingDocumentListResponse(BaseModel):
|
|
model_config = ConfigDict(json_schema_extra={
|
|
"example": {
|
|
"accession_number": "0000320193-24-000006",
|
|
"documents": [
|
|
{
|
|
"type": "8-K",
|
|
"description": "8-K",
|
|
"filename": "a8-k20240201.htm",
|
|
"url": "https://www.sec.gov/Archives/edgar/data/320193/000032019324000006/a8-k20240201.htm",
|
|
"size": "8 KB",
|
|
},
|
|
{
|
|
"type": "EX-99.1",
|
|
"description": "Press Release",
|
|
"filename": "ex991pressrelease.htm",
|
|
"url": "https://www.sec.gov/Archives/edgar/data/320193/000032019324000006/ex991pressrelease.htm",
|
|
"size": "42 KB",
|
|
},
|
|
],
|
|
"metadata": {"total_documents": 4},
|
|
}
|
|
})
|
|
|
|
accession_number: str
|
|
documents: List[FilingDocumentInfo]
|
|
metadata: dict = Field(default_factory=dict)
|
|
|
|
|
|
class ExhibitContentResponse(BaseModel):
|
|
model_config = ConfigDict(json_schema_extra={
|
|
"example": {
|
|
"accession_number": "0000320193-24-000006",
|
|
"exhibit_type": "EX-99.1",
|
|
"content": "Apple Reports First Quarter Results...\nCUPERTINO, California — February 1, 2024 — Apple Inc. today announced financial results for its fiscal 2024 first quarter...",
|
|
"content_type": "text/html",
|
|
"filename": "ex991pressrelease.htm",
|
|
"url": "https://www.sec.gov/Archives/edgar/data/320193/000032019324000006/ex991pressrelease.htm",
|
|
}
|
|
})
|
|
|
|
accession_number: str
|
|
exhibit_type: str
|
|
content: str
|
|
content_type: Optional[str] = None
|
|
filename: Optional[str] = None
|
|
url: Optional[str] = None
|
|
|
|
|
|
# ── Bulk filing search ──────────────────────────────────────────────────────
|
|
|
|
class BulkFilingSearchRequest(BaseModel):
|
|
model_config = ConfigDict(json_schema_extra={
|
|
"example": {
|
|
"tickers": ["AAPL", "MSFT", "NVDA"],
|
|
"form_type": "8-K",
|
|
"start_date": "2024-01-01",
|
|
"end_date": "2024-12-31",
|
|
"limit_per_ticker": 5,
|
|
}
|
|
})
|
|
|
|
tickers: List[str] = Field(..., min_length=1, max_length=200)
|
|
form_type: Optional[str] = None
|
|
start_date: Optional[str] = None
|
|
end_date: Optional[str] = None
|
|
limit_per_ticker: int = Field(default=20, ge=1, le=100)
|
|
|
|
|
|
class BulkFilingSearchItem(BaseModel):
|
|
ticker: str
|
|
success: bool
|
|
filings: List[FilingSummary] = []
|
|
total_count: int = 0
|
|
error: Optional[str] = None
|
|
|
|
|
|
class BulkFilingSearchResponse(BaseModel):
|
|
results: List[BulkFilingSearchItem]
|
|
total_tickers: int
|
|
successful_count: int
|
|
failed_count: int
|
|
query_time_seconds: float
|
|
metadata: Dict[str, Any] = Field(default_factory=dict)
|
|
|
|
|
|
# ── Bulk exhibit ────────────────────────────────────────────────────────────
|
|
|
|
class BulkExhibitRequest(BaseModel):
|
|
model_config = ConfigDict(json_schema_extra={
|
|
"example": {
|
|
"items": [
|
|
{"accession_number": "0000320193-24-000006", "exhibit_type": "EX-99.1"},
|
|
{"accession_number": "0001045810-24-000010", "exhibit_type": "EX-99.1"},
|
|
]
|
|
}
|
|
})
|
|
|
|
items: List[Dict[str, str]] = Field(..., min_length=1, max_length=50)
|
|
# Each item: {"accession_number": "...", "exhibit_type": "EX-99.1"}
|
|
|
|
|
|
class BulkExhibitItem(BaseModel):
|
|
accession_number: str
|
|
exhibit_type: str
|
|
success: bool
|
|
content: Optional[str] = None
|
|
content_type: Optional[str] = None
|
|
filename: Optional[str] = None
|
|
url: Optional[str] = None
|
|
error: Optional[str] = None
|
|
|
|
|
|
class BulkExhibitResponse(BaseModel):
|
|
results: List[BulkExhibitItem]
|
|
total_items: int
|
|
successful_count: int
|
|
failed_count: int
|
|
query_time_seconds: float
|