Developer API

FitOut Post REST API

Read-only JSON endpoints delivering daily-refreshed global fit-out intelligence — news, tenders, pipeline projects and company data. Available to Pro members.

⚡ Pro feature — upgrade to access

Overview

The FitOut Post API provides programmatic access to the same data that powers the platform — updated daily at 06:00 UTC by the automated fetch pipeline. All endpoints return JSON and require a Bearer token in the Authorization header.

The API is intentionally simple: no pagination parameters, no complex query DSL. Each endpoint returns the complete dataset for that day. Filter client-side or integrate the raw feed into your own pipeline.

Base URL

HTTP https://fitoutpost.com/api/

Available endpoints

MethodEndpointDescriptionUpdatedRate limit
GET /api/news.json All news articles, current feed Daily 06:00 UTC 100 req/day
GET /api/tenders.json Active tender listings worldwide Daily 06:00 UTC 100 req/day
GET /api/pipeline.json Pipeline / project announcements Daily 06:00 UTC 50 req/day
GET /api/companies.json Company directory (171+ firms) Weekly 20 req/day

Static JSON on GitHub Pages. The API is served as static files via GitHub Pages — no server-side query processing. All filtering, sorting and searching must be done client-side after fetching the payload.

Authentication

All API requests must include your Pro API key in the Authorization header.

Your API key

Find your API key in your account settings after upgrading to Pro. API keys are prefixed fop_live_ for production.

Keep your key private — do not expose it in client-side JavaScript or public repositories.

Request example

cURL # Fetch today's news feed curl -H "Authorization: Bearer fop_live_YOUR_API_KEY" \ -H "Accept: application/json" \ https://fitoutpost.com/api/news.json
Python import requests API_KEY = "fop_live_YOUR_API_KEY" headers = { "Authorization": f"Bearer {API_KEY}", "Accept": "application/json" } res = requests.get("https://fitoutpost.com/api/news.json", headers=headers) articles = res.json() print(f"{len(articles)} articles fetched")
JavaScript const API_KEY = 'fop_live_YOUR_API_KEY'; const res = await fetch('https://fitoutpost.com/api/news.json', { headers: { 'Authorization': `Bearer ${API_KEY}` } }); const articles = await res.json();

Rate limits

Rate limits are applied per API key per calendar day (UTC). Since the data is static and refreshed once daily, there is no need to poll more frequently than once per day per endpoint.

PlanLimitNotes
Pro Monthly100 req/dayPer endpoint
Pro Annual200 req/dayPer endpoint
EnterpriseUnlimitedCustom SLA available

Recommended pattern: Fetch once per day at 07:00 UTC (one hour after the daily build), cache the result in your own database, and serve from cache for the rest of the day.

GET /api/news.json

Returns an array of all news articles in the current daily feed. Covers 190+ countries, sourced from 300+ RSS feeds and web scrapers. Refreshed daily at 06:00 UTC.

Response schema

FieldTypeDescription
titlestringArticle headline
linkstringSource URL
descriptionstringArticle excerpt / summary
pubDatestring (ISO 8601)Publication date-time
sourcestringPublication name
countrystringCountry name (ISO common name)
continentstringOne of: Europe · Middle East · Americas · Asia-Pacific · Africa
signalstringClassified signal type: award · tender · pipeline · progress · news
fetched_atstring (ISO 8601)When FitOut Post fetched this article

Example response

