---
title: "Get Integration Config"
method: GET
path: "/configurations/{organization_id}"
tags: ["configurations"]
---

# Get Integration Config

`GET /configurations/{organization_id}`

Get full integration configuration for an organization.

Returns the complete IntegrationConfig with all config sections.

## Path parameters

- `organization_id` string, required

## Response `200`

Successful Response

- IntegrationConfigResponse — Config API response: IntegrationConfig plus response-only derived fields. Never persisted — the save path validates input as plain IntegrationConfig, so derived fields round-tripped by the dashboard are dropped before storage.
  - `timezone` string — Timezone of the organization
  - `dmr_config` DmrConfig — Tunable thresholds used by the DMR auto-computed daily metrics.
    - `replacement_opportunity_tag_ids` integer[] — ST tag type ids marking a call as a replacement opportunity; empty = auto (tag types flagged as conversion opportunity)
    - `trip_fee_cap` number — Invoice total at or below which a paid service call counts as trip/diagnostic-fee only
    - `marketed_campaign_ids` integer[] — ST campaign ids whose jobs count as Marketed (for orgs that track marketed by campaign, not job type)
    - `marketed_job_type_ids` integer[] — Extra ST job type ids that count as Marketed beyond name matching
    - `age_custom_field_names` string[] — Job custom-field names holding equipment age; empty = auto (name matches equipment+age)
    - `age_non_answer_values` string[] — Field values that do NOT count as an identified age; empty = built-in defaults
  - `org_trades` string[] — Authoritative list of trades this organization operates in. Empty means trades are not configured.
  - `partner_brand` 'praxis', nullable — Partner portfolio brand shown in the manager dashboard. None keeps standard NOSO branding.
  - `holiday_suppression_enabled` boolean — When True, automated customer messages are deferred on configured US/Canada holidays.
  - `holiday_country` 'US' | 'CA', nullable — Holiday calendar country. If unset, inferred from the organization timezone and defaults to US.
  - `holiday_region` string, nullable — Optional region/province code for holiday rules, e.g. QC for Quebec.
  - `followup_config` FollowUpStrategyConfig — Followup configuration for an organization. Stored in integrations.config.FOLLOWUP_STRATEGY_CONFIG. Holds the per-organization followup behaviour settings consumed by the pipeline.
    - `estimates_data_style` string, nullable
    - `excluded_tags` string[] — List of tag names to exclude from followup generation. Case-insensitive match against job tags.
    - `required_tags` string[] — Inclusion allowlist: when non-empty, only jobs carrying at least one of these tag names enter followup generation. Case-insensitive match against JOB-level tags only — customer/location tags never qualify a job. Empty list = no gate (default).
    - `excluded_business_units` string[] — List of ServiceTitan business unit names to exclude from followup generation. Case-insensitive, whitespace-trimmed match against the job's business unit (ST pads some names with stray spaces). Empty list = no gate (default).
    - `lookback_days` integer — ServiceTitan only. Delay for jobs governed by required_tags. ThermAll scopes this delay to Service; its ungated business units keep normal daily timing.
    - `verbal_pricing` boolean — If True, this org discusses pricing verbally rather than sending formal estimates. Messages will use 'options we discussed' instead of 'estimates'.
    - `conversation_logs_write_to_ST` boolean — If True, NOSO AI follow-up activity logs are written to the ServiceTitan job notes.
    - `won_job_conversation_pin_enabled` boolean — If True, ServiceTitan jobs created from sold followup estimates get a pinned read-only NOSO conversation handoff link.
    - `invoice_synthesis_enabled` boolean — Org master switch for invoice-driven estimate synthesis. When True, the followup pipeline infers recommendations from invoice write-ups and creates synthetic draft estimates in ServiceTitan — but only for technicians whose users.invoice_synthesis_enabled is also True. Temporary measure for orgs whose techs recommend work in invoices but rarely formalize it into estimates.
    - `invoice_synthesis_placeholder_sku_id` integer, nullable — ServiceTitan pricebook SKU id of the catch-all 'NOSO Recommended Work' item used as the line SKU for every synthetic estimate (the line carries our own description and unit_price). Required when invoice_synthesis_enabled is True.
    - `invoice_synthesis_placeholder_sku_name` string, nullable — Pricebook name of the placeholder SKU above. Reports-lane orgs need it: Pilot picks the line SKU by name in the browser, so a synthetic estimate without it fails at dispatch (label_missing:items.skuName).
    - `hcp_catchall_user_id` string, nullable — HousecallPro only. users.id (UUID) of the org's catch-all followup owner. When set, HCP Stage-1 ingestion runs two passes: real sales_techs (this user excluded) ingest normally under their own id; every OTHER qualifying open estimate is ingested regardless of whether its assigned pro maps to a user in our system, with the hcp_followup row and conversation assigned to this user. None = normal per-sales_tech ingestion (unmatched estimates are dropped).
    - `persona` string, nullable — Name outreach is signed with when the followup is owned by the catch-all user (hcp_catchall_user_id). Those followups are worked by back-office staff on behalf of the technician who attended, so the message is sent as this persona and refers to the technician in the third person. None = sign as the assigned user.
    - `hcp_job_followups_enabled` boolean — HousecallPro only. When True, Stage-1 ingestion also sweeps jobs completed yesterday and creates kind=job followup rows for them. False disables the completed-jobs pass entirely (estimate ingestion is unaffected) for orgs that don't want post-job followups.
    - `hcp_lookback_days` integer — HousecallPro only. Size in days of the rolling created_at window Stage-1 ingestion sweeps for open estimates. Wide by default because an estimate is only ingestible once delivered, which often happens days or weeks after it is created — the window is re-swept every run to catch those. Raise it for orgs that deliver slowly, lower it to cut API calls for high-volume orgs. Does not affect the completed-jobs pass, which always looks at yesterday only. The CLI's --lookback-days overrides this when passed.
  - `recording_config` RecordingConfig
    - `site_summary_style` 'paragraph' | 'bullet'
    - `recording_invoice_summary_enabled` boolean
    - `recording_invoice_summary_write_to_ST` boolean
    - `recording_invoice_summary_destination` 'invoice_summary' | 'location_notes' | 'job_notes'
    - `recording_insight_summary_ui_enabled` boolean
    - `recording_insight_summary_write_to_ST` boolean
    - `tech_specs_installer_notes_enabled` boolean
    - `recording_internal_notes_enabled` boolean
  - `agent_config` AgentConfig
    - `sms_agent_enabled` boolean
    - `require_action_resolver_enabled` boolean
    - `offers_memberships` boolean — Whether the org runs a membership/service-plan program. When False, membership context (has_active_membership, membership_analysis) is withheld from every SMS-agent LLM stage and the answerability gate. Shared with the re-engagement pipeline's membership suppression. Also the backstop that strips membership classifications from open-estimate intents when False — such orgs create no real membership estimates, so anything membership-classified is a ServiceTitan warranty/service-agreement rider misread as membership.
    - `new_membership_pitch_enabled` boolean — Whether to inject the synthetic NEW-membership opportunity intent into current-objective candidates for eligible non-member customers. ORed with membership_renewal_pitch_enabled it also gates membership sell-signal generation. Injection only — real membership estimates flow as normal products regardless (offers_memberships owns the classification backstop). Replaces the hardcoded MEMBERSHIP_OPPORTUNITY_ORG_IDS / MEMBERSHIP_SELLING_ORG_IDS allowlists.
    - `membership_renewal_pitch_enabled` boolean — Whether to inject the synthetic membership-RENEWAL opportunity intent for members whose plan is expiring soon. ORed with new_membership_pitch_enabled for sell-signal generation.
    - `reengagement_send_hour_local` integer — Local-hour send time (0-23) for outbound reengagement messages.
    - `sales_reachout_delay` integer — Days a sales-classified job is deferred after completion before its first re-engagement touch. 0 (default) disables the deferment.
    - `tech_answer_agent_enabled` boolean
    - `weekend_auto_reply_enabled` boolean
    - `message_grouping_window_seconds` integer — Time window (in seconds) to group consecutive customer messages. If customer sends multiple messages within this window, they will be processed together as a single conversation turn. Set to 0 to disable grouping. Max 300 seconds (5 minutes).
    - `auto_disable_on_human_reply` boolean — When enabled, the per-conversation agent toggle is automatically disabled whenever a real (non-AI) user sends a message in that conversation.
    - `campaign_responder_enabled` boolean — When True, campaign LLM auto-responds to inbound SMS immediately. When False (shadow mode), responses are logged to campaign_responder_shadow_events but NOT sent.
    - `campaign_booking_enabled` boolean — When True, the campaign brain may create real ServiceTitan jobs via book_appointment for any campaign, using campaigns.config.booking_defaults (business_unit_id + job_type_id) and a verified two-hour arrival window. When False (default), a customer who agrees to schedule is escalated to the office instead.
    - `campaign_booking_business_unit_id` integer, nullable — Org-wide ServiceTitan business unit for campaign bookings. Used when a campaign has no booking_defaults.business_unit_id, so manual campaigns can book without per-campaign setup.
    - `campaign_booking_job_type_id` integer, nullable — Org-wide ServiceTitan job type for campaign bookings. Falls back the same way as campaign_booking_business_unit_id.
    - `campaign_booking_st_campaign_id` integer, nullable — Org-wide ServiceTitan campaign that booked jobs attribute to. ServiceTitan makes campaignId mandatory on job creation, so without this (or a per-campaign override) a ready-to-book customer is escalated instead.
    - `campaign_booking_st_campaign_name` string, nullable — Display name of campaign_booking_st_campaign_id. Reports-lane orgs need it until a job has been booked against the campaign: the reports feed only learns names from Jobs rows, and Pilot picks the campaign by name.
    - `campaign_booking_team_ids` integer[] — ServiceTitan dispatch team ids whose technicians count as campaign booking capacity. When set, availability is reconstructed from the real board (appointments + assignments + non-job time off for these teams' techs over business hours) instead of the capacity API, which only reflects ST's capacity-planning module and reads as permanently full for tenants that do not maintain it.
    - `playwright_enabled` boolean — When True, escalate_to_backoffice(resend_estimate|resend_invoice) auto-sends the document. Stage 2/3 are skipped and the SMS agent dispatches a send_job_email WorkflowRequest to Pilot over SQS (the ServiceTitan browser automation now runs in Pilot, not inline). The Pilot results worker sends the customer confirmation SMS on completion, or flips the conversation to require_action + agent disabled on failure (or if Pilot never answers within the deadline). resend_other does NOT auto-send and runs the normal CSR-escalation path. (Flag name retained for config compatibility; the mechanism is now Pilot, not inline Playwright.)
    - `estimate_accept_link_enabled` boolean — When True (default), conversion_assist(accept_full_estimate) uses the self-service path — the SMS points the customer to the accept link in the estimate email. When False, the org does NOT include a self-service accept link in estimate emails; the customer's SMS YES is treated as the commitment and the path flips to office_handoff (office confirms + starts scheduling, email notification fires, conversation goes to require_action). voice_card stays accept_full_estimate; Stage 3 renders a no-link sub-card.
    - `dismiss_estimates_on_lost_enabled` boolean — When True, manual lost transitions may dismiss open ServiceTitan estimates and the SMS agent does so for chose_competitor or work_completed.
    - `escalation_dual_notify_enabled` boolean — When True, every escalation notifies BOTH the office (email, normal subtype routing) and the conversation's assigned technician (push). Excludes escalate_to_technician tech_work_question/tech_said_question, which stay technician-only.
    - `followup_agent_v3_enabled` boolean — When True the org is switched to the followup agent v3: inbound SMS routes to the v3 queue (event_type inbound_sms_v3) instead of the v2 SMS agent, and the nightly reengagement v2 pipeline skips this org entirely (v3's own planner owns its proactive cadence). Cutover runbook: cancel the org's pending reengagement_v2 rows when flipping this on. Rollback is flipping it back — v2 resumes on its next nightly run.
    - `followup_agent_v3_shadow` boolean — When True, v2 keeps running unchanged and every inbound SMS event is ALSO mirrored to the v3 queue with shadow=true. v3 runs its full pipeline (state, brain, lint, action queue, dispatcher) but suppresses all external side effects — intended messages land in followup_agent_v3_decision_logs for the M2 parity diff. Ignored when followup_agent_v3_enabled is True.
    - `strict_compliance_mode` boolean — v3 only. When True the compliance gate appends the carrier-approved opt-out line to the first proactive message of a cold thread. Default False: the visible 'Reply STOP' instruction is the loudest bot tell and v3 threads are one-to-one conversational messages; opt-outs in ANY wording are honored at the gate layer regardless of this flag.
    - `estimate_rework_sla` 'same_day' | 'within_48h' | 'unsupported' — v3 only. How fast this org's office can turn around a revised estimate (repair-only / good-better-best resize). Drives the agent's wording (same_day → 'this afternoon', within_48h → 'in the next day or two') and gates the rework play entirely when unsupported. Rework requests escalate with the dedicated estimate_rework subtype.
    - `aspire_followup_enabled` boolean — Master switch for the Aspire email-followup pipeline.
    - `aspire_outlook_native` boolean — Outlook-native: the orchestrator drives first-touch cards + reply drafts + tags inside the rep's own Outlook mailbox.
    - `aspire_outlook_review_scheduler_enabled` boolean — Allow due Ongoing Aspire conversations to create Outlook review drafts.
    - `aspire_divisions` string[] — Aspire DivisionNames ingested as followups.
    - `aspire_backfill_days` integer — Go-live backfill window for currently-Delivered opps.
    - `aspire_first_contact_hour_local` integer — Target local send hour for outbound touches.
    - `aspire_send_window_local` integer[] — [earliest, latest] local hour; slots outside roll forward.
    - `aspire_reengage_stale_days` integer — Default review gap when an Ongoing thread goes quiet this long.
    - `aspire_first_touch_delay_days` integer — First review falls this many days after the proposal email's SentDate (or the delivered date when it was never sent).
    - `aspire_self_email_addresses` string[] — Extra send-as addresses that count as the org's own senders (mailbox aliases not present in email_integrations).
    - `aspire_self_email_domains` string[] — Company domains whose senders count as the org's own side (e.g. send-as alias domains); never customer mail.
  - `notification_config` NotificationConfig
    - `email_notification` EmailNotificationConfig
      - `email_notifications_enabled` boolean
      - `global_email_recipients` string[] — List of org-wide recipients included on all notification emails.
      - `trade_email_recipients` object — Trade-specific email recipients. Keys: 'hvac', 'plumbing', 'electrical'. Values: list of email addresses.
      - `missed_call_email_notifications_enabled` boolean — Send email to back office on missed inbound calls (no-answer, busy, voicemail). Voicemail emails include transcript.
      - `weekly_report_recipients` string[] — Email addresses that receive the weekly followup analytics report. Empty list disables the report.
      - `weekly_report_noops_only` boolean — Send the Monday report with the No-Ops blocks only. For orgs that run operator workflows but no followups: the won/pipeline/engagement sections are skipped and the auto-send-user requirement does not apply.
      - `weekly_report_send_hour_local` integer — Hour in the org's local timezone to send the weekly report (0-23). Default 13 = 1 PM.
      - `email_grouping_window_seconds` integer — Time window (seconds) to batch email notifications for the same conversation. If multiple tool escalations happen within this window, they are grouped into one email. Set to 0 to send immediately. Max 900 seconds (15 minutes).
      - `csr_email_recipients` string[] — List of CSR (customer service rep) email recipients to be notified.
      - `contract_responsible_recipients` string[] — Email addresses notified when a customer signs a contract. These recipients are responsible for configuring the payment-reminder schedule in the dashboard. Empty list disables sign notifications.
      - `market_leads_contact_email` string[] — Email addresses notified when a market lead ServiceTitan job is created.
      - `operator_digest_recipients` union — Operator needs-review digest recipients keyed by workflow. Legacy flat lists remain valid until stored configs are migrated; they apply to every workflow and retain their list shape when serialized.
        - string[]
        - object
      - `operator_digest_send_hour_local` integer — Hour in the org's local timezone to send the Wednesday operator digest (0-23). Default 8 AM.
  - `dashboard_variant` 'analytics' | 'noops' — Which dashboard renders at /dashboard for non-aspire orgs. Aspire orgs are derived separately.
  - `MARKET_LEADS_ENABLED` boolean — When True, enables the market lead dashboard, workflows, and background sync for this organization.
  - `MARKET_LEADS_BALLPARK_PRICING_ENABLED` boolean — When True, market lead prompts may discuss broad ballpark pricing after the homeowner asks.
  - `MARKET_LEADS_SMS_SENDER_USER_ID` string, nullable — Org-wide users.id used as the SMS sender for market lead conversations.
  - `MARKET_LEADS_EMAIL_SENDER_ADDRESS` string, nullable — Email address of a market-lead-connected inbox used to send (and capture replies for) market lead emails.
  - `MARKET_LEADS_ST_BUSINESS_UNIT_NAME` string, nullable — Exact ServiceTitan business unit name for market lead jobs. Required before booking can run.
  - `MARKET_LEADS_ST_JOB_TYPE_NAME` string, nullable — Exact ServiceTitan job type name for market lead jobs. Required before booking can run.
  - `MARKET_LEADS_ST_JOB_ALERT_TO_NUMBER` string, nullable — E.164 phone number that receives ServiceTitan booked-job alert SMS messages for market lead intake.
  - `CAMPAIGNS_ENABLED` boolean — When True, enables the campaigns dashboard and the campaign API for this organization. Sole source of truth for campaign visibility; send-side guards are independent of it.
  - `CAMPAIGNS_SMS_SENDER_USER_ID` string, nullable — Org-wide users.id whose Twilio number sends campaign texts. Used when a campaign does not name its own sender.
  - `CAMPAIGNS_SENDER_DISPLAY_NAME` string, nullable — First name the AI introduces itself with on campaign texts. Copied onto each new campaign as customer_facing_sender_name; without it the sender user's first name is used.
  - `mobile_app_config` MobileAppConfig
    - `tech_full_schedule_enabled` boolean — Whether technicians can see full schedule
    - `messages_tab_enabled` boolean — Whether the Messages tab is shown in the mobile app.
    - `phonebook_tab_enabled` boolean — Whether the Phonebook tab is shown in the mobile app.
    - `sms_forwarding_enabled` boolean — When enabled, inbound customer messages are forwarded via SMS to the technician's personal phone number. Technicians reply from the app or field view via the link in that forward.
    - `proposal_modules` string[] — Proposal modules enabled in the mobile app, such as landscaping.
  - `review_config` ReviewConfig — Per-org config for the review-request pipeline.
    - `enabled` boolean — Master switch for the review-request pipeline on this org. When False, the daily enqueue and the scheduler both short-circuit.
    - `shadow_mode_enabled` boolean — When True (shadow mode), the inbound reply handler classifies but writes the would-be reply to review_request_shadow_events instead of dispatching O2A/O2B/O3, and the daily Google sweep skips its match-and-apply step (still ingests new google_reviews rows). No state transitions are applied to review_request_v2 / customer_reviews while shadow_mode_enabled is True. Default False = full live auto-reply behavior. The first-touch O1 outbound is unaffected — use `enabled` to pause that.
    - `bot_user_id` string, nullable — users.id (UUID) of the per-org review bot. conversations created by this pipeline carry this user_id; the inbound webhook short-circuits to the review handler when conversation.user_id matches. The bot user's first_name is also used as the sender identity ('this is <first_name> from <org>...') in the O1 message.
  - `operator_config` OperatorConfig — Per-org configuration for NOSO Operator (browser-agent) workflows. One nested model per operator workflow (e.g. ``warranty``) — add a model here as each new operator comes online. The Operator dashboard (nav tab + page) is visible when at least one workflow is enabled.
    - `warranty` WarrantyConfig — Per-org configuration for the post-install warranty-registration workflow.
      - `registration` boolean — Enables the post-install warranty-registration operator workflow: the Warranty Registration tab on the Operator page (runs, recordings, and exceptions endpoints), the warranty block in the Monday weekly report, and the exceptions section in the Thursday require-action digest.
      - `ledger_spreadsheet_id` string, nullable — For orgs whose warranty work-list is a Google Sheet (rather than the ServiceTitan dispatch board): the spreadsheet id (or full URL) of the ledger. The sheet-driven warranty pipeline reads the current-month tab for jobs to register and writes each outcome back to it. When set (and registration is on), the org runs the sheet flow; when null, the org uses the dispatch-board flow.
      - `portals` object — Per-org portal id -> manufacturer warranty portal. The KEY is a portal identifier (PortalKey = a known BrandName, or a free-form non-brand portal id) that NOSO Operator/Pilot looks up case-insensitively. A brand's registration portal is keyed by the brand (e.g. 'Bosch', 'Fujitsu', 'Allied', 'Hisense'); a non-registration portal carries its own id (e.g. 'trane_invoice' = Trane's invoice-management portal, distinct from the public Trane registration portal). For the dispatch-board brand gate, a job whose detected brand has no matching registration-portal key is skipped and a Slack alert is sent to the NOSO pilot channel. The value carries the portal URL + login (plaintext) that NOSO Operator/Pilot uses. When empty, the warranty pipeline falls back to the org's code-config supported brands (OrgWarrantyProfile). The non-brand half of PortalKey is open (str), so a stray or one-off portal id can never crash the whole Integration load.
      - `auto_enqueue` boolean — Per-org gate for the daily warranty cron's SQS publish to Pilot. When False (default), the pipeline still evaluates jobs, writes statuses, drains prior Pilot results, and writes outcomes back — but publishes NO new messages to the Pilot queue. Flip to True to let this org's verified-ready backlog and sheet rows be sent to Pilot. Operational toggle, not a workflow-enablement flag (excluded from /operator/access).
    - `rebate` RebateConfig — Per-org configuration for the Friedrich spiff-rebate operator workflow.
      - `registration` boolean — Enables the rebate operator workflow: the Rebates tab on the Operator page (runs, recordings, and exceptions endpoints).
      - `prod_only` boolean — When True, the Rebates tab shows only production runs (business_workflow_version like 'prod%'), hiding dev/local/test runs. Default False so demo/dev runs surface; flip on for a live org so its test runs never appear in the dashboard.
    - `permit` PermitConfig — Per-org configuration for the NJ municipal permit-packet operator workflow.
      - `registration` boolean — Enables the permit operator workflow: the Permits tab on the Operator page (runs, packet, recordings, and push endpoints) and the weekly sheet pipeline for the org (see services/install_jobs_permits).
      - `batch_email_recipient` string, nullable — Recipient of the Monday permit-packet batch email (Pilot permit_packet_email). None/empty disables the Monday email — the weekly CLI treats an email-day run without a recipient as a failure so the gap is visible, not silent.
    - `purchase_order` PurchaseOrderConfig — Per-org configuration for the receive-purchase-order operator workflow.
      - `enabled` boolean — Enables the receive-PO operator workflow: the Purchase Orders tab on the Operator page, runs endpoint, recordings endpoint, and digest visibility. This is a dashboard/workflow visibility flag only; purchase_order.auto_enqueue controls whether the cron/poller actually dispatches receive_purchase_order runs.
      - `auto_enqueue` boolean — Per-org gate for the receive-PO cron/poller dispatch to Pilot. When False (default), the workflow can still be visible in the dashboard, but the inbox poller must not enqueue new receive_purchase_order runs. Flip to True only when this org should actively process labelled PO vendor invoices.
      - `dry_run` boolean — When True, runs match/reconcile/tie and PROPOSE, but skip the receive/attach writes that create the payable bill. Default True so supervised launches never bill until explicitly flipped live.
      - `label` string — Gmail label whose tagged vendor invoices the poller processes.
      - `max_invoices` integer — Cap on invoices dispatched per poll pass.
    - `bid` BidConfig — Per-org configuration for the takeoff-to-Aspire bid-automation workflow.
      - `enabled` boolean — Enables the bid operator workflow: the Bids tab on the Operator page (runs, recordings, and exceptions endpoints) for takeoff_to_aspire_opportunities runs (Takeoff Monkey sheet -> Aspire estimate fill).
      - `prod_only` boolean — When True, the Bids tab shows only production runs (business_workflow_version like 'prod%'), hiding dev/local/test runs. Default False so pilot/dev runs surface during launch.
      - `auto_enqueue` boolean — Per-org gate for Pilot's takeoff email-intake poller. When False (default), forwards to operator@noso.so are ignored for this org. Flip to True to let forwarded takeoff sheets dispatch runs. Operational toggle, not a workflow-enablement flag.
      - `intake_sender_domains` string[] — Sender domains whose forwards to operator@noso.so route to this org (e.g. ['obersons.com', 'vlgllc.com']). Empty disables intake routing.
  - `business_hours_config` BusinessHoursConfig — Per-org business hours and after-hours inbound-call redirect settings.
    - `after_hours_redirect_enabled` boolean — When True, inbound calls to tech Twilio numbers outside business hours are redirected to the office line.
    - `redirect_phone_number` string, nullable — E.164 office line that after-hours inbound calls are forwarded to.
    - `weekday` DayHoursConfig — Open/close window in org-local time.
      - `open` string, required — Opening time as HH:MM in 24h org-local time.
      - `close` string, required — Closing time as HH:MM in 24h org-local time.
    - `weekend` DayHoursConfig — Open/close window in org-local time.
      - `open` string, required — Opening time as HH:MM in 24h org-local time.
      - `close` string, required — Closing time as HH:MM in 24h org-local time.
  - `custom_data` boolean — When True, enables org-specific custom processing at various pipeline stages. Off by default; toggle on per-integration as needed.
  - `st_call_sync_enabled` boolean — When True, the ServiceTitan telecom call ingestion CLI syncs this organization's office calls into st_calls.
  - `st_data_source` 'direct' | 'make_primary' | 'reports_primary' — Where ServiceTitan reads come from: the direct API, or a staged source (Make lanes / ST scheduled reports; any direct ST client construction raises). What each staged source supports lives in services/st_etl/capabilities.py. Turning an org off is integrations.status, not this field.
  - `st_reports_shadow` boolean — When True, ST report drops are ingested into st_report_records for this org even though another lane still serves it. Read-only parity mode: never changes st_data_source, never refreshes org settings, never kicks the nightly sync.
  - `st_require_feed_freshness` boolean — When True, the followup pipeline fails closed unless all Make-staged ST feeds cover the processing window.
  - `operator_workflow_flags` object — Derived from operator_config.workflow_flags(); response-only.

## Other responses

- `404` — Not found
- `422` — Validation Error

## Changes

- **2026-09-03** `9afc3ea00b16` — 4 info
  - added the optional property `agent_config/campaign_booking_st_campaign_name` to the response with the `200` status
  - added the optional property `dmr_config/age_custom_field_names` to the response with the `200` status
  - added the optional property `dmr_config/age_non_answer_values` to the response with the `200` status
  - added the optional property `followup_config/invoice_synthesis_placeholder_sku_name` to the response with the `200` status
- **2026-09-02** `d96feef8e2ef` — 1 warning, 1 info
  - removed the optional property `dmr_config/opportunity_min_estimate` from the response with the `200` status
  - added the optional property `dmr_config/replacement_opportunity_tag_ids` to the response with the `200` status

[Change history](https://skmtc.dev/noso/apis/crucible-backend-api/changes/configurations/:organization_id/get.md)

---

[API](https://skmtc.dev/noso/apis/crucible-backend-api.md) · [All operations](https://skmtc.dev/noso/apis/crucible-backend-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/noso/crucible-backend-api/revisions/9afc3ea00b16/schema)
