What federal agencies plan to buy, from DHS and the GSA Acquisition Gateway, with GSA’s ceiling rates for every labor category on the Multiple Award Schedule, updated weekly.
A forecast is an agency’s public notice of a purchase it plans to make, usually months before the solicitation. DHS publishes its forecasts in the Acquisition Planning Forecast System (planned buys over $250,000). The GSA Acquisition Gateway publishes forecasts from ten civilian agencies, with Interior, Agriculture and Commerce the largest. Civly reads both every week into one table, FORECASTS, with an estimated value range, NAICS code, set-aside, incumbent and planned award date where the agency gives them. A forecast that drops off a feed stays in the table, flagged.
LABOR_RATES has GSA’s CALC+ ceiling rates: the most each Multiple Award Schedule contractor may bill per hour for each labor category, with next-year and second-year prices.
Common uses: building a federal sales pipeline (what is coming, when, how large, which set-aside, who holds the current contract), tracking recompetes, finding teaming partners and competitors, and pricing a bid against published ceiling rates.
| Fact | Detail |
|---|---|
| Source | DHS Acquisition Planning Forecast System, GSA Acquisition Gateway forecast tool, and GSA CALC+ ceiling rates. U.S. government works |
| Coverage | Forecasts from DHS and the ten civilian agencies on the Acquisition Gateway. Ceiling rates for every labor category on the Multiple Award Schedule |
| Refresh | Weekly |
| Free trial | 30 days: the DHS forecasts (SOURCE = 'dhs_apfs') and the labor rates whose CATEGORY includes Facilities |
| Subscription | Every forecast and every labor rate |
| Join key | The tables share no key. FORECASTS.NORM_INCUMBENT_NAME and LABOR_RATES.NORM_VENDOR_NAME use the same name rule, so a forecast’s incumbent can be matched to its ceiling rates. |
| Permitted use | Not for employment, tenant, credit, insurance or licensing decisions about a person. |
Row counts as of October 6, 2026.
| Table | Source | Rows | Free trial |
|---|---|---|---|
FORECASTS | DHS Acquisition Planning Forecast System (dhs_apfs) | 609 | Included |
FORECASTS | GSA Acquisition Gateway, ten civilian agencies (acquisition_gateway) | 11,906 | Subscription only |
LABOR_RATES | GSA CALC+ ceiling rates, Multiple Award Schedule | 334,565 | Categories that include Facilities |
Reading the data
A forecast is a plan, not an award, a solicitation or a promise to buy. Agencies change dates, values and set-asides, or drop the purchase. The binding terms come with the solicitation on SAM.gov.
Use LISTED_IN_LATEST_FEED = TRUE for what agencies plan now. A forecast that leaves a feed stays with LISTED_IN_LATEST_FEED = FALSE. FIRST_SEEN_DATE and LAST_SEEN_DATE are the dates of Civly’s weekly reads, not the agency’s dates.
DHS gives an exact planned award date. The Acquisition Gateway usually gives a fiscal year and sometimes a quarter. PLANNED_AWARD_WINDOW_START and PLANNED_AWARD_WINDOW_END let you filter both together.
Dates outside 2015 to 2060 are typing errors or placeholders in the source (such as 2099-09-08) and are left empty, never corrected.
A ceiling rate is the most a vendor may bill per hour for a labor category on that contract. Actual task-order prices are often lower. Labor category names are the vendors’ own wording, so compare within SIN or CATEGORY and read EDUCATION_LEVEL and MIN_YEARS_EXPERIENCE beside the price.
Two tables, 78 columns in total: FORECASTS and LABOR_RATES. The same tables serve the trial and the subscription. During the free trial, FORECASTS returns the DHS forecasts and LABOR_RATES returns the categories that include Facilities. A subscription adds the Acquisition Gateway forecasts and every other labor category.
FORECASTSOne row per forecast, from either source, with SOURCE and AGENCY columns. Text is kept as published apart from the columns marked as Civly’s. Named agency contacts are not included. 52 columns.
| Column | Type | Meaning |
|---|---|---|
SOURCE_ROW_NUMBER | NUMBER | Position of the row in Civly’s weekly file. |
ACQUISITION_PHASE | TEXT | Acquisition Gateway only: the purchase’s stage, as published. |
ADDITIONAL_INFORMATION | TEXT | Acquisition Gateway only: the agency’s added notes. Typed-in email addresses are replaced with [email removed]. |
AGENCY | TEXT | Department of Homeland Security for DHS forecasts. For Acquisition Gateway forecasts, the agency that published it. |
CONTRACT_TYPE | TEXT | Planned contract type, as published. |
CONTRACT_VEHICLE | TEXT | Planned contract vehicle or buying method, as published. |
CONTRACTING_AGENCY | TEXT | Acquisition Gateway only: the agency that will award the contract. |
CONTRACTING_OFFICE | TEXT | The office that will award the contract. |
CURRENT_CONTRACT_END_DATE | DATE | Acquisition Gateway only: when the current contract ends, when listed. |
DESCRIPTION | TEXT | The agency’s description of the purchase. Typed-in email addresses are replaced with [email removed]. |
ESTIMATED_VALUE_MAX_USD | NUMBER | Civly’s reading of the upper dollar amount in ESTIMATED_VALUE_RANGE. Empty for open-ended bands such as Over $100M, or when the label has no amount Civly can read. |
ESTIMATED_VALUE_MIN_USD | NUMBER | The lower dollar amount in the band, read the same way. 0 for bands such as Below $150K. |
ESTIMATED_VALUE_RANGE | TEXT | The agency’s value band, as published. A band, not a budget or an expected price. |
EXTENT_COMPETED | TEXT | Acquisition Gateway only: planned competition, as published. |
FORECAST_ID | TEXT | The agency’s own forecast number (the APFS number for DHS). |
INCUMBENT_CONTRACT_NUMBER | TEXT | Current contract number, when the agency lists one. Several are joined as a; b. |
INCUMBENT_NAME | TEXT | Current contractor, when listed. Placeholders such as TBD and N/A are left out, and several names are joined as a; b. Typed-in email addresses are replaced with [email removed]. |
NAICS_CODE | TEXT | Industry code (NAICS). The Acquisition Gateway shows only the first when a forecast has several. |
NAICS_CODE_COUNT | NUMBER | How many NAICS codes the agency listed. |
NAICS_DESCRIPTION | TEXT | Industry name, as published. |
NORM_INCUMBENT_NAME | TEXT | Civly’s normalized incumbent name, each name normalized separately, for matching. Same rule as LABOR_RATES.NORM_VENDOR_NAME. |
ORGANIZATION | TEXT | The agency component or funding organization, as published. |
PERIOD_OF_PERFORMANCE_END | DATE | Planned end of the work. |
PERIOD_OF_PERFORMANCE_START | DATE | Planned start of the work. |
PLACE_OF_PERFORMANCE_CITY | TEXT | Every city the forecast lists, as a; b. Not lined up with the state and country columns. |
PLACE_OF_PERFORMANCE_COUNT | NUMBER | How many places the forecast lists. Empty when the agency says the place cannot be disclosed. |
PLACE_OF_PERFORMANCE_COUNTRY | TEXT | Every country the forecast lists, as a; b. |
PLACE_OF_PERFORMANCE_STATE | TEXT | Every state the forecast lists, as a; b. A nationwide forecast lists all 62 states and territories. |
PLANNED_AWARD_DATE | DATE | DHS only: the planned award date. |
PLANNED_AWARD_FISCAL_YEAR | NUMBER | Federal fiscal year of the planned award. A fiscal year runs October 1 to September 30. |
PLANNED_AWARD_QUARTER | NUMBER | Fiscal quarter of the planned award, when given. |
PLANNED_AWARD_WINDOW_END | DATE | End of the planned award window (see PLANNED_AWARD_WINDOW_START). |
PLANNED_AWARD_WINDOW_START | DATE | Civly’s column, so both sources can be filtered together: the exact planned date when published, otherwise the fiscal quarter, otherwise the whole fiscal year. Empty when the agency gave no award year. |
PLANNED_SOLICITATION_DATE | DATE | When the agency plans to post the solicitation. |
REQUIREMENT_TYPE | TEXT | Civly’s mapping of the agency’s wording: new, recompete (a follow-on to an existing contract), option_exercise (Acquisition Gateway only), no_longer_required (DHS only) or other. Empty when the agency gave none. |
REQUIREMENT_TYPE_AS_PUBLISHED | TEXT | The agency’s own wording. |
REQUIREMENTS_OFFICE | TEXT | The office that needs the purchase. |
SET_ASIDE | TEXT | Small-business set-aside, in the agency’s wording (SB is small business, TBD is to be determined). |
SET_ASIDE_EXTENT | TEXT | DHS only: full or partial. |
SOLICITATION_URL | TEXT | Acquisition Gateway only: link to the solicitation, when posted. |
SOURCE | TEXT | dhs_apfs or acquisition_gateway. The trial returns dhs_apfs. |
SOURCE_CREATED_DATE | DATE | When the agency created the forecast. |
SOURCE_RECORD_ID | TEXT | The source system’s id for the forecast. Unique together with SOURCE. |
SOURCE_UPDATED_DATE | DATE | When the agency last changed the forecast. |
TITLE | TEXT | Forecast title. |
SOURCE_URL | TEXT | The feed the row was read from. |
SOURCE_SHA256 | TEXT | Checksum of the file read. |
SOURCE_RELEASE_DATE | DATE | Date of the read. |
FIRST_SEEN_DATE | DATE | Date of the first weekly read that found the forecast. Civly’s date, not the agency’s. |
LAST_SEEN_DATE | DATE | Date of the latest weekly read that found the forecast. |
LISTED_IN_LATEST_FEED | BOOLEAN | True when the latest read found the forecast. False means it has left the feed since LAST_SEEN_DATE, often because the solicitation was posted or the plan was dropped. It does not mean the contract was awarded. |
IMPORTED_AT | TIMESTAMP_NTZ | When Civly imported the row. |
LABOR_RATESOne row per labor category on one vendor’s GSA schedule contract, from one nightly CALC+ build. 26 columns.
| Column | Type | Meaning |
|---|---|---|
SOURCE_ROW_NUMBER | NUMBER | Position of the row in Civly’s weekly file. |
BUSINESS_SIZE | TEXT | S for a small business, O for other than small. |
CATEGORY | TEXT | Multiple Award Schedule category, as published. The trial returns categories that include Facilities. |
CONTRACT_END | DATE | Contract end date. |
CONTRACT_NUMBER | TEXT | GSA contract number. One contract carries many rates, and one vendor can hold several contracts. |
CONTRACT_START | DATE | Contract start date. |
CONTRACT_TERMINATION_DATE | DATE | Published by CALC+ without a definition and set on few contracts. Read it as published. |
CURRENT_PRICE | NUMBER | Ceiling hourly rate for the contract’s current year, dollars: the most the vendor may bill, not a price anyone paid. |
DATA_SOURCE | TEXT | CALC+’s own source label for the rate, as published. |
EDUCATION_LEVEL | TEXT | Minimum education for the labor category, in the vendor’s wording. |
LABOR_CATEGORY | TEXT | The vendor’s name for the job. The same job appears under many names. |
MIN_YEARS_EXPERIENCE | NUMBER | Minimum years of experience the vendor sets for the category. |
NEXT_YEAR_PRICE | NUMBER | Ceiling rate for the contract’s next year. Empty when none is published. |
NORM_VENDOR_NAME | TEXT | Civly’s normalized vendor name, for matching. Same rule as FORECASTS.NORM_INCUMBENT_NAME. |
RATE_ID | NUMBER | CALC+’s id for the rate. |
SCHEDULE | TEXT | GSA schedule. MAS (Multiple Award Schedule) on every row as of October 5, 2026. |
SECOND_YEAR_PRICE | NUMBER | Ceiling rate for the year after next. Empty when none is published. |
SECURITY_CLEARANCE | BOOLEAN | Whether the labor category requires a security clearance. |
SIN | TEXT | Special Item Number: the part of the schedule the rate is offered under. |
SUBCATEGORY | TEXT | Schedule subcategory, as published. |
VENDOR_NAME | TEXT | Contractor name, as published. |
WORKSITE | TEXT | Where the work is done, in the vendor’s wording (the contractor’s site, the customer’s, or both). |
SOURCE_URL | TEXT | The CALC+ address the rates were read from. |
SOURCE_SHA256 | TEXT | Checksum of the file read. |
SOURCE_RELEASE_DATE | DATE | Date of the read. |
IMPORTED_AT | TIMESTAMP_NTZ | When Civly imported the row. |
The two tables share no key. NORM_INCUMBENT_NAME in FORECASTS and NORM_VENDOR_NAME in LABOR_RATES are normalized the same way, so a forecast’s incumbent can be matched to that company’s ceiling rates. A forecast that lists several incumbents joins them as a; b, and those rows match only after you split the value.
After installing, set your worksheet’s database selector to the installed database and these run as written.
-- Forecasts listed now with an award planned in the next 12 months, largest bands first SELECT agency, title, naics_code, set_aside, estimated_value_range, incumbent_name, planned_award_window_start, planned_award_window_end FROM FEDERAL_BUYING_SIGNALS.FORECASTS WHERE listed_in_latest_feed AND planned_award_window_start <= DATEADD(month, 12, CURRENT_DATE) AND planned_award_window_end >= CURRENT_DATE ORDER BY estimated_value_min_usd DESC NULLS LAST LIMIT 50; -- Recompetes listed now, by industry code SELECT naics_code, naics_description, COUNT(*) AS recompetes FROM FEDERAL_BUYING_SIGNALS.FORECASTS WHERE listed_in_latest_feed AND requirement_type = 'recompete' GROUP BY naics_code, naics_description ORDER BY recompetes DESC LIMIT 20; -- Forecasts that left the feeds in the last 30 days SELECT source, agency, title, last_seen_date, solicitation_url FROM FEDERAL_BUYING_SIGNALS.FORECASTS WHERE NOT listed_in_latest_feed AND last_seen_date >= DATEADD(day, -30, CURRENT_DATE) ORDER BY last_seen_date DESC; -- Ceiling rates for one kind of job, by business size SELECT business_size, COUNT(*) AS rates, MEDIAN(current_price) AS median_rate, APPROX_PERCENTILE(current_price, 0.9) AS rate_90th_percentile FROM FEDERAL_BUYING_SIGNALS.LABOR_RATES WHERE category ILIKE '%facilities%' AND labor_category ILIKE '%project manager%' GROUP BY business_size; -- Recompetes whose incumbent also holds GSA schedule rates SELECT f.agency, f.title, f.incumbent_name, f.planned_award_window_start, COUNT(r.rate_id) AS incumbent_rates, MEDIAN(r.current_price) AS median_ceiling_rate FROM FEDERAL_BUYING_SIGNALS.FORECASTS f JOIN FEDERAL_BUYING_SIGNALS.LABOR_RATES r ON r.norm_vendor_name = f.norm_incumbent_name WHERE f.listed_in_latest_feed AND f.requirement_type = 'recompete' GROUP BY f.agency, f.title, f.incumbent_name, f.planned_award_window_start ORDER BY incumbent_rates DESC LIMIT 25;
Sources: the DHS Acquisition Planning Forecast System (apfs-cloud.dhs.gov), the GSA Acquisition Gateway forecast tool (acquisitiongateway.gov/forecast) and GSA’s CALC+ ceiling rates (buy.gsa.gov/pricing). All three are U.S. government works, read from their public pages without signing in. Other agencies publish forecasts only on their own sites or in spreadsheets, and those are not included.
No named agency contacts. The contact and small-business contact names, email addresses and phone numbers the agencies publish are not loaded. Email addresses typed into descriptions, notes and incumbent names are replaced with [email removed].
Civly’s own columns: REQUIREMENT_TYPE, ESTIMATED_VALUE_MIN_USD, ESTIMATED_VALUE_MAX_USD, PLANNED_AWARD_WINDOW_START, PLANNED_AWARD_WINDOW_END, NORM_INCUMBENT_NAME, NORM_VENDOR_NAME, FIRST_SEEN_DATE, LAST_SEEN_DATE and LISTED_IN_LATEST_FEED. Everything else is as the agencies publish it. This product is not endorsed by DHS, GSA or any government agency.
Permitted use: not for employment, tenant, credit, insurance or licensing decisions about a person.
For coverage or access questions: matthew@civly.ai