# Get Strategy Health

Get strategy health

Endpoint: GET /strategies/{strategy_id}/healthcheck
Version: 3.0.1807
Security: Auth0

## Path parameters:

  - `strategy_id` (integer, required)
    Numeric ID of the strategy object

## Response 200 fields (application/json):

  - `data` (object)

  - `data.result` (string)
    Enum: "pass", "warning", "fail"

  - `data.organization` (object)

  - `data.organization.id` (integer)

  - `data.organization.status` (boolean)

  - `data.organization.activity_check` (object)

  - `data.organization.activity_check.result` (string)
    Enum: "pass", "warning", "fail"

  - `data.organization.activity_check.message` (string)
    Will be returned for all statuses.

  - `data.contract` (object)

  - `data.contract.id` (integer)
    Null when the organization has no contract on file.

  - `data.contract.expiration_date` (string)
    effective_end_date of the contract surfaced by the check; null when no contract was found.

  - `data.agency` (object)

  - `data.agency.id` (integer)

  - `data.agency.status` (boolean)

  - `data.advertiser` (object)

  - `data.advertiser.id` (integer)

  - `data.advertiser.status` (boolean)

  - `data.campaign` (object)

  - `data.campaign.id` (integer)

  - `data.campaign.status` (boolean)

  - `data.campaign.start_date` (string)

  - `data.campaign.end_date` (string)

  - `data.campaign.remaining_budget` (number)
    Remaining budget (total_budget − spend_to_date) on the campaign's relevant budget flight; null when no active flight exists.

  - `data.campaign.currency_code` (string)
    Currency of `remaining_budget`, inherited from the relevant budget flight; null when no active flight exists.

  - `data.strategy` (object)

  - `data.strategy.id` (integer)

  - `data.strategy.status` (boolean)

  - `data.strategy.start_date` (string)

  - `data.strategy.use_campaign_start` (boolean)

  - `data.strategy.use_campaign_end` (boolean)

  - `data.strategy.end_date` (string)

  - `data.strategy.remaining_budget` (number)
    Strategy budget minus spend-to-date; null when no strategy-level budget cap is set.

  - `data.strategy.currency_code` (string)
    Currency of `remaining_budget`, inherited from the parent campaign; null when no strategy-level cap is set.

  - `data.strategy.next_active_window_start` (string)
    UTC time the next active daypart window will open. Populated only when
day_parts_check is `warning` (currently outside every active window); null
otherwise (including when no dayparting is configured).

  - `data.strategy.deals` (object)
    Per-deal configuration consistency checks for the PMP deals the strategy
targets (resolved from both direct deals and deal groups). Individual deal
results are informational; `summary` carries the strategy-level rollup, which
is driven by the supply-path logic: when open auction is enabled, deal issues
are downgraded to warnings because an alternative supply path exists; for a
deal-only strategy the summary fails when no deal is fully healthy.

  - `data.strategy.deals.summary` (object)
    Strategy-level rollup. `pass` when all targeted deals are healthy (or when
no deals are targeted — not applicable); `warning` when some deals have
issues but a viable supply path remains; `fail` for a deal-only strategy
with no viable deal. A warning-level FreeWheel creative approval status
(pending / not submitted / partially rejected) counts as an issue but keeps
the deal viable; a FreeWheel PG deal with every assigned creative rejected
is not viable. Also `warning` when deal data is unavailable.

  - `data.strategy.deals.items` (array)
    One entry per targeted deal. Empty when no deals are targeted or deal data is unavailable.

  - `data.strategy.deals.items.deal_id` (integer)

  - `data.strategy.deals.items.deal_name` (string)
    The deal's name as returned by the deals service.

  - `data.strategy.deals.items.deal_identifier` (string)
    The deal's external deal identifier; empty string when not configured.

  - `data.strategy.deals.items.supply_source_id` (integer)

  - `data.strategy.deals.items.floor_vs_bid_check` (object)
    Compares strategy max bid against the deal floor price; the message includes both values.

  - `data.strategy.deals.items.creative_format_check` (object)
    Whether at least one assigned creative matches the deal's required format/channel (pass when the deal specifies no format).

  - `data.strategy.deals.items.creative_approval_check` (object)
    FreeWheel creative approval readiness for this deal. FreeWheel gates delivery
