Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
Adds HUNT (Sniper/Trend/Forge), CFO dashboard (burn rate + kill list), and a plugin-based Analyze side panel with caching and SSRF hardening.
94 lines
2.2 KiB
Python
94 lines
2.2 KiB
Python
"""HUNT (Discovery) schemas."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class HuntSniperItem(BaseModel):
|
|
domain: str
|
|
platform: str
|
|
auction_url: str
|
|
current_bid: float
|
|
currency: str
|
|
end_time: datetime
|
|
age_years: Optional[int] = None
|
|
backlinks: Optional[int] = None
|
|
pounce_score: Optional[int] = None
|
|
|
|
|
|
class HuntSniperResponse(BaseModel):
|
|
items: list[HuntSniperItem]
|
|
total: int
|
|
filtered_out_missing_data: int = 0
|
|
last_updated: Optional[datetime] = None
|
|
|
|
|
|
class TrendItem(BaseModel):
|
|
title: str
|
|
approx_traffic: Optional[str] = None
|
|
published_at: Optional[datetime] = None
|
|
link: Optional[str] = None
|
|
|
|
|
|
class TrendsResponse(BaseModel):
|
|
geo: str = "US"
|
|
items: list[TrendItem]
|
|
fetched_at: datetime
|
|
|
|
|
|
class KeywordAvailabilityRequest(BaseModel):
|
|
keywords: list[str] = Field(min_length=1, max_length=25)
|
|
tlds: list[str] = Field(default_factory=lambda: ["com", "io", "ai", "net", "org"], max_length=20)
|
|
|
|
|
|
class KeywordAvailabilityRow(BaseModel):
|
|
keyword: str
|
|
domain: str
|
|
tld: str
|
|
is_available: Optional[bool] = None
|
|
status: str # available|taken|unknown
|
|
|
|
|
|
class KeywordAvailabilityResponse(BaseModel):
|
|
items: list[KeywordAvailabilityRow]
|
|
|
|
|
|
class TypoCheckRequest(BaseModel):
|
|
brand: str = Field(min_length=2, max_length=50)
|
|
tlds: list[str] = Field(default_factory=lambda: ["com"], max_length=10)
|
|
limit: int = Field(default=50, ge=1, le=200)
|
|
|
|
|
|
class TypoCandidate(BaseModel):
|
|
domain: str
|
|
is_available: Optional[bool] = None
|
|
status: str # available|taken|unknown
|
|
|
|
|
|
class TypoCheckResponse(BaseModel):
|
|
brand: str
|
|
items: list[TypoCandidate]
|
|
|
|
|
|
class BrandableRequest(BaseModel):
|
|
pattern: str = Field(description="cvcvc|cvccv|human", examples=["cvcvc"])
|
|
tlds: list[str] = Field(default_factory=lambda: ["com"], max_length=10)
|
|
limit: int = Field(default=30, ge=1, le=100)
|
|
max_checks: int = Field(default=400, ge=50, le=2000)
|
|
|
|
|
|
class BrandableCandidate(BaseModel):
|
|
domain: str
|
|
is_available: Optional[bool] = None
|
|
status: str # available|taken|unknown
|
|
|
|
|
|
class BrandableResponse(BaseModel):
|
|
pattern: str
|
|
items: list[BrandableCandidate]
|
|
|