Skip to content

A user can query the Historic JOA API endpoint #5

Closed

Description

@paddy74

The Historic JOAs API is designed to deliver smaller fields for all current and past job postings to USAJOBS filtered by a set of standard parameters. This endpoint is intended to deliver a bulk data set to be parsed by the consumer.

Enable usage of the Historic JOAs API endpoint as documented in the API Reference - GET /api/HistoricJoa.

Activity

  1. paddy74 commented on Sep 11, 2025

    @paddy74
    OwnerAuthor

    Here is an initial generated solution for usajobsapi/endpoints/historicjoa.py

    class HistoricJoaEndpoint(BaseModel):
        """Historic JOAs endpoint (no auth; uses continuation tokens)."""
        method: str = "GET"
        path: str = "/api/historicjoa"  # per docs. :contentReference[oaicite:2]{index=2}
    
        class Params(BaseModel):
            model_config = ConfigDict(frozen=True, extra="forbid", populate_by_name=True)
    
            # Per docs, all are optional filters:
            hiring_agency_codes: Optional[str] = Field(None, serialization_alias="HiringAgencyCodes")
            hiring_department_codes: Optional[str] = Field(None, serialization_alias="HiringDepartmentCodes")
            position_series: Optional[str] = Field(None, serialization_alias="PositionSeries")
            announcement_numbers: Optional[str] = Field(None, serialization_alias="AnnouncementNumbers")
            usajobs_control_numbers: Optional[str] = Field(None, serialization_alias="USAJOBSControlNumbers")
            start_position_open_date: Optional[str] = Field(None, serialization_alias="StartPositionOpenDate")  # YYYY-MM-DD
            end_position_open_date: Optional[str] = Field(None, serialization_alias="EndPositionOpenDate")
            start_position_close_date: Optional[str] = Field(None, serialization_alias="StartPositionCloseDate")
            end_position_close_date: Optional[str] = Field(None, serialization_alias="EndPositionCloseDate")
            continuation_token: Optional[str] = Field(None, serialization_alias="continuationtoken")
    
            def to_params(self) -> Dict[str, str]:
                return _dump_by_alias(self)
    
        class Item(BaseModel):
            usajobs_control_number: int = Field(alias="usajobsControlNumber")
            position_title: Optional[str] = Field(default=None, alias="positionTitle")
            hiring_agency_code: Optional[str] = Field(default=None, alias="hiringAgencyCode")
            hiring_department_code: Optional[str] = Field(default=None, alias="hiringDepartmentCode")
            position_open_date: Optional[str] = Field(default=None, alias="positionOpenDate")
            position_close_date: Optional[str] = Field(default=None, alias="positionCloseDate")
            minimum_salary: Optional[float] = Field(default=None, alias="minimumSalary")
            maximum_salary: Optional[float] = Field(default=None, alias="maximumSalary")
    
        class PagingMeta(BaseModel):
            total_count: Optional[int] = Field(default=None, alias="totalCount")
            page_size: Optional[int] = Field(default=None, alias="pageSize")
            continuation_token: Optional[str] = Field(default=None, alias="continuationToken")
    
        class Paging(BaseModel):
            metadata: HistoricJoaEndpoint.PagingMeta
            next: Optional[str] = None
    
        class Response(BaseModel):
            paging: Optional[HistoricJoaEndpoint.Paging] = None
            data: List[HistoricJoaEndpoint.Item] = Field(default_factory=list)
    
            def next_token(self) -> Optional[str]:
                return self.paging.metadata.continuation_token if self.paging and self.paging.metadata else None
  2. self-assigned this
    on Sep 11, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions