Developer Documentation

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.

Base URL
https://api.fpx.world

Your 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.

FieldValue
Base URLhttps://api.fpx.world
Company ID<YOUR_COMPANY_ID>
Broker ID<YOUR_BROKER_ID>
API KeyYOUR_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 typeCan doCannot do
Read-onlyGET /v1/deals — search and retrieve public supplyPOST /v1/deals returns 403 Forbidden
Read + WriteEverything 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-key header 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-DD or full ISO timestamps; we normalize both.
  • Monetary values are plain numbers (no currency symbols, no commas). Currency is specified in a separate currency field where applicable.
  • Unknown fields in request bodies are silently dropped, not rejected.

Rate limits

EndpointLimit
GET /v1/deals20 requests / minute / IP
POST /v1/deals10 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"] }
HTTPMeaning
400Malformed JSON, invalid listing_type, or missing required fields
401Missing or invalid x-api-key
403Key does not have write permission (POST only)
429Rate limit exceeded
500Server error, please retry with backoff

Data type legend

Types used throughout this doc map to what the server expects after coercion:

  • string — free-form text
  • enum — string restricted to a fixed set of values (listed inline)
  • integer — whole number
  • number — decimal number (e.g. price, MW)
  • boolean — true / false, or string "true" / "false" / "1" / "0"
  • date — "YYYY-MM-DD" or full ISO 8601 timestamp
  • uuid — UUID v4 string
  • array — JSON array of objects or strings

GET/v1/deals
Search public supply

Returns active, publicly-listed deals matching your filters, newest first.

Request headers

HeaderTypeRequiredNotes
x-api-keystringyesYour API key

Query parameters

All parameters are optional. Omit any you don't need.

ParameterTypeApplies toDescription
listing_typeenumallOne of hardware_gpu, colocation, cloud_gpu, powered_land, power_equipment
statusstringallDeal lifecycle status. Defaults to everything except archived
locationstringallCase-insensitive substring match on location (e.g. Dallas, Frankfurt)
min_pricenumberallMinimum price. Matches price for hardware/cloud, power_capacity_charge for colocation, asking_price for powered land
max_pricenumberallUpper bound, same semantics as min_price
gpu_modelstringhardware, cloud_gpuMatches both gpu_model and gpu_type, substring
unit_typeenumhardwareserver, baseboard, gpu/card, or rack
min_quantityintegerhardware, cloud_gpuMatches available_units or total_qty_available
conditionenumhardwarenew, refurbished, used, etc.
cooling_typeenumcolocationair, liquid, both, tbc
categorystringpower_equipmentMatches equipment_category
min_power_mwnumbercolocation, powered_landMatches total_power_mw or power_available_now_mw
max_power_mwnumbercolocation, powered_landSame, upper bound
limitintegerallPage size, 1–100, default 50
offsetintegerallPagination 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/deals
Submit a deal for review

Submits 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

HeaderTypeRequiredNotes
x-api-keystringyes
Content-TypestringyesMust be application/json

Common body fields (all listing types)

FieldTypeRequiredNotes
listing_typeenumyesSee the seven categories below
titlestringrecommendedA human-readable name, e.g. "B200 SXM — Dallas — 1024 units"
company_iduuidrecommendedUse your company ID issued at onboarding
broker_iduuidrecommendedUse your broker ID issued at onboarding
deal_typeenumno"Offer" (default) or "Bid"
locationstringvariesCity / region. Required for colocation and powered_land
currencystringno"USD" (default), "EUR", "GBP", etc.
notesstringnoFree-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_typeWhat it represents
hardware_gpuGPU-based hardware for sale — servers, baseboards, standalone cards, full racks
colocationData-center space and power available for lease
cloud_gpuCloud / bare-metal GPU compute offered on-demand or long-term
powered_landLand parcels with power availability for development
power_equipmentGenerators, 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 — integer
  • price — number

Pricing

One price per unit in price + currency. Set price_unit to match:

price_unitWhen to use
per_serverSelling full servers
per_baseboardSelling HGX baseboards
per_gpuSelling loose GPUs/cards
per_rackSelling full racks

