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.
101 lines
2.8 KiB
Python
101 lines
2.8 KiB
Python
"""
|
|
Pydantic schemas for SEC filing endpoints.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from typing import Any, Dict, List, Optional
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class FilingDocumentInfo(BaseModel):
|
|
type: Optional[str] = None
|
|
description: Optional[str] = None
|
|
filename: Optional[str] = None
|
|
url: Optional[str] = None
|
|
size: Optional[str] = None
|
|
|
|
|
|
class FilingSummary(BaseModel):
|
|
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):
|
|
ticker: str
|
|
filings: List[FilingSummary]
|
|
total_count: int
|
|
metadata: dict = Field(default_factory=dict)
|
|
|
|
|
|
class FilingDocumentListResponse(BaseModel):
|
|
accession_number: str
|
|
documents: List[FilingDocumentInfo]
|
|
metadata: dict = Field(default_factory=dict)
|
|
|
|
|
|
class ExhibitContentResponse(BaseModel):
|
|
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):
|
|
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):
|
|
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
|