import {z} from 'zod' export type GetApiV3NfipClaimsArgs = {$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' | 'basementEnclosureCrawlspaceType' | 'basementEnclosureCrawlspaceType desc' | 'policyCount' | 'policyCount desc' | 'crsClassCode' | 'crsClassCode desc' | 'dateOfLoss' | 'dateOfLoss desc' | 'elevatedBuildingIndicator' | 'elevatedBuildingIndicator desc' | 'elevationCertificateIndicator' | 'elevationCertificateIndicator desc' | 'elevationDifference' | 'elevationDifference desc' | 'baseFloodElevation' | 'baseFloodElevation desc' | 'ratedFloodZone' | 'ratedFloodZone desc' | 'houseWorship' | 'houseWorship desc' | 'locationOfContents' | 'locationOfContents desc' | 'lowestAdjacentGrade' | 'lowestAdjacentGrade desc' | 'lowestFloorElevation' | 'lowestFloorElevation desc' | 'numberOfFloorsInTheInsuredBuilding' | 'numberOfFloorsInTheInsuredBuilding desc' | 'nonProfitIndicator' | 'nonProfitIndicator desc' | 'obstructionType' | 'obstructionType desc' | 'occupancyType' | 'occupancyType desc' | 'originalConstructionDate' | 'originalConstructionDate desc' | 'originalNBDate' | 'originalNBDate desc' | 'amountPaidOnBuildingClaim' | 'amountPaidOnBuildingClaim desc' | 'amountPaidOnContentsClaim' | 'amountPaidOnContentsClaim desc' | 'amountPaidOnIncreasedCostOfComplianceClaim' | 'amountPaidOnIncreasedCostOfComplianceClaim desc' | 'postFIRMConstructionIndicator' | 'postFIRMConstructionIndicator desc' | 'rateMethod' | 'rateMethod desc' | 'smallBusinessIndicatorBuilding' | 'smallBusinessIndicatorBuilding desc' | 'totalBuildingInsuranceCoverage' | 'totalBuildingInsuranceCoverage desc' | 'totalContentsInsuranceCoverage' | 'totalContentsInsuranceCoverage desc' | 'yearOfLoss' | 'yearOfLoss desc' | 'primaryResidenceIndicator' | 'primaryResidenceIndicator desc' | 'buildingDamageAmount' | 'buildingDamageAmount desc' | 'buildingDeductibleCode' | 'buildingDeductibleCode desc' | 'netBuildingPaymentAmount' | 'netBuildingPaymentAmount desc' | 'buildingPropertyValue' | 'buildingPropertyValue desc' | 'causeOfDamage' | 'causeOfDamage desc' | 'condominiumCoverageTypeCode' | 'condominiumCoverageTypeCode desc' | 'contentsDamageAmount' | 'contentsDamageAmount desc' | 'contentsDeductibleCode' | 'contentsDeductibleCode desc' | 'netContentsPaymentAmount' | 'netContentsPaymentAmount desc' | 'contentsPropertyValue' | 'contentsPropertyValue desc' | 'disasterAssistanceCoverageRequired' | 'disasterAssistanceCoverageRequired desc' | 'eventDesignationNumber' | 'eventDesignationNumber desc' | 'ficoNumber' | 'ficoNumber desc' | 'floodCharacteristicsIndicator' | 'floodCharacteristicsIndicator desc' | 'floodWaterDuration' | 'floodWaterDuration desc' | 'floodproofedIndicator' | 'floodproofedIndicator desc' | 'floodEvent' | 'floodEvent desc' | 'iccCoverage' | 'iccCoverage desc' | 'netIccPaymentAmount' | 'netIccPaymentAmount desc' | 'nfipRatedCommunityNumber' | 'nfipRatedCommunityNumber desc' | 'nfipCommunityNumberCurrent' | 'nfipCommunityNumberCurrent desc' | 'nfipCommunityName' | 'nfipCommunityName desc' | 'nonPaymentReasonContents' | 'nonPaymentReasonContents desc' | 'nonPaymentReasonBuilding' | 'nonPaymentReasonBuilding desc' | 'numberOfUnits' | 'numberOfUnits desc' | 'buildingReplacementCost' | 'buildingReplacementCost desc' | 'contentsReplacementCost' | 'contentsReplacementCost desc' | 'replacementCostBasis' | 'replacementCostBasis desc' | 'stateOwnedIndicator' | 'stateOwnedIndicator desc' | 'waterDepth' | 'waterDepth desc' | 'floodZoneCurrent' | 'floodZoneCurrent desc' | 'buildingDescriptionCode' | 'buildingDescriptionCode desc' | 'rentalPropertyIndicator' | 'rentalPropertyIndicator desc' | 'state' | 'state desc' | 'reportedCity' | 'reportedCity desc' | 'reportedZipCode' | 'reportedZipCode desc' | 'countyCode' | 'countyCode desc' | 'censusGeoid' | 'censusGeoid desc' | 'latitude' | 'latitude desc' | 'longitude' | 'longitude desc' | 'foundationType' | 'foundationType desc' | 'openDate' | 'openDate desc' | 'mostRecentRecoveryDate' | 'mostRecentRecoveryDate desc' | 'exteriorWaterDepth' | 'exteriorWaterDepth desc' | 'interiorWaterDepth' | 'interiorWaterDepth desc' | 'mostRecentPaymentDate' | 'mostRecentPaymentDate desc' | 'preFirmIndicator' | 'preFirmIndicator desc' | 'totalSalvageRecovery' | 'totalSalvageRecovery desc' | 'totalBldgClaimPmtRecovery' | 'totalBldgClaimPmtRecovery desc' | 'totalContentsClaimPmtRecovery' | 'totalContentsClaimPmtRecovery desc' | 'totalIccClaimPmtRecovery' | 'totalIccClaimPmtRecovery desc' | 'totalSubrogationRecovery' | 'totalSubrogationRecovery desc' | 'id' | 'id desc'>) | undefined, $select?: (Array<'agricultureStructureIndicator' | 'asOfDate' | 'basementEnclosureCrawlspaceType' | 'policyCount' | 'crsClassCode' | 'dateOfLoss' | 'elevatedBuildingIndicator' | 'elevationCertificateIndicator' | 'elevationDifference' | 'baseFloodElevation' | 'ratedFloodZone' | 'houseWorship' | 'locationOfContents' | 'lowestAdjacentGrade' | 'lowestFloorElevation' | 'numberOfFloorsInTheInsuredBuilding' | 'nonProfitIndicator' | 'obstructionType' | 'occupancyType' | 'originalConstructionDate' | 'originalNBDate' | 'amountPaidOnBuildingClaim' | 'amountPaidOnContentsClaim' | 'amountPaidOnIncreasedCostOfComplianceClaim' | 'postFIRMConstructionIndicator' | 'rateMethod' | 'smallBusinessIndicatorBuilding' | 'totalBuildingInsuranceCoverage' | 'totalContentsInsuranceCoverage' | 'yearOfLoss' | 'primaryResidenceIndicator' | 'buildingDamageAmount' | 'buildingDeductibleCode' | 'netBuildingPaymentAmount' | 'buildingPropertyValue' | 'causeOfDamage' | 'condominiumCoverageTypeCode' | 'contentsDamageAmount' | 'contentsDeductibleCode' | 'netContentsPaymentAmount' | 'contentsPropertyValue' | 'disasterAssistanceCoverageRequired' | 'eventDesignationNumber' | 'ficoNumber' | 'floodCharacteristicsIndicator' | 'floodWaterDuration' | 'floodproofedIndicator' | 'floodEvent' | 'iccCoverage' | 'netIccPaymentAmount' | 'nfipRatedCommunityNumber' | 'nfipCommunityNumberCurrent' | 'nfipCommunityName' | 'nonPaymentReasonContents' | 'nonPaymentReasonBuilding' | 'numberOfUnits' | 'buildingReplacementCost' | 'contentsReplacementCost' | 'replacementCostBasis' | 'stateOwnedIndicator' | 'waterDepth' | 'floodZoneCurrent' | 'buildingDescriptionCode' | 'rentalPropertyIndicator' | 'state' | 'reportedCity' | 'reportedZipCode' | 'countyCode' | 'censusGeoid' | 'latitude' | 'longitude' | 'foundationType' | 'openDate' | 'mostRecentRecoveryDate' | 'exteriorWaterDepth' | 'interiorWaterDepth' | 'mostRecentPaymentDate' | 'preFirmIndicator' | 'totalSalvageRecovery' | 'totalBldgClaimPmtRecovery' | 'totalContentsClaimPmtRecovery' | 'totalIccClaimPmtRecovery' | 'totalSubrogationRecovery' | 'id'>) | undefined, $format?: ('json' | 'jsona' | 'jsonl' | 'csv' | 'parquet') | undefined}; export type GetApiV3NfipClaimsOptions = {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 v3NfipClaims = z.object({agricultureStructureIndicator: z.boolean().nullable().optional(), asOfDate: z.string().nullable().optional(), basementEnclosureCrawlspaceType: z.number().nullable().optional(), policyCount: z.number().nullable().optional(), crsClassCode: z.number().nullable().optional(), dateOfLoss: z.string().nullable().optional(), elevatedBuildingIndicator: z.boolean().nullable().optional(), elevationCertificateIndicator: z.string().nullable().optional(), elevationDifference: z.number().nullable().optional(), baseFloodElevation: z.number().nullable().optional(), ratedFloodZone: z.string().nullable().optional(), houseWorship: z.boolean().nullable().optional(), locationOfContents: z.number().nullable().optional(), lowestAdjacentGrade: z.number().nullable().optional(), lowestFloorElevation: z.number().nullable().optional(), numberOfFloorsInTheInsuredBuilding: z.number().nullable().optional(), nonProfitIndicator: z.boolean().nullable().optional(), obstructionType: z.number().nullable().optional(), occupancyType: z.number().nullable().optional(), originalConstructionDate: z.string().nullable().optional(), originalNBDate: z.string().nullable().optional(), amountPaidOnBuildingClaim: z.number().nullable().optional(), amountPaidOnContentsClaim: z.number().nullable().optional(), amountPaidOnIncreasedCostOfComplianceClaim: z.number().nullable().optional(), postFIRMConstructionIndicator: z.boolean().nullable().optional(), rateMethod: z.string().nullable().optional(), smallBusinessIndicatorBuilding: z.boolean().nullable().optional(), totalBuildingInsuranceCoverage: z.number().nullable().optional(), totalContentsInsuranceCoverage: z.number().nullable().optional(), yearOfLoss: z.number().nullable().optional(), primaryResidenceIndicator: z.boolean().nullable().optional(), buildingDamageAmount: z.number().nullable().optional(), buildingDeductibleCode: z.string().nullable().optional(), netBuildingPaymentAmount: z.number().nullable().optional(), buildingPropertyValue: z.number().nullable().optional(), causeOfDamage: z.string().nullable().optional(), condominiumCoverageTypeCode: z.string().nullable().optional(), contentsDamageAmount: z.number().nullable().optional(), contentsDeductibleCode: z.string().nullable().optional(), netContentsPaymentAmount: z.number().nullable().optional(), contentsPropertyValue: z.number().nullable().optional(), disasterAssistanceCoverageRequired: z.number().nullable().optional(), eventDesignationNumber: z.string().nullable().optional(), ficoNumber: z.number().nullable().optional(), floodCharacteristicsIndicator: z.number().nullable().optional(), floodWaterDuration: z.number().nullable().optional(), floodproofedIndicator: z.boolean().nullable().optional(), floodEvent: z.string().nullable().optional(), iccCoverage: z.number().nullable().optional(), netIccPaymentAmount: z.number().nullable().optional(), nfipRatedCommunityNumber: z.string().nullable().optional(), nfipCommunityNumberCurrent: z.string().nullable().optional(), nfipCommunityName: z.string().nullable().optional(), nonPaymentReasonContents: z.string().nullable().optional(), nonPaymentReasonBuilding: z.string().nullable().optional(), numberOfUnits: z.number().nullable().optional(), buildingReplacementCost: z.number().nullable().optional(), contentsReplacementCost: z.number().nullable().optional(), replacementCostBasis: z.string().nullable().optional(), stateOwnedIndicator: z.boolean().nullable().optional(), waterDepth: z.number().nullable().optional(), floodZoneCurrent: z.string().nullable().optional(), buildingDescriptionCode: z.number().nullable().optional(), rentalPropertyIndicator: z.boolean().nullable().optional(), state: z.string().nullable().optional(), reportedCity: z.string().nullable().optional(), reportedZipCode: z.string().nullable().optional(), countyCode: z.string().nullable().optional(), censusGeoid: z.string().nullable().optional(), latitude: z.number().nullable().optional(), longitude: z.number().nullable().optional(), foundationType: z.string().nullable().optional(), openDate: z.string().nullable().optional(), mostRecentRecoveryDate: z.string().nullable().optional(), exteriorWaterDepth: z.number().nullable().optional(), interiorWaterDepth: z.number().nullable().optional(), mostRecentPaymentDate: z.string().nullable().optional(), preFirmIndicator: z.boolean().nullable().optional(), totalSalvageRecovery: z.number().nullable().optional(), totalBldgClaimPmtRecovery: z.number().nullable().optional(), totalContentsClaimPmtRecovery: z.number().nullable().optional(), totalIccClaimPmtRecovery: z.number().nullable().optional(), totalSubrogationRecovery: z.number().nullable().optional(), id: z.number().optional()}); export const getApiV3NfipClaimsResponse = z.object({metadata: metadata.optional(), NfipClaims: z.array(v3NfipClaims).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 Claims * * GET /v3/NfipClaims */ export const getApiV3NfipClaims = async (args: GetApiV3NfipClaimsArgs, options?: GetApiV3NfipClaimsOptions) => { 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/NfipClaims${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(getApiV3NfipClaimsResponse, await res.json()) };