---
title: "Set sender profile smart limits"
method: POST
path: "/api/sender-profiles/{sid}/limits/linkedin/smart-limits"
tags: ["sender_profiles"]
---

# Set sender profile smart limits

`POST /api/sender-profiles/{sid}/limits/linkedin/smart-limits`

## Request

- Base URL: `https://beta.getsales.io/unibox/v1`
- URL: `https://beta.getsales.io/unibox/v1/api/sender-profiles/{sid}/limits/linkedin/smart-limits`
- Auth: HTTP bearer and API key in header `Team-SID`

Switch gtm's smart limits on or off for the sender profile's LinkedIn account, every bucket at once (gtm keeps one switch per account; the per-row field mirrors it, read-only). Answers the limits after the write (read_sender_profile_limits' shape). Use it instead of update_sender_profile_linkedin_limit for the switch; a real flip puts every row back on gtm's platform defaults first. Refusals in error.context.reason: 403 gtm_scope_missing, 429 gtm_busy, 503 gtm_unavailable, 409 gtm_refused.

Contract:
- MCP tool `set_sender_profile_linkedin_smart_limits`, registry package `mcp.unibox/sender_profiles`, mount `unibox.sender-profiles`.
- Operation `action`, response envelope `action`.
- Flags: none.

## Path parameters

- `sid` string, required: Sender profile sid (ub_sp_…).

## Request body

- SetSenderProfileLinkedinSmartLimitsRequest: Request body of `set_sender_profile_linkedin_smart_limits`.
  - `enabled` boolean, required: true lets gtm warm the account up and lower the effective caps on its own signals; false leaves every bucket at the number it has. A real flip puts the rows back on gtm's platform defaults first.

## Response `200`

`action` success envelope.

- SetSenderProfileLinkedinSmartLimitsResponse
  - `success` true, required
  - `operation` 'action', required
  - `action` string, required: kebab-case verb; matches the route segment.
  - `item` object, nullable, required
  - `result` object, required
    - `linkedin` object[], required: One row per outreach action type, read live from gtm. Empty on a sender profile with no LinkedIn account.
      - `sid` string, required: The smart-limit row (ln_sm_…): pass it to update_sender_profile_linkedin_limit.
      - `limit_type` string, required: The action the row budgets: send_connection_requests, send_messages, send_inmails, visit_profiles, react_posts, comment_posts, endorse_skills, and the two umbrella buckets networking_general and messaging_general.
      - `daily_limit` integer, nullable, required
      - `target_limit` integer, nullable, required
      - `smart_limit` integer, nullable, required: The cap gtm is actually applying today when smart limits are on.
      - `learned_ceiling` integer, nullable, required: What the learner has worked the account up to.
      - `delay_in_seconds` integer, nullable, required
      - `batch_size` integer, nullable, required
      - `done_today_count` integer, nullable, required
      - `done_7d_count` integer, nullable, required
      - `smart_limits_enabled` boolean, nullable, required: The account's switch, mirrored on every row (gtm keeps one per account).
      - `learning_enabled` boolean, nullable, required
      - `status` string, nullable, required: gtm's own row status, e.g. active or held.
      - `hold_till` string, nullable, required: ISO 8601 UTC: nothing of this type goes out before then. reset_hold lifts it.
      - `linkedin_quota_hit_till` string, nullable, required: ISO 8601 UTC: LinkedIn's own quota refuses until then.
      - `last_reset_at` string, nullable, required
    - `smart_limits_enabled` boolean, nullable, required: gtm's account-wide smart-limits switch (one per account); every row's smart_limits_enabled mirrors it. Flip it with set_sender_profile_linkedin_smart_limits. null on a sender profile with no LinkedIn account, or one gtm's roster does not list.
    - `mailboxes` object[], required: Each mailbox's limits off the sender profile mirror (gtm keeps no per-mailbox counters to show).
      - `email_account_sid` string, required
      - `address` string, nullable, required
      - `status` string, nullable, required
      - `is_primary` boolean, nullable, required
      - `sending_limits` object, nullable, required
      - `warmup_config` object, nullable, required
  - `meta` object, required
    - `trace_id` string, required: UUID v7; same 128-bit value as the X-Trace-Id header.
    - `span_id` string, required: 16 hex chars, root span of this request.
    - `timestamp` string, required: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
    - `duration_ms` integer, required: Server-side wall clock.
    - `team_sid` string, nullable: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends.
    - `actor_type` string, nullable: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.

## Other responses

- `4XX`: MCP error envelope. `error.code` is one of validation_failed, nothing_to_update, not_found, relation_not_found, invalid_transition, limit_exceeded, payment_required, duplicate_rejected, conflict, delete_blocked, unauthorized, forbidden, rate_limited, not_implemented.
- `5XX`: MCP error envelope with `error.code` internal_error or service_unavailable.

---

[API](https://skmtc.dev/getsales/apis/getsales-public-contract-gs-service-unibox.md) - [All operations](https://skmtc.dev/getsales/apis/getsales-public-contract-gs-service-unibox/llms.txt) - [OpenAPI document](https://skmtc.dev/getsales/apis/getsales-public-contract-gs-service-unibox/revisions/8f1bc317897f?raw)
