FPX API
Overview
Welcome. The FPX Public API lets approved partners read live supply and submit deals and bids programmatically over HTTPS. All requests and responses are JSON, authenticated by an API key sent in the x-api-key header.
https://api.fpx.worldYour credentials
FPX issues each partner a Company ID, a Broker ID, and an API key. The keys are delivered out-of-band — keep them secret. Always include company_id and broker_id on deals you submit so they are attributed to you automatically.
| Field | Value |
|---|---|
| Base URL | https://api.fpx.world |
| Company ID | <YOUR_COMPANY_ID> |
| Broker ID | <YOUR_BROKER_ID> |
| API Key | YOUR_API_KEY |
Your specific IDs and key are sent separately at onboarding.
API key types
Keys come in two types. You will receive the type appropriate for your use case.
| Key type | Can do | Cannot do |
|---|---|---|
| Read-only | GET /v1/deals — search and retrieve public supply | POST /v1/deals returns 403 Forbidden |
| Read + Write | Everything a read-only key can do, plus POST /v1/deals to submit deals for review | — |
If you attempt a POST with a read-only key the response is:
{ "error": "This API key does not have write access" }with HTTP status 403.
Conventions
- All requests use HTTPS. HTTP is not supported.
- Authenticate with the
x-api-keyheader on every request. - All request and response bodies are JSON (
Content-Type: application/json). - Times are ISO 8601 UTC. Dates may be submitted as
YYYY-MM-DDor full ISO timestamps; we normalize both. - Monetary values are plain numbers (no currency symbols, no commas). Currency is specified in a separate
currencyfield where applicable. - Unknown fields in request bodies are silently dropped, not rejected.
Rate limits
| Endpoint | Limit |
|---|---|
GET /v1/deals | 20 requests / minute / IP |
POST /v1/deals | 10 requests / minute / IP |
When exceeded we return 429 Too Many Requests with a Retry-After header (seconds).
Every successful response also includes X-RateLimit-Remaining so you can track your budget.
Errors
Errors are JSON with a stable error field.
{ "error": "Missing required fields", "missing_fields": ["price", "available_units"] }| HTTP | Meaning |
|---|---|
| 400 | Malformed JSON, invalid listing_type, or missing required fields |
| 401 | Missing or invalid x-api-key |
| 403 | Key does not have write permission (POST only) |
| 429 | Rate limit exceeded |
| 500 | Server error, please retry with backoff |
Data type legend
Types used throughout this doc map to what the server expects after coercion:
string— free-form textenum— string restricted to a fixed set of values (listed inline)integer— whole numbernumber— decimal number (e.g. price, MW)boolean— true / false, or string "true" / "false" / "1" / "0"date— "YYYY-MM-DD" or full ISO 8601 timestampuuid— UUID v4 stringarray— JSON array of objects or strings
GET/v1/dealsSearch public supply
/v1/dealsReturns active, publicly-listed deals matching your filters, newest first.
Request headers
| Header | Type | Required | Notes |
|---|---|---|---|
x-api-key | string | yes | Your API key |
Query parameters
All parameters are optional. Omit any you don't need.
| Parameter | Type | Applies to | Description |
|---|---|---|---|
listing_type | enum | all | One of hardware_gpu, colocation, cloud_gpu, powered_land, power_equipment |
status | string | all | Deal lifecycle status. Defaults to everything except archived |
location | string | all | Case-insensitive substring match on location (e.g. Dallas, Frankfurt) |
min_price | number | all | Minimum price. Matches price for hardware/cloud, power_capacity_charge for colocation, asking_price for powered land |
max_price | number | all | Upper bound, same semantics as min_price |
gpu_model | string | hardware, cloud_gpu | Matches both gpu_model and gpu_type, substring |
unit_type | enum | hardware | server, baseboard, gpu/card, or rack |
min_quantity | integer | hardware, cloud_gpu | Matches available_units or total_qty_available |
condition | enum | hardware | new, refurbished, used, etc. |
cooling_type | enum | colocation | air, liquid, both, tbc |
category | string | power_equipment | Matches equipment_category |
min_power_mw | number | colocation, powered_land | Matches total_power_mw or power_available_now_mw |
max_power_mw | number | colocation, powered_land | Same, upper bound |
limit | integer | all | Page size, 1–100, default 50 |
offset | integer | all | Pagination offset, default 0 |
Response
{
"success": true,
"count": 3,
"total": 184,
"offset": 0,
"limit": 50,
"deals": [ /* deal objects */ ]
}Each deal object contains only fields relevant to its listing_type. Empty fields are omitted.
Example: search for H200 GPU supply
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.fpx.world/v1/deals?listing_type=hardware_gpu&gpu_model=H200&min_quantity=8&limit=10"Example: colocation in Dallas, 1–5 MW
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.fpx.world/v1/deals?listing_type=colocation&location=Dallas&min_power_mw=1&max_power_mw=5"POST/v1/dealsSubmit a deal for review
/v1/dealsSubmits a new deal. Submissions enter a pending queue and become live supply once approved. You will not see the deal returned by GET /v1/deals until then.
Request headers
| Header | Type | Required | Notes |
|---|---|---|---|
x-api-key | string | yes | |
Content-Type | string | yes | Must be application/json |
Common body fields (all listing types)
| Field | Type | Required | Notes |
|---|---|---|---|
listing_type | enum | yes | See the seven categories below |
title | string | recommended | A human-readable name, e.g. "B200 SXM — Dallas — 1024 units" |
company_id | uuid | recommended | Use your company ID issued at onboarding |
broker_id | uuid | recommended | Use your broker ID issued at onboarding |
deal_type | enum | no | "Offer" (default) or "Bid" |
location | string | varies | City / region. Required for colocation and powered_land |
currency | string | no | "USD" (default), "EUR", "GBP", etc. |
notes | string | no | Free-form notes — partner context, delivery terms, contact info |
Response
{
"success": true,
"id": "70193bab-2b2f-423c-9c59-ac61990496c2",
"status": "request_received",
"created_at": "2026-04-22T07:31:00.123Z",
"message": "Deal submitted for review. You will be notified when it is approved."
}Keep the id — you can use it to reference the submission later.
Listing types at a glance
| listing_type | What it represents |
|---|---|
hardware_gpu | GPU-based hardware for sale — servers, baseboards, standalone cards, full racks |
colocation | Data-center space and power available for lease |
cloud_gpu | Cloud / bare-metal GPU compute offered on-demand or long-term |
powered_land | Land parcels with power availability for development |
power_equipment | Generators, UPS, transformers, switchgear, PDUs, chillers |
Pricing works differently per category — see the per-type sections below.
1. hardware_gpu — GPU hardware
Required fields
listing_type = "hardware_gpu"gpu_model— string — e.g. "H100", "H200", "B200"available_units— integerprice— number
Pricing
One price per unit in price + currency. Set price_unit to match:
| price_unit | When to use |
|---|---|
per_server | Selling full servers |
per_baseboard | Selling HGX baseboards |
per_gpu | Selling loose GPUs/cards |
per_rack | Selling full racks |
Other commonly-used fields
unit_type— enum — physical unit being sold. One of server, baseboard, gpu/card, rackmoq— integer — minimum order quantitybatch_size— integer — units grouped per shipment/batchgpus_per_unit— integer — number of GPUs per server/baseboard/rackgpu_hbm_gb_each— integer — GB of HBM memory per GPU (e.g. 80, 141, 192)gpu_hbm_type— string — HBM generation (e.g. "HBM3", "HBM3e")gpu_specs— string — free-form GPU specification detailcpu_specs— string — CPU model and configurationmemory_specs— string — system memory spec (e.g. "2TB DDR5")storage_specs— string — storage configurationnetworking_specs— string — NIC / fabric detailspower_specs— string — PSU / power draw informationchassis— string — chassis model or form factorcondition— enum — one of new, refurbished, used, pulled, as_is, unknownwarranty_months— integer — length of warranty coveragewarranty_type— enum — oem, seller, third_party, none, unknownlead_time_text— string — delivery ETA (e.g. "4-6 weeks")server_age_years— integer — age of the unit in years (for used/refurbished)
Example
curl -X POST https://api.fpx.world/v1/deals \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"listing_type": "hardware_gpu",
"title": "H200 SXM5 — Dallas — 256 units",
"company_id": "<YOUR_COMPANY_ID>",
"broker_id": "<YOUR_BROKER_ID>",
"deal_type": "Offer",
"unit_type": "server",
"gpu_model": "H200",
"gpus_per_unit": 8,
"gpu_hbm_gb_each": 141,
"gpu_hbm_type": "HBM3e",
"available_units": 32,
"moq": 8,
"price": 285000,
"currency": "USD",
"price_unit": "per_server",
"location": "Dallas, TX",
"condition": "new",
"warranty_months": 12,
"warranty_type": "oem",
"lead_time_text": "4-6 weeks",
"notes": "Sealed, OEM warranty, FOB Dallas."
}'2. colocation — Data-center space
Required fields
listing_type = "colocation"location— string — city or metrototal_power_mw— number
Pricing
Colocation uses two pricing components instead of a single price:
| Field | Type | Description |
|---|---|---|
power_capacity_charge | number | Recurring charge per kW per month for contracted capacity |
power_capacity_charge_currency | string | e.g. "USD" |
power_consumption_charge | number | Per-kWh charge for actual power consumed |
power_consumption_charge_currency | string | e.g. "USD" |
is_dynamic_pricing | boolean | Set to true if the charge is market-indexed |
Other commonly-used fields
site_name— string — name of the data center / sitesite_status— enum — ready, under_construction, plannedavailable_power_mw— number — MW currently available for contractpower_density_kw_per_rack— number — supported rack density in kWcooling_type— enum — air, liquid, both, tbcliquid_cooling_supported— string — free-form description (e.g. "DLC + RDHx")power_redundancy— enum — N, N+1, 2Npue— number — power usage effectiveness (1.0 – 2.0)racks_available— integer — count of racks availablecontract_term— string — typical contract length offeredminimum_commit— string — minimum contract commitment descriptionrfs_date— date — ready-for-service datelive_power_date— date — date power becomes livemeet_me_room— boolean — meet-me room / carrier hotel accessrenewable_power_option— boolean — renewable energy option availablecarriers_available— string — list of connectivity carrierscompliance_certifications— string — certifications (SOC 2, ISO 27001, etc.)
Example
curl -X POST https://api.fpx.world/v1/deals \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"listing_type": "colocation",
"title": "Frankfurt FRA-03 — 5MW",
"company_id": "<YOUR_COMPANY_ID>",
"broker_id": "<YOUR_BROKER_ID>",
"site_name": "FRA-03",
"site_status": "ready",
"location": "Frankfurt, Germany",
"total_power_mw": 5,
"available_power_mw": 5,
"power_density_kw_per_rack": 80,
"cooling_type": "liquid",
"liquid_cooling_supported": "DLC + rear-door heat exchanger",
"power_redundancy": "2N",
"pue": 1.25,
"power_capacity_charge": 145,
"power_capacity_charge_currency": "EUR",
"power_consumption_charge": 0.12,
"power_consumption_charge_currency": "EUR",
"is_dynamic_pricing": false,
"rfs_date": "2026-07-01",
"meet_me_room": true
}'3. cloud_gpu — Cloud compute
Required fields
listing_type = "cloud_gpu"price— numbertotal_qty_available— integer — number of GPUs available- One of
gpu_modelorgpu_type— string — e.g. "H100", "B200"
Pricing
Cloud GPUs are always billed per GPU-hour. Set:
price— number — rate per GPU-hourcurrency— string — e.g. "USD"price_unit— string — leave as "per_gpu_hour" (default and enforced server-side)
Rental model
| Field | Values | Description |
|---|---|---|
rental_type | on_demand / long_term / both | Billing mode offered |
cloud_duration + cloud_duration_unit | integer + (days/weeks/months/years) | For long_term, the commit term |
minimum_duration | string | Free-form description if you prefer |
billing_granularity | string | hourly, daily, monthly |
Other commonly-used fields
gpus_per_node— integer — GPUs per node/instancecpu_spec— string — CPU configuration per noderam_gb— integer — RAM per node in GBlocal_ssd_nvme— string — local storage descriptionstorage_options— string — attached storage tiers offerednetwork_type— enum — ethernet, infiniband, roce, unknownnetwork_bandwidth— string — e.g. "3.2Tbps non-blocking"availability_start_date— date — date capacity becomes availablesla_support_level— string — support SLA tiersupport_hours— string — e.g. "24/7", "business hours"managed_services— string — managed services offeredsoftware_stack— string — preinstalled OS / drivers / CUDA versioncontainer_support— string — e.g. "kubernetes", "docker"orchestration_support— string — orchestration platforms supporteddata_egress_cost— string — egress pricing descriptionprivate_connectivity_options— string — direct connect / private link options
Example
curl -X POST https://api.fpx.world/v1/deals \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"listing_type": "cloud_gpu",
"title": "H200 on-demand — us-east",
"company_id": "<YOUR_COMPANY_ID>",
"broker_id": "<YOUR_BROKER_ID>",
"gpu_model": "H200",
"gpu_type": "H200 SXM",
"total_qty_available": 512,
"gpus_per_node": 8,
"ram_gb": 2048,
"rental_type": "both",
"cloud_duration": 12,
"cloud_duration_unit": "months",
"price": 3.95,
"currency": "USD",
"price_unit": "per_gpu_hour",
"billing_granularity": "hourly",
"network_type": "infiniband",
"network_bandwidth": "3.2Tbps non-blocking",
"location": "us-east",
"availability_start_date": "2026-05-15"
}'4. powered_land — Land parcels
Required fields
listing_type = "powered_land"location— string — e.g. "West Texas"power_available_now_mw— number
Pricing
Powered land supports five pricing models. Use pricing_type to declare which one, then fill the matching fields.
pricing_type: "purchase" — one-time purchase
| Field | Type | Description |
|---|---|---|
purchase_price_per_mw | number | Price per MW |
purchase_currency | string | e.g. "USD" |
pricing_type: "option_purchase" — option plus closing price
| Field | Type | Description |
|---|---|---|
option_upfront_percentage | number | % of the deal paid upfront for the option |
option_closing_price_per_mw | number | Per-MW price at closing |
option_currency | string | e.g. "USD" |
pricing_type: "phased" — tranche-based
| Field | Type | Description |
|---|---|---|
phased_pricing | array | Array of { block, mw, price_per_mw } |
"phased_pricing": [
{ "block": 1, "mw": 50, "price_per_mw": 800000 },
{ "block": 2, "mw": 100, "price_per_mw": 900000 }
]pricing_type: "jv" — joint venture
| Field | Type | Description |
|---|---|---|
jv_price_per_mw | number | Per-MW reference value |
jv_currency | string | e.g. "USD" |
jv_split | array | [{ party, ratio }] |
"jv_split": [
{ "party": "Landowner", "ratio": "30" },
{ "party": "Developer", "ratio": "70" }
]pricing_type: "ground_lease" — land rent + power premium
| Field | Type | Description |
|---|---|---|
land_rent_per_acre_year | number | Annual rent per acre |
power_premium_per_mw_year | number | Annual power premium per MW |
ground_lease_currency | string | e.g. "USD" |
Other commonly-used fields
parcel_name— string — name of the parcel / siteparcel_id_apn— string — assessor's parcel numbertotal_land_area_acres— number — total parcel size in acresbuildable_area_acres— number — usable / buildable acreagezoning— string — zoning classification (e.g. "Heavy Industrial")land_type— string — land classificationpower_topology— enum — on_grid, btm, hybridgrid_mw— number — grid-connected MWbtm_mw— number — behind-the-meter MWgeneration_types— array — any of "Gas", "Solar (BESS)", "Nuclear", "Other"power_expandable_to_mw— number — max expandable capacityestimated_rfs_date— date — estimated ready-for-service datefull_mw_delivery_date— date — date of full MW deliveryestimated_energization_date— date — energization date estimateutility_provider— string — serving utilitysubstation_name— string — name of nearest substationsubstation_distance— string — distance to substation (e.g. "1.2 miles")interconnection_status— string — current interconnection queue statusentitlement_status— string — permitting / entitlement progressfiber_availability— string — available fiber carriers / routeswater_availability— string — water supply descriptionsewer_availability— string — sewer infrastructure descriptiontransaction_type— enum — purchase, ground_lease, option, jv, otherasking_price— number — headline asking priceclosing_timeline— string — expected closing timeline
Example (phased purchase)
curl -X POST https://api.fpx.world/v1/deals \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"listing_type": "powered_land",
"title": "150MW BTM parcel — West Texas",
"company_id": "<YOUR_COMPANY_ID>",
"broker_id": "<YOUR_BROKER_ID>",
"parcel_name": "Abilene North",
"location": "Abilene, TX",
"total_land_area_acres": 320,
"power_topology": "btm",
"btm_mw": 150,
"generation_types": ["Gas"],
"power_available_now_mw": 50,
"power_expandable_to_mw": 150,
"estimated_rfs_date": "2026-09-01",
"full_mw_delivery_date": "2027-06-01",
"zoning": "Heavy Industrial",
"utility_provider": "Oncor",
"substation_distance": "1.2 miles",
"transaction_type": "purchase",
"pricing_type": "phased",
"phased_pricing": [
{ "block": 1, "mw": 50, "price_per_mw": 750000 },
{ "block": 2, "mw": 100, "price_per_mw": 850000 }
]
}'5. power_equipment — Generators, UPS, transformers
Required fields
listing_type = "power_equipment"equipment_category— enum — one of "generator", "ups", "transformer", "switchgear", "pdu", "chiller_cooling", "other"rated_capacity_kw_mw— string — rated capacity including units (e.g. "2500kW", "2MW")price— number
Pricing
Single price + currency. Typically a per-unit price.
Other commonly-used fields
manufacturer— string — equipment manufacturer (e.g. "Caterpillar", "Schneider Electric")model_part_number— string — manufacturer model / part numbervoltage_phase_frequency— string — electrical specs (e.g. "480V / 3ph / 60Hz")fuel_prime_mover— string — fuel type or prime mover (e.g. "Diesel", "Natural Gas")hours_runtime— integer — runtime hours on the unitmanufacture_year— integer — year the unit was manufacturedcondition_grade— enum — A, B, C, D, unknowntesting_documentation— string — test reports / certifications availableavailable_units— integer — count of units available
Example
curl -X POST https://api.fpx.world/v1/deals \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"listing_type": "power_equipment",
"title": "Caterpillar 3516B — 2MW diesel genset",
"company_id": "<YOUR_COMPANY_ID>",
"broker_id": "<YOUR_BROKER_ID>",
"equipment_category": "generator",
"manufacturer": "Caterpillar",
"model_part_number": "3516B",
"rated_capacity_kw_mw": "2MW",
"voltage_phase_frequency": "480V / 3ph / 60Hz",
"fuel_prime_mover": "Diesel",
"hours_runtime": 850,
"manufacture_year": 2019,
"condition_grade": "A",
"available_units": 2,
"price": 285000,
"currency": "USD",
"location": "Houston, TX"
}'GET/v1/helpDiscover the API from your terminal
/v1/helpA self-describing, manpage-style help document for the entire /v1 API. It is generated at runtime from the same constants the endpoints actually use (valid listing types, allowed fields, required-field maps, rate-limit numbers), so the help output and the live behavior cannot drift apart.
This is the recommended way to confirm the latest field list, required parameters, and rate limits before integrating — even ahead of this document.
Request headers: None. /v1/help is intentionally unauthenticated and not rate-limited so partners can discover the API freely.
Response
| Header / behavior | Value |
|---|---|
| Content-Type | text/plain; charset=utf-8 |
| Cache-Control | public, max-age=60 |
| Output format | ANSI-colored when User-Agent looks like a terminal client (curl, wget, HTTPie, xh, httpx); plain text otherwise. |
| Status code | 200 on success. |
Examples
Pretty terminal output with colors:
curl https://api.fpx.world/v1/helpPlain text (e.g. saving to a file or piping to less):
curl -A "Mozilla/5.0" https://api.fpx.world/v1/help > fpx-api.txtSample response (truncated):
FPX Public API — v1
Base URL: https://api.fpx.world
ENDPOINTS
GET /v1/deals Search public supply
POST /v1/deals Submit a new deal for review
POST /v1/add-bid Place a bid on an existing offer
GET /v1/bids List bids placed by a broker
GET /v1/bid-status/:id Get the status of a single bid
GET /v1/help This page
...Finding a deal's tracking_number
Every approved offer has a stable, public tracking_number — a partner-friendly identifier (typically an 11-digit string such as "20267996029") that uniquely points to one offer. You need it to place a bid via POST /v1/add-bid.
Where it appears
The tracking_number field is included on every deal returned by GET /v1/deals — it is part of the common allowlist applied to every listing type, so it shows up regardless of category.
Step 1 — Search for the offer
Use any combination of filters described in GET /v1/deals to narrow down to the offer you want to bid on:
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.fpx.world/v1/deals?listing_type=hardware_gpu&gpu_model=H200&min_quantity=8&limit=10"Step 2 — Read tracking_number from the response
{
"success": true,
"count": 1,
"deals": [
{
"listing_type": "hardware_gpu",
"tracking_number": "20267996029",
"gpu_model": "H200",
"available_units": 32,
"price": 285000,
"currency": "USD",
"price_unit": "per_server",
"location": "Dallas, TX"
}
]
}Copy the tracking_number value verbatim — both numeric strings and string forms are accepted by the bid endpoint, but treating it as an opaque string is safest (it preserves any leading zeros).
Notes
tracking_numberis stable: it does not change once an offer is published, so it is safe to store on your side.- Only offers with
deal_type = "Offer"can be bid on. Bids and archived deals are not valid targets — the bid endpoint returns 404 for unknown tracking numbers and 409 for archived offers. - If you cannot find a tracking number for a deal you saw elsewhere, it may not be public yet (still pending approval).
POST/v1/add-bidPlace a bid on an existing offer
/v1/add-bidSubmits a bid against an existing live offer, identified by its tracking_number. Bids enter a pending queue and are published as live bids once approved.
Request headers
| Header | Type | Required | Notes |
|---|---|---|---|
x-api-key | string | yes | Must be a key with can_write=true. Read-only keys return 403. |
Content-Type | string | yes | Must be application/json. |
Mandatory body fields (all listing types)
| Field | Type | Notes |
|---|---|---|
tracking_number | string | The tracking_number of the offer you are bidding on. Accepted as a JSON string or number; whitespace is trimmed. |
broker_id | uuid | UUID of the broker placing the bid. Must be a broker your API key is permitted to act on. |
company_id | uuid | UUID of your buyer company. Must be a company your API key is permitted to act on. |
Mandatory body fields per listing_type
In addition to the always-required fields above, the bid must include further fields that depend on the offer's listing_type:
| listing_type | Required fields | Notes |
|---|---|---|
hardware_gpu | price | Your bid price. Same unit/currency model as the offer. |
hardware | price | Generic hardware (legacy alias). |
power_equipment | price | Per-unit bid price. |
colocation | power_capacity_charge | Bid is on the per-kW/month capacity charge — colocation uses this instead of price. |
powered_land | price | Bid against the offer's asking_price. |
cloud_gpu | price + duration + duration_unit | Cloud bids must include all three: per-GPU-hour price, term length, and unit. |
Optional body fields
Anything outside this allowlist is silently dropped:
| Field | Type | Applies to | Description |
|---|---|---|---|
price_unit | string | all | e.g. per_server, per_gpu, per_unit, per_gpu_hour. |
currency | string | all | Defaults to USD if omitted. |
quantity | integer | hardware, power_equipment, cloud_gpu | How many units / GPUs you are bidding on. |
notes | string | all | Free-form context for the reviewer. |
location | string | all | Falls back to the offer's location if omitted. |
selling_company_id | uuid | all | Defaults to the offer's company_id. |
broker_name | string | all | Optional human-readable broker label for display. |
duration_years / duration_months / duration_days / duration_hours | integer | hardware | Term components for fixed-term hardware contracts. |
power_consumption_charge | number | colocation | Per-kWh consumption charge component. |
is_dynamic_pricing | boolean | colocation | Set true if your bid uses market-indexed pricing. |
variable_contract | boolean | cloud_gpu | True for variable-term cloud commits. |
Response
{
"success": true,
"id": "f3a2c1b0-8d4e-4d2b-9a90-22e4b7c81234",
"status": "request_received",
"tracking_number": "20267996029",
"created_at": "2026-04-27T07:31:00.123Z",
"message": "Bid submitted for review. You will be notified when it is approved."
}Status is 201 on success. The id is your pending-bid ID — keep it if you need to reference this submission later.
Error responses
| HTTP | Body | Cause |
|---|---|---|
| 400 | Missing tracking_number | tracking_number not present in the JSON body. |
| 400 | Missing required fields | Body parsed, but the listing_type's required fields are not all present. Inspect missing_fields in the response. |
| 400 | Invalid JSON body / Request body must be a JSON object | Body is not valid JSON, or is an array / scalar. |
| 401 | Unauthorized | Missing or invalid x-api-key. |
| 403 | This API key does not have write access | Your key is read-only. |
| 403 | Not permitted to act as the given broker_id / company_id | The IDs you sent are not in your key's permitted list. |
| 404 | Offer not found | No live offer with that tracking_number. |
| 409 | This offer is archived and no longer accepts bids. | Offer exists but its status is archived. |
| 429 | Rate limit exceeded | More than 10 writes/min from your IP. Honor Retry-After. |
| 500 | Internal server error / Failed to create pending bid | Transient — retry with exponential backoff. |
Rate limit
Bids share the write bucket with POST /v1/deals: 10 requests / minute / IP. The successful response includes X-RateLimit-Remaining.
Example — bid on a hardware_gpu offer
curl -X POST https://api.fpx.world/v1/add-bid \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tracking_number": "20267996029",
"broker_id": "<YOUR_BROKER_ID>",
"company_id": "<YOUR_COMPANY_ID>",
"price": 268000,
"currency": "USD",
"price_unit": "per_server",
"quantity": 16,
"notes": "Firm bid, FOB Dallas, 2-week close."
}'Example — bid on a colocation offer
curl -X POST https://api.fpx.world/v1/add-bid \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tracking_number": "20284551108",
"broker_id": "<YOUR_BROKER_ID>",
"company_id": "<YOUR_COMPANY_ID>",
"power_capacity_charge": 138,
"power_capacity_charge_currency": "EUR",
"power_consumption_charge": 0.11,
"is_dynamic_pricing": false,
"notes": "5MW commit, 5-year term."
}'Example — bid on a cloud_gpu offer
curl -X POST https://api.fpx.world/v1/add-bid \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tracking_number": "20271108882",
"broker_id": "<YOUR_BROKER_ID>",
"company_id": "<YOUR_COMPANY_ID>",
"price": 3.65,
"currency": "USD",
"price_unit": "per_gpu_hour",
"duration": 12,
"duration_unit": "months",
"quantity": 256
}'GET/v1/bidsList a broker's bids
/v1/bidsReturns every bid placed by a given broker across the full deal pipeline — from the moment FPX receives an inquiry through to delivery or close. The response merges every pipeline stage into a single, paginated, newest-first list so you have one place to look.
Shares the read rate-limit bucket of 20 requests per minute per IP with GET /v1/deals.
Request headers
| Header | Type | Required | Notes |
|---|---|---|---|
x-api-key | string | yes | Any valid key (read or read+write). Must be permitted to query the broker_id you pass. |
Query parameters
| Parameter | Type | Required | Notes |
|---|---|---|---|
broker_id | uuid | yes | The broker whose bids you want to list. |
status | string | no | Filter to a single pipeline stage. See the status reference below for valid values. Omit to receive all stages. |
limit | integer | no | Page size, 1-100. Defaults to 50. |
offset | integer | no | Items to skip. Defaults to 0. |
Status pipeline
The status field reflects where an inquiry sits in the FPX deal pipeline. Stages flow top-to-bottom; deals can also exit at any point via closed_lost_cancelled.
| Status | Stage | What it means |
|---|---|---|
request_received | Request Received | FPX has received the buyer's inquiry. |
reviewing_requirements | Reviewing Requirements | FPX is checking specs like location, MW/GPU count, term, timing, budget, power density, hardware type. |
matching_inventory | Matching Inventory | FPX is searching available cloud, colo, power, or hardware supply. |
contacting_supplier | Contacting Supplier | FPX is speaking with the relevant supplier or inventory owner. |
supplier_reviewing | Supplier Reviewing | Supplier is checking availability, pricing, timing, and fit. |
meeting_setup | Meeting Setup | Intro, technical, or commercial call is being coordinated. |
in_discussion | In Discussion | Buyer and supplier are actively reviewing the opportunity. |
pricing_proposal_shared | Pricing / Proposal Shared | Quote, term sheet, LOI, or high-level proposal has been shared. |
negotiating | Negotiating | Parties are discussing commercial, legal, technical, or delivery terms. |
contracting | Contracting | MSA, NDA, order form, LOA, lease, or purchase agreement is being finalized. |
signed_confirmed | Signed / Confirmed | Deal has been agreed or signed. |
provisioning_delivery | Provisioning / Delivery | Capacity, hardware, site access, or deployment is being prepared. |
live_completed | Live / Completed | Buyer is using the inventory, or hardware has been delivered. |
closed_lost_cancelled | Closed Lost / Cancelled | Deal did not proceed. |
Response
| Field | Type | Notes |
|---|---|---|
id | uuid | Stable identifier for this bid. |
deal_id | uuid | null | System identifier of the offer this bid targets. Use tracking_number for partner-facing references. |
deal_name | string | null | Title of the offer this bid targets. |
status | string | Current pipeline stage. See the status reference for the full list of values. |
tracking_number | string | null | tracking_number of the offer this bid targets, when known. |
created_at | string | ISO-8601 timestamp of when the bid was first submitted. |
{
"success": true,
"count": 2,
"offset": 0,
"limit": 50,
"total": 2,
"bids": [
{
"id": "f3a2c1b0-8d4e-4d2b-9a90-22e4b7c81234",
"deal_id": "9b1d6c84-1f47-4b9d-8c1b-77f0e1aa0001",
"deal_name": "H200 supply, Dallas",
"status": "in_discussion",
"tracking_number": "20267996029",
"created_at": "2026-04-20T07:31:00.123Z"
},
{
"id": "0d2bc44a-7c39-4e27-9b61-3a9b1b22aaaa",
"deal_id": "ab6c5c81-89b7-43c3-8d72-19e22a11bbbb",
"deal_name": "5MW colocation, Frankfurt",
"status": "matching_inventory",
"tracking_number": "20284551108",
"created_at": "2026-04-19T16:02:11.443Z"
}
]
}Error responses
| HTTP | Body | Cause |
|---|---|---|
| 400 | Missing required query parameter: broker_id | broker_id was not supplied. |
| 401 | Unauthorized | Missing or invalid x-api-key. |
| 403 | Not permitted to query bids for the given broker_id | The broker_id is not in your key's permitted list. |
| 429 | Rate limit exceeded | More than 20 reads/min from your IP. Honor Retry-After. |
| 500 | Internal server error | Transient — retry with exponential backoff. |
Examples
List every bid for a broker (newest first):
curl -G https://api.fpx.world/v1/bids \
-H "x-api-key: YOUR_API_KEY" \
--data-urlencode "broker_id=<YOUR_BROKER_ID>"Page through bids 50 at a time, only the ones currently in negotiation:
curl -G https://api.fpx.world/v1/bids \
-H "x-api-key: YOUR_API_KEY" \
--data-urlencode "broker_id=<YOUR_BROKER_ID>" \
--data-urlencode "status=negotiating" \
--data-urlencode "limit=50" \
--data-urlencode "offset=0"GET/v1/bid-status/:idStatus of a single bid
/v1/bid-status/:idLooks up one bid by its id (the same identifier returned in the bid lists from GET /v1/bids and in the success response from POST /v1/add-bid) and returns its current lifecycle status.
Shares the read rate-limit bucket of 20 requests per minute per IP with GET /v1/deals.
URL parameters
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | uuid | yes | The bid id. URL-decoded and trimmed before lookup. |
Response
| Field | Type | Notes |
|---|---|---|
success | boolean | Always true on 200. |
id | uuid | Echo of the requested bid id. |
status | string | null | Current pipeline stage for the bid. See the status reference for the full list of values. |
// inquiry being routed by FPX
{
"success": true,
"id": "f3a2c1b0-8d4e-4d2b-9a90-22e4b7c81234",
"status": "matching_inventory"
}
// buyer and supplier in active discussion
{
"success": true,
"id": "0d2bc44a-7c39-4e27-9b61-3a9b1b22aaaa",
"status": "in_discussion"
}
// signed deal
{
"success": true,
"id": "12cb7e9a-4abc-49a1-9f8b-77ff90112233",
"status": "signed_confirmed"
}Error responses
| HTTP | Body | Cause |
|---|---|---|
| 400 | Missing bid id in URL | The :id segment was empty after URL-decoding and trimming. |
| 401 | Unauthorized | Missing or invalid x-api-key. |
| 404 | Bid not found | No bid with that id is visible to this API key. |
| 429 | Rate limit exceeded | More than 20 reads/min from your IP. Honor Retry-After. |
| 500 | Internal server error | Transient — retry with exponential backoff. |
Example
curl https://api.fpx.world/v1/bid-status/f3a2c1b0-8d4e-4d2b-9a90-22e4b7c81234 \
-H "x-api-key: YOUR_API_KEY"Support
For questions, key rotation, or to report an issue, contact your account lead. Include the id from any relevant POST response when asking about a specific submission.