JSON [ { "title": "ISG wins £42M fit-out contract for Canary Wharf HQ", "link": "https://www.constructionnews.co.uk/...", "description": "ISG has been appointed to deliver the...", "pubDate": "2026-05-06T08:14:00Z", "source": "Construction News", "country": "United Kingdom", "continent": "Europe", "signal": "progress", "fetched_at": "2026-05-06T06:02:14Z" }, // ... more articles ]

GET /api/tenders.json

Returns all active tender listings. Sources include TED/OJEU (Europe), Saudi Etimad, UAE Tejouri, Australian AusTender, US SAM.gov, and regional procurement portals across 60+ countries.

Response schema

FieldTypeDescription
titlestringTender / contract title
contracting_authoritystringIssuing body / client
countrystringCountry of tender
continentstringGeographic region
deadlinestring (ISO 8601)Submission deadline (null if unknown)
value_eurnumber | nullEstimated contract value in EUR (null if undisclosed)
cpv_codesstring[]EU CPV procurement codes (empty for non-EU)
source_urlstringDirect link to tender notice
sourcestringProcurement platform (TED, SAM.gov, Etimad, etc.)
publishedstring (ISO 8601)Notice publication date

GET /api/pipeline.json

Returns announced pipeline projects — developments at planning, design or pre-tender stage. Useful for early market intelligence before tenders are issued.

Response schema

FieldTypeDescription
titlestringProject title
developerstringDeveloper / client name
countrystringCountry
continentstringRegion
sectorstringOffice · Retail · Hospitality · Healthcare · Education · Mixed-use
gfa_m2number | nullGross floor area in m² (null if undisclosed)
value_usdnumber | nullEstimated project value in USD
stagestringplanning · design · pre-tender · tender · construction
expected_completionstringYear or quarter (e.g. "2027 Q4")
source_urlstringSource article URL
pubDatestringWhen announced

GET /api/companies.json

Returns the FitOut Post company directory — 171+ fit-out contractors and developers with profile data. Updated weekly.

Response schema

FieldTypeDescription
namestringCompany name
countrystringHQ country
continentstringRegion
sectorsstring[]Sectors of activity
websitestringCompany website URL
descriptionstringShort company description
feed_urlstringRSS feed monitored by FitOut Post

Error codes

HTTP statusCodeMeaning
401UNAUTHORIZEDMissing or invalid API key
403FORBIDDENAPI key valid but Pro plan not active
429RATE_LIMITEDDaily request limit exceeded
404NOT_FOUNDEndpoint does not exist
503BUILDINGDaily build in progress — retry after 10 minutes

503 during build window. The daily build runs 06:00–06:15 UTC. If you fetch during this window, static files may be temporarily unavailable. Recommend scheduling fetches for 07:00 UTC or later.

Changelog

v1.0 — May 2026

  • Initial API release with /api/news.json, /api/tenders.json, /api/pipeline.json
  • /api/companies.json added (weekly refresh)
  • Signal type field added to news articles
  • continent field standardised across all endpoints

SDKs & examples

Official SDKs are on the roadmap. In the meantime, the following community examples demonstrate typical integration patterns.

Python — daily fetch and filter

Python import requests, json API_KEY = "fop_live_YOUR_KEY" HEADERS = {"Authorization": f"Bearer {API_KEY}"} # Fetch and filter tenders for the UK tenders = requests.get("https://fitoutpost.com/api/tenders.json", headers=HEADERS).json() uk_tenders = [t for t in tenders if t["country"] == "United Kingdom"] print(f"{len(uk_tenders)} UK tenders today") # Fetch news with 'award' signal news = requests.get("https://fitoutpost.com/api/news.json", headers=HEADERS).json() awards = [a for a in news if a.get("signal") == "award"] print(f"{len(awards)} contract awards in today's feed")

Node.js — keyword filter

JavaScript const FOP_KEY = 'fop_live_YOUR_KEY'; const KEYWORD = 'Dubai office'; const news = await fetch('https://fitoutpost.com/api/news.json', { headers: { Authorization: `Bearer ${FOP_KEY}` } }).then(r => r.json()); const matches = news.filter(a => (a.title + ' ' + a.description).toLowerCase() .includes(KEYWORD.toLowerCase()) ); console.log(`${matches.length} articles matching "${KEYWORD}"`);

Ready to integrate?

Upgrade to Pro and get your API key in minutes.

Get API access →