Momberger Data API
Integrate airport intelligence directly into your dashboards, BI tools, and AI assistants. REST API + MCP server for Claude, GPT, and custom agents.
Authentication
All API requests require authentication via Bearer token. Generate a key from your account settings.
Endpoints
/api/v1/editions?page=1&limit=20List published editions (paginated)
/api/v1/editions/latestLatest published edition + all its articles
/api/v1/editions/:numberSingle edition by issue number with articles + executive summary
/api/v1/articles?module=DEV®ion=Africa&q=terminal+expansion&tag=CapexFilter & full-text search articles
/api/v1/articles/:idSingle article with takeaways and source
/api/v1/projects?status=ongoing®ion=Middle+East&min_value=100000000Airport projects database
/api/v1/projects/:idSingle project with linked articles
/api/v1/projects/exportCSV export of projects (same filters as list)
/api/v1/tenders?category=security&deadline_days=30Worldwide Airport Tenders (WAT add-on or Enterprise)
/api/v1/tenders/:idSingle tender
/api/v1/tenders/exportCSV export of tenders
/api/v1/search?q=...&module=DEV&year=2025&include_archived=1Archive search — same engine as the in-app archive page
/api/v1/searchSame as GET /search, JSON body for complex filters
Admin endpoints
Editorial CRUD for the platform owner and editors. Same Bearer auth as the public API, but the API key's user must have profiles.is_admin = true. Admin keys bypass the daily quota and the API/MCP plan gates — admins can always reach the platform.
/api/v1/admin/editions?status=draftList editions including drafts and archived
/api/v1/admin/editionsCreate a new edition (defaults to draft)
/api/v1/admin/editions/:idUpdate edition metadata, executive summary, status
/api/v1/admin/editions/:idDelete an edition (cascades to articles)
/api/v1/admin/editions/:id/publishPublish edition; recompute rollups
/api/admin/newsletter/sendeditionNumber?, dryRun?, onlyToSelf?, testEmail?, testEmails?Send personalised newsletter digests via Resend
/api/v1/admin/articlesAdd article to an edition
/api/v1/admin/articles/:idUpdate an article (takeaways, why_it_matters, content, ...)
/api/v1/admin/articles/:idDelete an article
/api/v1/admin/projectsAdd a project to the airport projects DB
/api/v1/admin/projects/:idUpdate a project
/api/v1/admin/projects/:idDelete a project
/api/v1/admin/tendersAdd a tender
/api/v1/admin/tenders/:idUpdate a tender
/api/v1/admin/tenders/:idDelete a tender
/api/v1/admin/inbox?status=pendingList editorial inbox items (AI-pre-screened)
/api/v1/admin/inbox/:idSet inbox item status / assigned module
/api/v1/admin/inbox/:id/promotePromote inbox item into an article on a target edition
Agent-ready spec
Copy this whole block and paste it into Claude, ChatGPT, Cursor, or any other coding agent. It's self-contained — auth, every endpoint, every query parameter, and runnable curl examples.
# Momberger Airport Information — REST API
Base URL: https://momberger.app
Auth: every request must include `Authorization: Bearer <token>`
- `<token>` is either a Supabase JWT (in-app sessions) or a long-lived API key
that starts with `mbg_live_`. Generate keys at /settings → API Keys.
Content-Type: all POST bodies are JSON.
Errors: non-2xx responses return `{ "error": "<message>" }`.
Rate limits (per API key, UTC day): trial 200 / core 1k / professional 1k / enterprise 10k.
Exceeded → 429 with `Retry-After` header.
Modules (codes used in `module` filters):
DEV Airport Development News (flagship)
CAL Calendar of Events
MGT Management, Ownership & Finance
OPS Airport Operations News
CON Consultant & Contractor News
GSE Ground Support Equipment
ATC Air Traffic Services
MRO Maintenance Base & FBO News
AIT Airport Information Technology
Common response envelope:
{ "data": <T | T[]>, "meta"?: { "page", "limit", "total", "pages" } }
================================================================================
ENDPOINTS
================================================================================
GET /api/v1/editions
Query: page (default 1), limit (default 20, max 50)
Returns: list of published editions with executive-summary fields
(summary, top_developments[], key_trends[], regional_highlights, key_metrics).
GET /api/v1/editions/latest
Returns: the most recent published edition plus its full article list
(id, module, headline, content, region, country, airports[], tags[],
source_name, source_url, takeaways[], why_it_matters, sort_order).
Use this when you want "what's in this week's newsletter".
GET /api/v1/editions/:number
Path: :number is the issue number (e.g. 1267).
Returns: same shape as /editions/latest but for a specific issue.
GET /api/v1/articles
Query:
q full-text search (Postgres websearch syntax)
module module code (DEV, MGT, ...)
region substring match
country substring match
tag single tag — article must contain it
edition issue number
page, limit (default 20, max 100)
Returns: paginated articles + linked edition_number / publish_date.
GET /api/v1/articles/:id
Returns: single article (UUID id) with takeaways, why_it_matters, source.
GET /api/v1/search
GET /api/v1/search?q=...
POST /api/v1/search { ...same params as JSON }
This is the SAME search the in-app archive page uses.
Query / body params:
q keyword query (websearch FTS)
module module code
region exact region name
year "2024", "2025", ... (filters by edition publish_date)
tag single required tag (must contain)
any_tags comma-separated list (article must contain at least one)
any_regions comma-separated list (OR over regions)
any_modules comma-separated list (OR over modules)
exclude_tags comma-separated list (article must NOT contain any)
include_archived "1" to also return archived (older imported) editions
page, limit pagination (default 30, max 100)
Returns: { data: Article[], meta: { page, limit, total, pages } }
Each article includes edition_number + publish_date so you can group by issue.
GET /api/v1/projects
Airport projects database.
Query: q, region, country, status (planned|ongoing|complete|cancelled|on_hold),
type (substring match on project_type), min_value (USD integer),
page, limit (default 50, max 100).
Returns: paginated projects with airport_name, iata_code, country, region,
project_type, value_usd, contractor, status, expected_completion_year,
tags, last_seen_edition.
GET /api/v1/projects/:id
Returns: full project + `articles` array of editions where it was mentioned.
GET /api/v1/projects/export
Same filters as /projects. Returns text/csv (up to 1000 rows).
GET /api/v1/tenders [requires WAT add-on or Enterprise plan]
Query: q, region, country, category, type (rfp|tender|framework|eoi),
closed=1 (include expired), deadline_days (only show tenders closing
within N days), sort (deadline_asc|deadline_desc|value_desc|published_desc),
page, limit.
GET /api/v1/tenders/:id [WAT or Enterprise]
GET /api/v1/tenders/export [WAT or Enterprise]
CSV export, same filters as list.
================================================================================
EXAMPLES
================================================================================
# 1. Latest newsletter content
curl -H "Authorization: Bearer mbg_live_..." \
https://momberger.app/api/v1/editions/latest
# 2. All Capex articles in Africa from 2025
curl -H "Authorization: Bearer mbg_live_..." \
"https://momberger.app/api/v1/search?q=capex®ion=Africa&year=2025"
# 3. Ongoing terminal projects above $100M
curl -H "Authorization: Bearer mbg_live_..." \
"https://momberger.app/api/v1/projects?status=ongoing&type=terminal&min_value=100000000"
# 4. Tenders closing in the next 30 days
curl -H "Authorization: Bearer mbg_live_..." \
"https://momberger.app/api/v1/tenders?deadline_days=30"
# 5. Complex search via POST
curl -X POST -H "Authorization: Bearer mbg_live_..." \
-H "Content-Type: application/json" \
-d '{"q":"terminal","any_modules":["DEV","MGT"],"exclude_tags":["Cancelled"],"limit":50}' \
https://momberger.app/api/v1/search
MCP Server
Two tools, the whole API
Our MCP server is intentionally thin. Instead of one tool per endpoint (which burns the model's context with descriptions), it exposes two tools that let the agent compose calls itself:
search_api(query)— discover endpoints in the catalog with their parameters and examples.call_api(method, path, …)— invoke any/api/v1/*endpoint. Auth, RLS, and plan gates apply.
Endpoint: POST https://momberger.app/api/mcp
Transport: Streamable HTTP (JSON-RPC 2.0)
Auth: Authorization: Bearer mbg_live_…
Quota: 1 tool call = 1 unit on your daily API limit
{
"mcpServers": {
"momberger": {
"url": "https://momberger.app/api/mcp",
"headers": {
"Authorization": "Bearer mbg_live_…"
}
}
}
}Why this shape?
Hand-crafted MCP tool sets balloon. Cloudflare collapsed 2,500 endpoints into two tools; we're collapsing ours into the same pattern. Your agent already knows how to compose REST calls — give it the catalog and let it work. MCP access is a paid add-on (or bundled with Enterprise); contact us to enable it on your subscription.
Connect from ChatGPT
- ChatGPT Pro / Team / Enterprise plan required.
- Generate an API key under Settings → API Keys.
- ChatGPT → Settings → Connectors → Add custom connector.
- URL:
https://momberger.app/api/mcp - Auth header:
Authorization: Bearer mbg_live_… - Enable in any chat with
Tools → momberger.
Connect from Claude
- Claude Desktop or Claude Code.
- Add to
~/.claude/mcp.jsonwith the snippet above. - Restart Claude; ask it to “search the Momberger API for tender endpoints”.
- For admin (write) access, the API key's user must have
profiles.is_admin = true.
Ready to integrate?
API access is included in Professional and Enterprise plans.