Other commonly-used fields

  • unit_type — enum — physical unit being sold. One of server, baseboard, gpu/card, rack
  • moq — integer — minimum order quantity
  • batch_size — integer — units grouped per shipment/batch
  • gpus_per_unit — integer — number of GPUs per server/baseboard/rack
  • gpu_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 detail
  • cpu_specs — string — CPU model and configuration
  • memory_specs — string — system memory spec (e.g. "2TB DDR5")
  • storage_specs — string — storage configuration
  • networking_specs — string — NIC / fabric details
  • power_specs — string — PSU / power draw information
  • chassis — string — chassis model or form factor
  • condition — enum — one of new, refurbished, used, pulled, as_is, unknown
  • warranty_months — integer — length of warranty coverage
  • warranty_type — enum — oem, seller, third_party, none, unknown
  • lead_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 metro
  • total_power_mw — number

Pricing

Colocation uses two pricing components instead of a single price:

FieldTypeDescription
power_capacity_chargenumberRecurring charge per kW per month for contracted capacity
power_capacity_charge_currencystringe.g. "USD"
power_consumption_chargenumberPer-kWh charge for actual power consumed
power_consumption_charge_currencystringe.g. "USD"
is_dynamic_pricingbooleanSet to true if the charge is market-indexed

Other commonly-used fields

  • site_name — string — name of the data center / site
  • site_status — enum — ready, under_construction, planned
  • available_power_mw — number — MW currently available for contract
  • power_density_kw_per_rack — number — supported rack density in kW
  • cooling_type — enum — air, liquid, both, tbc
  • liquid_cooling_supported — string — free-form description (e.g. "DLC + RDHx")
  • power_redundancy — enum — N, N+1, 2N
  • pue — number — power usage effectiveness (1.0 – 2.0)
  • racks_available — integer — count of racks available
  • contract_term — string — typical contract length offered
  • minimum_commit — string — minimum contract commitment description
  • rfs_date — date — ready-for-service date
  • live_power_date — date — date power becomes live
  • meet_me_room — boolean — meet-me room / carrier hotel access
  • renewable_power_option — boolean — renewable energy option available
  • carriers_available — string — list of connectivity carriers
  • compliance_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 — number
  • total_qty_available — integer — number of GPUs available
  • One of gpu_model or gpu_type — string — e.g. "H100", "B200"

Pricing

Cloud GPUs are always billed per GPU-hour. Set:

  • price — number — rate per GPU-hour
  • currency — string — e.g. "USD"
  • price_unit — string — leave as "per_gpu_hour" (default and enforced server-side)

Rental model

FieldValuesDescription
rental_typeon_demand / long_term / bothBilling mode offered
cloud_duration + cloud_duration_unitinteger + (days/weeks/months/years)For long_term, the commit term
minimum_durationstringFree-form description if you prefer
billing_granularitystringhourly, daily, monthly

Other commonly-used fields

  • gpus_per_node — integer — GPUs per node/instance
  • cpu_spec — string — CPU configuration per node
  • ram_gb — integer — RAM per node in GB
  • local_ssd_nvme — string — local storage description
  • storage_options — string — attached storage tiers offered
  • network_type — enum — ethernet, infiniband, roce, unknown
  • network_bandwidth — string — e.g. "3.2Tbps non-blocking"
  • availability_start_date — date — date capacity becomes available
  • sla_support_level — string — support SLA tier
  • support_hours — string — e.g. "24/7", "business hours"
  • managed_services — string — managed services offered
  • software_stack — string — preinstalled OS / drivers / CUDA version
  • container_support — string — e.g. "kubernetes", "docker"
  • orchestration_support — string — orchestration platforms supported
  • data_egress_cost — string — egress pricing description
  • private_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

FieldTypeDescription
purchase_price_per_mwnumberPrice per MW
purchase_currencystringe.g. "USD"

pricing_type: "option_purchase" — option plus closing price

FieldTypeDescription
option_upfront_percentagenumber% of the deal paid upfront for the option
option_closing_price_per_mwnumberPer-MW price at closing
option_currencystringe.g. "USD"

pricing_type: "phased" — tranche-based

FieldTypeDescription
phased_pricingarrayArray 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

FieldTypeDescription
jv_price_per_mwnumberPer-MW reference value
jv_currencystringe.g. "USD"
jv_splitarray[{ party, ratio }]
"jv_split": [
  { "party": "Landowner", "ratio": "30" },
  { "party": "Developer", "ratio": "70" }
]

pricing_type: "ground_lease" — land rent + power premium

FieldTypeDescription
land_rent_per_acre_yearnumberAnnual rent per acre
power_premium_per_mw_yearnumberAnnual power premium per MW
ground_lease_currencystringe.g. "USD"

Other commonly-used fields

  • parcel_name — string — name of the parcel / site
  • parcel_id_apn — string — assessor's parcel number
  • total_land_area_acres — number — total parcel size in acres
  • buildable_area_acres — number — usable / buildable acreage
  • zoning — string — zoning classification (e.g. "Heavy Industrial")
  • land_type — string — land classification
  • power_topology — enum — on_grid, btm, hybrid
  • grid_mw — number — grid-connected MW
  • btm_mw — number — behind-the-meter MW
  • generation_types — array — any of "Gas", "Solar (BESS)", "Nuclear", "Other"
  • power_expandable_to_mw — number — max expandable capacity
  • estimated_rfs_date — date — estimated ready-for-service date
  • full_mw_delivery_date — date — date of full MW delivery
  • estimated_energization_date — date — energization date estimate
  • utility_provider — string — serving utility
  • substation_name — string — name of nearest substation
  • substation_distance — string — distance to substation (e.g. "1.2 miles")
  • interconnection_status — string — current interconnection queue status
  • entitlement_status — string — permitting / entitlement progress
  • fiber_availability — string — available fiber carriers / routes
  • water_availability — string — water supply description
  • sewer_availability — string — sewer infrastructure description
  • transaction_type — enum — purchase, ground_lease, option, jv, other
  • asking_price — number — headline asking price
  • closing_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 number
  • voltage_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 unit
  • manufacture_year — integer — year the unit was manufactured
  • condition_grade — enum — A, B, C, D, unknown
  • testing_documentation — string — test reports / certifications available
  • available_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/help
Discover the API from your terminal

A 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 / behaviorValue
Content-Typetext/plain; charset=utf-8
Cache-Controlpublic, max-age=60
Output formatANSI-colored when User-Agent looks like a terminal client (curl, wget, HTTPie, xh, httpx); plain text otherwise.
Status code200 on success.

Examples

Pretty terminal output with colors:

curl https://api.fpx.world/v1/help

Plain text (e.g. saving to a file or piping to less):

curl -A "Mozilla/5.0" https://api.fpx.world/v1/help > fpx-api.txt

Sample 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_number is 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-bid
Place a bid on an existing offer

Submits 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

HeaderTypeRequiredNotes
x-api-keystringyesMust be a key with can_write=true. Read-only keys return 403.
Content-TypestringyesMust be application/json.

Mandatory body fields (all listing types)

FieldTypeNotes
tracking_numberstringThe tracking_number of the offer you are bidding on. Accepted as a JSON string or number; whitespace is trimmed.
broker_iduuidUUID of the broker placing the bid. Must be a broker your API key is permitted to act on.
company_iduuidUUID 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_typeRequired fieldsNotes
hardware_gpupriceYour bid price. Same unit/currency model as the offer.
hardwarepriceGeneric hardware (legacy alias).
power_equipmentpricePer-unit bid price.
colocationpower_capacity_chargeBid is on the per-kW/month capacity charge — colocation uses this instead of price.
powered_landpriceBid against the offer's asking_price.
cloud_gpuprice + duration + duration_unitCloud bids must include all three: per-GPU-hour price, term length, and unit.

Optional body fields

Anything outside this allowlist is silently dropped:

FieldTypeApplies toDescription
price_unitstringalle.g. per_server, per_gpu, per_unit, per_gpu_hour.
currencystringallDefaults to USD if omitted.
quantityintegerhardware, power_equipment, cloud_gpuHow many units / GPUs you are bidding on.
notesstringallFree-form context for the reviewer.
locationstringallFalls back to the offer's location if omitted.
selling_company_iduuidallDefaults to the offer's company_id.
broker_namestringallOptional human-readable broker label for display.
duration_years / duration_months / duration_days / duration_hoursintegerhardwareTerm components for fixed-term hardware contracts.
power_consumption_chargenumbercolocationPer-kWh consumption charge component.
is_dynamic_pricingbooleancolocationSet true if your bid uses market-indexed pricing.
variable_contractbooleancloud_gpuTrue 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

