{
  "_meta": {
    "description": "Per-(provider \u00d7 market) integration-cost breakdown. The integration-cost score measures how much each provider's API/data model differs from Cleo's existing Plaid integration \u2014 auth flow, connection lifecycle, webhooks, error taxonomy, and sandbox availability. Per-cell lists show which buckets are covered, partial, absent, or unverified, with the evidence/source we have for each.",
    "scoring": "score = 5 \u2212 4 \u00d7 (\u03a3 weighted_cost / \u03a3 weight) where cost is 0 for covered, 0.5 for partial/unknown, 1.0 for absent; weight = criticality bucket weight (must_have=3, nice_to_have=1, optional=0.5, deprecating=0).",
    "buckets_used": [
      "auth_link",
      "item_management",
      "webhooks",
      "error_mapping",
      "sandbox_mocks"
    ],
    "source_files": [
      "plaid_surface.json (dimension=integration)",
      "provider_capabilities.json"
    ]
  },
  "providers": {
    "Mastercard OB": {
      "Australia": {
        "present_in_market": true,
        "breakdown": {
          "score": 4.2,
          "confidence_pct": 79,
          "confidence_label": "medium",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Error model & code mapping"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "OAuth2 /v1/oauth/connect + token + refresh",
              "source": "Postman: Connect"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "openbanking-eu.postman_webhooks.json",
              "source": "Postman webhooks"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "postman_environment-sandbox.json",
              "source": "Postman environments"
            }
          ],
          "partial": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "OAuth refresh implies session lifecycle; no explicit item_remove documented",
              "source": "Postman: Connect"
            }
          ],
          "absent": [],
          "unknown": [
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "No public error taxonomy doc found",
              "source": "\u2014"
            }
          ]
        }
      },
      "Poland": {
        "present_in_market": true,
        "breakdown": {
          "score": 4.2,
          "confidence_pct": 79,
          "confidence_label": "medium",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Error model & code mapping"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "OAuth2 /v1/oauth/connect + token + refresh",
              "source": "Postman: Connect"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "openbanking-eu.postman_webhooks.json",
              "source": "Postman webhooks"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "postman_environment-sandbox.json",
              "source": "Postman environments"
            }
          ],
          "partial": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "OAuth refresh implies session lifecycle; no explicit item_remove documented",
              "source": "Postman: Connect"
            }
          ],
          "absent": [],
          "unknown": [
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "No public error taxonomy doc found",
              "source": "\u2014"
            }
          ]
        }
      },
      "Spain": {
        "present_in_market": true,
        "breakdown": {
          "score": 4.2,
          "confidence_pct": 79,
          "confidence_label": "medium",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Error model & code mapping"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "OAuth2 /v1/oauth/connect + token + refresh",
              "source": "Postman: Connect"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "openbanking-eu.postman_webhooks.json",
              "source": "Postman webhooks"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "postman_environment-sandbox.json",
              "source": "Postman environments"
            }
          ],
          "partial": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "OAuth refresh implies session lifecycle; no explicit item_remove documented",
              "source": "Postman: Connect"
            }
          ],
          "absent": [],
          "unknown": [
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "No public error taxonomy doc found",
              "source": "\u2014"
            }
          ]
        }
      }
    },
    "Tink (Visa)": {
      "Australia": {
        "present_in_market": false,
        "breakdown": {
          "score": 3.4,
          "confidence_pct": 44,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping",
            "Sandbox / dev mocks"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Tink Link widget + console; demo.tink.com",
              "source": "tink.com/products"
            }
          ],
          "partial": [
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Tink Link Demo + console signup",
              "source": "demo.tink.com"
            }
          ],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Connection lifecycle not surfaced on product page",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not surfaced on product page",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Behind docs.tink.com (SPA)",
              "source": "\u2014"
            }
          ]
        }
      },
      "Poland": {
        "present_in_market": true,
        "breakdown": {
          "score": 3.4,
          "confidence_pct": 44,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping",
            "Sandbox / dev mocks"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Tink Link widget + console; demo.tink.com",
              "source": "tink.com/products"
            }
          ],
          "partial": [
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Tink Link Demo + console signup",
              "source": "demo.tink.com"
            }
          ],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Connection lifecycle not surfaced on product page",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not surfaced on product page",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Behind docs.tink.com (SPA)",
              "source": "\u2014"
            }
          ]
        }
      },
      "Spain": {
        "present_in_market": true,
        "breakdown": {
          "score": 3.4,
          "confidence_pct": 44,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping",
            "Sandbox / dev mocks"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Tink Link widget + console; demo.tink.com",
              "source": "tink.com/products"
            }
          ],
          "partial": [
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Tink Link Demo + console signup",
              "source": "demo.tink.com"
            }
          ],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Connection lifecycle not surfaced on product page",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not surfaced on product page",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Behind docs.tink.com (SPA)",
              "source": "\u2014"
            }
          ]
        }
      }
    },
    "Yapily": {
      "Australia": {
        "present_in_market": false,
        "breakdown": {
          "score": 3.8,
          "confidence_pct": 44,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Open Banking infrastructure with consent flow; demo.yapily.com",
              "source": "yapily.com"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Sandbox + demo.yapily.com",
              "source": "yapily.com"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Consent management implied but not detailed",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not advertised on product/portfolio pages",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Behind docs.yapily.com (SPA)",
              "source": "\u2014"
            }
          ]
        }
      },
      "Poland": {
        "present_in_market": true,
        "breakdown": {
          "score": 3.8,
          "confidence_pct": 44,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Open Banking infrastructure with consent flow; demo.yapily.com",
              "source": "yapily.com"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Sandbox + demo.yapily.com",
              "source": "yapily.com"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Consent management implied but not detailed",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not advertised on product/portfolio pages",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Behind docs.yapily.com (SPA)",
              "source": "\u2014"
            }
          ]
        }
      },
      "Spain": {
        "present_in_market": true,
        "breakdown": {
          "score": 3.8,
          "confidence_pct": 44,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Open Banking infrastructure with consent flow; demo.yapily.com",
              "source": "yapily.com"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Sandbox + demo.yapily.com",
              "source": "yapily.com"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Consent management implied but not detailed",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not advertised on product/portfolio pages",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Behind docs.yapily.com (SPA)",
              "source": "\u2014"
            }
          ]
        }
      }
    },
    "Salt Edge": {
      "Australia": {
        "present_in_market": false,
        "breakdown": {
          "score": 3.4,
          "confidence_pct": 37,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping",
            "Sandbox / dev mocks"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Pre-integrated widget for end-users to connect accounts",
              "source": "saltedge.com/products"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Connection lifecycle not documented on product page",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not on product page",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Behind docs.saltedge.com",
              "source": "\u2014"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not mentioned on product page",
              "source": "\u2014"
            }
          ]
        }
      },
      "Poland": {
        "present_in_market": true,
        "breakdown": {
          "score": 3.4,
          "confidence_pct": 37,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping",
            "Sandbox / dev mocks"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Pre-integrated widget for end-users to connect accounts",
              "source": "saltedge.com/products"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Connection lifecycle not documented on product page",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not on product page",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Behind docs.saltedge.com",
              "source": "\u2014"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not mentioned on product page",
              "source": "\u2014"
            }
          ]
        }
      },
      "Spain": {
        "present_in_market": true,
        "breakdown": {
          "score": 3.4,
          "confidence_pct": 37,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping",
            "Sandbox / dev mocks"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Pre-integrated widget for end-users to connect accounts",
              "source": "saltedge.com/products"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Connection lifecycle not documented on product page",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not on product page",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Behind docs.saltedge.com",
              "source": "\u2014"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not mentioned on product page",
              "source": "\u2014"
            }
          ]
        }
      }
    },
    "Kontomatik": {
      "Australia": {
        "present_in_market": false,
        "breakdown": {
          "score": 3.4,
          "confidence_pct": 37,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping",
            "Sandbox / dev mocks"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Widget product",
              "source": "kontomatik.com"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Connection lifecycle not surfaced",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not mentioned on public site",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Behind docs.kontomatik.com",
              "source": "\u2014"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "DEV Portal referenced; sandbox details require account",
              "source": "\u2014"
            }
          ]
        }
      },
      "Poland": {
        "present_in_market": true,
        "breakdown": {
          "score": 3.4,
          "confidence_pct": 37,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping",
            "Sandbox / dev mocks"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Widget product",
              "source": "kontomatik.com"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Connection lifecycle not surfaced",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not mentioned on public site",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Behind docs.kontomatik.com",
              "source": "\u2014"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "DEV Portal referenced; sandbox details require account",
              "source": "\u2014"
            }
          ]
        }
      },
      "Spain": {
        "present_in_market": true,
        "breakdown": {
          "score": 3.4,
          "confidence_pct": 37,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping",
            "Sandbox / dev mocks"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Widget product",
              "source": "kontomatik.com"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Connection lifecycle not surfaced",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not mentioned on public site",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Behind docs.kontomatik.com",
              "source": "\u2014"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "DEV Portal referenced; sandbox details require account",
              "source": "\u2014"
            }
          ]
        }
      }
    },
    "Token.io": {
      "Australia": {
        "present_in_market": false,
        "breakdown": {
          "score": 3.4,
          "confidence_pct": 37,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping",
            "Sandbox / dev mocks"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Bank Connect SDK + OAuth flow (PSD2 PISP)",
              "source": "token.io"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched in detail",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched",
              "source": "\u2014"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Likely yes (modern OB API)",
              "source": "\u2014"
            }
          ]
        }
      },
      "Poland": {
        "present_in_market": true,
        "breakdown": {
          "score": 3.4,
          "confidence_pct": 37,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping",
            "Sandbox / dev mocks"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Bank Connect SDK + OAuth flow (PSD2 PISP)",
              "source": "token.io"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched in detail",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched",
              "source": "\u2014"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Likely yes (modern OB API)",
              "source": "\u2014"
            }
          ]
        }
      },
      "Spain": {
        "present_in_market": true,
        "breakdown": {
          "score": 3.4,
          "confidence_pct": 37,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping",
            "Sandbox / dev mocks"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Bank Connect SDK + OAuth flow (PSD2 PISP)",
              "source": "token.io"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched in detail",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched",
              "source": "\u2014"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Likely yes (modern OB API)",
              "source": "\u2014"
            }
          ]
        }
      }
    },
    "TrueLayer": {
      "Australia": {
        "present_in_market": false,
        "breakdown": {
          "score": 4.6,
          "confidence_pct": 58,
          "confidence_label": "medium",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Error model & code mapping"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Auth + EmbeddedSDK + Hosted Payment Page",
              "source": "truelayer.com"
            },
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Connection management API for AIS connections",
              "source": "docs.truelayer.com"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Webhooks for payment status, AIS connection events",
              "source": "docs.truelayer.com"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Sandbox environment with mock banks",
              "source": "truelayer.com"
            }
          ],
          "partial": [
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Error documentation exists in docs (SPA)",
              "source": "\u2014"
            }
          ],
          "absent": [],
          "unknown": []
        }
      },
      "Poland": {
        "present_in_market": false,
        "breakdown": {
          "score": 4.6,
          "confidence_pct": 58,
          "confidence_label": "medium",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Error model & code mapping"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Auth + EmbeddedSDK + Hosted Payment Page",
              "source": "truelayer.com"
            },
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Connection management API for AIS connections",
              "source": "docs.truelayer.com"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Webhooks for payment status, AIS connection events",
              "source": "docs.truelayer.com"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Sandbox environment with mock banks",
              "source": "truelayer.com"
            }
          ],
          "partial": [
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Error documentation exists in docs (SPA)",
              "source": "\u2014"
            }
          ],
          "absent": [],
          "unknown": []
        }
      },
      "Spain": {
        "present_in_market": true,
        "breakdown": {
          "score": 4.6,
          "confidence_pct": 58,
          "confidence_label": "medium",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Error model & code mapping"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Auth + EmbeddedSDK + Hosted Payment Page",
              "source": "truelayer.com"
            },
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Connection management API for AIS connections",
              "source": "docs.truelayer.com"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Webhooks for payment status, AIS connection events",
              "source": "docs.truelayer.com"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Sandbox environment with mock banks",
              "source": "truelayer.com"
            }
          ],
          "partial": [
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Error documentation exists in docs (SPA)",
              "source": "\u2014"
            }
          ],
          "absent": [],
          "unknown": []
        }
      }
    },
    "Unnax": {
      "Australia": {
        "present_in_market": false,
        "breakdown": {
          "score": 3.0,
          "confidence_pct": 30,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Auth / Link Token / Connect flow",
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping",
            "Sandbox / dev mocks"
          ],
          "covered": [],
          "partial": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Bank connect flow exists; details limited",
              "source": "unnax.com"
            }
          ],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched",
              "source": "\u2014"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Likely available (developer portal)",
              "source": "\u2014"
            }
          ]
        }
      },
      "Poland": {
        "present_in_market": false,
        "breakdown": {
          "score": 3.0,
          "confidence_pct": 30,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Auth / Link Token / Connect flow",
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping",
            "Sandbox / dev mocks"
          ],
          "covered": [],
          "partial": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Bank connect flow exists; details limited",
              "source": "unnax.com"
            }
          ],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched",
              "source": "\u2014"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Likely available (developer portal)",
              "source": "\u2014"
            }
          ]
        }
      },
      "Spain": {
        "present_in_market": true,
        "breakdown": {
          "score": 3.0,
          "confidence_pct": 30,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Auth / Link Token / Connect flow",
            "Item / connection lifecycle",
            "Webhook intake & processing",
            "Error model & code mapping",
            "Sandbox / dev mocks"
          ],
          "covered": [],
          "partial": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Bank connect flow exists; details limited",
              "source": "unnax.com"
            }
          ],
          "absent": [],
          "unknown": [
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched",
              "source": "\u2014"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched",
              "source": "\u2014"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Not researched",
              "source": "\u2014"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Likely available (developer portal)",
              "source": "\u2014"
            }
          ]
        }
      }
    },
    "Frollo": {
      "Australia": {
        "present_in_market": true,
        "breakdown": {
          "score": 4.2,
          "confidence_pct": 44,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Webhook intake & processing",
            "Error model & code mapping"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "CDR-accredited connect flow",
              "source": "frollo.us"
            },
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "CDR consent management is core to AU OB",
              "source": "\u2014"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Developer sandbox referenced",
              "source": "developer.frollo.us"
            }
          ],
          "partial": [
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "CDR data refresh model; webhook details unknown",
              "source": "\u2014"
            }
          ],
          "absent": [],
          "unknown": [
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Behind developer portal",
              "source": "\u2014"
            }
          ]
        }
      },
      "Poland": {
        "present_in_market": false,
        "breakdown": {
          "score": 4.2,
          "confidence_pct": 44,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Webhook intake & processing",
            "Error model & code mapping"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "CDR-accredited connect flow",
              "source": "frollo.us"
            },
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "CDR consent management is core to AU OB",
              "source": "\u2014"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Developer sandbox referenced",
              "source": "developer.frollo.us"
            }
          ],
          "partial": [
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "CDR data refresh model; webhook details unknown",
              "source": "\u2014"
            }
          ],
          "absent": [],
          "unknown": [
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Behind developer portal",
              "source": "\u2014"
            }
          ]
        }
      },
      "Spain": {
        "present_in_market": false,
        "breakdown": {
          "score": 4.2,
          "confidence_pct": 44,
          "confidence_label": "low",
          "missing_must_haves": [],
          "partial_must_haves": [
            "Webhook intake & processing",
            "Error model & code mapping"
          ],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "CDR-accredited connect flow",
              "source": "frollo.us"
            },
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "CDR consent management is core to AU OB",
              "source": "\u2014"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Developer sandbox referenced",
              "source": "developer.frollo.us"
            }
          ],
          "partial": [
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "CDR data refresh model; webhook details unknown",
              "source": "\u2014"
            }
          ],
          "absent": [],
          "unknown": [
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "low",
              "evidence": "Behind developer portal",
              "source": "\u2014"
            }
          ]
        }
      }
    },
    "Basiq": {
      "Australia": {
        "present_in_market": true,
        "breakdown": {
          "score": 5.0,
          "confidence_pct": 65,
          "confidence_label": "medium",
          "missing_must_haves": [],
          "partial_must_haves": [],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Connect SDK + Basiq Connect",
              "source": "basiq.io"
            },
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Connections API: get / refresh / delete",
              "source": "api.basiq.io/docs"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Webhook events for connections + transactions",
              "source": "api.basiq.io/docs"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Documented error codes in docs",
              "source": "api.basiq.io/docs"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Demo data + sandbox",
              "source": "api.basiq.io/docs"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": []
        }
      },
      "Poland": {
        "present_in_market": false,
        "breakdown": {
          "score": 5.0,
          "confidence_pct": 65,
          "confidence_label": "medium",
          "missing_must_haves": [],
          "partial_must_haves": [],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Connect SDK + Basiq Connect",
              "source": "basiq.io"
            },
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Connections API: get / refresh / delete",
              "source": "api.basiq.io/docs"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Webhook events for connections + transactions",
              "source": "api.basiq.io/docs"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Documented error codes in docs",
              "source": "api.basiq.io/docs"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Demo data + sandbox",
              "source": "api.basiq.io/docs"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": []
        }
      },
      "Spain": {
        "present_in_market": false,
        "breakdown": {
          "score": 5.0,
          "confidence_pct": 65,
          "confidence_label": "medium",
          "missing_must_haves": [],
          "partial_must_haves": [],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Connect SDK + Basiq Connect",
              "source": "basiq.io"
            },
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Connections API: get / refresh / delete",
              "source": "api.basiq.io/docs"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Webhook events for connections + transactions",
              "source": "api.basiq.io/docs"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Documented error codes in docs",
              "source": "api.basiq.io/docs"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "medium",
              "evidence": "Demo data + sandbox",
              "source": "api.basiq.io/docs"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": []
        }
      }
    },
    "Plaid": {
      "Australia": {
        "present_in_market": false,
        "breakdown": {
          "score": 5.0,
          "confidence_pct": 100,
          "confidence_label": "high",
          "missing_must_haves": [],
          "partial_must_haves": [],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "Plaid Link Token + Plaid Link SDK",
              "source": "Cleo monorepo + plaid.com"
            },
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "/item/get, /item/remove, /item/webhook/update",
              "source": "plaid.com"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "JWT/ES256-signed webhooks per item",
              "source": "plaid.com"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "Documented error_code taxonomy",
              "source": "plaid.com/docs/errors"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "Plaid sandbox + Cleo's internal service_mocks",
              "source": "plaid.com/sandbox"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": []
        }
      },
      "Poland": {
        "present_in_market": true,
        "breakdown": {
          "score": 5.0,
          "confidence_pct": 100,
          "confidence_label": "high",
          "missing_must_haves": [],
          "partial_must_haves": [],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "Plaid Link Token + Plaid Link SDK",
              "source": "Cleo monorepo + plaid.com"
            },
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "/item/get, /item/remove, /item/webhook/update",
              "source": "plaid.com"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "JWT/ES256-signed webhooks per item",
              "source": "plaid.com"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "Documented error_code taxonomy",
              "source": "plaid.com/docs/errors"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "Plaid sandbox + Cleo's internal service_mocks",
              "source": "plaid.com/sandbox"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": []
        }
      },
      "Spain": {
        "present_in_market": true,
        "breakdown": {
          "score": 5.0,
          "confidence_pct": 100,
          "confidence_label": "high",
          "missing_must_haves": [],
          "partial_must_haves": [],
          "covered": [
            {
              "id": "auth_link",
              "name": "Auth / Link Token / Connect flow",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "Plaid Link Token + Plaid Link SDK",
              "source": "Cleo monorepo + plaid.com"
            },
            {
              "id": "item_management",
              "name": "Item / connection lifecycle",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "/item/get, /item/remove, /item/webhook/update",
              "source": "plaid.com"
            },
            {
              "id": "webhooks",
              "name": "Webhook intake & processing",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "JWT/ES256-signed webhooks per item",
              "source": "plaid.com"
            },
            {
              "id": "error_mapping",
              "name": "Error model & code mapping",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "Documented error_code taxonomy",
              "source": "plaid.com/docs/errors"
            },
            {
              "id": "sandbox_mocks",
              "name": "Sandbox / dev mocks",
              "criticality": "must_have",
              "confidence": "high",
              "evidence": "Plaid sandbox + Cleo's internal service_mocks",
              "source": "plaid.com/sandbox"
            }
          ],
          "partial": [],
          "absent": [],
          "unknown": []
        }
      }
    }
  }
}