Safety

Read an account's safety policy

Returns every configurable safety field for every budget row of this account: ceiling, bands, window, posture, warm-up, and where each value was inherited from. Fields, posture and precedence: /reference/safety.

get/v1/{account_id}/safety-policy

Request

  • Base URL: https://api.curviate.com
  • URL: https://api.curviate.com/v1/{account_id}/safety-policy
  • Auth: HTTP bearer

Path parameters

account_idstring required

The account ID (acc_...) whose safety policy to read.

Response

The account's full safety policy: every configurable field for every budget row, in one response. Any row whose configured value is above the Curviate default carries an over_default entry naming the value, the default and the source class of that default. Two top-level fields are DERIVED rather than configured: warm_up says whether Curviate is currently holding this account below its configured ceilings and by how much, and activity_window says which timezone the window is read in and whether it is switched on at all.

object'safety_policy'

Response type discriminator.

account_idstring

The account this policy governs.

limit_profile'basic' | 'premium' | 'sales_navigator' | 'recruiter'

Which set of Curviate defaults every row below is resolved from. Each profile inherits the one before it and raises a few rows: premium adds a daily invitation band and open-profile InMail, sales_navigator raises profile views and search, recruiter raises profile views again. This is the platform product active on the account, not the Curviate seat entitlement. The two can disagree, and this is the one that governs the numbers. The elevated Sales Navigator and Recruiter figures apply only to calls made through the matching interface, the /v1/{account_id}/sales-navigator/... and /v1/{account_id}/recruiter/... operations, and Curviate holds each call to the figure for the interface it goes through. The numbers here are therefore the ones a standard-interface call is held to, on every profile; a call through one of those operations resolves from the elevated set instead, and each row publishes that figure as interface_ceiling.

limit_profile_source'default' | 'detected' | 'operator'

Where limit_profile came from. detected: Curviate read it from LinkedIn, at limit_profile_detected_at. operator: it was set through this operation and holds until you release it by sending limit_profile_source: "default" on this operation, on its own (changing limit_profile and releasing it in the same request is refused). Nothing else overrides it: a connect, a reconnect and an account read all leave a pinned value exactly as you set it. default: it has never been observed, so the value is the seeded basic and says nothing about the account; Curviate detects it on the account's next read or connect.

limit_profile_detected_atstring date-time nullable

When Curviate last read limit_profile from LinkedIn, whether or not the value changed. Null until it has. Curviate re-reads it on connect and, at most once a day, on an account read, so a subscription change reaches the numbers without a reconnect. While limit_profile_source is operator neither the value nor this timestamp moves, until you release the pin.

posture'warn' | 'enforce'

The account's default posture, before any per-row override.

posture_source'account' | 'tenant' | 'default'

Whether that default is the account's own, the tenant's, or the built-in warn.

tenant_default_posture'warn' | 'enforce' | 'null' nullable

The workspace-wide posture default every account in the tenant inherits, or null when none is set. Always present, and separate from posture on purpose: when this account overrides the tenant default, a change to the tenant default does not move posture, and this field is how you can still see it took effect.

Example response

{
  "safety_warning": {
    "row": "profile_views",
    "reset_at": "2026-09-05T00:00:00.000Z",
    "hint": {
      "parameter": "profile_views.ceiling",
      "message": "This account is at its ceiling for profile_views. This action went through because profile_views.posture is warn, and it counted: 101 of 100 this window. Raise profile_views.ceiling, or wait for the window to reset at 2026-09-05T00:00:00.000Z."
    },
    "reason": "ceiling",
    "blocked": false
  }
}

Changes

No recorded changes to this operation across all 1 revision of this API.