{
  "schema_version": "civicdataforge.integration-recipes.v1",
  "updated_at": "2026-09-12",
  "canonical_url": "https://civicdataforge.pages.dev/integration-recipes.json",
  "credential_policy": "Caller-owned scoped credentials only. Never place a live token in a URL, repository, example, analytics event, or client-side page.",
  "recipes": [
    {"id":"apify-rest-sync","availability":"available_now","interface":"REST","method":"POST","endpoint":"https://api.apify.com/v2/acts/civicdataforge~civicdataforge-evidence-gateway/run-sync-get-dataset-items?timeout=120","openapi_url":"https://civicdataforge.pages.dev/openapi/evidence-gateway.openapi.json","authentication":"Authorization: Bearer $APIFY_TOKEN","example_body":{"task":"us_property_decision","subject":{"address":"100 Sample St, Sampleton, ZZ","city":"Sampleton","state":"ZZ"},"purpose":"property compliance research","retentionDays":0,"transactionGate":true},"required_controls":["bounded timeout","non-2xx remains unresolved","preserve decision state and receipt"]},
    {"id":"remote-mcp","availability":"available_now","interface":"MCP Streamable HTTP","endpoint":"https://civicdataforge.pages.dev/mcp","authentication":"X-Apify-Token: $APIFY_TOKEN","required_controls":["secret storage","preserve source/scope/retrieval/decision/receipt fields","do not convert no-match into clearance"]},
    {"id":"apify-run-webhook","availability":"available_now","interface":"HTTPS webhook","authentication":"shared secret configured by customer","required_controls":["verify secret","acknowledge quickly","queue processing","deduplicate by Actor run ID plus event type","support retried delivery"]},
    {"id":"dataset-export","availability":"available_now","interface":"Apify dataset export","endpoint_template":"https://api.apify.com/v2/datasets/$DATASET_ID/items?format=jsonl&clean=true","formats":["json","jsonl","csv","xml","xlsx","html","rss"],"required_controls":["named dataset for durable platform storage","customer retention policy","schema validation"]},
    {"id":"hospitable-connect-import","availability":"available_now_owner_authorized","interface":"Hospitable Connect","start_url":"https://civicdataforge.pages.dev/connect-host","authentication":"Owner authorizes access through Hospitable; no Hospitable credential is pasted into CivicDataForge","result":"Selected property addresses are transferred to the permit-audit intake for review before checkout","required_controls":["property-owner authorization","read-only property import","one supported jurisdiction per order","review selected addresses before purchase","no-match remains bounded to the selected publisher and scope"]},
    {"id":"hostex-read-only-import","availability":"available_now","interface":"Hostex Public API bridge","start_url":"https://civicdataforge.pages.dev/permit-audit","authentication":"Caller supplies a scoped read-only Hostex token in the password field; it is sent only to the CivicDataForge import endpoint over HTTPS and cleared from the page after the request","result":"Caller selects 1-25 returned property addresses and reviews the jurisdiction before checkout","required_controls":["read-only caller-owned token","never place token in URL or analytics","never persist or echo token","block credential forwarding across redirects","review selected addresses before purchase"]},
    {"id":"customer-specific-adapter","availability":"requires_scope_build_and_acceptance_test","interfaces":["SFTP","private API","platform-native app","customer system connector"],"required_controls":["source feasibility","rights review","transformation contract","retry and idempotency","downstream review path","acceptance test"]}
  ],
  "responsible_use": "A no-match, unavailable source, incomplete scope, timeout, or review candidate is not affirmative clearance."
}