on per-creative approval for PG deals only (never open auction or standard
PMP), so every non-FreeWheel or non-PG deal passes with "not required". For a
FreeWheel PG deal, the strategy's assigned creatives are bucketed by their
latest FreeWheel approval status: `fail` when every assigned creative is
rejected (confirmed block), `warning` when some are rejected or none are
approved yet (pending / not submitted), `pass` when at least one creative is
approved and none are rejected.

  - `data.strategy.creative_approval_readiness` (object)
    Strategy-context creative approval readiness. Cross-references each
assigned creative's latest per-exchange approval status against the approval-gated
exchanges the strategy targets (Google AdX, Xandr). Individual exchange results are
informational; `summary` carries the rollup. A creative can still serve on an exchange
unless it is rejected there — pending, pending > 48h and not-submitted are non-blocking.
A would-be blocker is downgraded to a warning when any alternative serving path remains
(another approval-gated exchange that can still serve, a targeted RTB-enabled non-approval
exchange that can accept open-auction bids, or run_on_all_exchanges).

  - `data.strategy.creative_approval_readiness.summary` (object)
    Strategy-level rollup. `pass` when at least one approved creative exists on every
targeted approval-gated exchange (or none are targeted — not applicable). `warning`
when the eligible creative pool is reduced but a viable serving path remains, or
creatives are only pending. `fail` when every targeted approval-gated exchange has
all assigned creatives rejected and no alternative supply path exists.

  - `data.strategy.creative_approval_readiness.items` (array)
    One entry per targeted approval-gated exchange. Empty when none are targeted or no creatives are assigned.

  - `data.strategy.creative_approval_readiness.items.supply_source_id` (integer)

  - `data.strategy.creative_approval_readiness.items.exchange_name` (string)

  - `data.strategy.creative_approval_readiness.items.approved_count` (integer)

  - `data.strategy.creative_approval_readiness.items.rejected_count` (integer)

  - `data.strategy.creative_approval_readiness.items.pending_count` (integer)
    Creatives PENDING or PENDING > 48 Hours on this exchange, combined.

  - `data.strategy.creative_approval_readiness.items.not_submitted_count` (integer)
    Creatives with no approval record for this exchange (treated as N/A).

  - `data.strategy.creative_approval_readiness.items.total_creatives` (integer)

  - `data.creative` (object)
    Collective creative diagnostics. A strategy has many creatives via the
strategy_concepts → concepts → atomic_creatives path, so there is no single
creative to point at — only the collective check outcomes. Per-exchange
creative approval is reported under strategy.creative_approval_readiness.

  - `data.creative.activity_check` (object)
    pass if ≥1 attached creative is active and within its start/end date window.

  - `data.creative.media_type_check` (object)
    warning when the strategy's assigned creatives do not match its configured
media type (e.g. a video strategy with only display creatives); pass otherwise,
or when no creatives are assigned / the strategy has no media type set.

  - `meta` (object)

  - `meta.status` (string, required)
    Example: success

## Response 400 fields (application/json):

  - `errors` (array, required)

  - `errors.code` (string)

  - `errors.sub_code` (string)
    Optional identifier that refines the generic `code` category (e.g. `html5-noscript-tag`). Present on HTML5 upload/preview validation errors; absent otherwise.

  - `errors.field` (string)
    Optional when it is a schema error

  - `errors.message` (string)

  - `meta` (object, required)

  - `meta.status` (string, required)

## Response 401 fields (application/json):

  - `errors` (array, required)

  - `errors.code` (string)

  - `errors.sub_code` (string)
    Optional identifier that refines the generic `code` category (e.g. `html5-noscript-tag`). Present on HTML5 upload/preview validation errors; absent otherwise.

  - `errors.field` (string)
    Optional when it is a schema error

  - `errors.message` (string)

  - `meta` (object, required)

  - `meta.status` (string, required)

## Response 403 fields (application/json):

  - `errors` (array, required)

  - `errors.code` (string)

  - `errors.sub_code` (string)
    Optional identifier that refines the generic `code` category (e.g. `html5-noscript-tag`). Present on HTML5 upload/preview validation errors; absent otherwise.

  - `errors.field` (string)
    Optional when it is a schema error

  - `errors.message` (string)

  - `meta` (object, required)

  - `meta.status` (string, required)

## Response 404 fields (application/json):

  - `errors` (array, required)

  - `errors.code` (string)

  - `errors.sub_code` (string)
    Optional identifier that refines the generic `code` category (e.g. `html5-noscript-tag`). Present on HTML5 upload/preview validation errors; absent otherwise.

  - `errors.field` (string)
    Optional when it is a schema error

  - `errors.message` (string)

  - `meta` (object, required)

  - `meta.status` (string, required)

