2026-07-24 22:19:56,006 INFO app.connectors.servicetitan: ServiceTitan companies synced: 0 records merged
2026-07-24 22:19:56,007 INFO app.connectors.servicetitan: ServiceTitan jobs synced: 0 records merged
2026-07-24 22:19:56,008 ERROR app.connectors: Failed to write connector log
Traceback (most recent call last):
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1969, in _exec_single_context
    self.dialect.do_execute(
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
    cursor.execute(statement, parameters)
sqlite3.IntegrityError: FOREIGN KEY constraint failed

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/vincent/projects/command-sovereignty/app/connectors/__init__.py", line 171, in _log
    db.session.commit()
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/orm/scoping.py", line 597, in commit
    return self._proxied.commit()
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2034, in commit
    trans.commit(_to_root=True)
  File "<string>", line 2, in commit
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 137, in _go
    ret_value = fn(self, *arg, **kw)
                ^^^^^^^^^^^^^^^^^^^^
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1315, in commit
    self._prepare_impl()
  File "<string>", line 2, in _prepare_impl
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 137, in _go
    ret_value = fn(self, *arg, **kw)
                ^^^^^^^^^^^^^^^^^^^^
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1290, in _prepare_impl
    self.session.flush()
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 4352, in flush
    self._flush(objects)
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 4487, in _flush
    with util.safe_reraise():
         ^^^^^^^^^^^^^^^^^^^
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 122, in __exit__
    raise exc_value.with_traceback(exc_tb)
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 4448, in _flush
    flush_context.execute()
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py", line 465, in execute
    rec.execute(self)
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py", line 641, in execute
    util.preloaded.orm_persistence.save_obj(
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py", line 94, in save_obj
    _emit_insert_statements(
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py", line 1234, in _emit_insert_statements
    result = connection.execute(
             ^^^^^^^^^^^^^^^^^^^
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1421, in execute
    return meth(
           ^^^^^
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py", line 526, in _execute_on_connection
    return connection._execute_clauseelement(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1643, in _execute_clauseelement
    ret = self._execute_context(
          ^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1848, in _execute_context
    return self._exec_single_context(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1988, in _exec_single_context
    self._handle_dbapi_exception(
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 2365, in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1969, in _exec_single_context
    self.dialect.do_execute(
  File "/home/vincent/projects/command-sovereignty/.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) FOREIGN KEY constraint failed
[SQL: INSERT INTO connector_logs (id, company_id, connector_id, event_type, record_count, duration_ms, status, error_message, details_json, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]
[parameters: ('e668c9b6-1a74-4d37-8362-4d9fcdc5ecce', 'aeccd8f8-8a0f-462a-a7b3-2c14bd517b37', 'st-1', 'sync_complete', 1, 1, 'success', '', '{"contacts": 1, "companies": 0, "deals": 0}', '2026-07-25 02:19:56.007952')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-07-24 22:19:56,014 WARNING app: DB pre-flight check failed: (sqlite3.OperationalError) no such table: profiles
[SQL: SELECT COALESCE((SELECT count(*) FROM profiles), -1) as c]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
2026-07-24 22:19:56,014 INFO app.connectors: Registered connectors: ['servicetitan', 'sms', 'hubspot', 'quickbooks', 'google_ads', 'jobnimbus', 'slack', 'facebook_ads', 'generic_rest', 'angi', 'zapier', 'google_sheets', 'five9', 'leadperfection', 'marlimar', 'jobber']
2026-07-24 22:19:56,047 WARNING app.utils.csrf: CSRF audit: 136 unprotected state-changing route(s):
  /api/company/<company_id>/angi/leads/<lead_id> [PUT] → api_proxy.update_angi_lead
  /api/company/<company_id>/angi/leads/<lead_id>/respond [POST] → api_proxy.respond_to_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/accept [POST] → api_proxy.accept_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/reject [POST] → api_proxy.reject_lead_endpoint
  /api/company/<company_id>/angi/leads/sync [POST] → api_proxy.sync_angi_leads
  /api/company/<company_id>/quickbooks/accept-invoice/<invoice_id> [POST] → api_proxy.accept_quickbooks_invoice
  /api/company/<company_id>/quickbooks/sync [POST] → api_proxy.sync_quickbooks
  /api/company/<company_id>/google_ads/sync [POST] → api_proxy.sync_google_ads
  /api/company/<company_id>/facebook_ads/sync [POST] → api_proxy.sync_facebook_ads
  /api/company/<company_id>/slack/sync [POST] → api_proxy.sync_slack
  /api/company/<company_id>/slack/send-message [POST] → api_proxy.send_slack_message
  /api/auth/user [PUT] → auth_api.api_auth_update_user
  /api/auth/login [POST] → auth_api.api_auth_login
  /api/auth/signup [POST] → auth_api.api_auth_signup
  /api/auth/logout [POST] → auth_api.api_auth_logout
  /api/auth/invite [POST] → auth_api.api_auth_invite
  /api/auth/accept [POST] → auth_api.api_auth_accept
  /api/auth/change [POST] → auth_api.api_auth_change
  /api/user/settings [PUT] → auth_api.api_user_settings_put
  /api/user/company [PUT] → auth_api.api_user_company_put
  /api/user/company-settings [PUT] → auth_api.api_user_company_settings_put
  /api/auth/forgot-password [POST] → auth_api.api_auth_forgot_password
  /api/auth/reset-password [POST] → auth_api.api_auth_reset_password
  /api/security/2fa/setup [POST] → security_api.api_security_2fa_setup
  /api/security/2fa/enable [POST] → security_api.api_security_2fa_enable
  /api/security/2fa/disable [POST] → security_api.api_security_2fa_disable
  /api/security/api-keys [POST] → security_api.api_security_api_keys_create
  /api/security/api-keys/<key_id> [PUT] → security_api.api_security_api_keys_update
  /api/security/api-keys/<key_id> [DELETE] → security_api.api_security_api_keys_revoke
  /api/security/connected-accounts/<service>/disconnect [POST] → security_api.api_security_disconnect_account
  /api/security/sessions/<session_id>/revoke [POST] → security_api.api_security_revoke_session
  /api/security/sessions/revoke-other [POST] → security_api.api_security_revoke_other_sessions
  /api/super-admin/commissions/partnerships [POST] → admin_api.api_admin_commissions_create
  /api/super-admin/commissions/partnerships/<partnership_id> [PUT] → admin_api.api_admin_commissions_update
  /api/super-admin/commissions/records/<record_id>/approve [POST] → admin_api.api_admin_commissions_approve_record
  /api/super-admin/commissions/payouts [POST] → admin_api.api_admin_commissions_create_payout
  /api/super-admin/commissions/payouts/<payout_id> [PUT] → admin_api.api_admin_commissions_update_payout
  /api/super-admin/commissions/calculate [POST] → admin_api.api_admin_commissions_calculate
  /api/super-admin/organizations/<org_id> [DELETE] → admin_api.api_super_admin_delete_organization
  /api/super-admin/organizations [POST] → admin_api.api_super_admin_create_organization
  /api/partner/organizations [POST] → admin_api.api_partner_create_organization
  /api/leads/demo-request [POST] → admin_api.api_demo_request
  /api/super-admin/users [POST] → admin_api.api_super_admin_create_user
  /api/super-admin/users/<user_id> [DELETE] → admin_api.api_super_admin_delete_user
  /api/super-admin/users/<user_id>/role [PUT] → admin_api.api_super_admin_update_user_role
  /api/super-admin/users/<user_id>/company-role [PUT] → admin_api.api_super_admin_update_user_company_role
  /api/super-admin/users/<user_id> [PUT] → admin_api.api_super_admin_update_user
  /api/partner/team [POST] → admin_api.api_partner_team_add
  /api/partner/team/<int:user_id> [PUT] → admin_api.api_partner_team_update
  /api/partner/team/<int:user_id> [DELETE] → admin_api.api_partner_team_remove
  /api/company/<company_id>/revenue-leaks/detectors [PUT] → admin_api.update_leak_detectors
  /api/company/<company_id>/revenue-leaks [POST] → business_api.create_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [PUT] → business_api.update_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [DELETE] → business_api.delete_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id>/resolve [PATCH] → business_api.resolve_revenue_leak
  /api/company/<company_id>/revenue-leaks/scan [POST] → business_api.scan_revenue_leaks
  /api/company/<company_id>/revenue-leaks/<leak_id>/remediation [POST] → business_api.apply_leak_remediation
  /api/company/<company_id>/leak-settings/severity [PUT] → business_api.update_severity_rules_endpoint
  /api/company/<company_id>/leak-settings/alerts [PUT] → business_api.update_alert_settings
  /api/company/<company_id>/optimization-moves [POST] → business_api.create_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [PUT] → business_api.update_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [DELETE] → business_api.delete_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/accept [PATCH] → business_api.accept_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/reject [PATCH] → business_api.reject_optimization_move
  /api/company/<company_id>/forecasts [POST] → business_api.create_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [PUT] → business_api.update_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [DELETE] → business_api.delete_forecast
  /api/company/<company_id>/forecasts/sync [POST] → business_api.sync_forecasts
  /api/company/<company_id>/coaching-assignments [POST] → business_api.create_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [PUT] → business_api.update_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [DELETE] → business_api.delete_coaching_assignment
  /api/company/<company_id>/coaching-scorecards [POST] → business_api.create_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [PUT] → business_api.update_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [DELETE] → business_api.delete_coaching_scorecard
  /api/connectors [POST] → connectors.create_connector
  /api/connectors/<connector_id> [DELETE] → connectors.delete_connector
  /api/connectors/<connector_id> [PUT] → connectors.update_connector
  /api/connectors/<connector_id>/sync [POST] → connectors.trigger_sync
  /api/connectors/oauth/connected-sheets/select [POST] → connectors.oauth_select_spreadsheet
  /api/connectors/<connector_id>/refresh [POST] → connectors.refresh_connector
  /api/connectors/webhooks/<service> [POST] → connectors.webhook_receiver
  /api/connectors/webhooks/angi [POST] → connectors.angi_webhook
  /api/connectors/webhooks/zapier [POST] → connectors.zapier_webhook
  /api/analytics/goals [POST] → analytics.create_goal
  /api/analytics/goals/<goal_id> [PUT] → analytics.update_goal
  /api/analytics/goals/<goal_id> [DELETE] → analytics.delete_goal
  /api/analytics/goals/<goal_id>/progress [PUT] → analytics.update_goal_progress
  /api/analytics/goals/<goal_id>/metrics [POST] → analytics.create_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [PUT] → analytics.update_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [DELETE] → analytics.delete_goal_metric
  /api/analytics/locations/detector [POST] → analytics.location_detector_run
  /api/coaching/insights/<insight_id>/dismiss [POST] → coaching.dismiss_insight
  /api/billing/checkout-session [POST] → billing.create_checkout_session
  /api/billing/portal-session [POST] → billing.create_portal_session
  /api/enterprise/sso-config [POST] → enterprise.upsert_sso_config
  /api/enterprise/sso-config/acs [POST] → enterprise.saml_acs
  /api/enterprise/branding [PUT] → enterprise.update_branding
  /api/enterprise/branding/reset [POST] → enterprise.reset_branding
  /api/enterprise/branding/upload-logo [POST] → enterprise.upload_logo
  /api/portfolios/ [POST] → portfolios.create_portfolio
  /api/portfolios/<portfolio_id> [PUT] → portfolios.update_portfolio
  /api/portfolios/<portfolio_id> [DELETE] → portfolios.delete_portfolio
  /api/portfolios/<portfolio_id>/companies [POST] → portfolios.add_companies
  /api/portfolios/<portfolio_id>/companies [DELETE] → portfolios.remove_companies
  /api/email-campaigns/ [POST] → email_campaigns.create_campaign
  /api/email-campaigns/<campaign_id> [PUT] → email_campaigns.update_campaign
  /api/email-campaigns/<campaign_id>/send [POST] → email_campaigns.send_campaign
  /api/email-campaigns/<campaign_id> [DELETE] → email_campaigns.delete_campaign
  /api/email-campaigns/<campaign_id>/logs/<log_id> [PUT] → email_campaigns.update_log
  /connectors/sms/webhook/<connector_id>/sms [POST] → sms_webhooks.sms_webhook
  /connectors/sms/webhook/<connector_id>/call [POST] → sms_webhooks.call_webhook
  /api/sms/send [POST] → sms.send_sms
  /api/sms/call [POST] → sms.trigger_call
  /api/sms/calls/<call_id>/disposition [PUT] → sms.update_call_disposition
  /api/sms/opt-outs/<opt_out_id> [DELETE] → sms.remove_opt_out
  /api/sms/opt-outs [POST] → sms.add_opt_out
  /app/api/sms-call/send [POST] → sms_call.send
  /app/api/sms-call/outbound [POST] → sms_call.outbound
  /app/api/sms-call/call/<call_id>/disposition [PUT] → sms_call.disposition
  /api/super-admin/company/<company_id>/connectors/<connector_id>/sync [POST] → super_admin_proxy.proxy_connector_sync
  /api/super-admin/company/<company_id>/connectors/<connector_id>/refresh [POST] → super_admin_proxy.proxy_connector_refresh
  /api/super-admin/company/<company_id>/connectors/<connector_id>/disconnect [POST] → super_admin_proxy.proxy_connector_disconnect
  /api/super-admin/company/<company_id>/connectors [POST] → super_admin_proxy.proxy_create_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [PUT] → super_admin_proxy.proxy_update_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [DELETE] → super_admin_proxy.proxy_delete_connector
  /api/super-admin/company/<company_id>/billing/portal [POST] → super_admin_proxy.proxy_billing_portal
  /api/lead-gen/templates [POST] → lead_gen.create_template
  /api/lead-gen/templates/<template_id> [PUT] → lead_gen.update_template
  /api/lead-gen/templates/<template_id> [DELETE] → lead_gen.delete_template
  /api/company/<company_id>/lead-gen/creatives [POST] → lead_gen.create_creative
  /api/company/<company_id>/lead-gen/rules [POST] → lead_gen.create_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id> [PUT] → lead_gen.update_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id>/run [POST] → lead_gen.run_rule
  /api/company/<company_id>/lead-gen/attribution [POST] → lead_gen.create_attribution
  /api/company/<company_id>/lead-gen/attribution/<attribution_id> [PUT] → lead_gen.update_attribution
  /api/company/<company_id>/lead-gen/campaigns/generate [POST] → lead_gen.generate_campaign
2026-07-24 22:19:56,047 INFO app.scheduler: Scheduler disabled via DISABLE_SCHEDULER
2026-07-24 22:19:56,077 WARNING app: DB pre-flight check failed: (sqlite3.OperationalError) no such table: profiles
[SQL: SELECT COALESCE((SELECT count(*) FROM profiles), -1) as c]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
2026-07-24 22:19:56,077 INFO app.connectors: Registered connectors: ['servicetitan', 'sms', 'hubspot', 'quickbooks', 'google_ads', 'jobnimbus', 'slack', 'facebook_ads', 'generic_rest', 'angi', 'zapier', 'google_sheets', 'five9', 'leadperfection', 'marlimar', 'jobber']
2026-07-24 22:19:56,110 WARNING app.utils.csrf: CSRF audit: 136 unprotected state-changing route(s):
  /api/company/<company_id>/angi/leads/<lead_id> [PUT] → api_proxy.update_angi_lead
  /api/company/<company_id>/angi/leads/<lead_id>/respond [POST] → api_proxy.respond_to_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/accept [POST] → api_proxy.accept_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/reject [POST] → api_proxy.reject_lead_endpoint
  /api/company/<company_id>/angi/leads/sync [POST] → api_proxy.sync_angi_leads
  /api/company/<company_id>/quickbooks/accept-invoice/<invoice_id> [POST] → api_proxy.accept_quickbooks_invoice
  /api/company/<company_id>/quickbooks/sync [POST] → api_proxy.sync_quickbooks
  /api/company/<company_id>/google_ads/sync [POST] → api_proxy.sync_google_ads
  /api/company/<company_id>/facebook_ads/sync [POST] → api_proxy.sync_facebook_ads
  /api/company/<company_id>/slack/sync [POST] → api_proxy.sync_slack
  /api/company/<company_id>/slack/send-message [POST] → api_proxy.send_slack_message
  /api/auth/user [PUT] → auth_api.api_auth_update_user
  /api/auth/login [POST] → auth_api.api_auth_login
  /api/auth/signup [POST] → auth_api.api_auth_signup
  /api/auth/logout [POST] → auth_api.api_auth_logout
  /api/auth/invite [POST] → auth_api.api_auth_invite
  /api/auth/accept [POST] → auth_api.api_auth_accept
  /api/auth/change [POST] → auth_api.api_auth_change
  /api/user/settings [PUT] → auth_api.api_user_settings_put
  /api/user/company [PUT] → auth_api.api_user_company_put
  /api/user/company-settings [PUT] → auth_api.api_user_company_settings_put
  /api/auth/forgot-password [POST] → auth_api.api_auth_forgot_password
  /api/auth/reset-password [POST] → auth_api.api_auth_reset_password
  /api/security/2fa/setup [POST] → security_api.api_security_2fa_setup
  /api/security/2fa/enable [POST] → security_api.api_security_2fa_enable
  /api/security/2fa/disable [POST] → security_api.api_security_2fa_disable
  /api/security/api-keys [POST] → security_api.api_security_api_keys_create
  /api/security/api-keys/<key_id> [PUT] → security_api.api_security_api_keys_update
  /api/security/api-keys/<key_id> [DELETE] → security_api.api_security_api_keys_revoke
  /api/security/connected-accounts/<service>/disconnect [POST] → security_api.api_security_disconnect_account
  /api/security/sessions/<session_id>/revoke [POST] → security_api.api_security_revoke_session
  /api/security/sessions/revoke-other [POST] → security_api.api_security_revoke_other_sessions
  /api/super-admin/commissions/partnerships [POST] → admin_api.api_admin_commissions_create
  /api/super-admin/commissions/partnerships/<partnership_id> [PUT] → admin_api.api_admin_commissions_update
  /api/super-admin/commissions/records/<record_id>/approve [POST] → admin_api.api_admin_commissions_approve_record
  /api/super-admin/commissions/payouts [POST] → admin_api.api_admin_commissions_create_payout
  /api/super-admin/commissions/payouts/<payout_id> [PUT] → admin_api.api_admin_commissions_update_payout
  /api/super-admin/commissions/calculate [POST] → admin_api.api_admin_commissions_calculate
  /api/super-admin/organizations/<org_id> [DELETE] → admin_api.api_super_admin_delete_organization
  /api/super-admin/organizations [POST] → admin_api.api_super_admin_create_organization
  /api/partner/organizations [POST] → admin_api.api_partner_create_organization
  /api/leads/demo-request [POST] → admin_api.api_demo_request
  /api/super-admin/users [POST] → admin_api.api_super_admin_create_user
  /api/super-admin/users/<user_id> [DELETE] → admin_api.api_super_admin_delete_user
  /api/super-admin/users/<user_id>/role [PUT] → admin_api.api_super_admin_update_user_role
  /api/super-admin/users/<user_id>/company-role [PUT] → admin_api.api_super_admin_update_user_company_role
  /api/super-admin/users/<user_id> [PUT] → admin_api.api_super_admin_update_user
  /api/partner/team [POST] → admin_api.api_partner_team_add
  /api/partner/team/<int:user_id> [PUT] → admin_api.api_partner_team_update
  /api/partner/team/<int:user_id> [DELETE] → admin_api.api_partner_team_remove
  /api/company/<company_id>/revenue-leaks/detectors [PUT] → admin_api.update_leak_detectors
  /api/company/<company_id>/revenue-leaks [POST] → business_api.create_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [PUT] → business_api.update_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [DELETE] → business_api.delete_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id>/resolve [PATCH] → business_api.resolve_revenue_leak
  /api/company/<company_id>/revenue-leaks/scan [POST] → business_api.scan_revenue_leaks
  /api/company/<company_id>/revenue-leaks/<leak_id>/remediation [POST] → business_api.apply_leak_remediation
  /api/company/<company_id>/leak-settings/severity [PUT] → business_api.update_severity_rules_endpoint
  /api/company/<company_id>/leak-settings/alerts [PUT] → business_api.update_alert_settings
  /api/company/<company_id>/optimization-moves [POST] → business_api.create_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [PUT] → business_api.update_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [DELETE] → business_api.delete_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/accept [PATCH] → business_api.accept_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/reject [PATCH] → business_api.reject_optimization_move
  /api/company/<company_id>/forecasts [POST] → business_api.create_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [PUT] → business_api.update_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [DELETE] → business_api.delete_forecast
  /api/company/<company_id>/forecasts/sync [POST] → business_api.sync_forecasts
  /api/company/<company_id>/coaching-assignments [POST] → business_api.create_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [PUT] → business_api.update_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [DELETE] → business_api.delete_coaching_assignment
  /api/company/<company_id>/coaching-scorecards [POST] → business_api.create_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [PUT] → business_api.update_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [DELETE] → business_api.delete_coaching_scorecard
  /api/connectors [POST] → connectors.create_connector
  /api/connectors/<connector_id> [DELETE] → connectors.delete_connector
  /api/connectors/<connector_id> [PUT] → connectors.update_connector
  /api/connectors/<connector_id>/sync [POST] → connectors.trigger_sync
  /api/connectors/oauth/connected-sheets/select [POST] → connectors.oauth_select_spreadsheet
  /api/connectors/<connector_id>/refresh [POST] → connectors.refresh_connector
  /api/connectors/webhooks/<service> [POST] → connectors.webhook_receiver
  /api/connectors/webhooks/angi [POST] → connectors.angi_webhook
  /api/connectors/webhooks/zapier [POST] → connectors.zapier_webhook
  /api/analytics/goals [POST] → analytics.create_goal
  /api/analytics/goals/<goal_id> [PUT] → analytics.update_goal
  /api/analytics/goals/<goal_id> [DELETE] → analytics.delete_goal
  /api/analytics/goals/<goal_id>/progress [PUT] → analytics.update_goal_progress
  /api/analytics/goals/<goal_id>/metrics [POST] → analytics.create_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [PUT] → analytics.update_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [DELETE] → analytics.delete_goal_metric
  /api/analytics/locations/detector [POST] → analytics.location_detector_run
  /api/coaching/insights/<insight_id>/dismiss [POST] → coaching.dismiss_insight
  /api/billing/checkout-session [POST] → billing.create_checkout_session
  /api/billing/portal-session [POST] → billing.create_portal_session
  /api/enterprise/sso-config [POST] → enterprise.upsert_sso_config
  /api/enterprise/sso-config/acs [POST] → enterprise.saml_acs
  /api/enterprise/branding [PUT] → enterprise.update_branding
  /api/enterprise/branding/reset [POST] → enterprise.reset_branding
  /api/enterprise/branding/upload-logo [POST] → enterprise.upload_logo
  /api/portfolios/ [POST] → portfolios.create_portfolio
  /api/portfolios/<portfolio_id> [PUT] → portfolios.update_portfolio
  /api/portfolios/<portfolio_id> [DELETE] → portfolios.delete_portfolio
  /api/portfolios/<portfolio_id>/companies [POST] → portfolios.add_companies
  /api/portfolios/<portfolio_id>/companies [DELETE] → portfolios.remove_companies
  /api/email-campaigns/ [POST] → email_campaigns.create_campaign
  /api/email-campaigns/<campaign_id> [PUT] → email_campaigns.update_campaign
  /api/email-campaigns/<campaign_id>/send [POST] → email_campaigns.send_campaign
  /api/email-campaigns/<campaign_id> [DELETE] → email_campaigns.delete_campaign
  /api/email-campaigns/<campaign_id>/logs/<log_id> [PUT] → email_campaigns.update_log
  /connectors/sms/webhook/<connector_id>/sms [POST] → sms_webhooks.sms_webhook
  /connectors/sms/webhook/<connector_id>/call [POST] → sms_webhooks.call_webhook
  /api/sms/send [POST] → sms.send_sms
  /api/sms/call [POST] → sms.trigger_call
  /api/sms/calls/<call_id>/disposition [PUT] → sms.update_call_disposition
  /api/sms/opt-outs/<opt_out_id> [DELETE] → sms.remove_opt_out
  /api/sms/opt-outs [POST] → sms.add_opt_out
  /app/api/sms-call/send [POST] → sms_call.send
  /app/api/sms-call/outbound [POST] → sms_call.outbound
  /app/api/sms-call/call/<call_id>/disposition [PUT] → sms_call.disposition
  /api/super-admin/company/<company_id>/connectors/<connector_id>/sync [POST] → super_admin_proxy.proxy_connector_sync
  /api/super-admin/company/<company_id>/connectors/<connector_id>/refresh [POST] → super_admin_proxy.proxy_connector_refresh
  /api/super-admin/company/<company_id>/connectors/<connector_id>/disconnect [POST] → super_admin_proxy.proxy_connector_disconnect
  /api/super-admin/company/<company_id>/connectors [POST] → super_admin_proxy.proxy_create_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [PUT] → super_admin_proxy.proxy_update_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [DELETE] → super_admin_proxy.proxy_delete_connector
  /api/super-admin/company/<company_id>/billing/portal [POST] → super_admin_proxy.proxy_billing_portal
  /api/lead-gen/templates [POST] → lead_gen.create_template
  /api/lead-gen/templates/<template_id> [PUT] → lead_gen.update_template
  /api/lead-gen/templates/<template_id> [DELETE] → lead_gen.delete_template
  /api/company/<company_id>/lead-gen/creatives [POST] → lead_gen.create_creative
  /api/company/<company_id>/lead-gen/rules [POST] → lead_gen.create_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id> [PUT] → lead_gen.update_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id>/run [POST] → lead_gen.run_rule
  /api/company/<company_id>/lead-gen/attribution [POST] → lead_gen.create_attribution
  /api/company/<company_id>/lead-gen/attribution/<attribution_id> [PUT] → lead_gen.update_attribution
  /api/company/<company_id>/lead-gen/campaigns/generate [POST] → lead_gen.generate_campaign
2026-07-24 22:19:56,110 INFO app.scheduler: Scheduler disabled via DISABLE_SCHEDULER
2026-07-24 22:19:56,126 INFO app.connectors.sms: Lead status updated: test-lead-1 new → sms_sent
2026-07-24 22:19:56,144 WARNING app: DB pre-flight check failed: (sqlite3.OperationalError) no such table: profiles
[SQL: SELECT COALESCE((SELECT count(*) FROM profiles), -1) as c]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
2026-07-24 22:19:56,144 INFO app.connectors: Registered connectors: ['servicetitan', 'sms', 'hubspot', 'quickbooks', 'google_ads', 'jobnimbus', 'slack', 'facebook_ads', 'generic_rest', 'angi', 'zapier', 'google_sheets', 'five9', 'leadperfection', 'marlimar', 'jobber']
2026-07-24 22:19:56,177 WARNING app.utils.csrf: CSRF audit: 136 unprotected state-changing route(s):
  /api/company/<company_id>/angi/leads/<lead_id> [PUT] → api_proxy.update_angi_lead
  /api/company/<company_id>/angi/leads/<lead_id>/respond [POST] → api_proxy.respond_to_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/accept [POST] → api_proxy.accept_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/reject [POST] → api_proxy.reject_lead_endpoint
  /api/company/<company_id>/angi/leads/sync [POST] → api_proxy.sync_angi_leads
  /api/company/<company_id>/quickbooks/accept-invoice/<invoice_id> [POST] → api_proxy.accept_quickbooks_invoice
  /api/company/<company_id>/quickbooks/sync [POST] → api_proxy.sync_quickbooks
  /api/company/<company_id>/google_ads/sync [POST] → api_proxy.sync_google_ads
  /api/company/<company_id>/facebook_ads/sync [POST] → api_proxy.sync_facebook_ads
  /api/company/<company_id>/slack/sync [POST] → api_proxy.sync_slack
  /api/company/<company_id>/slack/send-message [POST] → api_proxy.send_slack_message
  /api/auth/user [PUT] → auth_api.api_auth_update_user
  /api/auth/login [POST] → auth_api.api_auth_login
  /api/auth/signup [POST] → auth_api.api_auth_signup
  /api/auth/logout [POST] → auth_api.api_auth_logout
  /api/auth/invite [POST] → auth_api.api_auth_invite
  /api/auth/accept [POST] → auth_api.api_auth_accept
  /api/auth/change [POST] → auth_api.api_auth_change
  /api/user/settings [PUT] → auth_api.api_user_settings_put
  /api/user/company [PUT] → auth_api.api_user_company_put
  /api/user/company-settings [PUT] → auth_api.api_user_company_settings_put
  /api/auth/forgot-password [POST] → auth_api.api_auth_forgot_password
  /api/auth/reset-password [POST] → auth_api.api_auth_reset_password
  /api/security/2fa/setup [POST] → security_api.api_security_2fa_setup
  /api/security/2fa/enable [POST] → security_api.api_security_2fa_enable
  /api/security/2fa/disable [POST] → security_api.api_security_2fa_disable
  /api/security/api-keys [POST] → security_api.api_security_api_keys_create
  /api/security/api-keys/<key_id> [PUT] → security_api.api_security_api_keys_update
  /api/security/api-keys/<key_id> [DELETE] → security_api.api_security_api_keys_revoke
  /api/security/connected-accounts/<service>/disconnect [POST] → security_api.api_security_disconnect_account
  /api/security/sessions/<session_id>/revoke [POST] → security_api.api_security_revoke_session
  /api/security/sessions/revoke-other [POST] → security_api.api_security_revoke_other_sessions
  /api/super-admin/commissions/partnerships [POST] → admin_api.api_admin_commissions_create
  /api/super-admin/commissions/partnerships/<partnership_id> [PUT] → admin_api.api_admin_commissions_update
  /api/super-admin/commissions/records/<record_id>/approve [POST] → admin_api.api_admin_commissions_approve_record
  /api/super-admin/commissions/payouts [POST] → admin_api.api_admin_commissions_create_payout
  /api/super-admin/commissions/payouts/<payout_id> [PUT] → admin_api.api_admin_commissions_update_payout
  /api/super-admin/commissions/calculate [POST] → admin_api.api_admin_commissions_calculate
  /api/super-admin/organizations/<org_id> [DELETE] → admin_api.api_super_admin_delete_organization
  /api/super-admin/organizations [POST] → admin_api.api_super_admin_create_organization
  /api/partner/organizations [POST] → admin_api.api_partner_create_organization
  /api/leads/demo-request [POST] → admin_api.api_demo_request
  /api/super-admin/users [POST] → admin_api.api_super_admin_create_user
  /api/super-admin/users/<user_id> [DELETE] → admin_api.api_super_admin_delete_user
  /api/super-admin/users/<user_id>/role [PUT] → admin_api.api_super_admin_update_user_role
  /api/super-admin/users/<user_id>/company-role [PUT] → admin_api.api_super_admin_update_user_company_role
  /api/super-admin/users/<user_id> [PUT] → admin_api.api_super_admin_update_user
  /api/partner/team [POST] → admin_api.api_partner_team_add
  /api/partner/team/<int:user_id> [PUT] → admin_api.api_partner_team_update
  /api/partner/team/<int:user_id> [DELETE] → admin_api.api_partner_team_remove
  /api/company/<company_id>/revenue-leaks/detectors [PUT] → admin_api.update_leak_detectors
  /api/company/<company_id>/revenue-leaks [POST] → business_api.create_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [PUT] → business_api.update_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [DELETE] → business_api.delete_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id>/resolve [PATCH] → business_api.resolve_revenue_leak
  /api/company/<company_id>/revenue-leaks/scan [POST] → business_api.scan_revenue_leaks
  /api/company/<company_id>/revenue-leaks/<leak_id>/remediation [POST] → business_api.apply_leak_remediation
  /api/company/<company_id>/leak-settings/severity [PUT] → business_api.update_severity_rules_endpoint
  /api/company/<company_id>/leak-settings/alerts [PUT] → business_api.update_alert_settings
  /api/company/<company_id>/optimization-moves [POST] → business_api.create_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [PUT] → business_api.update_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [DELETE] → business_api.delete_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/accept [PATCH] → business_api.accept_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/reject [PATCH] → business_api.reject_optimization_move
  /api/company/<company_id>/forecasts [POST] → business_api.create_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [PUT] → business_api.update_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [DELETE] → business_api.delete_forecast
  /api/company/<company_id>/forecasts/sync [POST] → business_api.sync_forecasts
  /api/company/<company_id>/coaching-assignments [POST] → business_api.create_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [PUT] → business_api.update_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [DELETE] → business_api.delete_coaching_assignment
  /api/company/<company_id>/coaching-scorecards [POST] → business_api.create_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [PUT] → business_api.update_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [DELETE] → business_api.delete_coaching_scorecard
  /api/connectors [POST] → connectors.create_connector
  /api/connectors/<connector_id> [DELETE] → connectors.delete_connector
  /api/connectors/<connector_id> [PUT] → connectors.update_connector
  /api/connectors/<connector_id>/sync [POST] → connectors.trigger_sync
  /api/connectors/oauth/connected-sheets/select [POST] → connectors.oauth_select_spreadsheet
  /api/connectors/<connector_id>/refresh [POST] → connectors.refresh_connector
  /api/connectors/webhooks/<service> [POST] → connectors.webhook_receiver
  /api/connectors/webhooks/angi [POST] → connectors.angi_webhook
  /api/connectors/webhooks/zapier [POST] → connectors.zapier_webhook
  /api/analytics/goals [POST] → analytics.create_goal
  /api/analytics/goals/<goal_id> [PUT] → analytics.update_goal
  /api/analytics/goals/<goal_id> [DELETE] → analytics.delete_goal
  /api/analytics/goals/<goal_id>/progress [PUT] → analytics.update_goal_progress
  /api/analytics/goals/<goal_id>/metrics [POST] → analytics.create_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [PUT] → analytics.update_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [DELETE] → analytics.delete_goal_metric
  /api/analytics/locations/detector [POST] → analytics.location_detector_run
  /api/coaching/insights/<insight_id>/dismiss [POST] → coaching.dismiss_insight
  /api/billing/checkout-session [POST] → billing.create_checkout_session
  /api/billing/portal-session [POST] → billing.create_portal_session
  /api/enterprise/sso-config [POST] → enterprise.upsert_sso_config
  /api/enterprise/sso-config/acs [POST] → enterprise.saml_acs
  /api/enterprise/branding [PUT] → enterprise.update_branding
  /api/enterprise/branding/reset [POST] → enterprise.reset_branding
  /api/enterprise/branding/upload-logo [POST] → enterprise.upload_logo
  /api/portfolios/ [POST] → portfolios.create_portfolio
  /api/portfolios/<portfolio_id> [PUT] → portfolios.update_portfolio
  /api/portfolios/<portfolio_id> [DELETE] → portfolios.delete_portfolio
  /api/portfolios/<portfolio_id>/companies [POST] → portfolios.add_companies
  /api/portfolios/<portfolio_id>/companies [DELETE] → portfolios.remove_companies
  /api/email-campaigns/ [POST] → email_campaigns.create_campaign
  /api/email-campaigns/<campaign_id> [PUT] → email_campaigns.update_campaign
  /api/email-campaigns/<campaign_id>/send [POST] → email_campaigns.send_campaign
  /api/email-campaigns/<campaign_id> [DELETE] → email_campaigns.delete_campaign
  /api/email-campaigns/<campaign_id>/logs/<log_id> [PUT] → email_campaigns.update_log
  /connectors/sms/webhook/<connector_id>/sms [POST] → sms_webhooks.sms_webhook
  /connectors/sms/webhook/<connector_id>/call [POST] → sms_webhooks.call_webhook
  /api/sms/send [POST] → sms.send_sms
  /api/sms/call [POST] → sms.trigger_call
  /api/sms/calls/<call_id>/disposition [PUT] → sms.update_call_disposition
  /api/sms/opt-outs/<opt_out_id> [DELETE] → sms.remove_opt_out
  /api/sms/opt-outs [POST] → sms.add_opt_out
  /app/api/sms-call/send [POST] → sms_call.send
  /app/api/sms-call/outbound [POST] → sms_call.outbound
  /app/api/sms-call/call/<call_id>/disposition [PUT] → sms_call.disposition
  /api/super-admin/company/<company_id>/connectors/<connector_id>/sync [POST] → super_admin_proxy.proxy_connector_sync
  /api/super-admin/company/<company_id>/connectors/<connector_id>/refresh [POST] → super_admin_proxy.proxy_connector_refresh
  /api/super-admin/company/<company_id>/connectors/<connector_id>/disconnect [POST] → super_admin_proxy.proxy_connector_disconnect
  /api/super-admin/company/<company_id>/connectors [POST] → super_admin_proxy.proxy_create_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [PUT] → super_admin_proxy.proxy_update_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [DELETE] → super_admin_proxy.proxy_delete_connector
  /api/super-admin/company/<company_id>/billing/portal [POST] → super_admin_proxy.proxy_billing_portal
  /api/lead-gen/templates [POST] → lead_gen.create_template
  /api/lead-gen/templates/<template_id> [PUT] → lead_gen.update_template
  /api/lead-gen/templates/<template_id> [DELETE] → lead_gen.delete_template
  /api/company/<company_id>/lead-gen/creatives [POST] → lead_gen.create_creative
  /api/company/<company_id>/lead-gen/rules [POST] → lead_gen.create_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id> [PUT] → lead_gen.update_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id>/run [POST] → lead_gen.run_rule
  /api/company/<company_id>/lead-gen/attribution [POST] → lead_gen.create_attribution
  /api/company/<company_id>/lead-gen/attribution/<attribution_id> [PUT] → lead_gen.update_attribution
  /api/company/<company_id>/lead-gen/campaigns/generate [POST] → lead_gen.generate_campaign
2026-07-24 22:19:56,177 INFO app.scheduler: Scheduler disabled via DISABLE_SCHEDULER
2026-07-24 22:19:56,193 INFO app.connectors.sms: Lead status updated: test-lead-1 new → call_attempted
2026-07-24 22:19:56,213 WARNING app: DB pre-flight check failed: (sqlite3.OperationalError) no such table: profiles
[SQL: SELECT COALESCE((SELECT count(*) FROM profiles), -1) as c]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
2026-07-24 22:19:56,213 INFO app.connectors: Registered connectors: ['servicetitan', 'sms', 'hubspot', 'quickbooks', 'google_ads', 'jobnimbus', 'slack', 'facebook_ads', 'generic_rest', 'angi', 'zapier', 'google_sheets', 'five9', 'leadperfection', 'marlimar', 'jobber']
2026-07-24 22:19:56,245 WARNING app.utils.csrf: CSRF audit: 136 unprotected state-changing route(s):
  /api/company/<company_id>/angi/leads/<lead_id> [PUT] → api_proxy.update_angi_lead
  /api/company/<company_id>/angi/leads/<lead_id>/respond [POST] → api_proxy.respond_to_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/accept [POST] → api_proxy.accept_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/reject [POST] → api_proxy.reject_lead_endpoint
  /api/company/<company_id>/angi/leads/sync [POST] → api_proxy.sync_angi_leads
  /api/company/<company_id>/quickbooks/accept-invoice/<invoice_id> [POST] → api_proxy.accept_quickbooks_invoice
  /api/company/<company_id>/quickbooks/sync [POST] → api_proxy.sync_quickbooks
  /api/company/<company_id>/google_ads/sync [POST] → api_proxy.sync_google_ads
  /api/company/<company_id>/facebook_ads/sync [POST] → api_proxy.sync_facebook_ads
  /api/company/<company_id>/slack/sync [POST] → api_proxy.sync_slack
  /api/company/<company_id>/slack/send-message [POST] → api_proxy.send_slack_message
  /api/auth/user [PUT] → auth_api.api_auth_update_user
  /api/auth/login [POST] → auth_api.api_auth_login
  /api/auth/signup [POST] → auth_api.api_auth_signup
  /api/auth/logout [POST] → auth_api.api_auth_logout
  /api/auth/invite [POST] → auth_api.api_auth_invite
  /api/auth/accept [POST] → auth_api.api_auth_accept
  /api/auth/change [POST] → auth_api.api_auth_change
  /api/user/settings [PUT] → auth_api.api_user_settings_put
  /api/user/company [PUT] → auth_api.api_user_company_put
  /api/user/company-settings [PUT] → auth_api.api_user_company_settings_put
  /api/auth/forgot-password [POST] → auth_api.api_auth_forgot_password
  /api/auth/reset-password [POST] → auth_api.api_auth_reset_password
  /api/security/2fa/setup [POST] → security_api.api_security_2fa_setup
  /api/security/2fa/enable [POST] → security_api.api_security_2fa_enable
  /api/security/2fa/disable [POST] → security_api.api_security_2fa_disable
  /api/security/api-keys [POST] → security_api.api_security_api_keys_create
  /api/security/api-keys/<key_id> [PUT] → security_api.api_security_api_keys_update
  /api/security/api-keys/<key_id> [DELETE] → security_api.api_security_api_keys_revoke
  /api/security/connected-accounts/<service>/disconnect [POST] → security_api.api_security_disconnect_account
  /api/security/sessions/<session_id>/revoke [POST] → security_api.api_security_revoke_session
  /api/security/sessions/revoke-other [POST] → security_api.api_security_revoke_other_sessions
  /api/super-admin/commissions/partnerships [POST] → admin_api.api_admin_commissions_create
  /api/super-admin/commissions/partnerships/<partnership_id> [PUT] → admin_api.api_admin_commissions_update
  /api/super-admin/commissions/records/<record_id>/approve [POST] → admin_api.api_admin_commissions_approve_record
  /api/super-admin/commissions/payouts [POST] → admin_api.api_admin_commissions_create_payout
  /api/super-admin/commissions/payouts/<payout_id> [PUT] → admin_api.api_admin_commissions_update_payout
  /api/super-admin/commissions/calculate [POST] → admin_api.api_admin_commissions_calculate
  /api/super-admin/organizations/<org_id> [DELETE] → admin_api.api_super_admin_delete_organization
  /api/super-admin/organizations [POST] → admin_api.api_super_admin_create_organization
  /api/partner/organizations [POST] → admin_api.api_partner_create_organization
  /api/leads/demo-request [POST] → admin_api.api_demo_request
  /api/super-admin/users [POST] → admin_api.api_super_admin_create_user
  /api/super-admin/users/<user_id> [DELETE] → admin_api.api_super_admin_delete_user
  /api/super-admin/users/<user_id>/role [PUT] → admin_api.api_super_admin_update_user_role
  /api/super-admin/users/<user_id>/company-role [PUT] → admin_api.api_super_admin_update_user_company_role
  /api/super-admin/users/<user_id> [PUT] → admin_api.api_super_admin_update_user
  /api/partner/team [POST] → admin_api.api_partner_team_add
  /api/partner/team/<int:user_id> [PUT] → admin_api.api_partner_team_update
  /api/partner/team/<int:user_id> [DELETE] → admin_api.api_partner_team_remove
  /api/company/<company_id>/revenue-leaks/detectors [PUT] → admin_api.update_leak_detectors
  /api/company/<company_id>/revenue-leaks [POST] → business_api.create_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [PUT] → business_api.update_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [DELETE] → business_api.delete_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id>/resolve [PATCH] → business_api.resolve_revenue_leak
  /api/company/<company_id>/revenue-leaks/scan [POST] → business_api.scan_revenue_leaks
  /api/company/<company_id>/revenue-leaks/<leak_id>/remediation [POST] → business_api.apply_leak_remediation
  /api/company/<company_id>/leak-settings/severity [PUT] → business_api.update_severity_rules_endpoint
  /api/company/<company_id>/leak-settings/alerts [PUT] → business_api.update_alert_settings
  /api/company/<company_id>/optimization-moves [POST] → business_api.create_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [PUT] → business_api.update_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [DELETE] → business_api.delete_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/accept [PATCH] → business_api.accept_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/reject [PATCH] → business_api.reject_optimization_move
  /api/company/<company_id>/forecasts [POST] → business_api.create_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [PUT] → business_api.update_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [DELETE] → business_api.delete_forecast
  /api/company/<company_id>/forecasts/sync [POST] → business_api.sync_forecasts
  /api/company/<company_id>/coaching-assignments [POST] → business_api.create_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [PUT] → business_api.update_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [DELETE] → business_api.delete_coaching_assignment
  /api/company/<company_id>/coaching-scorecards [POST] → business_api.create_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [PUT] → business_api.update_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [DELETE] → business_api.delete_coaching_scorecard
  /api/connectors [POST] → connectors.create_connector
  /api/connectors/<connector_id> [DELETE] → connectors.delete_connector
  /api/connectors/<connector_id> [PUT] → connectors.update_connector
  /api/connectors/<connector_id>/sync [POST] → connectors.trigger_sync
  /api/connectors/oauth/connected-sheets/select [POST] → connectors.oauth_select_spreadsheet
  /api/connectors/<connector_id>/refresh [POST] → connectors.refresh_connector
  /api/connectors/webhooks/<service> [POST] → connectors.webhook_receiver
  /api/connectors/webhooks/angi [POST] → connectors.angi_webhook
  /api/connectors/webhooks/zapier [POST] → connectors.zapier_webhook
  /api/analytics/goals [POST] → analytics.create_goal
  /api/analytics/goals/<goal_id> [PUT] → analytics.update_goal
  /api/analytics/goals/<goal_id> [DELETE] → analytics.delete_goal
  /api/analytics/goals/<goal_id>/progress [PUT] → analytics.update_goal_progress
  /api/analytics/goals/<goal_id>/metrics [POST] → analytics.create_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [PUT] → analytics.update_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [DELETE] → analytics.delete_goal_metric
  /api/analytics/locations/detector [POST] → analytics.location_detector_run
  /api/coaching/insights/<insight_id>/dismiss [POST] → coaching.dismiss_insight
  /api/billing/checkout-session [POST] → billing.create_checkout_session
  /api/billing/portal-session [POST] → billing.create_portal_session
  /api/enterprise/sso-config [POST] → enterprise.upsert_sso_config
  /api/enterprise/sso-config/acs [POST] → enterprise.saml_acs
  /api/enterprise/branding [PUT] → enterprise.update_branding
  /api/enterprise/branding/reset [POST] → enterprise.reset_branding
  /api/enterprise/branding/upload-logo [POST] → enterprise.upload_logo
  /api/portfolios/ [POST] → portfolios.create_portfolio
  /api/portfolios/<portfolio_id> [PUT] → portfolios.update_portfolio
  /api/portfolios/<portfolio_id> [DELETE] → portfolios.delete_portfolio
  /api/portfolios/<portfolio_id>/companies [POST] → portfolios.add_companies
  /api/portfolios/<portfolio_id>/companies [DELETE] → portfolios.remove_companies
  /api/email-campaigns/ [POST] → email_campaigns.create_campaign
  /api/email-campaigns/<campaign_id> [PUT] → email_campaigns.update_campaign
  /api/email-campaigns/<campaign_id>/send [POST] → email_campaigns.send_campaign
  /api/email-campaigns/<campaign_id> [DELETE] → email_campaigns.delete_campaign
  /api/email-campaigns/<campaign_id>/logs/<log_id> [PUT] → email_campaigns.update_log
  /connectors/sms/webhook/<connector_id>/sms [POST] → sms_webhooks.sms_webhook
  /connectors/sms/webhook/<connector_id>/call [POST] → sms_webhooks.call_webhook
  /api/sms/send [POST] → sms.send_sms
  /api/sms/call [POST] → sms.trigger_call
  /api/sms/calls/<call_id>/disposition [PUT] → sms.update_call_disposition
  /api/sms/opt-outs/<opt_out_id> [DELETE] → sms.remove_opt_out
  /api/sms/opt-outs [POST] → sms.add_opt_out
  /app/api/sms-call/send [POST] → sms_call.send
  /app/api/sms-call/outbound [POST] → sms_call.outbound
  /app/api/sms-call/call/<call_id>/disposition [PUT] → sms_call.disposition
  /api/super-admin/company/<company_id>/connectors/<connector_id>/sync [POST] → super_admin_proxy.proxy_connector_sync
  /api/super-admin/company/<company_id>/connectors/<connector_id>/refresh [POST] → super_admin_proxy.proxy_connector_refresh
  /api/super-admin/company/<company_id>/connectors/<connector_id>/disconnect [POST] → super_admin_proxy.proxy_connector_disconnect
  /api/super-admin/company/<company_id>/connectors [POST] → super_admin_proxy.proxy_create_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [PUT] → super_admin_proxy.proxy_update_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [DELETE] → super_admin_proxy.proxy_delete_connector
  /api/super-admin/company/<company_id>/billing/portal [POST] → super_admin_proxy.proxy_billing_portal
  /api/lead-gen/templates [POST] → lead_gen.create_template
  /api/lead-gen/templates/<template_id> [PUT] → lead_gen.update_template
  /api/lead-gen/templates/<template_id> [DELETE] → lead_gen.delete_template
  /api/company/<company_id>/lead-gen/creatives [POST] → lead_gen.create_creative
  /api/company/<company_id>/lead-gen/rules [POST] → lead_gen.create_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id> [PUT] → lead_gen.update_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id>/run [POST] → lead_gen.run_rule
  /api/company/<company_id>/lead-gen/attribution [POST] → lead_gen.create_attribution
  /api/company/<company_id>/lead-gen/attribution/<attribution_id> [PUT] → lead_gen.update_attribution
  /api/company/<company_id>/lead-gen/campaigns/generate [POST] → lead_gen.generate_campaign
2026-07-24 22:19:56,246 INFO app.scheduler: Scheduler disabled via DISABLE_SCHEDULER
2026-07-24 22:19:56,262 INFO app.connectors.sms: Lead status updated: test-lead-1 new → replied
2026-07-24 22:19:56,279 WARNING app: DB pre-flight check failed: (sqlite3.OperationalError) no such table: profiles
[SQL: SELECT COALESCE((SELECT count(*) FROM profiles), -1) as c]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
2026-07-24 22:19:56,279 INFO app.connectors: Registered connectors: ['servicetitan', 'sms', 'hubspot', 'quickbooks', 'google_ads', 'jobnimbus', 'slack', 'facebook_ads', 'generic_rest', 'angi', 'zapier', 'google_sheets', 'five9', 'leadperfection', 'marlimar', 'jobber']
2026-07-24 22:19:56,492 WARNING app.utils.csrf: CSRF audit: 136 unprotected state-changing route(s):
  /api/company/<company_id>/angi/leads/<lead_id> [PUT] → api_proxy.update_angi_lead
  /api/company/<company_id>/angi/leads/<lead_id>/respond [POST] → api_proxy.respond_to_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/accept [POST] → api_proxy.accept_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/reject [POST] → api_proxy.reject_lead_endpoint
  /api/company/<company_id>/angi/leads/sync [POST] → api_proxy.sync_angi_leads
  /api/company/<company_id>/quickbooks/accept-invoice/<invoice_id> [POST] → api_proxy.accept_quickbooks_invoice
  /api/company/<company_id>/quickbooks/sync [POST] → api_proxy.sync_quickbooks
  /api/company/<company_id>/google_ads/sync [POST] → api_proxy.sync_google_ads
  /api/company/<company_id>/facebook_ads/sync [POST] → api_proxy.sync_facebook_ads
  /api/company/<company_id>/slack/sync [POST] → api_proxy.sync_slack
  /api/company/<company_id>/slack/send-message [POST] → api_proxy.send_slack_message
  /api/auth/user [PUT] → auth_api.api_auth_update_user
  /api/auth/login [POST] → auth_api.api_auth_login
  /api/auth/signup [POST] → auth_api.api_auth_signup
  /api/auth/logout [POST] → auth_api.api_auth_logout
  /api/auth/invite [POST] → auth_api.api_auth_invite
  /api/auth/accept [POST] → auth_api.api_auth_accept
  /api/auth/change [POST] → auth_api.api_auth_change
  /api/user/settings [PUT] → auth_api.api_user_settings_put
  /api/user/company [PUT] → auth_api.api_user_company_put
  /api/user/company-settings [PUT] → auth_api.api_user_company_settings_put
  /api/auth/forgot-password [POST] → auth_api.api_auth_forgot_password
  /api/auth/reset-password [POST] → auth_api.api_auth_reset_password
  /api/security/2fa/setup [POST] → security_api.api_security_2fa_setup
  /api/security/2fa/enable [POST] → security_api.api_security_2fa_enable
  /api/security/2fa/disable [POST] → security_api.api_security_2fa_disable
  /api/security/api-keys [POST] → security_api.api_security_api_keys_create
  /api/security/api-keys/<key_id> [PUT] → security_api.api_security_api_keys_update
  /api/security/api-keys/<key_id> [DELETE] → security_api.api_security_api_keys_revoke
  /api/security/connected-accounts/<service>/disconnect [POST] → security_api.api_security_disconnect_account
  /api/security/sessions/<session_id>/revoke [POST] → security_api.api_security_revoke_session
  /api/security/sessions/revoke-other [POST] → security_api.api_security_revoke_other_sessions
  /api/super-admin/commissions/partnerships [POST] → admin_api.api_admin_commissions_create
  /api/super-admin/commissions/partnerships/<partnership_id> [PUT] → admin_api.api_admin_commissions_update
  /api/super-admin/commissions/records/<record_id>/approve [POST] → admin_api.api_admin_commissions_approve_record
  /api/super-admin/commissions/payouts [POST] → admin_api.api_admin_commissions_create_payout
  /api/super-admin/commissions/payouts/<payout_id> [PUT] → admin_api.api_admin_commissions_update_payout
  /api/super-admin/commissions/calculate [POST] → admin_api.api_admin_commissions_calculate
  /api/super-admin/organizations/<org_id> [DELETE] → admin_api.api_super_admin_delete_organization
  /api/super-admin/organizations [POST] → admin_api.api_super_admin_create_organization
  /api/partner/organizations [POST] → admin_api.api_partner_create_organization
  /api/leads/demo-request [POST] → admin_api.api_demo_request
  /api/super-admin/users [POST] → admin_api.api_super_admin_create_user
  /api/super-admin/users/<user_id> [DELETE] → admin_api.api_super_admin_delete_user
  /api/super-admin/users/<user_id>/role [PUT] → admin_api.api_super_admin_update_user_role
  /api/super-admin/users/<user_id>/company-role [PUT] → admin_api.api_super_admin_update_user_company_role
  /api/super-admin/users/<user_id> [PUT] → admin_api.api_super_admin_update_user
  /api/partner/team [POST] → admin_api.api_partner_team_add
  /api/partner/team/<int:user_id> [PUT] → admin_api.api_partner_team_update
  /api/partner/team/<int:user_id> [DELETE] → admin_api.api_partner_team_remove
  /api/company/<company_id>/revenue-leaks/detectors [PUT] → admin_api.update_leak_detectors
  /api/company/<company_id>/revenue-leaks [POST] → business_api.create_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [PUT] → business_api.update_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [DELETE] → business_api.delete_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id>/resolve [PATCH] → business_api.resolve_revenue_leak
  /api/company/<company_id>/revenue-leaks/scan [POST] → business_api.scan_revenue_leaks
  /api/company/<company_id>/revenue-leaks/<leak_id>/remediation [POST] → business_api.apply_leak_remediation
  /api/company/<company_id>/leak-settings/severity [PUT] → business_api.update_severity_rules_endpoint
  /api/company/<company_id>/leak-settings/alerts [PUT] → business_api.update_alert_settings
  /api/company/<company_id>/optimization-moves [POST] → business_api.create_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [PUT] → business_api.update_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [DELETE] → business_api.delete_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/accept [PATCH] → business_api.accept_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/reject [PATCH] → business_api.reject_optimization_move
  /api/company/<company_id>/forecasts [POST] → business_api.create_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [PUT] → business_api.update_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [DELETE] → business_api.delete_forecast
  /api/company/<company_id>/forecasts/sync [POST] → business_api.sync_forecasts
  /api/company/<company_id>/coaching-assignments [POST] → business_api.create_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [PUT] → business_api.update_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [DELETE] → business_api.delete_coaching_assignment
  /api/company/<company_id>/coaching-scorecards [POST] → business_api.create_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [PUT] → business_api.update_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [DELETE] → business_api.delete_coaching_scorecard
  /api/connectors [POST] → connectors.create_connector
  /api/connectors/<connector_id> [DELETE] → connectors.delete_connector
  /api/connectors/<connector_id> [PUT] → connectors.update_connector
  /api/connectors/<connector_id>/sync [POST] → connectors.trigger_sync
  /api/connectors/oauth/connected-sheets/select [POST] → connectors.oauth_select_spreadsheet
  /api/connectors/<connector_id>/refresh [POST] → connectors.refresh_connector
  /api/connectors/webhooks/<service> [POST] → connectors.webhook_receiver
  /api/connectors/webhooks/angi [POST] → connectors.angi_webhook
  /api/connectors/webhooks/zapier [POST] → connectors.zapier_webhook
  /api/analytics/goals [POST] → analytics.create_goal
  /api/analytics/goals/<goal_id> [PUT] → analytics.update_goal
  /api/analytics/goals/<goal_id> [DELETE] → analytics.delete_goal
  /api/analytics/goals/<goal_id>/progress [PUT] → analytics.update_goal_progress
  /api/analytics/goals/<goal_id>/metrics [POST] → analytics.create_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [PUT] → analytics.update_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [DELETE] → analytics.delete_goal_metric
  /api/analytics/locations/detector [POST] → analytics.location_detector_run
  /api/coaching/insights/<insight_id>/dismiss [POST] → coaching.dismiss_insight
  /api/billing/checkout-session [POST] → billing.create_checkout_session
  /api/billing/portal-session [POST] → billing.create_portal_session
  /api/enterprise/sso-config [POST] → enterprise.upsert_sso_config
  /api/enterprise/sso-config/acs [POST] → enterprise.saml_acs
  /api/enterprise/branding [PUT] → enterprise.update_branding
  /api/enterprise/branding/reset [POST] → enterprise.reset_branding
  /api/enterprise/branding/upload-logo [POST] → enterprise.upload_logo
  /api/portfolios/ [POST] → portfolios.create_portfolio
  /api/portfolios/<portfolio_id> [PUT] → portfolios.update_portfolio
  /api/portfolios/<portfolio_id> [DELETE] → portfolios.delete_portfolio
  /api/portfolios/<portfolio_id>/companies [POST] → portfolios.add_companies
  /api/portfolios/<portfolio_id>/companies [DELETE] → portfolios.remove_companies
  /api/email-campaigns/ [POST] → email_campaigns.create_campaign
  /api/email-campaigns/<campaign_id> [PUT] → email_campaigns.update_campaign
  /api/email-campaigns/<campaign_id>/send [POST] → email_campaigns.send_campaign
  /api/email-campaigns/<campaign_id> [DELETE] → email_campaigns.delete_campaign
  /api/email-campaigns/<campaign_id>/logs/<log_id> [PUT] → email_campaigns.update_log
  /connectors/sms/webhook/<connector_id>/sms [POST] → sms_webhooks.sms_webhook
  /connectors/sms/webhook/<connector_id>/call [POST] → sms_webhooks.call_webhook
  /api/sms/send [POST] → sms.send_sms
  /api/sms/call [POST] → sms.trigger_call
  /api/sms/calls/<call_id>/disposition [PUT] → sms.update_call_disposition
  /api/sms/opt-outs/<opt_out_id> [DELETE] → sms.remove_opt_out
  /api/sms/opt-outs [POST] → sms.add_opt_out
  /app/api/sms-call/send [POST] → sms_call.send
  /app/api/sms-call/outbound [POST] → sms_call.outbound
  /app/api/sms-call/call/<call_id>/disposition [PUT] → sms_call.disposition
  /api/super-admin/company/<company_id>/connectors/<connector_id>/sync [POST] → super_admin_proxy.proxy_connector_sync
  /api/super-admin/company/<company_id>/connectors/<connector_id>/refresh [POST] → super_admin_proxy.proxy_connector_refresh
  /api/super-admin/company/<company_id>/connectors/<connector_id>/disconnect [POST] → super_admin_proxy.proxy_connector_disconnect
  /api/super-admin/company/<company_id>/connectors [POST] → super_admin_proxy.proxy_create_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [PUT] → super_admin_proxy.proxy_update_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [DELETE] → super_admin_proxy.proxy_delete_connector
  /api/super-admin/company/<company_id>/billing/portal [POST] → super_admin_proxy.proxy_billing_portal
  /api/lead-gen/templates [POST] → lead_gen.create_template
  /api/lead-gen/templates/<template_id> [PUT] → lead_gen.update_template
  /api/lead-gen/templates/<template_id> [DELETE] → lead_gen.delete_template
  /api/company/<company_id>/lead-gen/creatives [POST] → lead_gen.create_creative
  /api/company/<company_id>/lead-gen/rules [POST] → lead_gen.create_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id> [PUT] → lead_gen.update_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id>/run [POST] → lead_gen.run_rule
  /api/company/<company_id>/lead-gen/attribution [POST] → lead_gen.create_attribution
  /api/company/<company_id>/lead-gen/attribution/<attribution_id> [PUT] → lead_gen.update_attribution
  /api/company/<company_id>/lead-gen/campaigns/generate [POST] → lead_gen.generate_campaign
2026-07-24 22:19:56,493 INFO app.scheduler: Scheduler disabled via DISABLE_SCHEDULER
2026-07-24 22:19:56,510 INFO app.connectors.sms: Opt-out recorded: +15551234567 (company=test-company-1)
2026-07-24 22:19:56,512 INFO app.connectors.sms: Lead status updated: test-lead-1 new → opted_out
2026-07-24 22:19:56,530 WARNING app: DB pre-flight check failed: (sqlite3.OperationalError) no such table: profiles
[SQL: SELECT COALESCE((SELECT count(*) FROM profiles), -1) as c]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
2026-07-24 22:19:56,530 INFO app.connectors: Registered connectors: ['servicetitan', 'sms', 'hubspot', 'quickbooks', 'google_ads', 'jobnimbus', 'slack', 'facebook_ads', 'generic_rest', 'angi', 'zapier', 'google_sheets', 'five9', 'leadperfection', 'marlimar', 'jobber']
2026-07-24 22:19:56,562 WARNING app.utils.csrf: CSRF audit: 136 unprotected state-changing route(s):
  /api/company/<company_id>/angi/leads/<lead_id> [PUT] → api_proxy.update_angi_lead
  /api/company/<company_id>/angi/leads/<lead_id>/respond [POST] → api_proxy.respond_to_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/accept [POST] → api_proxy.accept_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/reject [POST] → api_proxy.reject_lead_endpoint
  /api/company/<company_id>/angi/leads/sync [POST] → api_proxy.sync_angi_leads
  /api/company/<company_id>/quickbooks/accept-invoice/<invoice_id> [POST] → api_proxy.accept_quickbooks_invoice
  /api/company/<company_id>/quickbooks/sync [POST] → api_proxy.sync_quickbooks
  /api/company/<company_id>/google_ads/sync [POST] → api_proxy.sync_google_ads
  /api/company/<company_id>/facebook_ads/sync [POST] → api_proxy.sync_facebook_ads
  /api/company/<company_id>/slack/sync [POST] → api_proxy.sync_slack
  /api/company/<company_id>/slack/send-message [POST] → api_proxy.send_slack_message
  /api/auth/user [PUT] → auth_api.api_auth_update_user
  /api/auth/login [POST] → auth_api.api_auth_login
  /api/auth/signup [POST] → auth_api.api_auth_signup
  /api/auth/logout [POST] → auth_api.api_auth_logout
  /api/auth/invite [POST] → auth_api.api_auth_invite
  /api/auth/accept [POST] → auth_api.api_auth_accept
  /api/auth/change [POST] → auth_api.api_auth_change
  /api/user/settings [PUT] → auth_api.api_user_settings_put
  /api/user/company [PUT] → auth_api.api_user_company_put
  /api/user/company-settings [PUT] → auth_api.api_user_company_settings_put
  /api/auth/forgot-password [POST] → auth_api.api_auth_forgot_password
  /api/auth/reset-password [POST] → auth_api.api_auth_reset_password
  /api/security/2fa/setup [POST] → security_api.api_security_2fa_setup
  /api/security/2fa/enable [POST] → security_api.api_security_2fa_enable
  /api/security/2fa/disable [POST] → security_api.api_security_2fa_disable
  /api/security/api-keys [POST] → security_api.api_security_api_keys_create
  /api/security/api-keys/<key_id> [PUT] → security_api.api_security_api_keys_update
  /api/security/api-keys/<key_id> [DELETE] → security_api.api_security_api_keys_revoke
  /api/security/connected-accounts/<service>/disconnect [POST] → security_api.api_security_disconnect_account
  /api/security/sessions/<session_id>/revoke [POST] → security_api.api_security_revoke_session
  /api/security/sessions/revoke-other [POST] → security_api.api_security_revoke_other_sessions
  /api/super-admin/commissions/partnerships [POST] → admin_api.api_admin_commissions_create
  /api/super-admin/commissions/partnerships/<partnership_id> [PUT] → admin_api.api_admin_commissions_update
  /api/super-admin/commissions/records/<record_id>/approve [POST] → admin_api.api_admin_commissions_approve_record
  /api/super-admin/commissions/payouts [POST] → admin_api.api_admin_commissions_create_payout
  /api/super-admin/commissions/payouts/<payout_id> [PUT] → admin_api.api_admin_commissions_update_payout
  /api/super-admin/commissions/calculate [POST] → admin_api.api_admin_commissions_calculate
  /api/super-admin/organizations/<org_id> [DELETE] → admin_api.api_super_admin_delete_organization
  /api/super-admin/organizations [POST] → admin_api.api_super_admin_create_organization
  /api/partner/organizations [POST] → admin_api.api_partner_create_organization
  /api/leads/demo-request [POST] → admin_api.api_demo_request
  /api/super-admin/users [POST] → admin_api.api_super_admin_create_user
  /api/super-admin/users/<user_id> [DELETE] → admin_api.api_super_admin_delete_user
  /api/super-admin/users/<user_id>/role [PUT] → admin_api.api_super_admin_update_user_role
  /api/super-admin/users/<user_id>/company-role [PUT] → admin_api.api_super_admin_update_user_company_role
  /api/super-admin/users/<user_id> [PUT] → admin_api.api_super_admin_update_user
  /api/partner/team [POST] → admin_api.api_partner_team_add
  /api/partner/team/<int:user_id> [PUT] → admin_api.api_partner_team_update
  /api/partner/team/<int:user_id> [DELETE] → admin_api.api_partner_team_remove
  /api/company/<company_id>/revenue-leaks/detectors [PUT] → admin_api.update_leak_detectors
  /api/company/<company_id>/revenue-leaks [POST] → business_api.create_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [PUT] → business_api.update_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [DELETE] → business_api.delete_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id>/resolve [PATCH] → business_api.resolve_revenue_leak
  /api/company/<company_id>/revenue-leaks/scan [POST] → business_api.scan_revenue_leaks
  /api/company/<company_id>/revenue-leaks/<leak_id>/remediation [POST] → business_api.apply_leak_remediation
  /api/company/<company_id>/leak-settings/severity [PUT] → business_api.update_severity_rules_endpoint
  /api/company/<company_id>/leak-settings/alerts [PUT] → business_api.update_alert_settings
  /api/company/<company_id>/optimization-moves [POST] → business_api.create_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [PUT] → business_api.update_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [DELETE] → business_api.delete_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/accept [PATCH] → business_api.accept_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/reject [PATCH] → business_api.reject_optimization_move
  /api/company/<company_id>/forecasts [POST] → business_api.create_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [PUT] → business_api.update_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [DELETE] → business_api.delete_forecast
  /api/company/<company_id>/forecasts/sync [POST] → business_api.sync_forecasts
  /api/company/<company_id>/coaching-assignments [POST] → business_api.create_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [PUT] → business_api.update_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [DELETE] → business_api.delete_coaching_assignment
  /api/company/<company_id>/coaching-scorecards [POST] → business_api.create_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [PUT] → business_api.update_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [DELETE] → business_api.delete_coaching_scorecard
  /api/connectors [POST] → connectors.create_connector
  /api/connectors/<connector_id> [DELETE] → connectors.delete_connector
  /api/connectors/<connector_id> [PUT] → connectors.update_connector
  /api/connectors/<connector_id>/sync [POST] → connectors.trigger_sync
  /api/connectors/oauth/connected-sheets/select [POST] → connectors.oauth_select_spreadsheet
  /api/connectors/<connector_id>/refresh [POST] → connectors.refresh_connector
  /api/connectors/webhooks/<service> [POST] → connectors.webhook_receiver
  /api/connectors/webhooks/angi [POST] → connectors.angi_webhook
  /api/connectors/webhooks/zapier [POST] → connectors.zapier_webhook
  /api/analytics/goals [POST] → analytics.create_goal
  /api/analytics/goals/<goal_id> [PUT] → analytics.update_goal
  /api/analytics/goals/<goal_id> [DELETE] → analytics.delete_goal
  /api/analytics/goals/<goal_id>/progress [PUT] → analytics.update_goal_progress
  /api/analytics/goals/<goal_id>/metrics [POST] → analytics.create_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [PUT] → analytics.update_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [DELETE] → analytics.delete_goal_metric
  /api/analytics/locations/detector [POST] → analytics.location_detector_run
  /api/coaching/insights/<insight_id>/dismiss [POST] → coaching.dismiss_insight
  /api/billing/checkout-session [POST] → billing.create_checkout_session
  /api/billing/portal-session [POST] → billing.create_portal_session
  /api/enterprise/sso-config [POST] → enterprise.upsert_sso_config
  /api/enterprise/sso-config/acs [POST] → enterprise.saml_acs
  /api/enterprise/branding [PUT] → enterprise.update_branding
  /api/enterprise/branding/reset [POST] → enterprise.reset_branding
  /api/enterprise/branding/upload-logo [POST] → enterprise.upload_logo
  /api/portfolios/ [POST] → portfolios.create_portfolio
  /api/portfolios/<portfolio_id> [PUT] → portfolios.update_portfolio
  /api/portfolios/<portfolio_id> [DELETE] → portfolios.delete_portfolio
  /api/portfolios/<portfolio_id>/companies [POST] → portfolios.add_companies
  /api/portfolios/<portfolio_id>/companies [DELETE] → portfolios.remove_companies
  /api/email-campaigns/ [POST] → email_campaigns.create_campaign
  /api/email-campaigns/<campaign_id> [PUT] → email_campaigns.update_campaign
  /api/email-campaigns/<campaign_id>/send [POST] → email_campaigns.send_campaign
  /api/email-campaigns/<campaign_id> [DELETE] → email_campaigns.delete_campaign
  /api/email-campaigns/<campaign_id>/logs/<log_id> [PUT] → email_campaigns.update_log
  /connectors/sms/webhook/<connector_id>/sms [POST] → sms_webhooks.sms_webhook
  /connectors/sms/webhook/<connector_id>/call [POST] → sms_webhooks.call_webhook
  /api/sms/send [POST] → sms.send_sms
  /api/sms/call [POST] → sms.trigger_call
  /api/sms/calls/<call_id>/disposition [PUT] → sms.update_call_disposition
  /api/sms/opt-outs/<opt_out_id> [DELETE] → sms.remove_opt_out
  /api/sms/opt-outs [POST] → sms.add_opt_out
  /app/api/sms-call/send [POST] → sms_call.send
  /app/api/sms-call/outbound [POST] → sms_call.outbound
  /app/api/sms-call/call/<call_id>/disposition [PUT] → sms_call.disposition
  /api/super-admin/company/<company_id>/connectors/<connector_id>/sync [POST] → super_admin_proxy.proxy_connector_sync
  /api/super-admin/company/<company_id>/connectors/<connector_id>/refresh [POST] → super_admin_proxy.proxy_connector_refresh
  /api/super-admin/company/<company_id>/connectors/<connector_id>/disconnect [POST] → super_admin_proxy.proxy_connector_disconnect
  /api/super-admin/company/<company_id>/connectors [POST] → super_admin_proxy.proxy_create_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [PUT] → super_admin_proxy.proxy_update_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [DELETE] → super_admin_proxy.proxy_delete_connector
  /api/super-admin/company/<company_id>/billing/portal [POST] → super_admin_proxy.proxy_billing_portal
  /api/lead-gen/templates [POST] → lead_gen.create_template
  /api/lead-gen/templates/<template_id> [PUT] → lead_gen.update_template
  /api/lead-gen/templates/<template_id> [DELETE] → lead_gen.delete_template
  /api/company/<company_id>/lead-gen/creatives [POST] → lead_gen.create_creative
  /api/company/<company_id>/lead-gen/rules [POST] → lead_gen.create_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id> [PUT] → lead_gen.update_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id>/run [POST] → lead_gen.run_rule
  /api/company/<company_id>/lead-gen/attribution [POST] → lead_gen.create_attribution
  /api/company/<company_id>/lead-gen/attribution/<attribution_id> [PUT] → lead_gen.update_attribution
  /api/company/<company_id>/lead-gen/campaigns/generate [POST] → lead_gen.generate_campaign
2026-07-24 22:19:56,563 INFO app.scheduler: Scheduler disabled via DISABLE_SCHEDULER
2026-07-24 22:19:56,594 WARNING app: DB pre-flight check failed: (sqlite3.OperationalError) no such table: profiles
[SQL: SELECT COALESCE((SELECT count(*) FROM profiles), -1) as c]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
2026-07-24 22:19:56,594 INFO app.connectors: Registered connectors: ['servicetitan', 'sms', 'hubspot', 'quickbooks', 'google_ads', 'jobnimbus', 'slack', 'facebook_ads', 'generic_rest', 'angi', 'zapier', 'google_sheets', 'five9', 'leadperfection', 'marlimar', 'jobber']
2026-07-24 22:19:56,626 WARNING app.utils.csrf: CSRF audit: 136 unprotected state-changing route(s):
  /api/company/<company_id>/angi/leads/<lead_id> [PUT] → api_proxy.update_angi_lead
  /api/company/<company_id>/angi/leads/<lead_id>/respond [POST] → api_proxy.respond_to_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/accept [POST] → api_proxy.accept_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/reject [POST] → api_proxy.reject_lead_endpoint
  /api/company/<company_id>/angi/leads/sync [POST] → api_proxy.sync_angi_leads
  /api/company/<company_id>/quickbooks/accept-invoice/<invoice_id> [POST] → api_proxy.accept_quickbooks_invoice
  /api/company/<company_id>/quickbooks/sync [POST] → api_proxy.sync_quickbooks
  /api/company/<company_id>/google_ads/sync [POST] → api_proxy.sync_google_ads
  /api/company/<company_id>/facebook_ads/sync [POST] → api_proxy.sync_facebook_ads
  /api/company/<company_id>/slack/sync [POST] → api_proxy.sync_slack
  /api/company/<company_id>/slack/send-message [POST] → api_proxy.send_slack_message
  /api/auth/user [PUT] → auth_api.api_auth_update_user
  /api/auth/login [POST] → auth_api.api_auth_login
  /api/auth/signup [POST] → auth_api.api_auth_signup
  /api/auth/logout [POST] → auth_api.api_auth_logout
  /api/auth/invite [POST] → auth_api.api_auth_invite
  /api/auth/accept [POST] → auth_api.api_auth_accept
  /api/auth/change [POST] → auth_api.api_auth_change
  /api/user/settings [PUT] → auth_api.api_user_settings_put
  /api/user/company [PUT] → auth_api.api_user_company_put
  /api/user/company-settings [PUT] → auth_api.api_user_company_settings_put
  /api/auth/forgot-password [POST] → auth_api.api_auth_forgot_password
  /api/auth/reset-password [POST] → auth_api.api_auth_reset_password
  /api/security/2fa/setup [POST] → security_api.api_security_2fa_setup
  /api/security/2fa/enable [POST] → security_api.api_security_2fa_enable
  /api/security/2fa/disable [POST] → security_api.api_security_2fa_disable
  /api/security/api-keys [POST] → security_api.api_security_api_keys_create
  /api/security/api-keys/<key_id> [PUT] → security_api.api_security_api_keys_update
  /api/security/api-keys/<key_id> [DELETE] → security_api.api_security_api_keys_revoke
  /api/security/connected-accounts/<service>/disconnect [POST] → security_api.api_security_disconnect_account
  /api/security/sessions/<session_id>/revoke [POST] → security_api.api_security_revoke_session
  /api/security/sessions/revoke-other [POST] → security_api.api_security_revoke_other_sessions
  /api/super-admin/commissions/partnerships [POST] → admin_api.api_admin_commissions_create
  /api/super-admin/commissions/partnerships/<partnership_id> [PUT] → admin_api.api_admin_commissions_update
  /api/super-admin/commissions/records/<record_id>/approve [POST] → admin_api.api_admin_commissions_approve_record
  /api/super-admin/commissions/payouts [POST] → admin_api.api_admin_commissions_create_payout
  /api/super-admin/commissions/payouts/<payout_id> [PUT] → admin_api.api_admin_commissions_update_payout
  /api/super-admin/commissions/calculate [POST] → admin_api.api_admin_commissions_calculate
  /api/super-admin/organizations/<org_id> [DELETE] → admin_api.api_super_admin_delete_organization
  /api/super-admin/organizations [POST] → admin_api.api_super_admin_create_organization
  /api/partner/organizations [POST] → admin_api.api_partner_create_organization
  /api/leads/demo-request [POST] → admin_api.api_demo_request
  /api/super-admin/users [POST] → admin_api.api_super_admin_create_user
  /api/super-admin/users/<user_id> [DELETE] → admin_api.api_super_admin_delete_user
  /api/super-admin/users/<user_id>/role [PUT] → admin_api.api_super_admin_update_user_role
  /api/super-admin/users/<user_id>/company-role [PUT] → admin_api.api_super_admin_update_user_company_role
  /api/super-admin/users/<user_id> [PUT] → admin_api.api_super_admin_update_user
  /api/partner/team [POST] → admin_api.api_partner_team_add
  /api/partner/team/<int:user_id> [PUT] → admin_api.api_partner_team_update
  /api/partner/team/<int:user_id> [DELETE] → admin_api.api_partner_team_remove
  /api/company/<company_id>/revenue-leaks/detectors [PUT] → admin_api.update_leak_detectors
  /api/company/<company_id>/revenue-leaks [POST] → business_api.create_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [PUT] → business_api.update_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [DELETE] → business_api.delete_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id>/resolve [PATCH] → business_api.resolve_revenue_leak
  /api/company/<company_id>/revenue-leaks/scan [POST] → business_api.scan_revenue_leaks
  /api/company/<company_id>/revenue-leaks/<leak_id>/remediation [POST] → business_api.apply_leak_remediation
  /api/company/<company_id>/leak-settings/severity [PUT] → business_api.update_severity_rules_endpoint
  /api/company/<company_id>/leak-settings/alerts [PUT] → business_api.update_alert_settings
  /api/company/<company_id>/optimization-moves [POST] → business_api.create_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [PUT] → business_api.update_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [DELETE] → business_api.delete_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/accept [PATCH] → business_api.accept_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/reject [PATCH] → business_api.reject_optimization_move
  /api/company/<company_id>/forecasts [POST] → business_api.create_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [PUT] → business_api.update_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [DELETE] → business_api.delete_forecast
  /api/company/<company_id>/forecasts/sync [POST] → business_api.sync_forecasts
  /api/company/<company_id>/coaching-assignments [POST] → business_api.create_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [PUT] → business_api.update_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [DELETE] → business_api.delete_coaching_assignment
  /api/company/<company_id>/coaching-scorecards [POST] → business_api.create_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [PUT] → business_api.update_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [DELETE] → business_api.delete_coaching_scorecard
  /api/connectors [POST] → connectors.create_connector
  /api/connectors/<connector_id> [DELETE] → connectors.delete_connector
  /api/connectors/<connector_id> [PUT] → connectors.update_connector
  /api/connectors/<connector_id>/sync [POST] → connectors.trigger_sync
  /api/connectors/oauth/connected-sheets/select [POST] → connectors.oauth_select_spreadsheet
  /api/connectors/<connector_id>/refresh [POST] → connectors.refresh_connector
  /api/connectors/webhooks/<service> [POST] → connectors.webhook_receiver
  /api/connectors/webhooks/angi [POST] → connectors.angi_webhook
  /api/connectors/webhooks/zapier [POST] → connectors.zapier_webhook
  /api/analytics/goals [POST] → analytics.create_goal
  /api/analytics/goals/<goal_id> [PUT] → analytics.update_goal
  /api/analytics/goals/<goal_id> [DELETE] → analytics.delete_goal
  /api/analytics/goals/<goal_id>/progress [PUT] → analytics.update_goal_progress
  /api/analytics/goals/<goal_id>/metrics [POST] → analytics.create_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [PUT] → analytics.update_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [DELETE] → analytics.delete_goal_metric
  /api/analytics/locations/detector [POST] → analytics.location_detector_run
  /api/coaching/insights/<insight_id>/dismiss [POST] → coaching.dismiss_insight
  /api/billing/checkout-session [POST] → billing.create_checkout_session
  /api/billing/portal-session [POST] → billing.create_portal_session
  /api/enterprise/sso-config [POST] → enterprise.upsert_sso_config
  /api/enterprise/sso-config/acs [POST] → enterprise.saml_acs
  /api/enterprise/branding [PUT] → enterprise.update_branding
  /api/enterprise/branding/reset [POST] → enterprise.reset_branding
  /api/enterprise/branding/upload-logo [POST] → enterprise.upload_logo
  /api/portfolios/ [POST] → portfolios.create_portfolio
  /api/portfolios/<portfolio_id> [PUT] → portfolios.update_portfolio
  /api/portfolios/<portfolio_id> [DELETE] → portfolios.delete_portfolio
  /api/portfolios/<portfolio_id>/companies [POST] → portfolios.add_companies
  /api/portfolios/<portfolio_id>/companies [DELETE] → portfolios.remove_companies
  /api/email-campaigns/ [POST] → email_campaigns.create_campaign
  /api/email-campaigns/<campaign_id> [PUT] → email_campaigns.update_campaign
  /api/email-campaigns/<campaign_id>/send [POST] → email_campaigns.send_campaign
  /api/email-campaigns/<campaign_id> [DELETE] → email_campaigns.delete_campaign
  /api/email-campaigns/<campaign_id>/logs/<log_id> [PUT] → email_campaigns.update_log
  /connectors/sms/webhook/<connector_id>/sms [POST] → sms_webhooks.sms_webhook
  /connectors/sms/webhook/<connector_id>/call [POST] → sms_webhooks.call_webhook
  /api/sms/send [POST] → sms.send_sms
  /api/sms/call [POST] → sms.trigger_call
  /api/sms/calls/<call_id>/disposition [PUT] → sms.update_call_disposition
  /api/sms/opt-outs/<opt_out_id> [DELETE] → sms.remove_opt_out
  /api/sms/opt-outs [POST] → sms.add_opt_out
  /app/api/sms-call/send [POST] → sms_call.send
  /app/api/sms-call/outbound [POST] → sms_call.outbound
  /app/api/sms-call/call/<call_id>/disposition [PUT] → sms_call.disposition
  /api/super-admin/company/<company_id>/connectors/<connector_id>/sync [POST] → super_admin_proxy.proxy_connector_sync
  /api/super-admin/company/<company_id>/connectors/<connector_id>/refresh [POST] → super_admin_proxy.proxy_connector_refresh
  /api/super-admin/company/<company_id>/connectors/<connector_id>/disconnect [POST] → super_admin_proxy.proxy_connector_disconnect
  /api/super-admin/company/<company_id>/connectors [POST] → super_admin_proxy.proxy_create_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [PUT] → super_admin_proxy.proxy_update_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [DELETE] → super_admin_proxy.proxy_delete_connector
  /api/super-admin/company/<company_id>/billing/portal [POST] → super_admin_proxy.proxy_billing_portal
  /api/lead-gen/templates [POST] → lead_gen.create_template
  /api/lead-gen/templates/<template_id> [PUT] → lead_gen.update_template
  /api/lead-gen/templates/<template_id> [DELETE] → lead_gen.delete_template
  /api/company/<company_id>/lead-gen/creatives [POST] → lead_gen.create_creative
  /api/company/<company_id>/lead-gen/rules [POST] → lead_gen.create_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id> [PUT] → lead_gen.update_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id>/run [POST] → lead_gen.run_rule
  /api/company/<company_id>/lead-gen/attribution [POST] → lead_gen.create_attribution
  /api/company/<company_id>/lead-gen/attribution/<attribution_id> [PUT] → lead_gen.update_attribution
  /api/company/<company_id>/lead-gen/campaigns/generate [POST] → lead_gen.generate_campaign
2026-07-24 22:19:56,627 INFO app.scheduler: Scheduler disabled via DISABLE_SCHEDULER
2026-07-24 22:19:56,657 WARNING app: DB pre-flight check failed: (sqlite3.OperationalError) no such table: profiles
[SQL: SELECT COALESCE((SELECT count(*) FROM profiles), -1) as c]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
2026-07-24 22:19:56,658 INFO app.connectors: Registered connectors: ['servicetitan', 'sms', 'hubspot', 'quickbooks', 'google_ads', 'jobnimbus', 'slack', 'facebook_ads', 'generic_rest', 'angi', 'zapier', 'google_sheets', 'five9', 'leadperfection', 'marlimar', 'jobber']
2026-07-24 22:19:56,689 WARNING app.utils.csrf: CSRF audit: 136 unprotected state-changing route(s):
  /api/company/<company_id>/angi/leads/<lead_id> [PUT] → api_proxy.update_angi_lead
  /api/company/<company_id>/angi/leads/<lead_id>/respond [POST] → api_proxy.respond_to_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/accept [POST] → api_proxy.accept_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/reject [POST] → api_proxy.reject_lead_endpoint
  /api/company/<company_id>/angi/leads/sync [POST] → api_proxy.sync_angi_leads
  /api/company/<company_id>/quickbooks/accept-invoice/<invoice_id> [POST] → api_proxy.accept_quickbooks_invoice
  /api/company/<company_id>/quickbooks/sync [POST] → api_proxy.sync_quickbooks
  /api/company/<company_id>/google_ads/sync [POST] → api_proxy.sync_google_ads
  /api/company/<company_id>/facebook_ads/sync [POST] → api_proxy.sync_facebook_ads
  /api/company/<company_id>/slack/sync [POST] → api_proxy.sync_slack
  /api/company/<company_id>/slack/send-message [POST] → api_proxy.send_slack_message
  /api/auth/user [PUT] → auth_api.api_auth_update_user
  /api/auth/login [POST] → auth_api.api_auth_login
  /api/auth/signup [POST] → auth_api.api_auth_signup
  /api/auth/logout [POST] → auth_api.api_auth_logout
  /api/auth/invite [POST] → auth_api.api_auth_invite
  /api/auth/accept [POST] → auth_api.api_auth_accept
  /api/auth/change [POST] → auth_api.api_auth_change
  /api/user/settings [PUT] → auth_api.api_user_settings_put
  /api/user/company [PUT] → auth_api.api_user_company_put
  /api/user/company-settings [PUT] → auth_api.api_user_company_settings_put
  /api/auth/forgot-password [POST] → auth_api.api_auth_forgot_password
  /api/auth/reset-password [POST] → auth_api.api_auth_reset_password
  /api/security/2fa/setup [POST] → security_api.api_security_2fa_setup
  /api/security/2fa/enable [POST] → security_api.api_security_2fa_enable
  /api/security/2fa/disable [POST] → security_api.api_security_2fa_disable
  /api/security/api-keys [POST] → security_api.api_security_api_keys_create
  /api/security/api-keys/<key_id> [PUT] → security_api.api_security_api_keys_update
  /api/security/api-keys/<key_id> [DELETE] → security_api.api_security_api_keys_revoke
  /api/security/connected-accounts/<service>/disconnect [POST] → security_api.api_security_disconnect_account
  /api/security/sessions/<session_id>/revoke [POST] → security_api.api_security_revoke_session
  /api/security/sessions/revoke-other [POST] → security_api.api_security_revoke_other_sessions
  /api/super-admin/commissions/partnerships [POST] → admin_api.api_admin_commissions_create
  /api/super-admin/commissions/partnerships/<partnership_id> [PUT] → admin_api.api_admin_commissions_update
  /api/super-admin/commissions/records/<record_id>/approve [POST] → admin_api.api_admin_commissions_approve_record
  /api/super-admin/commissions/payouts [POST] → admin_api.api_admin_commissions_create_payout
  /api/super-admin/commissions/payouts/<payout_id> [PUT] → admin_api.api_admin_commissions_update_payout
  /api/super-admin/commissions/calculate [POST] → admin_api.api_admin_commissions_calculate
  /api/super-admin/organizations/<org_id> [DELETE] → admin_api.api_super_admin_delete_organization
  /api/super-admin/organizations [POST] → admin_api.api_super_admin_create_organization
  /api/partner/organizations [POST] → admin_api.api_partner_create_organization
  /api/leads/demo-request [POST] → admin_api.api_demo_request
  /api/super-admin/users [POST] → admin_api.api_super_admin_create_user
  /api/super-admin/users/<user_id> [DELETE] → admin_api.api_super_admin_delete_user
  /api/super-admin/users/<user_id>/role [PUT] → admin_api.api_super_admin_update_user_role
  /api/super-admin/users/<user_id>/company-role [PUT] → admin_api.api_super_admin_update_user_company_role
  /api/super-admin/users/<user_id> [PUT] → admin_api.api_super_admin_update_user
  /api/partner/team [POST] → admin_api.api_partner_team_add
  /api/partner/team/<int:user_id> [PUT] → admin_api.api_partner_team_update
  /api/partner/team/<int:user_id> [DELETE] → admin_api.api_partner_team_remove
  /api/company/<company_id>/revenue-leaks/detectors [PUT] → admin_api.update_leak_detectors
  /api/company/<company_id>/revenue-leaks [POST] → business_api.create_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [PUT] → business_api.update_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [DELETE] → business_api.delete_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id>/resolve [PATCH] → business_api.resolve_revenue_leak
  /api/company/<company_id>/revenue-leaks/scan [POST] → business_api.scan_revenue_leaks
  /api/company/<company_id>/revenue-leaks/<leak_id>/remediation [POST] → business_api.apply_leak_remediation
  /api/company/<company_id>/leak-settings/severity [PUT] → business_api.update_severity_rules_endpoint
  /api/company/<company_id>/leak-settings/alerts [PUT] → business_api.update_alert_settings
  /api/company/<company_id>/optimization-moves [POST] → business_api.create_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [PUT] → business_api.update_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [DELETE] → business_api.delete_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/accept [PATCH] → business_api.accept_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/reject [PATCH] → business_api.reject_optimization_move
  /api/company/<company_id>/forecasts [POST] → business_api.create_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [PUT] → business_api.update_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [DELETE] → business_api.delete_forecast
  /api/company/<company_id>/forecasts/sync [POST] → business_api.sync_forecasts
  /api/company/<company_id>/coaching-assignments [POST] → business_api.create_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [PUT] → business_api.update_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [DELETE] → business_api.delete_coaching_assignment
  /api/company/<company_id>/coaching-scorecards [POST] → business_api.create_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [PUT] → business_api.update_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [DELETE] → business_api.delete_coaching_scorecard
  /api/connectors [POST] → connectors.create_connector
  /api/connectors/<connector_id> [DELETE] → connectors.delete_connector
  /api/connectors/<connector_id> [PUT] → connectors.update_connector
  /api/connectors/<connector_id>/sync [POST] → connectors.trigger_sync
  /api/connectors/oauth/connected-sheets/select [POST] → connectors.oauth_select_spreadsheet
  /api/connectors/<connector_id>/refresh [POST] → connectors.refresh_connector
  /api/connectors/webhooks/<service> [POST] → connectors.webhook_receiver
  /api/connectors/webhooks/angi [POST] → connectors.angi_webhook
  /api/connectors/webhooks/zapier [POST] → connectors.zapier_webhook
  /api/analytics/goals [POST] → analytics.create_goal
  /api/analytics/goals/<goal_id> [PUT] → analytics.update_goal
  /api/analytics/goals/<goal_id> [DELETE] → analytics.delete_goal
  /api/analytics/goals/<goal_id>/progress [PUT] → analytics.update_goal_progress
  /api/analytics/goals/<goal_id>/metrics [POST] → analytics.create_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [PUT] → analytics.update_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [DELETE] → analytics.delete_goal_metric
  /api/analytics/locations/detector [POST] → analytics.location_detector_run
  /api/coaching/insights/<insight_id>/dismiss [POST] → coaching.dismiss_insight
  /api/billing/checkout-session [POST] → billing.create_checkout_session
  /api/billing/portal-session [POST] → billing.create_portal_session
  /api/enterprise/sso-config [POST] → enterprise.upsert_sso_config
  /api/enterprise/sso-config/acs [POST] → enterprise.saml_acs
  /api/enterprise/branding [PUT] → enterprise.update_branding
  /api/enterprise/branding/reset [POST] → enterprise.reset_branding
  /api/enterprise/branding/upload-logo [POST] → enterprise.upload_logo
  /api/portfolios/ [POST] → portfolios.create_portfolio
  /api/portfolios/<portfolio_id> [PUT] → portfolios.update_portfolio
  /api/portfolios/<portfolio_id> [DELETE] → portfolios.delete_portfolio
  /api/portfolios/<portfolio_id>/companies [POST] → portfolios.add_companies
  /api/portfolios/<portfolio_id>/companies [DELETE] → portfolios.remove_companies
  /api/email-campaigns/ [POST] → email_campaigns.create_campaign
  /api/email-campaigns/<campaign_id> [PUT] → email_campaigns.update_campaign
  /api/email-campaigns/<campaign_id>/send [POST] → email_campaigns.send_campaign
  /api/email-campaigns/<campaign_id> [DELETE] → email_campaigns.delete_campaign
  /api/email-campaigns/<campaign_id>/logs/<log_id> [PUT] → email_campaigns.update_log
  /connectors/sms/webhook/<connector_id>/sms [POST] → sms_webhooks.sms_webhook
  /connectors/sms/webhook/<connector_id>/call [POST] → sms_webhooks.call_webhook
  /api/sms/send [POST] → sms.send_sms
  /api/sms/call [POST] → sms.trigger_call
  /api/sms/calls/<call_id>/disposition [PUT] → sms.update_call_disposition
  /api/sms/opt-outs/<opt_out_id> [DELETE] → sms.remove_opt_out
  /api/sms/opt-outs [POST] → sms.add_opt_out
  /app/api/sms-call/send [POST] → sms_call.send
  /app/api/sms-call/outbound [POST] → sms_call.outbound
  /app/api/sms-call/call/<call_id>/disposition [PUT] → sms_call.disposition
  /api/super-admin/company/<company_id>/connectors/<connector_id>/sync [POST] → super_admin_proxy.proxy_connector_sync
  /api/super-admin/company/<company_id>/connectors/<connector_id>/refresh [POST] → super_admin_proxy.proxy_connector_refresh
  /api/super-admin/company/<company_id>/connectors/<connector_id>/disconnect [POST] → super_admin_proxy.proxy_connector_disconnect
  /api/super-admin/company/<company_id>/connectors [POST] → super_admin_proxy.proxy_create_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [PUT] → super_admin_proxy.proxy_update_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [DELETE] → super_admin_proxy.proxy_delete_connector
  /api/super-admin/company/<company_id>/billing/portal [POST] → super_admin_proxy.proxy_billing_portal
  /api/lead-gen/templates [POST] → lead_gen.create_template
  /api/lead-gen/templates/<template_id> [PUT] → lead_gen.update_template
  /api/lead-gen/templates/<template_id> [DELETE] → lead_gen.delete_template
  /api/company/<company_id>/lead-gen/creatives [POST] → lead_gen.create_creative
  /api/company/<company_id>/lead-gen/rules [POST] → lead_gen.create_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id> [PUT] → lead_gen.update_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id>/run [POST] → lead_gen.run_rule
  /api/company/<company_id>/lead-gen/attribution [POST] → lead_gen.create_attribution
  /api/company/<company_id>/lead-gen/attribution/<attribution_id> [PUT] → lead_gen.update_attribution
  /api/company/<company_id>/lead-gen/campaigns/generate [POST] → lead_gen.generate_campaign
2026-07-24 22:19:56,690 INFO app.scheduler: Scheduler disabled via DISABLE_SCHEDULER
2026-07-24 22:19:56,720 WARNING app: DB pre-flight check failed: (sqlite3.OperationalError) no such table: profiles
[SQL: SELECT COALESCE((SELECT count(*) FROM profiles), -1) as c]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
2026-07-24 22:19:56,720 INFO app.connectors: Registered connectors: ['servicetitan', 'sms', 'hubspot', 'quickbooks', 'google_ads', 'jobnimbus', 'slack', 'facebook_ads', 'generic_rest', 'angi', 'zapier', 'google_sheets', 'five9', 'leadperfection', 'marlimar', 'jobber']
2026-07-24 22:19:56,752 WARNING app.utils.csrf: CSRF audit: 136 unprotected state-changing route(s):
  /api/company/<company_id>/angi/leads/<lead_id> [PUT] → api_proxy.update_angi_lead
  /api/company/<company_id>/angi/leads/<lead_id>/respond [POST] → api_proxy.respond_to_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/accept [POST] → api_proxy.accept_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/reject [POST] → api_proxy.reject_lead_endpoint
  /api/company/<company_id>/angi/leads/sync [POST] → api_proxy.sync_angi_leads
  /api/company/<company_id>/quickbooks/accept-invoice/<invoice_id> [POST] → api_proxy.accept_quickbooks_invoice
  /api/company/<company_id>/quickbooks/sync [POST] → api_proxy.sync_quickbooks
  /api/company/<company_id>/google_ads/sync [POST] → api_proxy.sync_google_ads
  /api/company/<company_id>/facebook_ads/sync [POST] → api_proxy.sync_facebook_ads
  /api/company/<company_id>/slack/sync [POST] → api_proxy.sync_slack
  /api/company/<company_id>/slack/send-message [POST] → api_proxy.send_slack_message
  /api/auth/user [PUT] → auth_api.api_auth_update_user
  /api/auth/login [POST] → auth_api.api_auth_login
  /api/auth/signup [POST] → auth_api.api_auth_signup
  /api/auth/logout [POST] → auth_api.api_auth_logout
  /api/auth/invite [POST] → auth_api.api_auth_invite
  /api/auth/accept [POST] → auth_api.api_auth_accept
  /api/auth/change [POST] → auth_api.api_auth_change
  /api/user/settings [PUT] → auth_api.api_user_settings_put
  /api/user/company [PUT] → auth_api.api_user_company_put
  /api/user/company-settings [PUT] → auth_api.api_user_company_settings_put
  /api/auth/forgot-password [POST] → auth_api.api_auth_forgot_password
  /api/auth/reset-password [POST] → auth_api.api_auth_reset_password
  /api/security/2fa/setup [POST] → security_api.api_security_2fa_setup
  /api/security/2fa/enable [POST] → security_api.api_security_2fa_enable
  /api/security/2fa/disable [POST] → security_api.api_security_2fa_disable
  /api/security/api-keys [POST] → security_api.api_security_api_keys_create
  /api/security/api-keys/<key_id> [PUT] → security_api.api_security_api_keys_update
  /api/security/api-keys/<key_id> [DELETE] → security_api.api_security_api_keys_revoke
  /api/security/connected-accounts/<service>/disconnect [POST] → security_api.api_security_disconnect_account
  /api/security/sessions/<session_id>/revoke [POST] → security_api.api_security_revoke_session
  /api/security/sessions/revoke-other [POST] → security_api.api_security_revoke_other_sessions
  /api/super-admin/commissions/partnerships [POST] → admin_api.api_admin_commissions_create
  /api/super-admin/commissions/partnerships/<partnership_id> [PUT] → admin_api.api_admin_commissions_update
  /api/super-admin/commissions/records/<record_id>/approve [POST] → admin_api.api_admin_commissions_approve_record
  /api/super-admin/commissions/payouts [POST] → admin_api.api_admin_commissions_create_payout
  /api/super-admin/commissions/payouts/<payout_id> [PUT] → admin_api.api_admin_commissions_update_payout
  /api/super-admin/commissions/calculate [POST] → admin_api.api_admin_commissions_calculate
  /api/super-admin/organizations/<org_id> [DELETE] → admin_api.api_super_admin_delete_organization
  /api/super-admin/organizations [POST] → admin_api.api_super_admin_create_organization
  /api/partner/organizations [POST] → admin_api.api_partner_create_organization
  /api/leads/demo-request [POST] → admin_api.api_demo_request
  /api/super-admin/users [POST] → admin_api.api_super_admin_create_user
  /api/super-admin/users/<user_id> [DELETE] → admin_api.api_super_admin_delete_user
  /api/super-admin/users/<user_id>/role [PUT] → admin_api.api_super_admin_update_user_role
  /api/super-admin/users/<user_id>/company-role [PUT] → admin_api.api_super_admin_update_user_company_role
  /api/super-admin/users/<user_id> [PUT] → admin_api.api_super_admin_update_user
  /api/partner/team [POST] → admin_api.api_partner_team_add
  /api/partner/team/<int:user_id> [PUT] → admin_api.api_partner_team_update
  /api/partner/team/<int:user_id> [DELETE] → admin_api.api_partner_team_remove
  /api/company/<company_id>/revenue-leaks/detectors [PUT] → admin_api.update_leak_detectors
  /api/company/<company_id>/revenue-leaks [POST] → business_api.create_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [PUT] → business_api.update_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [DELETE] → business_api.delete_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id>/resolve [PATCH] → business_api.resolve_revenue_leak
  /api/company/<company_id>/revenue-leaks/scan [POST] → business_api.scan_revenue_leaks
  /api/company/<company_id>/revenue-leaks/<leak_id>/remediation [POST] → business_api.apply_leak_remediation
  /api/company/<company_id>/leak-settings/severity [PUT] → business_api.update_severity_rules_endpoint
  /api/company/<company_id>/leak-settings/alerts [PUT] → business_api.update_alert_settings
  /api/company/<company_id>/optimization-moves [POST] → business_api.create_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [PUT] → business_api.update_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [DELETE] → business_api.delete_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/accept [PATCH] → business_api.accept_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/reject [PATCH] → business_api.reject_optimization_move
  /api/company/<company_id>/forecasts [POST] → business_api.create_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [PUT] → business_api.update_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [DELETE] → business_api.delete_forecast
  /api/company/<company_id>/forecasts/sync [POST] → business_api.sync_forecasts
  /api/company/<company_id>/coaching-assignments [POST] → business_api.create_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [PUT] → business_api.update_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [DELETE] → business_api.delete_coaching_assignment
  /api/company/<company_id>/coaching-scorecards [POST] → business_api.create_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [PUT] → business_api.update_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [DELETE] → business_api.delete_coaching_scorecard
  /api/connectors [POST] → connectors.create_connector
  /api/connectors/<connector_id> [DELETE] → connectors.delete_connector
  /api/connectors/<connector_id> [PUT] → connectors.update_connector
  /api/connectors/<connector_id>/sync [POST] → connectors.trigger_sync
  /api/connectors/oauth/connected-sheets/select [POST] → connectors.oauth_select_spreadsheet
  /api/connectors/<connector_id>/refresh [POST] → connectors.refresh_connector
  /api/connectors/webhooks/<service> [POST] → connectors.webhook_receiver
  /api/connectors/webhooks/angi [POST] → connectors.angi_webhook
  /api/connectors/webhooks/zapier [POST] → connectors.zapier_webhook
  /api/analytics/goals [POST] → analytics.create_goal
  /api/analytics/goals/<goal_id> [PUT] → analytics.update_goal
  /api/analytics/goals/<goal_id> [DELETE] → analytics.delete_goal
  /api/analytics/goals/<goal_id>/progress [PUT] → analytics.update_goal_progress
  /api/analytics/goals/<goal_id>/metrics [POST] → analytics.create_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [PUT] → analytics.update_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [DELETE] → analytics.delete_goal_metric
  /api/analytics/locations/detector [POST] → analytics.location_detector_run
  /api/coaching/insights/<insight_id>/dismiss [POST] → coaching.dismiss_insight
  /api/billing/checkout-session [POST] → billing.create_checkout_session
  /api/billing/portal-session [POST] → billing.create_portal_session
  /api/enterprise/sso-config [POST] → enterprise.upsert_sso_config
  /api/enterprise/sso-config/acs [POST] → enterprise.saml_acs
  /api/enterprise/branding [PUT] → enterprise.update_branding
  /api/enterprise/branding/reset [POST] → enterprise.reset_branding
  /api/enterprise/branding/upload-logo [POST] → enterprise.upload_logo
  /api/portfolios/ [POST] → portfolios.create_portfolio
  /api/portfolios/<portfolio_id> [PUT] → portfolios.update_portfolio
  /api/portfolios/<portfolio_id> [DELETE] → portfolios.delete_portfolio
  /api/portfolios/<portfolio_id>/companies [POST] → portfolios.add_companies
  /api/portfolios/<portfolio_id>/companies [DELETE] → portfolios.remove_companies
  /api/email-campaigns/ [POST] → email_campaigns.create_campaign
  /api/email-campaigns/<campaign_id> [PUT] → email_campaigns.update_campaign
  /api/email-campaigns/<campaign_id>/send [POST] → email_campaigns.send_campaign
  /api/email-campaigns/<campaign_id> [DELETE] → email_campaigns.delete_campaign
  /api/email-campaigns/<campaign_id>/logs/<log_id> [PUT] → email_campaigns.update_log
  /connectors/sms/webhook/<connector_id>/sms [POST] → sms_webhooks.sms_webhook
  /connectors/sms/webhook/<connector_id>/call [POST] → sms_webhooks.call_webhook
  /api/sms/send [POST] → sms.send_sms
  /api/sms/call [POST] → sms.trigger_call
  /api/sms/calls/<call_id>/disposition [PUT] → sms.update_call_disposition
  /api/sms/opt-outs/<opt_out_id> [DELETE] → sms.remove_opt_out
  /api/sms/opt-outs [POST] → sms.add_opt_out
  /app/api/sms-call/send [POST] → sms_call.send
  /app/api/sms-call/outbound [POST] → sms_call.outbound
  /app/api/sms-call/call/<call_id>/disposition [PUT] → sms_call.disposition
  /api/super-admin/company/<company_id>/connectors/<connector_id>/sync [POST] → super_admin_proxy.proxy_connector_sync
  /api/super-admin/company/<company_id>/connectors/<connector_id>/refresh [POST] → super_admin_proxy.proxy_connector_refresh
  /api/super-admin/company/<company_id>/connectors/<connector_id>/disconnect [POST] → super_admin_proxy.proxy_connector_disconnect
  /api/super-admin/company/<company_id>/connectors [POST] → super_admin_proxy.proxy_create_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [PUT] → super_admin_proxy.proxy_update_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [DELETE] → super_admin_proxy.proxy_delete_connector
  /api/super-admin/company/<company_id>/billing/portal [POST] → super_admin_proxy.proxy_billing_portal
  /api/lead-gen/templates [POST] → lead_gen.create_template
  /api/lead-gen/templates/<template_id> [PUT] → lead_gen.update_template
  /api/lead-gen/templates/<template_id> [DELETE] → lead_gen.delete_template
  /api/company/<company_id>/lead-gen/creatives [POST] → lead_gen.create_creative
  /api/company/<company_id>/lead-gen/rules [POST] → lead_gen.create_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id> [PUT] → lead_gen.update_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id>/run [POST] → lead_gen.run_rule
  /api/company/<company_id>/lead-gen/attribution [POST] → lead_gen.create_attribution
  /api/company/<company_id>/lead-gen/attribution/<attribution_id> [PUT] → lead_gen.update_attribution
  /api/company/<company_id>/lead-gen/campaigns/generate [POST] → lead_gen.generate_campaign
2026-07-24 22:19:56,752 INFO app.scheduler: Scheduler disabled via DISABLE_SCHEDULER
2026-07-24 22:19:56,768 INFO app.connectors.sms: Lead status updated: test-lead-1 new → sms_sent
2026-07-24 22:19:56,786 WARNING app: DB pre-flight check failed: (sqlite3.OperationalError) no such table: profiles
[SQL: SELECT COALESCE((SELECT count(*) FROM profiles), -1) as c]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
2026-07-24 22:19:56,786 INFO app.connectors: Registered connectors: ['servicetitan', 'sms', 'hubspot', 'quickbooks', 'google_ads', 'jobnimbus', 'slack', 'facebook_ads', 'generic_rest', 'angi', 'zapier', 'google_sheets', 'five9', 'leadperfection', 'marlimar', 'jobber']
2026-07-24 22:19:56,818 WARNING app.utils.csrf: CSRF audit: 136 unprotected state-changing route(s):
  /api/company/<company_id>/angi/leads/<lead_id> [PUT] → api_proxy.update_angi_lead
  /api/company/<company_id>/angi/leads/<lead_id>/respond [POST] → api_proxy.respond_to_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/accept [POST] → api_proxy.accept_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/reject [POST] → api_proxy.reject_lead_endpoint
  /api/company/<company_id>/angi/leads/sync [POST] → api_proxy.sync_angi_leads
  /api/company/<company_id>/quickbooks/accept-invoice/<invoice_id> [POST] → api_proxy.accept_quickbooks_invoice
  /api/company/<company_id>/quickbooks/sync [POST] → api_proxy.sync_quickbooks
  /api/company/<company_id>/google_ads/sync [POST] → api_proxy.sync_google_ads
  /api/company/<company_id>/facebook_ads/sync [POST] → api_proxy.sync_facebook_ads
  /api/company/<company_id>/slack/sync [POST] → api_proxy.sync_slack
  /api/company/<company_id>/slack/send-message [POST] → api_proxy.send_slack_message
  /api/auth/user [PUT] → auth_api.api_auth_update_user
  /api/auth/login [POST] → auth_api.api_auth_login
  /api/auth/signup [POST] → auth_api.api_auth_signup
  /api/auth/logout [POST] → auth_api.api_auth_logout
  /api/auth/invite [POST] → auth_api.api_auth_invite
  /api/auth/accept [POST] → auth_api.api_auth_accept
  /api/auth/change [POST] → auth_api.api_auth_change
  /api/user/settings [PUT] → auth_api.api_user_settings_put
  /api/user/company [PUT] → auth_api.api_user_company_put
  /api/user/company-settings [PUT] → auth_api.api_user_company_settings_put
  /api/auth/forgot-password [POST] → auth_api.api_auth_forgot_password
  /api/auth/reset-password [POST] → auth_api.api_auth_reset_password
  /api/security/2fa/setup [POST] → security_api.api_security_2fa_setup
  /api/security/2fa/enable [POST] → security_api.api_security_2fa_enable
  /api/security/2fa/disable [POST] → security_api.api_security_2fa_disable
  /api/security/api-keys [POST] → security_api.api_security_api_keys_create
  /api/security/api-keys/<key_id> [PUT] → security_api.api_security_api_keys_update
  /api/security/api-keys/<key_id> [DELETE] → security_api.api_security_api_keys_revoke
  /api/security/connected-accounts/<service>/disconnect [POST] → security_api.api_security_disconnect_account
  /api/security/sessions/<session_id>/revoke [POST] → security_api.api_security_revoke_session
  /api/security/sessions/revoke-other [POST] → security_api.api_security_revoke_other_sessions
  /api/super-admin/commissions/partnerships [POST] → admin_api.api_admin_commissions_create
  /api/super-admin/commissions/partnerships/<partnership_id> [PUT] → admin_api.api_admin_commissions_update
  /api/super-admin/commissions/records/<record_id>/approve [POST] → admin_api.api_admin_commissions_approve_record
  /api/super-admin/commissions/payouts [POST] → admin_api.api_admin_commissions_create_payout
  /api/super-admin/commissions/payouts/<payout_id> [PUT] → admin_api.api_admin_commissions_update_payout
  /api/super-admin/commissions/calculate [POST] → admin_api.api_admin_commissions_calculate
  /api/super-admin/organizations/<org_id> [DELETE] → admin_api.api_super_admin_delete_organization
  /api/super-admin/organizations [POST] → admin_api.api_super_admin_create_organization
  /api/partner/organizations [POST] → admin_api.api_partner_create_organization
  /api/leads/demo-request [POST] → admin_api.api_demo_request
  /api/super-admin/users [POST] → admin_api.api_super_admin_create_user
  /api/super-admin/users/<user_id> [DELETE] → admin_api.api_super_admin_delete_user
  /api/super-admin/users/<user_id>/role [PUT] → admin_api.api_super_admin_update_user_role
  /api/super-admin/users/<user_id>/company-role [PUT] → admin_api.api_super_admin_update_user_company_role
  /api/super-admin/users/<user_id> [PUT] → admin_api.api_super_admin_update_user
  /api/partner/team [POST] → admin_api.api_partner_team_add
  /api/partner/team/<int:user_id> [PUT] → admin_api.api_partner_team_update
  /api/partner/team/<int:user_id> [DELETE] → admin_api.api_partner_team_remove
  /api/company/<company_id>/revenue-leaks/detectors [PUT] → admin_api.update_leak_detectors
  /api/company/<company_id>/revenue-leaks [POST] → business_api.create_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [PUT] → business_api.update_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [DELETE] → business_api.delete_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id>/resolve [PATCH] → business_api.resolve_revenue_leak
  /api/company/<company_id>/revenue-leaks/scan [POST] → business_api.scan_revenue_leaks
  /api/company/<company_id>/revenue-leaks/<leak_id>/remediation [POST] → business_api.apply_leak_remediation
  /api/company/<company_id>/leak-settings/severity [PUT] → business_api.update_severity_rules_endpoint
  /api/company/<company_id>/leak-settings/alerts [PUT] → business_api.update_alert_settings
  /api/company/<company_id>/optimization-moves [POST] → business_api.create_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [PUT] → business_api.update_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [DELETE] → business_api.delete_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/accept [PATCH] → business_api.accept_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/reject [PATCH] → business_api.reject_optimization_move
  /api/company/<company_id>/forecasts [POST] → business_api.create_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [PUT] → business_api.update_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [DELETE] → business_api.delete_forecast
  /api/company/<company_id>/forecasts/sync [POST] → business_api.sync_forecasts
  /api/company/<company_id>/coaching-assignments [POST] → business_api.create_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [PUT] → business_api.update_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [DELETE] → business_api.delete_coaching_assignment
  /api/company/<company_id>/coaching-scorecards [POST] → business_api.create_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [PUT] → business_api.update_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [DELETE] → business_api.delete_coaching_scorecard
  /api/connectors [POST] → connectors.create_connector
  /api/connectors/<connector_id> [DELETE] → connectors.delete_connector
  /api/connectors/<connector_id> [PUT] → connectors.update_connector
  /api/connectors/<connector_id>/sync [POST] → connectors.trigger_sync
  /api/connectors/oauth/connected-sheets/select [POST] → connectors.oauth_select_spreadsheet
  /api/connectors/<connector_id>/refresh [POST] → connectors.refresh_connector
  /api/connectors/webhooks/<service> [POST] → connectors.webhook_receiver
  /api/connectors/webhooks/angi [POST] → connectors.angi_webhook
  /api/connectors/webhooks/zapier [POST] → connectors.zapier_webhook
  /api/analytics/goals [POST] → analytics.create_goal
  /api/analytics/goals/<goal_id> [PUT] → analytics.update_goal
  /api/analytics/goals/<goal_id> [DELETE] → analytics.delete_goal
  /api/analytics/goals/<goal_id>/progress [PUT] → analytics.update_goal_progress
  /api/analytics/goals/<goal_id>/metrics [POST] → analytics.create_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [PUT] → analytics.update_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [DELETE] → analytics.delete_goal_metric
  /api/analytics/locations/detector [POST] → analytics.location_detector_run
  /api/coaching/insights/<insight_id>/dismiss [POST] → coaching.dismiss_insight
  /api/billing/checkout-session [POST] → billing.create_checkout_session
  /api/billing/portal-session [POST] → billing.create_portal_session
  /api/enterprise/sso-config [POST] → enterprise.upsert_sso_config
  /api/enterprise/sso-config/acs [POST] → enterprise.saml_acs
  /api/enterprise/branding [PUT] → enterprise.update_branding
  /api/enterprise/branding/reset [POST] → enterprise.reset_branding
  /api/enterprise/branding/upload-logo [POST] → enterprise.upload_logo
  /api/portfolios/ [POST] → portfolios.create_portfolio
  /api/portfolios/<portfolio_id> [PUT] → portfolios.update_portfolio
  /api/portfolios/<portfolio_id> [DELETE] → portfolios.delete_portfolio
  /api/portfolios/<portfolio_id>/companies [POST] → portfolios.add_companies
  /api/portfolios/<portfolio_id>/companies [DELETE] → portfolios.remove_companies
  /api/email-campaigns/ [POST] → email_campaigns.create_campaign
  /api/email-campaigns/<campaign_id> [PUT] → email_campaigns.update_campaign
  /api/email-campaigns/<campaign_id>/send [POST] → email_campaigns.send_campaign
  /api/email-campaigns/<campaign_id> [DELETE] → email_campaigns.delete_campaign
  /api/email-campaigns/<campaign_id>/logs/<log_id> [PUT] → email_campaigns.update_log
  /connectors/sms/webhook/<connector_id>/sms [POST] → sms_webhooks.sms_webhook
  /connectors/sms/webhook/<connector_id>/call [POST] → sms_webhooks.call_webhook
  /api/sms/send [POST] → sms.send_sms
  /api/sms/call [POST] → sms.trigger_call
  /api/sms/calls/<call_id>/disposition [PUT] → sms.update_call_disposition
  /api/sms/opt-outs/<opt_out_id> [DELETE] → sms.remove_opt_out
  /api/sms/opt-outs [POST] → sms.add_opt_out
  /app/api/sms-call/send [POST] → sms_call.send
  /app/api/sms-call/outbound [POST] → sms_call.outbound
  /app/api/sms-call/call/<call_id>/disposition [PUT] → sms_call.disposition
  /api/super-admin/company/<company_id>/connectors/<connector_id>/sync [POST] → super_admin_proxy.proxy_connector_sync
  /api/super-admin/company/<company_id>/connectors/<connector_id>/refresh [POST] → super_admin_proxy.proxy_connector_refresh
  /api/super-admin/company/<company_id>/connectors/<connector_id>/disconnect [POST] → super_admin_proxy.proxy_connector_disconnect
  /api/super-admin/company/<company_id>/connectors [POST] → super_admin_proxy.proxy_create_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [PUT] → super_admin_proxy.proxy_update_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [DELETE] → super_admin_proxy.proxy_delete_connector
  /api/super-admin/company/<company_id>/billing/portal [POST] → super_admin_proxy.proxy_billing_portal
  /api/lead-gen/templates [POST] → lead_gen.create_template
  /api/lead-gen/templates/<template_id> [PUT] → lead_gen.update_template
  /api/lead-gen/templates/<template_id> [DELETE] → lead_gen.delete_template
  /api/company/<company_id>/lead-gen/creatives [POST] → lead_gen.create_creative
  /api/company/<company_id>/lead-gen/rules [POST] → lead_gen.create_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id> [PUT] → lead_gen.update_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id>/run [POST] → lead_gen.run_rule
  /api/company/<company_id>/lead-gen/attribution [POST] → lead_gen.create_attribution
  /api/company/<company_id>/lead-gen/attribution/<attribution_id> [PUT] → lead_gen.update_attribution
  /api/company/<company_id>/lead-gen/campaigns/generate [POST] → lead_gen.generate_campaign
2026-07-24 22:19:56,818 INFO app.scheduler: Scheduler disabled via DISABLE_SCHEDULER
2026-07-24 22:19:56,848 WARNING app: DB pre-flight check failed: (sqlite3.OperationalError) no such table: profiles
[SQL: SELECT COALESCE((SELECT count(*) FROM profiles), -1) as c]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
2026-07-24 22:19:56,848 INFO app.connectors: Registered connectors: ['servicetitan', 'sms', 'hubspot', 'quickbooks', 'google_ads', 'jobnimbus', 'slack', 'facebook_ads', 'generic_rest', 'angi', 'zapier', 'google_sheets', 'five9', 'leadperfection', 'marlimar', 'jobber']
2026-07-24 22:19:56,880 WARNING app.utils.csrf: CSRF audit: 136 unprotected state-changing route(s):
  /api/company/<company_id>/angi/leads/<lead_id> [PUT] → api_proxy.update_angi_lead
  /api/company/<company_id>/angi/leads/<lead_id>/respond [POST] → api_proxy.respond_to_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/accept [POST] → api_proxy.accept_lead_endpoint
  /api/company/<company_id>/angi/leads/<lead_id>/reject [POST] → api_proxy.reject_lead_endpoint
  /api/company/<company_id>/angi/leads/sync [POST] → api_proxy.sync_angi_leads
  /api/company/<company_id>/quickbooks/accept-invoice/<invoice_id> [POST] → api_proxy.accept_quickbooks_invoice
  /api/company/<company_id>/quickbooks/sync [POST] → api_proxy.sync_quickbooks
  /api/company/<company_id>/google_ads/sync [POST] → api_proxy.sync_google_ads
  /api/company/<company_id>/facebook_ads/sync [POST] → api_proxy.sync_facebook_ads
  /api/company/<company_id>/slack/sync [POST] → api_proxy.sync_slack
  /api/company/<company_id>/slack/send-message [POST] → api_proxy.send_slack_message
  /api/auth/user [PUT] → auth_api.api_auth_update_user
  /api/auth/login [POST] → auth_api.api_auth_login
  /api/auth/signup [POST] → auth_api.api_auth_signup
  /api/auth/logout [POST] → auth_api.api_auth_logout
  /api/auth/invite [POST] → auth_api.api_auth_invite
  /api/auth/accept [POST] → auth_api.api_auth_accept
  /api/auth/change [POST] → auth_api.api_auth_change
  /api/user/settings [PUT] → auth_api.api_user_settings_put
  /api/user/company [PUT] → auth_api.api_user_company_put
  /api/user/company-settings [PUT] → auth_api.api_user_company_settings_put
  /api/auth/forgot-password [POST] → auth_api.api_auth_forgot_password
  /api/auth/reset-password [POST] → auth_api.api_auth_reset_password
  /api/security/2fa/setup [POST] → security_api.api_security_2fa_setup
  /api/security/2fa/enable [POST] → security_api.api_security_2fa_enable
  /api/security/2fa/disable [POST] → security_api.api_security_2fa_disable
  /api/security/api-keys [POST] → security_api.api_security_api_keys_create
  /api/security/api-keys/<key_id> [PUT] → security_api.api_security_api_keys_update
  /api/security/api-keys/<key_id> [DELETE] → security_api.api_security_api_keys_revoke
  /api/security/connected-accounts/<service>/disconnect [POST] → security_api.api_security_disconnect_account
  /api/security/sessions/<session_id>/revoke [POST] → security_api.api_security_revoke_session
  /api/security/sessions/revoke-other [POST] → security_api.api_security_revoke_other_sessions
  /api/super-admin/commissions/partnerships [POST] → admin_api.api_admin_commissions_create
  /api/super-admin/commissions/partnerships/<partnership_id> [PUT] → admin_api.api_admin_commissions_update
  /api/super-admin/commissions/records/<record_id>/approve [POST] → admin_api.api_admin_commissions_approve_record
  /api/super-admin/commissions/payouts [POST] → admin_api.api_admin_commissions_create_payout
  /api/super-admin/commissions/payouts/<payout_id> [PUT] → admin_api.api_admin_commissions_update_payout
  /api/super-admin/commissions/calculate [POST] → admin_api.api_admin_commissions_calculate
  /api/super-admin/organizations/<org_id> [DELETE] → admin_api.api_super_admin_delete_organization
  /api/super-admin/organizations [POST] → admin_api.api_super_admin_create_organization
  /api/partner/organizations [POST] → admin_api.api_partner_create_organization
  /api/leads/demo-request [POST] → admin_api.api_demo_request
  /api/super-admin/users [POST] → admin_api.api_super_admin_create_user
  /api/super-admin/users/<user_id> [DELETE] → admin_api.api_super_admin_delete_user
  /api/super-admin/users/<user_id>/role [PUT] → admin_api.api_super_admin_update_user_role
  /api/super-admin/users/<user_id>/company-role [PUT] → admin_api.api_super_admin_update_user_company_role
  /api/super-admin/users/<user_id> [PUT] → admin_api.api_super_admin_update_user
  /api/partner/team [POST] → admin_api.api_partner_team_add
  /api/partner/team/<int:user_id> [PUT] → admin_api.api_partner_team_update
  /api/partner/team/<int:user_id> [DELETE] → admin_api.api_partner_team_remove
  /api/company/<company_id>/revenue-leaks/detectors [PUT] → admin_api.update_leak_detectors
  /api/company/<company_id>/revenue-leaks [POST] → business_api.create_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [PUT] → business_api.update_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id> [DELETE] → business_api.delete_revenue_leak
  /api/company/<company_id>/revenue-leaks/<leak_id>/resolve [PATCH] → business_api.resolve_revenue_leak
  /api/company/<company_id>/revenue-leaks/scan [POST] → business_api.scan_revenue_leaks
  /api/company/<company_id>/revenue-leaks/<leak_id>/remediation [POST] → business_api.apply_leak_remediation
  /api/company/<company_id>/leak-settings/severity [PUT] → business_api.update_severity_rules_endpoint
  /api/company/<company_id>/leak-settings/alerts [PUT] → business_api.update_alert_settings
  /api/company/<company_id>/optimization-moves [POST] → business_api.create_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [PUT] → business_api.update_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id> [DELETE] → business_api.delete_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/accept [PATCH] → business_api.accept_optimization_move
  /api/company/<company_id>/optimization-moves/<move_id>/reject [PATCH] → business_api.reject_optimization_move
  /api/company/<company_id>/forecasts [POST] → business_api.create_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [PUT] → business_api.update_forecast
  /api/company/<company_id>/forecasts/<forecast_id> [DELETE] → business_api.delete_forecast
  /api/company/<company_id>/forecasts/sync [POST] → business_api.sync_forecasts
  /api/company/<company_id>/coaching-assignments [POST] → business_api.create_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [PUT] → business_api.update_coaching_assignment
  /api/company/<company_id>/coaching-assignments/<assignment_id> [DELETE] → business_api.delete_coaching_assignment
  /api/company/<company_id>/coaching-scorecards [POST] → business_api.create_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [PUT] → business_api.update_coaching_scorecard
  /api/company/<company_id>/coaching-scorecards/<scorecard_id> [DELETE] → business_api.delete_coaching_scorecard
  /api/connectors [POST] → connectors.create_connector
  /api/connectors/<connector_id> [DELETE] → connectors.delete_connector
  /api/connectors/<connector_id> [PUT] → connectors.update_connector
  /api/connectors/<connector_id>/sync [POST] → connectors.trigger_sync
  /api/connectors/oauth/connected-sheets/select [POST] → connectors.oauth_select_spreadsheet
  /api/connectors/<connector_id>/refresh [POST] → connectors.refresh_connector
  /api/connectors/webhooks/<service> [POST] → connectors.webhook_receiver
  /api/connectors/webhooks/angi [POST] → connectors.angi_webhook
  /api/connectors/webhooks/zapier [POST] → connectors.zapier_webhook
  /api/analytics/goals [POST] → analytics.create_goal
  /api/analytics/goals/<goal_id> [PUT] → analytics.update_goal
  /api/analytics/goals/<goal_id> [DELETE] → analytics.delete_goal
  /api/analytics/goals/<goal_id>/progress [PUT] → analytics.update_goal_progress
  /api/analytics/goals/<goal_id>/metrics [POST] → analytics.create_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [PUT] → analytics.update_goal_metric
  /api/analytics/goals/<goal_id>/metrics/<metric_id> [DELETE] → analytics.delete_goal_metric
  /api/analytics/locations/detector [POST] → analytics.location_detector_run
  /api/coaching/insights/<insight_id>/dismiss [POST] → coaching.dismiss_insight
  /api/billing/checkout-session [POST] → billing.create_checkout_session
  /api/billing/portal-session [POST] → billing.create_portal_session
  /api/enterprise/sso-config [POST] → enterprise.upsert_sso_config
  /api/enterprise/sso-config/acs [POST] → enterprise.saml_acs
  /api/enterprise/branding [PUT] → enterprise.update_branding
  /api/enterprise/branding/reset [POST] → enterprise.reset_branding
  /api/enterprise/branding/upload-logo [POST] → enterprise.upload_logo
  /api/portfolios/ [POST] → portfolios.create_portfolio
  /api/portfolios/<portfolio_id> [PUT] → portfolios.update_portfolio
  /api/portfolios/<portfolio_id> [DELETE] → portfolios.delete_portfolio
  /api/portfolios/<portfolio_id>/companies [POST] → portfolios.add_companies
  /api/portfolios/<portfolio_id>/companies [DELETE] → portfolios.remove_companies
  /api/email-campaigns/ [POST] → email_campaigns.create_campaign
  /api/email-campaigns/<campaign_id> [PUT] → email_campaigns.update_campaign
  /api/email-campaigns/<campaign_id>/send [POST] → email_campaigns.send_campaign
  /api/email-campaigns/<campaign_id> [DELETE] → email_campaigns.delete_campaign
  /api/email-campaigns/<campaign_id>/logs/<log_id> [PUT] → email_campaigns.update_log
  /connectors/sms/webhook/<connector_id>/sms [POST] → sms_webhooks.sms_webhook
  /connectors/sms/webhook/<connector_id>/call [POST] → sms_webhooks.call_webhook
  /api/sms/send [POST] → sms.send_sms
  /api/sms/call [POST] → sms.trigger_call
  /api/sms/calls/<call_id>/disposition [PUT] → sms.update_call_disposition
  /api/sms/opt-outs/<opt_out_id> [DELETE] → sms.remove_opt_out
  /api/sms/opt-outs [POST] → sms.add_opt_out
  /app/api/sms-call/send [POST] → sms_call.send
  /app/api/sms-call/outbound [POST] → sms_call.outbound
  /app/api/sms-call/call/<call_id>/disposition [PUT] → sms_call.disposition
  /api/super-admin/company/<company_id>/connectors/<connector_id>/sync [POST] → super_admin_proxy.proxy_connector_sync
  /api/super-admin/company/<company_id>/connectors/<connector_id>/refresh [POST] → super_admin_proxy.proxy_connector_refresh
  /api/super-admin/company/<company_id>/connectors/<connector_id>/disconnect [POST] → super_admin_proxy.proxy_connector_disconnect
  /api/super-admin/company/<company_id>/connectors [POST] → super_admin_proxy.proxy_create_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [PUT] → super_admin_proxy.proxy_update_connector
  /api/super-admin/company/<company_id>/connectors/<connector_id> [DELETE] → super_admin_proxy.proxy_delete_connector
  /api/super-admin/company/<company_id>/billing/portal [POST] → super_admin_proxy.proxy_billing_portal
  /api/lead-gen/templates [POST] → lead_gen.create_template
  /api/lead-gen/templates/<template_id> [PUT] → lead_gen.update_template
  /api/lead-gen/templates/<template_id> [DELETE] → lead_gen.delete_template
  /api/company/<company_id>/lead-gen/creatives [POST] → lead_gen.create_creative
  /api/company/<company_id>/lead-gen/rules [POST] → lead_gen.create_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id> [PUT] → lead_gen.update_rule
  /api/company/<company_id>/lead-gen/rules/<rule_id>/run [POST] → lead_gen.run_rule
  /api/company/<company_id>/lead-gen/attribution [POST] → lead_gen.create_attribution
  /api/company/<company_id>/lead-gen/attribution/<attribution_id> [PUT] → lead_gen.update_attribution
  /api/company/<company_id>/lead-gen/campaigns/generate [POST] → lead_gen.generate_campaign
2026-07-24 22:19:56,880 INFO app.scheduler: Scheduler disabled via DISABLE_SCHEDULER
2026-07-24 22:19:57,002 INFO app.utils.encryption: Connector encryption initialised with env-provided key