{
  "name": "Mission Meets Tech Agent Access API",
  "description": "Read-only access to your live MMT federal-contracting intelligence (opportunities, your pipeline, and pre-scored recommendations) so an AI agent can answer from your real book of business. Requires an MMT Premium membership with the Agent Access add-on.",
  "version": "1",
  "base_url": "https://missionmeetstech.com/api/v1",
  "documentation": "https://missionmeetstech.com/api/v1",
  "openapi": "https://missionmeetstech.com/api/v1/openapi.json",
  "authentication": {
    "type": "bearer",
    "header": "Authorization: Bearer <token>",
    "token_prefix": "mmt_pat_",
    "how_to_get_a_token": "https://missionmeetstech.com/premium/ai-integrations/",
    "notes": "Tokens are minted in the MMT member dashboard (Premium + Agent Access add-on required). The raw token is shown once at creation. Revoke any token from the same page and access stops immediately."
  },
  "response_shape": {
    "list": {
      "data": "array of rows",
      "total_count": "int",
      "has_more": "bool",
      "limit": "int",
      "offset": "int"
    },
    "item": {
      "data": "object"
    },
    "error": {
      "error": "MACHINE_CODE",
      "message": "human-readable",
      "docs": "https://missionmeetstech.com/api/v1"
    }
  },
  "rate_limits": {
    "per_key_per_minute": 60,
    "per_key_per_day": 5000,
    "headers": [
      "X-RateLimit-Limit",
      "X-RateLimit-Remaining",
      "Retry-After"
    ],
    "note": "429 responses include Retry-After. Honor it."
  },
  "error_codes": {
    "UNAUTHORIZED": "401 — missing or invalid bearer token. Get one at the setup URL.",
    "FORBIDDEN": "403 — token is valid but lacks the scope for this endpoint.",
    "AGENT_ACCESS_REQUIRED": "403 — the owner's Agent Access add-on is no longer active.",
    "RATE_LIMITED": "429 — too many requests this minute. Wait and retry per Retry-After.",
    "DAILY_LIMIT": "429 — daily request cap reached.",
    "SESSION_LIMIT": "429 — per-session call cap reached. Start a new session.",
    "BUDGET_EXCEEDED": "429 — usage budget for the period reached.",
    "BAD_REQUEST": "400 — invalid query parameter (e.g. limit out of range).",
    "NOT_FOUND": "404 — no resource with that id."
  },
  "endpoints": [
    {
      "path": "/api/v1/opportunities",
      "method": "GET",
      "scope": "opportunities:read",
      "summary": "Global federal opportunities MMT is tracking (opportunity_radar).",
      "query": {
        "naics": "Filter by NAICS code.",
        "agency": "Filter by awarding agency.",
        "set_aside": "Filter by set-aside type (e.g. SDVOSB, 8(a), WOSB).",
        "posted_from": "ISO date — only opportunities posted on/after this date.",
        "deadline": "ISO date — only opportunities with a response deadline on/before this date.",
        "limit": "Page size, 1–100 (default 25).",
        "offset": "Row offset for pagination (default 0)."
      }
    },
    {
      "path": "/api/v1/opportunities/{id}",
      "method": "GET",
      "scope": "opportunities:read",
      "summary": "A single opportunity by id.",
      "query": {}
    },
    {
      "path": "/api/v1/tracker",
      "method": "GET",
      "scope": "tracker:read",
      "summary": "The token owner's own pipeline (their tracked opportunities). Owner-scoped.",
      "query": {
        "limit": "Page size, 1–100 (default 25).",
        "offset": "Row offset for pagination (default 0)."
      }
    },
    {
      "path": "/api/v1/recommended",
      "method": "GET",
      "scope": "intel:read",
      "summary": "Pre-scored recommendations for the owner (nightly batch; never a live model call). May be empty until the batch runs.",
      "query": {
        "limit": "Page size, 1–100 (default 25).",
        "offset": "Row offset for pagination (default 0)."
      }
    }
  ]
}