{
  "default": "deny",
  "routes": [
    {
      "method": "POST",
      "path": "/api/account/invitations/accept",
      "access": "public",
      "purpose": "Local public identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "PUT",
      "path": "/api/account/profile",
      "access": "member",
      "purpose": "Local member identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "POST",
      "path": "/api/account/reset/complete",
      "access": "public",
      "purpose": "Local public identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "POST",
      "path": "/api/account/reset/request",
      "access": "public",
      "purpose": "Local public identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "GET",
      "path": "/api/assets",
      "access": "owner",
      "purpose": "Existing asset_library; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/assets",
      "access": "owner",
      "purpose": "Existing upload_asset; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/assets/{asset_id}",
      "access": "owner",
      "purpose": "Existing private_asset; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/business/switch",
      "access": "member",
      "purpose": "Local member identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "POST",
      "path": "/api/businesses",
      "access": "owner",
      "purpose": "Local owner identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "GET",
      "path": "/api/calendar",
      "access": "owner",
      "purpose": "Existing calendar; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/calendar",
      "access": "owner",
      "purpose": "Existing create; preserve tenant and object checks inside the handler."
    },
    {
      "method": "PUT",
      "path": "/api/calendar/{booking_id}",
      "access": "owner",
      "purpose": "Existing edit; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/calendar/{booking_id}/history",
      "access": "owner",
      "purpose": "Existing history; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/calendar/{booking_id}/{action}",
      "access": "owner",
      "purpose": "Existing archive; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/catalogue",
      "access": "owner",
      "purpose": "Existing catalogue; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/catalogue",
      "access": "owner",
      "purpose": "Existing catalogue_create; preserve tenant and object checks inside the handler."
    },
    {
      "method": "PUT",
      "path": "/api/catalogue/{catalogue_id}",
      "access": "owner",
      "purpose": "Existing catalogue_edit; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/catalogue/{catalogue_id}/add-to-job",
      "access": "owner",
      "purpose": "Existing catalogue_add; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/catalogue/{catalogue_id}/history",
      "access": "owner",
      "purpose": "Existing catalogue_history; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/catalogue/{catalogue_id}/{action}",
      "access": "owner",
      "purpose": "Existing catalogue_archive; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/customer-reviews/completion-preview",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/customer-reviews/completions",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/customer-reviews/duplicates",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/customer-reviews/pairs",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/customer-reviews/pairs/{pair_id}/history",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/customer-reviews/transfer-preview",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/customer-reviews/transfers",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/customer-reviews/transfers/{tid}",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/customers",
      "access": "owner",
      "purpose": "Existing search; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/customers",
      "access": "owner",
      "purpose": "Existing create; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/customers/export",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/customers/{cid}/portal-access",
      "access": "owner",
      "purpose": "Local exact-customer portal or private saved document output; validate business, customer, lifecycle and version inside handler."
    },
    {
      "method": "GET",
      "path": "/api/customers/{cid}/portal-access/captures/{token_id}",
      "access": "owner",
      "purpose": "Local exact-customer portal or private saved document output; validate business, customer, lifecycle and version inside handler."
    },
    {
      "method": "POST",
      "path": "/api/customers/{cid}/portal-access/invite",
      "access": "owner",
      "purpose": "Local exact-customer portal or private saved document output; validate business, customer, lifecycle and version inside handler."
    },
    {
      "method": "PUT",
      "path": "/api/customers/{cid}/private-notes",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/customers/{cid}/record-state",
      "access": "owner"
    },
    {
      "method": "PUT",
      "path": "/api/customers/{customer_id}",
      "access": "owner",
      "purpose": "Existing edit; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/customers/{customer_id}/history",
      "access": "owner",
      "purpose": "Existing history; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/customers/{customer_id}/jobs",
      "access": "owner",
      "purpose": "Existing new_work; preserve tenant and object checks inside the handler."
    },
    {
      "method": "DELETE",
      "path": "/api/customers/{customer_id}/portal",
      "access": "owner",
      "purpose": "Existing revoke_portal; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/customers/{customer_id}/portal",
      "access": "owner",
      "purpose": "Existing issue_portal; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/demo",
      "access": "public",
      "purpose": "Existing demo; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/demo/resolve-host",
      "access": "public",
      "purpose": "Existing resolve_host; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/document-settings",
      "access": "owner",
      "purpose": "Local exact-customer portal or private saved document output; validate business, customer, lifecycle and version inside handler."
    },
    {
      "method": "PUT",
      "path": "/api/document-settings",
      "access": "owner",
      "purpose": "Local exact-customer portal or private saved document output; validate business, customer, lifecycle and version inside handler."
    },
    {
      "method": "GET",
      "path": "/api/documents/{kind}/{doc_id}",
      "access": "owner",
      "purpose": "Existing staff_document; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/documents/{kind}/{doc_id}/logo",
      "access": "owner",
      "purpose": "Existing document_logo; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/documents/{kind}/{doc_id}/pdf",
      "access": "owner",
      "purpose": "Local exact-customer portal or private saved document output; validate business, customer, lifecycle and version inside handler."
    },
    {
      "method": "GET",
      "path": "/api/domains",
      "access": "owner",
      "purpose": "Existing domains; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/domains",
      "access": "owner",
      "purpose": "Existing domain_add; preserve tenant and object checks inside the handler."
    },
    {
      "method": "DELETE",
      "path": "/api/domains/{hostname}",
      "access": "owner",
      "purpose": "Existing domain_remove; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/feedback",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/feedback/eligibility",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/feedback/requests",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/feedback/requests/{rid}",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/feedback/requests/{rid}/archive",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/feedback/requests/{rid}/capture",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/feedback/requests/{rid}/hide",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/feedback/requests/{rid}/preview",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/feedback/requests/{rid}/publish",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/feedback/requests/{rid}/reissue",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/feedback/requests/{rid}/revoke",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/feedback/{slug}/access",
      "access": "public"
    },
    {
      "method": "POST",
      "path": "/api/feedback/{slug}/consent",
      "access": "public"
    },
    {
      "method": "POST",
      "path": "/api/feedback/{slug}/submit",
      "access": "public"
    },
    {
      "method": "GET",
      "path": "/api/field/jobs",
      "access": "member",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/field/jobs/{job_id}",
      "access": "member",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/device-notes/{operation}/deliver",
      "access": "member",
      "purpose": "Typed private device note; exact current actor, membership, device, customer and job checked inside one locked transaction."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/device-notes/{operation}/inspect",
      "access": "member",
      "purpose": "Typed private device note; exact current actor, membership, device, customer and job checked inside one locked transaction."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/device-notes/{operation}/revise",
      "access": "member",
      "purpose": "Typed private device note; exact current actor, membership, device, customer and job checked inside one locked transaction."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/logs",
      "access": "member",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "PUT",
      "path": "/api/field/jobs/{job_id}/logs/{log_id}",
      "access": "member",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/field/jobs/{job_id}/logs/{log_id}/history",
      "access": "owner",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/logs/{log_id}/material",
      "access": "owner",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/logs/{log_id}/state/{action}",
      "access": "owner",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/note-access",
      "access": "member",
      "purpose": "Typed private device note; exact current actor, membership, device, customer and job checked inside one locked transaction."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/timers",
      "access": "member",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/timers/{timer_id}/convert",
      "access": "owner",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/timers/{timer_id}/discard",
      "access": "owner",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/timers/{timer_id}/events/{action}",
      "access": "member",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/field/jobs/{job_id}/timers/{timer_id}/history",
      "access": "owner",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/timers/{timer_id}/reviewed",
      "access": "owner",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/gallery",
      "access": "owner",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/gallery",
      "access": "owner",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/gallery/{project_id}",
      "access": "owner",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "PUT",
      "path": "/api/gallery/{project_id}",
      "access": "owner",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/gallery/{project_id}/history/{revision_id}",
      "access": "owner",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/gallery/{project_id}/history/{revision_id}/images/{image_id}",
      "access": "owner",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/gallery/{project_id}/preview",
      "access": "owner",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/gallery/{project_id}/preview/images/{image_id}",
      "access": "owner",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/gallery/{project_id}/publish",
      "access": "owner",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/gallery/{project_id}/restore-draft",
      "access": "owner",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/gallery/{project_id}/state/{action}",
      "access": "owner",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/health",
      "access": "public",
      "purpose": "Existing health; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/invitations",
      "access": "owner",
      "purpose": "Local owner identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "DELETE",
      "path": "/api/invitations/{invitation_id}",
      "access": "owner",
      "purpose": "Local owner identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "PUT",
      "path": "/api/invoices/{iid}",
      "access": "owner",
      "purpose": "Existing edit_invoice; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/invoices/{iid}/payments",
      "access": "owner",
      "purpose": "Existing payment; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/invoices/{iid}/payments/{pid}/correct",
      "access": "owner",
      "purpose": "Existing correct_payment; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/invoices/{iid}/schedule",
      "access": "owner",
      "purpose": "Existing save_schedule; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/invoices/{iid}/schedule/clear",
      "access": "owner",
      "purpose": "Existing clear_schedule; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/invoices/{iid}/schedule/{stage_id}/pdf",
      "access": "owner",
      "purpose": "Local exact-customer portal or private saved document output; validate business, customer, lifecycle and version inside handler."
    },
    {
      "method": "POST",
      "path": "/api/invoices/{iid}/schedule/{stage_id}/request",
      "access": "owner",
      "purpose": "Existing request_stage; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/invoices/{iid}/{action}",
      "access": "owner",
      "purpose": "Existing invoice_action; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/jobs",
      "access": "owner",
      "purpose": "Existing manual_enquiry; preserve tenant and object checks inside the handler."
    },
    {
      "method": "PUT",
      "path": "/api/jobs/{jid}/workflow",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/jobs/{jid}/workflow-history",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/jobs/{job_id}",
      "access": "owner",
      "purpose": "Existing job_detail; preserve tenant and object checks inside the handler."
    },
    {
      "method": "PUT",
      "path": "/api/jobs/{job_id}",
      "access": "owner",
      "purpose": "Existing edit_job; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/jobs/{job_id}/costs",
      "access": "owner",
      "purpose": "Existing costs; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/jobs/{job_id}/customer-link",
      "access": "owner",
      "purpose": "Existing link; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/jobs/{job_id}/customer-link-preview",
      "access": "owner",
      "purpose": "Existing preview; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/jobs/{job_id}/invoices",
      "access": "owner",
      "purpose": "Existing create_invoice; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/jobs/{job_id}/photos",
      "access": "member",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/jobs/{job_id}/photos",
      "access": "member",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "PUT",
      "path": "/api/jobs/{job_id}/photos/{photo_id}",
      "access": "member",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/jobs/{job_id}/photos/{photo_id}/history",
      "access": "owner",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/jobs/{job_id}/photos/{photo_id}/image",
      "access": "member",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/jobs/{job_id}/photos/{photo_id}/share",
      "access": "owner",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/jobs/{job_id}/photos/{photo_id}/state/{action}",
      "access": "owner",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/jobs/{job_id}/quotes",
      "access": "owner",
      "purpose": "Existing create_quote; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/jobs/{job_id}/staff-updates",
      "access": "owner",
      "purpose": "Local owner identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "GET",
      "path": "/api/jobs/{job_id}/suggestions",
      "access": "owner",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/jobs/{job_id}/suggestions/draft",
      "access": "owner",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/jobs/{job_id}/suggestions/history",
      "access": "owner",
      "purpose": "Private field work or owner-reviewed document sources; exact assignment/job/customer and retry checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/jobs/{job_id}/time",
      "access": "owner",
      "purpose": "Existing time_list; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/login",
      "access": "public",
      "purpose": "Existing login; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/logout",
      "access": "member",
      "purpose": "Existing logout; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/materials",
      "access": "owner",
      "purpose": "Existing materials; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/materials",
      "access": "owner",
      "purpose": "Existing create; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/materials/bulk-stage",
      "access": "owner",
      "purpose": "Existing bulk; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/materials/history-match",
      "access": "owner",
      "purpose": "Existing history; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/materials/import",
      "access": "owner",
      "purpose": "Existing import_csv; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/materials/order",
      "access": "owner",
      "purpose": "Existing supplier_order; preserve tenant and object checks inside the handler."
    },
    {
      "method": "PUT",
      "path": "/api/materials/{material_id}",
      "access": "owner",
      "purpose": "Existing edit; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/materials/{material_id}/{action}",
      "access": "owner",
      "purpose": "Existing archive_material; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/memberships",
      "access": "owner",
      "purpose": "Local owner identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "GET",
      "path": "/api/memberships/audit",
      "access": "owner",
      "purpose": "Local owner identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "PUT",
      "path": "/api/memberships/{membership_id}",
      "access": "owner",
      "purpose": "Local owner identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "GET",
      "path": "/api/opportunities",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/opportunities/{oid}",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/opportunities/{oid}/actions",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/opportunity-settings",
      "access": "owner"
    },
    {
      "method": "PUT",
      "path": "/api/opportunity-settings",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/password",
      "access": "member",
      "purpose": "Existing change_password; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/pipeline",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/portal/{slug}/access/complete",
      "access": "public",
      "purpose": "Local exact-customer portal or private saved document output; validate business, customer, lifecycle and version inside handler."
    },
    {
      "method": "POST",
      "path": "/api/portal/{slug}/access/login",
      "access": "public",
      "purpose": "Local exact-customer portal or private saved document output; validate business, customer, lifecycle and version inside handler."
    },
    {
      "method": "POST",
      "path": "/api/portal/{slug}/access/reset-request",
      "access": "public",
      "purpose": "Local exact-customer portal or private saved document output; validate business, customer, lifecycle and version inside handler."
    },
    {
      "method": "GET",
      "path": "/api/portal/{slug}/documents/{kind}/{doc_id}",
      "access": "portal",
      "purpose": "Existing portal_document; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/portal/{slug}/documents/{kind}/{doc_id}/logo",
      "access": "portal",
      "purpose": "Existing portal_document_logo; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/portal/{slug}/documents/{kind}/{doc_id}/pdf",
      "access": "portal",
      "purpose": "Local exact-customer portal or private saved document output; validate business, customer, lifecycle and version inside handler."
    },
    {
      "method": "GET",
      "path": "/api/portal/{slug}/feedback",
      "access": "portal"
    },
    {
      "method": "GET",
      "path": "/api/portal/{slug}/feedback/{rid}",
      "access": "portal"
    },
    {
      "method": "POST",
      "path": "/api/portal/{slug}/feedback/{rid}/consent",
      "access": "portal"
    },
    {
      "method": "POST",
      "path": "/api/portal/{slug}/feedback/{rid}/submit",
      "access": "portal"
    },
    {
      "method": "GET",
      "path": "/api/portal/{slug}/invoices/{iid}/schedule/{stage_id}/pdf",
      "access": "portal",
      "purpose": "Local exact-customer portal or private saved document output; validate business, customer, lifecycle and version inside handler."
    },
    {
      "method": "GET",
      "path": "/api/portal/{slug}/jobs/{job_id}/photos",
      "access": "portal",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/portal/{slug}/jobs/{job_id}/photos/{photo_id}/image",
      "access": "portal",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/portal/{slug}/login",
      "access": "public",
      "purpose": "Existing portal_login; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/portal/{slug}/logout",
      "access": "portal",
      "purpose": "Existing portal_logout; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/portal/{slug}/me",
      "access": "portal",
      "purpose": "Existing portal_home; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/portal/{slug}/quotes/{quote_id}/accept",
      "access": "portal",
      "purpose": "Existing portal_accept; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/portal/{slug}/quotes/{quote_id}/decline",
      "access": "portal",
      "purpose": "Local exact-customer portal or private saved document output; validate business, customer, lifecycle and version inside handler."
    },
    {
      "method": "GET",
      "path": "/api/public/{slug}",
      "access": "public",
      "purpose": "Existing public_site; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/public/{slug}/assets/{asset_id}",
      "access": "public",
      "purpose": "Existing public_asset; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/public/{slug}/enquiries",
      "access": "public",
      "purpose": "Existing public_enquiry; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/public/{slug}/pages/{path:path}",
      "access": "public",
      "purpose": "Existing public_page; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/public/{slug}/projects",
      "access": "public",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/public/{slug}/projects/{project_slug}",
      "access": "public",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/public/{slug}/projects/{project_slug}/images/{image_id}",
      "access": "public",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/public/{slug}/testimonials",
      "access": "public"
    },
    {
      "method": "PUT",
      "path": "/api/quotes/{qid}",
      "access": "owner",
      "purpose": "Existing edit_quote; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/quotes/{qid}/{action}",
      "access": "owner",
      "purpose": "Existing quote_action; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/recurring",
      "access": "owner",
      "purpose": "Owner-reviewed recurrence; exact business/job/customer and version checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/recurring",
      "access": "owner",
      "purpose": "Owner-reviewed recurrence; exact business/job/customer and version checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/recurring/{contract_id}",
      "access": "owner",
      "purpose": "Owner-reviewed recurrence; exact business/job/customer and version checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/recurring/{contract_id}/confirm",
      "access": "owner",
      "purpose": "Owner-reviewed recurrence; exact business/job/customer and version checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/recurring/{contract_id}/history",
      "access": "owner",
      "purpose": "Owner-reviewed recurrence; exact business/job/customer and version checks in handler."
    },
    {
      "method": "POST",
      "path": "/api/recurring/{contract_id}/preview",
      "access": "owner",
      "purpose": "Owner-reviewed recurrence; exact business/job/customer and version checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/recurring/{contract_id}/runs/{run_id}",
      "access": "owner",
      "purpose": "Owner-reviewed recurrence; exact business/job/customer and version checks in handler."
    },
    {
      "method": "GET",
      "path": "/api/reports/activity",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/reports/activity/export",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/reports/operations",
      "access": "owner"
    },
    {
      "method": "GET",
      "path": "/api/session",
      "access": "member",
      "purpose": "Existing current_session; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/setup",
      "access": "owner",
      "purpose": "Local owner identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "PUT",
      "path": "/api/setup",
      "access": "owner",
      "purpose": "Local owner identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "GET",
      "path": "/api/site",
      "access": "owner",
      "purpose": "Existing read_site; preserve tenant and object checks inside the handler."
    },
    {
      "method": "PUT",
      "path": "/api/site",
      "access": "owner",
      "purpose": "Existing save_site; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/site/publish",
      "access": "owner",
      "purpose": "Existing publish; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/site/restore",
      "access": "owner",
      "purpose": "Existing restore; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/staff/jobs/{job_id}/updates",
      "access": "staff",
      "purpose": "Local staff identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "GET",
      "path": "/api/staff/work",
      "access": "staff",
      "purpose": "Local staff identity/setup contract; exact membership and object checks remain in the handler."
    },
    {
      "method": "GET",
      "path": "/api/team",
      "access": "owner",
      "purpose": "Existing team; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/team",
      "access": "owner",
      "purpose": "Existing create_resource; preserve tenant and object checks inside the handler."
    },
    {
      "method": "PUT",
      "path": "/api/team/{resource_id}",
      "access": "owner",
      "purpose": "Existing edit_resource; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/team/{resource_id}/{action}",
      "access": "owner",
      "purpose": "Existing archive_resource; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/time",
      "access": "owner",
      "purpose": "Existing create_time; preserve tenant and object checks inside the handler."
    },
    {
      "method": "PUT",
      "path": "/api/time/{entry_id}",
      "access": "owner",
      "purpose": "Existing edit_time; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/time/{entry_id}/history",
      "access": "owner",
      "purpose": "Existing time_history; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/time/{entry_id}/{action}",
      "access": "owner",
      "purpose": "Existing archive_time; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/api/workspace",
      "access": "owner",
      "purpose": "Existing workspace; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/robots.txt",
      "access": "public",
      "purpose": "Existing robots; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/site/{slug}",
      "access": "public",
      "purpose": "Existing website_shell; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/site/{slug}/reviews/selected",
      "access": "public"
    },
    {
      "method": "GET",
      "path": "/site/{slug}/robots.txt",
      "access": "public",
      "purpose": "Existing site_robots; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/site/{slug}/sitemap.xml",
      "access": "public",
      "purpose": "Existing sitemap; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/site/{slug}/work/projects",
      "access": "public",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "GET",
      "path": "/site/{slug}/work/projects/{project_slug}",
      "access": "public",
      "purpose": "Private photo or reviewed gallery workflow; exact business, job, assignment and publication checks in handler."
    },
    {
      "method": "GET",
      "path": "/site/{slug}/{path:path}",
      "access": "public",
      "purpose": "Existing website_shell; preserve tenant and object checks inside the handler."
    },
    {
      "method": "GET",
      "path": "/{path:path}",
      "access": "public",
      "purpose": "Existing frontend; preserve tenant and object checks inside the handler."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/device-notes/{operation}/cancel",
      "access": "member",
      "purpose": "Scoped note cancellation or versioned saved-log correction; current access checked before terminal receipts."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/device-notes/{operation}/saved",
      "access": "member",
      "purpose": "Scoped note cancellation or versioned saved-log correction; current access checked before terminal receipts."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/device-notes/{operation}/apply-correction",
      "access": "member",
      "purpose": "Scoped note cancellation or versioned saved-log correction; current access checked before terminal receipts."
    },
    {
      "method": "POST",
      "path": "/api/field/jobs/{job_id}/device-notes/{operation}/resolve-correction",
      "access": "member",
      "purpose": "Scoped note cancellation or versioned saved-log correction; current access checked before terminal receipts."
    },
    {
      "method": "GET",
      "path": "/api/customer-reviews/merges/{tid}/correction",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/customer-reviews/merge-correction-preview",
      "access": "owner"
    },
    {
      "method": "POST",
      "path": "/api/customer-reviews/merge-corrections",
      "access": "owner"
    }
  ]
}