HTTPBodyCause
400Missing tracking_numbertracking_number not present in the JSON body.
400Missing required fieldsBody parsed, but the listing_type's required fields are not all present. Inspect missing_fields in the response.
400Invalid JSON body / Request body must be a JSON objectBody is not valid JSON, or is an array / scalar.
401UnauthorizedMissing or invalid x-api-key.
403This API key does not have write accessYour key is read-only.
403Not permitted to act as the given broker_id / company_idThe IDs you sent are not in your key's permitted list.
404Offer not foundNo live offer with that tracking_number.
409This offer is archived and no longer accepts bids.Offer exists but its status is archived.
429Rate limit exceededMore than 10 writes/min from your IP. Honor Retry-After.
500Internal server error / Failed to create pending bidTransient — 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/bids
List a broker's bids

Returns 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

HeaderTypeRequiredNotes
x-api-keystringyesAny valid key (read or read+write). Must be permitted to query the broker_id you pass.

Query parameters

ParameterTypeRequiredNotes
broker_iduuidyesThe broker whose bids you want to list.
statusstringnoFilter to a single pipeline stage. See the status reference below for valid values. Omit to receive all stages.
limitintegernoPage size, 1-100. Defaults to 50.
offsetintegernoItems 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.

StatusStageWhat it means
request_receivedRequest ReceivedFPX has received the buyer's inquiry.
reviewing_requirementsReviewing RequirementsFPX is checking specs like location, MW/GPU count, term, timing, budget, power density, hardware type.
matching_inventoryMatching InventoryFPX is searching available cloud, colo, power, or hardware supply.
contacting_supplierContacting SupplierFPX is speaking with the relevant supplier or inventory owner.
supplier_reviewingSupplier ReviewingSupplier is checking availability, pricing, timing, and fit.
meeting_setupMeeting SetupIntro, technical, or commercial call is being coordinated.
in_discussionIn DiscussionBuyer and supplier are actively reviewing the opportunity.
pricing_proposal_sharedPricing / Proposal SharedQuote, term sheet, LOI, or high-level proposal has been shared.
negotiatingNegotiatingParties are discussing commercial, legal, technical, or delivery terms.
contractingContractingMSA, NDA, order form, LOA, lease, or purchase agreement is being finalized.
signed_confirmedSigned / ConfirmedDeal has been agreed or signed.
provisioning_deliveryProvisioning / DeliveryCapacity, hardware, site access, or deployment is being prepared.
live_completedLive / CompletedBuyer is using the inventory, or hardware has been delivered.
closed_lost_cancelledClosed Lost / CancelledDeal did not proceed.

Response

FieldTypeNotes
iduuidStable identifier for this bid.
deal_iduuid | nullSystem identifier of the offer this bid targets. Use tracking_number for partner-facing references.
deal_namestring | nullTitle of the offer this bid targets.
statusstringCurrent pipeline stage. See the status reference for the full list of values.
tracking_numberstring | nulltracking_number of the offer this bid targets, when known.
created_atstringISO-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

HTTPBodyCause
400Missing required query parameter: broker_idbroker_id was not supplied.
401UnauthorizedMissing or invalid x-api-key.
403Not permitted to query bids for the given broker_idThe broker_id is not in your key's permitted list.
429Rate limit exceededMore than 20 reads/min from your IP. Honor Retry-After.
500Internal server errorTransient — 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/:id
Status of a single bid

Looks 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

ParameterTypeRequiredNotes
iduuidyesThe bid id. URL-decoded and trimmed before lookup.

Response

FieldTypeNotes
successbooleanAlways true on 200.
iduuidEcho of the requested bid id.
statusstring | nullCurrent 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

HTTPBodyCause
400Missing bid id in URLThe :id segment was empty after URL-decoding and trimming.
401UnauthorizedMissing or invalid x-api-key.
404Bid not foundNo bid with that id is visible to this API key.
429Rate limit exceededMore than 20 reads/min from your IP. Honor Retry-After.
500Internal server errorTransient — 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.

FPX Public API — v1 · Updated April 2026