openapi: 3.2.0 info: title: Gtm Linkedin Account Smart Limits API version: '1.0' contact: name: GTM API url: https://gtm-api.com email: support@gtm-api.com license: name: Proprietary url: https://gtm-api.com/license description: 'Operations tagged linkedin_account_smart_limits across 2 of this provider''s published API definitions: gtm-api-openapi-openapi.yml, gtm-api-linkedin-openapi.yaml. Each path carries the servers of the definition it was published in.' servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway security: - BearerJwt: [] TeamSid: [] tags: - name: linkedin_account_smart_limits description: Registry package `mcp.linkedin/linkedin_account_smart_limits`, served on MCP mount `linkedin.accounts`. paths: /api/linkedin-account-smart-limits/search: post: operationId: search_linkedin_account_smart_limits summary: Search LinkedIn account smart limits description: 'List per-limit_type policy rows (one account owns 15 public buckets: send_connection_requests, send_messages, send_inmails, scraping, enrichment, custom_request, …) with filters, sorting, cursor pagination and a counts block (status / limit_type breakdowns). Whether the warmup governs a row is the ACCOUNT''s smart_limits_enabled, not a row field. Use for: "which limits are at their daily cap / held / blocked by LinkedIn" (status filter; held means the daily budget is spent), "can account X still send InMails today" (filter linkedin_account_sid + limit_type, read status + daily_limit − done_today_count), fleet capacity, smart-limit adoption rate. Every row also carries recommended_daily_limit / recommended_delay_in_seconds (what the platform would run this bucket at for THIS account) and risk_level (none | elevated | ban_likely) for the values currently set. Single-row case = search(filter:{linkedin_account_sid, limit_type}, page_size:1). No q. include[]: linkedin_account, linkedin_account_quota_hits. Contract: - MCP tool `search_linkedin_account_smart_limits`, registry package `mcp.linkedin/linkedin_account_smart_limits`, mount `linkedin.accounts`. - Operation `search`, response envelope `search`. - Flags: read only.' tags: - linkedin_account_smart_limits requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/SearchLinkedinAccountSmartLimitsRequest' responses: '200': description: '`search` success envelope.' content: application/json: schema: $ref: '#/components/schemas/SearchLinkedinAccountSmartLimitsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: search_linkedin_account_smart_limits x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_account_smart_limits x-gtm-operation: search x-gtm-envelope: search x-gtm-availability: ga x-gtm-dangerous: false x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-account-smart-limits/{sid}: patch: operationId: update_linkedin_account_smart_limit summary: Update LinkedIn account smart limit description: 'GATE: on a governed account (smart_limits_enabled true, the default) daily_limit / delay_in_seconds belong to the warmup; moving either is 409 smart_limits_governed: never promise a raised cap there. target_limit only BOUNDS (the row follows min(smart_limit, target_limit)): a target above the warmup ceiling changes nothing today; a young or dormant account sits at 1..2 for weeks (see warmup_breakdown). The other way: set_linkedin_account_smart_limits({enabled:false}), said out loud as removing ban protection. One row (daily_limit / target_limit / delay_in_seconds / learning_enabled; one field OR reset_hold:true). Switch off: nothing refused; read the row''s recommended_* first, 2x (or half the delay) is "elevated", beyond that "ban_likely", warn so. A spent budget is "held": raising daily_limit alone does not clear it, pass reset_hold:true too; it resumes once the cap exceeds done_today_count (governed rows re-hold at once). System fields are rejected; a LinkedIn lock is not resettable. Contract: - MCP tool `update_linkedin_account_smart_limit`, registry package `mcp.linkedin/linkedin_account_smart_limits`, mount `linkedin.accounts`. - Operation `update`, response envelope `update`. - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API.' tags: - linkedin_account_smart_limits parameters: - name: sid in: path required: true description: Smart-limit row sid (ln_sm_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_sm_ description: Smart-limit row sid (ln_sm_…). requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/UpdateLinkedinAccountSmartLimitRequest' responses: '200': description: '`update` success envelope.' content: application/json: schema: $ref: '#/components/schemas/UpdateLinkedinAccountSmartLimitResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: update_linkedin_account_smart_limit x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_account_smart_limits x-gtm-operation: update x-gtm-envelope: update x-gtm-availability: ga x-gtm-dangerous: true x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: complex servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-account-smart-limits/{sid}/reset-hold: post: operationId: reset_linkedin_account_smart_limit_hold summary: Reset LinkedIn account smart-limit hold description: 'Clear OUR platform-side pause (hold_till = null) on one row. On a spent budget (done_today_count >= daily_limit) the saturation latch re-holds at once, so this is a no-op that stays held: the cap has to grow first. On a HAND-MANAGED account (smart_limits_enabled false) prefer update({daily_limit:, reset_hold:true}), which raises the cap and resumes atomically. On a GOVERNED account (the default) daily_limit is the warmup''s and cannot be raised by hand: target_limit only bounds the cap, the warmup ceiling grows with account age and sent activity across snapshots, and the ramp lifts the latch by itself once its recomputed cap outgrows done_today_count, so nothing resumes today. This action resumes WITHOUT changing the limit (meaningful only when done_today_count < daily_limit, e.g. a systemic hold). Idempotent. Does NOT touch done_today_count or linkedin_quota_hit_till: a LinkedIn-side hard lock cannot be reset from the public surface (result.new_status stays linkedin_blocked while that clock runs). Contract: - MCP tool `reset_linkedin_account_smart_limit_hold`, registry package `mcp.linkedin/linkedin_account_smart_limits`, mount `linkedin.accounts`. - Operation `action`, response envelope `action`. - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API.' tags: - linkedin_account_smart_limits parameters: - name: sid in: path required: true description: Smart-limit row sid (ln_sm_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_sm_ description: Smart-limit row sid (ln_sm_…). responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/ResetLinkedinAccountSmartLimitHoldResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: reset_linkedin_account_smart_limit_hold x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_account_smart_limits x-gtm-operation: action x-gtm-envelope: action x-gtm-availability: ga x-gtm-dangerous: true x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway components: schemas: McpError: type: object properties: success: type: boolean enum: - false error: type: object properties: code: type: string enum: - 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 - internal_error - service_unavailable - not_implemented message: type: string recoverable: type: boolean suggestion: type: string field_errors: type: object additionalProperties: type: array items: type: object properties: rule: type: string message: type: string required: - rule - message blockers: type: array items: type: object properties: type: type: string description: Machine-readable blocker type (active_flow, pending_tasks, …). severity: type: string enum: - hard - soft description: hard = external action required; soft = acknowledge is enough. description: type: string entity_sid: type: - string - 'null' count: type: integer resolution: type: string description: 'Hard: tool name to call. Soft: code for acknowledge[].' resolution_hint: type: string required: - type - severity - description - entity_sid - resolution - resolution_hint context: type: object additionalProperties: {} required: - code - message - recoverable meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: 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: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms required: - success - error UpdateLinkedinAccountSmartLimitResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - update item: type: object properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string limit_type: type: string enum: - send_connection_requests - networking_general - send_messages - send_inmails - messaging_general - comment_posts - react_posts - endorse_skills - visit_profiles - edit_profile - self_account_sync - scraping - enrichment - posting - custom_request - data_requests daily_limit: type: number smart_limit: type: - number - 'null' target_limit: type: - number - 'null' delay_in_seconds: type: number done_today_count: type: number done_7d_count: type: - number - 'null' last_reset_at: type: string status: type: string enum: - active - held - linkedin_blocked hold_till: type: - string - 'null' linkedin_quota_hit_till: type: - string - 'null' created_at: type: string updated_at: type: string required: - sid - team_sid - linkedin_account_sid - limit_type - daily_limit - smart_limit - target_limit - delay_in_seconds - done_today_count - last_reset_at - status - hold_till - linkedin_quota_hit_till - created_at - updated_at updated_fields: type: array items: type: string previous_values: type: object additionalProperties: {} meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: 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: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms required: - success - operation - item - updated_fields - previous_values - meta SearchLinkedinAccountSmartLimitsRequest: type: object description: Request body of `search_linkedin_account_smart_limits`. properties: filter: type: object properties: sid: type: object properties: eq: type: string in: type: array items: type: string additionalProperties: false linkedin_account_sid: type: object properties: eq: type: string in: type: array items: type: string additionalProperties: false limit_type: type: object properties: eq: type: string ne: type: string in: type: array items: type: string nin: type: array items: type: string additionalProperties: false daily_limit: type: object properties: eq: type: integer ne: type: integer gte: type: integer lte: type: integer gt: type: integer lt: type: integer additionalProperties: false smart_limit: type: object properties: eq: type: integer ne: type: integer gte: type: integer lte: type: integer gt: type: integer lt: type: integer is_null: type: boolean additionalProperties: false target_limit: type: object properties: eq: type: integer ne: type: integer gte: type: integer lte: type: integer gt: type: integer lt: type: integer is_null: type: boolean additionalProperties: false delay_in_seconds: type: object properties: eq: type: integer ne: type: integer gte: type: integer lte: type: integer gt: type: integer lt: type: integer additionalProperties: false learning_enabled: type: object properties: eq: type: boolean additionalProperties: false description: false = the adaptive ceiling is pinned off for this row. learned_ceiling: type: object properties: eq: type: integer ne: type: integer gte: type: integer lte: type: integer gt: type: integer lt: type: integer is_null: type: boolean additionalProperties: false description: The cap LinkedIn refusals taught this bucket; is_null:false = every row the learner has lowered. learned_ceiling_source: type: object properties: eq: type: string ne: type: string in: type: array items: type: string nin: type: array items: type: string is_null: type: boolean additionalProperties: false description: backoff (a LinkedIn refusal lowered it) | probe (a clean streak raised it). learned_ceiling_updated_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false probe_not_before: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false description: When the learner may next try a higher ceiling. clean_saturation_streak: type: object properties: eq: type: integer ne: type: integer gte: type: integer lte: type: integer gt: type: integer lt: type: integer additionalProperties: false description: Days in a row the bucket spent its whole budget without a LinkedIn refusal. done_today_count: type: object properties: eq: type: integer ne: type: integer gte: type: integer lte: type: integer gt: type: integer lt: type: integer additionalProperties: false description: Live read of today's usage. last_reset_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string additionalProperties: false status: type: object properties: eq: type: string ne: type: string in: type: array items: type: string nin: type: array items: type: string additionalProperties: false description: 'Primary state filter: active | held | linkedin_blocked (held = daily budget spent OR a live hold, the same thing).' hold_till: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false description: Platform-side pause clock. linkedin_quota_hit_till: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false description: LinkedIn-block clock. created_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string additionalProperties: false updated_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string additionalProperties: false include: type: array items: type: string enum: - linkedin_account - linkedin_account_quota_hits description: Relations to eager-load (see entity Includes). sort: type: object properties: field: type: string enum: - created_at - updated_at - last_reset_at - daily_limit - smart_limit - target_limit - done_today_count - status - hold_till - linkedin_quota_hit_till direction: type: string enum: - asc - desc description: Default desc. required: - field page_size: type: integer minimum: 0 maximum: 200 description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst. cursor: type: - string - 'null' description: Opaque forward cursor from a previous response pagination.next_cursor. SearchLinkedinAccountSmartLimitsResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - search items: type: array items: type: object properties: item: type: object properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string limit_type: type: string enum: - send_connection_requests - networking_general - send_messages - send_inmails - messaging_general - comment_posts - react_posts - endorse_skills - visit_profiles - edit_profile - self_account_sync - scraping - enrichment - posting - custom_request - data_requests daily_limit: type: number smart_limit: type: - number - 'null' target_limit: type: - number - 'null' delay_in_seconds: type: number done_today_count: type: number done_7d_count: type: - number - 'null' last_reset_at: type: string status: type: string enum: - active - held - linkedin_blocked hold_till: type: - string - 'null' linkedin_quota_hit_till: type: - string - 'null' created_at: type: string updated_at: type: string required: - sid - team_sid - linkedin_account_sid - limit_type - daily_limit - smart_limit - target_limit - delay_in_seconds - done_today_count - last_reset_at - status - hold_till - linkedin_quota_hit_till - created_at - updated_at included: type: object additionalProperties: {} required: - item - included pagination: type: object properties: next_cursor: type: - string - 'null' has_more: type: boolean total_count: type: - integer - 'null' required: - next_cursor - has_more - total_count applied_filters: type: object additionalProperties: {} includes: type: array items: type: string meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: 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: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms counts: type: object properties: {} required: - success - operation - items - pagination - applied_filters - includes - meta UpdateLinkedinAccountSmartLimitRequest: type: object description: Request body of `update_linkedin_account_smart_limit`. properties: daily_limit: type: integer minimum: 1 maximum: 1000 description: Active cap (1..1000). target_limit: type: - integer - 'null' minimum: 0 maximum: 1000 description: Warm-up ceiling; null clears it. learning_enabled: type: boolean description: Whether the adaptive ceiling keeps moving. false pins learned_ceiling where it stands; the quota-hit block clock still arms either way, so this is a tuning knob, not a safety switch. delay_in_seconds: type: integer minimum: 1 maximum: 3600 description: The flat delay in seconds between any two calls of the bucket (1..3600), varied by up to 20% per call; nothing fires back-to-back. An undo verb (unreact, delete a comment or post, unendorse, unfollow, withdraw) waits 2 s instead. reset_hold: type: boolean description: Clear the daily-saturation hold in the same call (the atomic "raise the limit AND resume now"). Only resumes if the new daily_limit > done_today_count; otherwise the row re-holds. Never touches a LinkedIn-side lock. ResetLinkedinAccountSmartLimitHoldResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - action action: type: string description: kebab-case verb; matches the route segment. item: type: - object - 'null' properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string limit_type: type: string enum: - send_connection_requests - networking_general - send_messages - send_inmails - messaging_general - comment_posts - react_posts - endorse_skills - visit_profiles - edit_profile - self_account_sync - scraping - enrichment - posting - custom_request - data_requests daily_limit: type: number smart_limit: type: - number - 'null' target_limit: type: - number - 'null' delay_in_seconds: type: number done_today_count: type: number done_7d_count: type: - number - 'null' last_reset_at: type: string status: type: string enum: - active - held - linkedin_blocked hold_till: type: - string - 'null' linkedin_quota_hit_till: type: - string - 'null' created_at: type: string updated_at: type: string required: - sid - team_sid - linkedin_account_sid - limit_type - daily_limit - smart_limit - target_limit - delay_in_seconds - done_today_count - last_reset_at - status - hold_till - linkedin_quota_hit_till - created_at - updated_at result: type: object additionalProperties: {} meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: 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: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms required: - success - operation - action - item - result - meta responses: McpServerError: description: MCP error envelope with `error.code` internal_error or service_unavailable. content: application/json: schema: $ref: '#/components/schemas/McpError' McpClientError: description: 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. content: application/json: schema: $ref: '#/components/schemas/McpError' securitySchemes: BearerJwt: type: http scheme: bearer bearerFormat: JWT description: Access token issued by gtm.service.id. Its `access_identity` claim carries `team_sid`, `actor_sid` and `actor_type`, and that team scope is authoritative. TeamSid: type: apiKey in: header name: Team-SID description: Team scope for tokens that do not carry one. Ignored when the token already names a team. x-refined-from: - gtm-api-openapi-openapi.yml - gtm-api-linkedin-openapi.yaml