import {z} from 'zod' export type GetApiV3NfipPoliciesArgs = {$filter?: string | undefined, $top?: number | undefined, $skip?: number | undefined, $count?: boolean | undefined, $filename?: string | undefined, $metadata?: boolean | undefined, $gzip?: boolean | undefined, $orderby?: (Array<'agricultureStructureIndicator' | 'agricultureStructureIndicator desc' | 'asOfDate' | 'asOfDate desc' | 'baseFloodElevation' | 'baseFloodElevation desc' | 'basementEnclosureCrawlspaceType' | 'basementEnclosureCrawlspaceType desc' | 'cancellationDateOfFloodPolicy' | 'cancellationDateOfFloodPolicy desc' | 'condominiumCoverageTypeCode' | 'condominiumCoverageTypeCode desc' | 'construction' | 'construction desc' | 'crsClassCode' | 'crsClassCode desc' | 'buildingDeductibleCode' | 'buildingDeductibleCode desc' | 'contentsDeductibleCode' | 'contentsDeductibleCode desc' | 'elevatedBuildingIndicator' | 'elevatedBuildingIndicator desc' | 'elevationCertificateIndicator' | 'elevationCertificateIndicator desc' | 'elevationDifference' | 'elevationDifference desc' | 'federalPolicyFee' | 'federalPolicyFee desc' | 'ratedFloodZone' | 'ratedFloodZone desc' | 'hfiaaSurcharge' | 'hfiaaSurcharge desc' | 'houseOfWorshipIndicator' | 'houseOfWorshipIndicator desc' | 'locationOfContents' | 'locationOfContents desc' | 'lowestAdjacentGrade' | 'lowestAdjacentGrade desc' | 'lowestFloorElevation' | 'lowestFloorElevation desc' | 'nonProfitIndicator' | 'nonProfitIndicator desc' | 'numberOfFloorsInInsuredBuilding' | 'numberOfFloorsInInsuredBuilding desc' | 'obstructionType' | 'obstructionType desc' | 'occupancyType' | 'occupancyType desc' | 'originalConstructionDate' | 'originalConstructionDate desc' | 'originalNBDate' | 'originalNBDate desc' | 'policyCost' | 'policyCost desc' | 'policyCount' | 'policyCount desc' | 'policyEffectiveDate' | 'policyEffectiveDate desc' | 'policyTerminationDate' | 'policyTerminationDate desc' | 'policyTermIndicator' | 'policyTermIndicator desc' | 'postFIRMConstructionIndicator' | 'postFIRMConstructionIndicator desc' | 'primaryResidenceIndicator' | 'primaryResidenceIndicator desc' | 'rateMethod' | 'rateMethod desc' | 'regularEmergencyProgramIndicator' | 'regularEmergencyProgramIndicator desc' | 'smallBusinessIndicatorBuilding' | 'smallBusinessIndicatorBuilding desc' | 'totalBuildingInsuranceCoverage' | 'totalBuildingInsuranceCoverage desc' | 'totalContentsInsuranceCoverage' | 'totalContentsInsuranceCoverage desc' | 'totalInsurancePremiumOfThePolicy' | 'totalInsurancePremiumOfThePolicy desc' | 'cancellationVoidanceReasonCode' | 'cancellationVoidanceReasonCode desc' | 'subsidizedRateType' | 'subsidizedRateType desc' | 'iccPremium' | 'iccPremium desc' | 'reserveFundAssessment' | 'reserveFundAssessment desc' | 'communityProbationSurcharge' | 'communityProbationSurcharge desc' | 'premiumPaymentIndicator' | 'premiumPaymentIndicator desc' | 'buildingReplacementCost' | 'buildingReplacementCost desc' | 'basicBuildingRate' | 'basicBuildingRate desc' | 'additionalBuildingRate' | 'additionalBuildingRate desc' | 'basicContentsRate' | 'basicContentsRate desc' | 'additionalContentsRate' | 'additionalContentsRate desc' | 'enclosureTypeCode' | 'enclosureTypeCode desc' | 'buildingDescriptionCode' | 'buildingDescriptionCode desc' | 'insuranceToValueCode' | 'insuranceToValueCode desc' | 'postFirmVzoneIndicator' | 'postFirmVzoneIndicator desc' | 'floodproofedIndicator' | 'floodproofedIndicator desc' | 'waitingPeriodType' | 'waitingPeriodType desc' | 'rolloverTransferCode' | 'rolloverTransferCode desc' | 'endorsementEffectiveDate' | 'endorsementEffectiveDate desc' | 'propertyPurchaseDate' | 'propertyPurchaseDate desc' | 'rentalPropertyIndicator' | 'rentalPropertyIndicator desc' | 'tenantIndicator' | 'tenantIndicator desc' | 'stateOwnedIndicator' | 'stateOwnedIndicator desc' | 'disasterAssistanceCoverageRequiredCode' | 'disasterAssistanceCoverageRequiredCode desc' | 'mandatoryPurchaseFlag' | 'mandatoryPurchaseFlag desc' | 'grandfatheringTypeCode' | 'grandfatheringTypeCode desc' | 'nfipRatedCommunityNumber' | 'nfipRatedCommunityNumber desc' | 'nfipCommunityNumberCurrent' | 'nfipCommunityNumberCurrent desc' | 'nfipCommunityName' | 'nfipCommunityName desc' | 'programTypeIndicator' | 'programTypeIndicator desc' | 'mapPanelNumber' | 'mapPanelNumber desc' | 'mapPanelSuffix' | 'mapPanelSuffix desc' | 'floodZoneCurrent' | 'floodZoneCurrent desc' | 'femaRegion' | 'femaRegion desc' | 'propertyState' | 'propertyState desc' | 'reportedCity' | 'reportedCity desc' | 'reportedZipCode' | 'reportedZipCode desc' | 'censusGeoid' | 'censusGeoid desc' | 'latitude' | 'latitude desc' | 'longitude' | 'longitude desc' | 'buildingOnFederalLand' | 'buildingOnFederalLand desc' | 'buildingPurpose' | 'buildingPurpose desc' | 'seasonallyOccupied' | 'seasonallyOccupied desc' | 'fullRiskPremium' | 'fullRiskPremium desc' | 'buildingOverWaterType' | 'buildingOverWaterType desc' | 'foundationType' | 'foundationType desc' | 'preFIRMConstructionIndicator' | 'preFIRMConstructionIndicator desc' | 'id' | 'id desc'>) | undefined, $select?: (Array<'agricultureStructureIndicator' | 'asOfDate' | 'baseFloodElevation' | 'basementEnclosureCrawlspaceType' | 'cancellationDateOfFloodPolicy' | 'condominiumCoverageTypeCode' | 'construction' | 'crsClassCode' | 'buildingDeductibleCode' | 'contentsDeductibleCode' | 'elevatedBuildingIndicator' | 'elevationCertificateIndicator' | 'elevationDifference' | 'federalPolicyFee' | 'ratedFloodZone' | 'hfiaaSurcharge' | 'houseOfWorshipIndicator' | 'locationOfContents' | 'lowestAdjacentGrade' | 'lowestFloorElevation' | 'nonProfitIndicator' | 'numberOfFloorsInInsuredBuilding' | 'obstructionType' | 'occupancyType' | 'originalConstructionDate' | 'originalNBDate' | 'policyCost' | 'policyCount' | 'policyEffectiveDate' | 'policyTerminationDate' | 'policyTermIndicator' | 'postFIRMConstructionIndicator' | 'primaryResidenceIndicator' | 'rateMethod' | 'regularEmergencyProgramIndicator' | 'smallBusinessIndicatorBuilding' | 'totalBuildingInsuranceCoverage' | 'totalContentsInsuranceCoverage' | 'totalInsurancePremiumOfThePolicy' | 'cancellationVoidanceReasonCode' | 'subsidizedRateType' | 'iccPremium' | 'reserveFundAssessment' | 'communityProbationSurcharge' | 'premiumPaymentIndicator' | 'buildingReplacementCost' | 'basicBuildingRate' | 'additionalBuildingRate' | 'basicContentsRate' | 'additionalContentsRate' | 'enclosureTypeCode' | 'buildingDescriptionCode' | 'insuranceToValueCode' | 'postFirmVzoneIndicator' | 'floodproofedIndicator' | 'waitingPeriodType' | 'rolloverTransferCode' | 'endorsementEffectiveDate' | 'propertyPurchaseDate' | 'rentalPropertyIndicator' | 'tenantIndicator' | 'stateOwnedIndicator' | 'disasterAssistanceCoverageRequiredCode' | 'mandatoryPurchaseFlag' | 'grandfatheringTypeCode' | 'nfipRatedCommunityNumber' | 'nfipCommunityNumberCurrent' | 'nfipCommunityName' | 'programTypeIndicator' | 'mapPanelNumber' | 'mapPanelSuffix' | 'floodZoneCurrent' | 'femaRegion' | 'propertyState' | 'reportedCity' | 'reportedZipCode' | 'censusGeoid' | 'latitude' | 'longitude' | 'buildingOnFederalLand' | 'buildingPurpose' | 'seasonallyOccupied' | 'fullRiskPremium' | 'buildingOverWaterType' | 'foundationType' | 'preFIRMConstructionIndicator' | 'id'>) | undefined, $format?: ('json' | 'jsona' | 'jsonl' | 'csv' | 'parquet') | undefined}; export type GetApiV3NfipPoliciesOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const metadata = z.object({skip: z.number().nullable().optional(), filter: z.string().nullable().optional(), orderBy: z.string().nullable().optional(), select: z.string().nullable().optional(), rundate: z.string().nullable().optional(), top: z.number().nullable().optional(), format: z.string().nullable().optional(), metadata: z.boolean().nullable().optional(), entityname: z.string().optional(), version: z.string().optional(), url: z.string().optional(), count: z.number().nullable().optional()}); export const v3NfipPolicies = z.object({agricultureStructureIndicator: z.boolean().nullable().optional(), asOfDate: z.string().nullable().optional(), baseFloodElevation: z.number().nullable().optional(), basementEnclosureCrawlspaceType: z.number().nullable().optional(), cancellationDateOfFloodPolicy: z.string().nullable().optional(), condominiumCoverageTypeCode: z.string().nullable().optional(), construction: z.boolean().nullable().optional(), crsClassCode: z.number().nullable().optional(), buildingDeductibleCode: z.string().nullable().optional(), contentsDeductibleCode: z.string().nullable().optional(), elevatedBuildingIndicator: z.boolean().nullable().optional(), elevationCertificateIndicator: z.string().nullable().optional(), elevationDifference: z.number().nullable().optional(), federalPolicyFee: z.number().nullable().optional(), ratedFloodZone: z.string().nullable().optional(), hfiaaSurcharge: z.number().nullable().optional(), houseOfWorshipIndicator: z.boolean().nullable().optional(), locationOfContents: z.number().nullable().optional(), lowestAdjacentGrade: z.number().nullable().optional(), lowestFloorElevation: z.number().nullable().optional(), nonProfitIndicator: z.boolean().nullable().optional(), numberOfFloorsInInsuredBuilding: z.number().nullable().optional(), obstructionType: z.number().nullable().optional(), occupancyType: z.number().nullable().optional(), originalConstructionDate: z.string().nullable().optional(), originalNBDate: z.string().nullable().optional(), policyCost: z.number().nullable().optional(), policyCount: z.number().nullable().optional(), policyEffectiveDate: z.string().nullable().optional(), policyTerminationDate: z.string().nullable().optional(), policyTermIndicator: z.number().nullable().optional(), postFIRMConstructionIndicator: z.boolean().nullable().optional(), primaryResidenceIndicator: z.boolean().nullable().optional(), rateMethod: z.string().nullable().optional(), regularEmergencyProgramIndicator: z.string().nullable().optional(), smallBusinessIndicatorBuilding: z.boolean().nullable().optional(), totalBuildingInsuranceCoverage: z.number().nullable().optional(), totalContentsInsuranceCoverage: z.number().nullable().optional(), totalInsurancePremiumOfThePolicy: z.number().nullable().optional(), cancellationVoidanceReasonCode: z.string().nullable().optional(), subsidizedRateType: z.string().nullable().optional(), iccPremium: z.number().nullable().optional(), reserveFundAssessment: z.number().nullable().optional(), communityProbationSurcharge: z.number().nullable().optional(), premiumPaymentIndicator: z.number().nullable().optional(), buildingReplacementCost: z.number().nullable().optional(), basicBuildingRate: z.number().nullable().optional(), additionalBuildingRate: z.number().nullable().optional(), basicContentsRate: z.number().nullable().optional(), additionalContentsRate: z.number().nullable().optional(), enclosureTypeCode: z.string().nullable().optional(), buildingDescriptionCode: z.number().nullable().optional(), insuranceToValueCode: z.number().nullable().optional(), postFirmVzoneIndicator: z.boolean().nullable().optional(), floodproofedIndicator: z.boolean().nullable().optional(), waitingPeriodType: z.string().nullable().optional(), rolloverTransferCode: z.string().nullable().optional(), endorsementEffectiveDate: z.string().nullable().optional(), propertyPurchaseDate: z.string().nullable().optional(), rentalPropertyIndicator: z.boolean().nullable().optional(), tenantIndicator: z.boolean().nullable().optional(), stateOwnedIndicator: z.boolean().nullable().optional(), disasterAssistanceCoverageRequiredCode: z.number().nullable().optional(), mandatoryPurchaseFlag: z.boolean().nullable().optional(), grandfatheringTypeCode: z.number().nullable().optional(), nfipRatedCommunityNumber: z.string().nullable().optional(), nfipCommunityNumberCurrent: z.string().nullable().optional(), nfipCommunityName: z.string().nullable().optional(), programTypeIndicator: z.boolean().nullable().optional(), mapPanelNumber: z.string().nullable().optional(), mapPanelSuffix: z.string().nullable().optional(), floodZoneCurrent: z.string().nullable().optional(), femaRegion: z.number().nullable().optional(), propertyState: z.string().nullable().optional(), reportedCity: z.string().nullable().optional(), reportedZipCode: z.string().nullable().optional(), censusGeoid: z.string().nullable().optional(), latitude: z.number().nullable().optional(), longitude: z.number().nullable().optional(), buildingOnFederalLand: z.boolean().nullable().optional(), buildingPurpose: z.string().nullable().optional(), seasonallyOccupied: z.boolean().nullable().optional(), fullRiskPremium: z.number().nullable().optional(), buildingOverWaterType: z.number().nullable().optional(), foundationType: z.string().nullable().optional(), preFIRMConstructionIndicator: z.boolean().nullable().optional(), id: z.number().optional()}); export const getApiV3NfipPoliciesResponse = z.object({metadata: metadata.optional(), NfipPolicies: z.array(v3NfipPolicies).optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * NFIP Redacted Policies * * GET /v3/NfipPolicies */ export const getApiV3NfipPolicies = async (args: GetApiV3NfipPoliciesArgs, options?: GetApiV3NfipPoliciesOptions) => { const {baseUrl = "https://www.fema.gov/api/open", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.$filter != null) query.append("$filter", String(args.$filter)) if (args.$top != null) query.append("$top", String(args.$top)) if (args.$skip != null) query.append("$skip", String(args.$skip)) if (args.$count != null) query.append("$count", String(args.$count)) if (args.$filename != null) query.append("$filename", String(args.$filename)) if (args.$metadata != null) query.append("$metadata", String(args.$metadata)) if (args.$gzip != null) query.append("$gzip", String(args.$gzip)) for (const item of args.$orderby ?? []) query.append("$orderby", String(item)) for (const item of args.$select ?? []) query.append("$select", String(item)) if (args.$format != null) query.append("$format", String(args.$format)) const url = `${baseUrl.replace(/\/+$/, '')}/v3/NfipPolicies${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getApiV3NfipPoliciesResponse, await res.json()) };