Developer API

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.

REST API
JSON endpoints with OpenAPI spec
MCP Server
Model Context Protocol for AI tools
Rate limits
1K/day Core · 10K/day Enterprise
Auth
OAuth 2.0 + API key + SSO

Authentication

All API requests require authentication via Bearer token. Generate a key from your account settings.

# Include in all requests Authorization: Bearer mbg_live_your_api_key_here

Endpoints

GET
/api/v1/editions?page=1&limit=20

List published editions (paginated)

GET
/api/v1/editions/latest

Latest published edition + all its articles

GET
/api/v1/editions/:number

Single edition by issue number with articles + executive summary

GET
/api/v1/articles?module=DEV&region=Africa&q=terminal+expansion&tag=Capex

Filter & full-text search articles

GET
/api/v1/articles/:id

Single article with takeaways and source

GET
/api/v1/projects?status=ongoing&region=Middle+East&min_value=100000000

Airport projects database

GET
/api/v1/projects/:id

Single project with linked articles

GET
/api/v1/projects/export

CSV export of projects (same filters as list)

GET
/api/v1/tenders?category=security&deadline_days=30

Worldwide Airport Tenders (WAT add-on or Enterprise)

GET
/api/v1/tenders/:id

Single tender

GET
/api/v1/tenders/export

CSV export of tenders

GET
/api/v1/search?q=...&module=DEV&year=2025&include_archived=1

Archive search — same engine as the in-app archive page

POST
/api/v1/search

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

GET
/api/v1/admin/editions?status=draft

List editions including drafts and archived

POST
/api/v1/admin/editions

Create a new edition (defaults to draft)

PATCH
/api/v1/admin/editions/:id

Update edition metadata, executive summary, status

DELETE
/api/v1/admin/editions/:id

Delete an edition (cascades to articles)

POST
/api/v1/admin/editions/:id/publish

Publish edition; recompute rollups

POST
/api/admin/newsletter/sendeditionNumber?, dryRun?, onlyToSelf?, testEmail?, testEmails?

Send personalised newsletter digests via Resend

POST
/api/v1/admin/articles

Add article to an edition

PATCH
/api/v1/admin/articles/:id

Update an article (takeaways, why_it_matters, content, ...)

DELETE
/api/v1/admin/articles/:id

Delete an article

POST
/api/v1/admin/projects

Add a project to the airport projects DB

PATCH
/api/v1/admin/projects/:id

Update a project

DELETE
/api/v1/admin/projects/:id

Delete a project

POST
/api/v1/admin/tenders

Add a tender

PATCH
/api/v1/admin/tenders/:id

Update a tender

DELETE
/api/v1/admin/tenders/:id

Delete a tender

GET
/api/v1/admin/inbox?status=pending

List editorial inbox items (AI-pre-screened)

PATCH
/api/v1/admin/inbox/:id

Set inbox item status / assigned module

POST
/api/v1/admin/inbox/:id/promote

Promote 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&region=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

~/.claude/mcp.json
{
  "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

  1. ChatGPT Pro / Team / Enterprise plan required.
  2. Generate an API key under Settings → API Keys.
  3. ChatGPT → Settings → Connectors → Add custom connector.
  4. URL: https://momberger.app/api/mcp
  5. Auth header: Authorization: Bearer mbg_live_…
  6. Enable in any chat with Tools → momberger.

Connect from Claude

  1. Claude Desktop or Claude Code.
  2. Add to ~/.claude/mcp.json with the snippet above.
  3. Restart Claude; ask it to “search the Momberger API for tender endpoints”.
  4. 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.