{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/api-evangelist/gtm-api/main/json-schema/gtm-api-get-linkedin-account-my-sales-nav-notifications-response-schema.json", "title": "GetLinkedinAccountMySalesNavNotificationsResponse", "x-generated": "2026-10-18", "x-method": "derived", "x-generator": "derive-json-schema.py", "x-source": "openapi/_original/gtm-api-openapi-openapi.yml#/components/schemas/GetLinkedinAccountMySalesNavNotificationsResponse", "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" }, "antidetect_browser_sid": { "type": "string" }, "status": { "type": "string", "enum": [ "new", "initial_syncing", "active", "sync_failed", "shared_out", "subscription_required" ], "description": "Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads \"active\" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it)." }, "account_share_sid": { "type": [ "string", "null" ] }, "share_role": { "type": [ "string", "null" ], "enum": [ "owner", "holder", "giver", "receiver" ] }, "ln_id": { "type": [ "string", "null" ] }, "ln_member_id": { "type": [ "string", "null" ] }, "sn_id": { "type": [ "string", "null" ] }, "nickname": { "type": [ "string", "null" ] }, "recruiter_seat_id": { "type": [ "string", "null" ], "description": "The account's own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: ['recruiter']." }, "recruiter_contract_id": { "type": [ "string", "null" ], "description": "The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each." }, "recruiter_session_expires_at": { "type": [ "string", "null" ], "description": "When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn's li_a cookie, read by the premium check from the account's running browser (the plugin's own cookie jar; the antidetect vendor's cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account's recruiter_status turns signed_out (the session sweep confirms it in the browser's cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account's page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict)." }, "full_name": { "type": [ "string", "null" ] }, "avatar_url": { "type": [ "string", "null" ] }, "label": { "type": [ "string", "null" ] }, "has_premium": { "type": "boolean" }, "has_sn": { "type": "boolean" }, "recruiter_status": { "type": [ "string", "null" ], "enum": [ "active", "signed_out" ], "description": "The account's LinkedIn Recruiter status. null = no Recruiter seat (the premium check's recruiter probe said no, or never ran). active = the seat's Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account's page (the 409's context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder." }, "smart_limits_enabled": { "type": "boolean" }, "inmail_credits": { "type": [ "number", "null" ], "description": "The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero." }, "premium_inmail_credits": { "type": [ "number", "null" ], "description": "The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero." }, "recruiter_inmail_credits": { "type": [ "number", "null" ], "description": "The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero." }, "last_premium_check_at": { "type": [ "string", "null" ] }, "last_connections_sync_at": { "type": [ "string", "null" ] }, "last_conversations_sync_at": { "type": [ "string", "null" ] }, "last_sales_navigator_conversations_sync_at": { "type": [ "string", "null" ] }, "last_recruiter_conversations_sync_at": { "type": [ "string", "null" ] }, "last_connection_requests_sync_at": { "type": [ "string", "null" ] }, "last_connection_invitations_sync_at": { "type": [ "string", "null" ] }, "last_followers_sync_at": { "type": [ "string", "null" ] }, "last_snapshot_at": { "type": [ "string", "null" ] }, "initial_sync_completed_at": { "type": [ "string", "null" ] }, "initial_sync_held_at": { "type": [ "string", "null" ], "description": "When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync." }, "initial_sync_hold_reason": { "type": [ "string", "null" ], "description": "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit." }, "last_heartbeat_at": { "type": [ "string", "null" ] }, "sync_config": { "type": [ "object", "null" ], "properties": { "entries": { "type": "object", "properties": { "connections": { "type": "object", "properties": { "interval_minutes": { "type": "number" } }, "required": [ "interval_minutes" ] }, "conversations": { "type": "object", "properties": { "interval_minutes": { "type": "number" } }, "required": [ "interval_minutes" ] }, "sales_navigator_conversations": { "type": "object", "properties": { "interval_minutes": { "type": "number" } }, "required": [ "interval_minutes" ] }, "recruiter_conversations": { "type": "object", "properties": { "interval_minutes": { "type": "number" } }, "required": [ "interval_minutes" ] }, "connection_requests": { "type": "object", "properties": { "interval_minutes": { "type": "number" } }, "required": [ "interval_minutes" ] }, "connection_invitations": { "type": "object", "properties": { "interval_minutes": { "type": "number" } }, "required": [ "interval_minutes" ] }, "premium_check": { "type": "object", "properties": { "interval_minutes": { "type": "number" } }, "required": [ "interval_minutes" ] }, "snapshot_check": { "type": "object", "properties": { "interval_minutes": { "type": "number" } }, "required": [ "interval_minutes" ] } }, "description": "Per-track sync-interval overrides, keyed by sync track." }, "timezone": { "type": "string", "description": "IANA timezone the window is evaluated in." }, "window": { "type": "array", "items": { "type": "object", "properties": { "day_of_week": { "type": "integer", "minimum": 1, "maximum": 7 }, "start_minute": { "type": "integer", "minimum": 0, "maximum": 1439 }, "end_minute": { "type": "integer", "minimum": 1, "maximum": 1440 } }, "required": [ "day_of_week", "start_minute", "end_minute" ] }, "description": "Weekly sync-activity window blocks; empty = always open." } } }, "webhook_config": { "type": [ "object", "null" ], "properties": { "connections": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "since": { "type": [ "string", "null" ] } }, "required": [ "enabled", "since" ] }, "connection_requests": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "since": { "type": [ "string", "null" ] } }, "required": [ "enabled", "since" ] }, "connection_invitations": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "since": { "type": [ "string", "null" ] } }, "required": [ "enabled", "since" ] }, "conversations": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "since": { "type": [ "string", "null" ] } }, "required": [ "enabled", "since" ] }, "sales_navigator_conversations": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "since": { "type": [ "string", "null" ] } }, "required": [ "enabled", "since" ] }, "recruiter_conversations": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "since": { "type": [ "string", "null" ] } }, "required": [ "enabled", "since" ] }, "messages": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "since": { "type": [ "string", "null" ] } }, "required": [ "enabled", "since" ] }, "followers": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "since": { "type": [ "string", "null" ] } }, "required": [ "enabled", "since" ] }, "snapshot": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "since": { "type": [ "string", "null" ] } }, "required": [ "enabled", "since" ] }, "strike_log": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "since": { "type": [ "string", "null" ] } }, "required": [ "enabled", "since" ] }, "limits": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "since": { "type": [ "string", "null" ] } }, "required": [ "enabled", "since" ] } } }, "created_by": { "type": "object", "properties": { "actor_type": { "type": "string", "enum": [ "user", "support", "api_key", "system", "agent" ] }, "actor_sid": { "type": [ "string", "null" ] }, "team_sid": { "type": "string" }, "permissions": { "type": "object", "additionalProperties": {} }, "request_sid": { "type": [ "string", "null" ] }, "reason": { "type": [ "string", "null" ] } }, "required": [ "actor_type", "actor_sid", "team_sid", "permissions", "reason" ] }, "created_at": { "type": "string" }, "updated_at": { "type": "string" }, "deleted_at": { "type": [ "string", "null" ] } }, "required": [ "sid", "team_sid", "antidetect_browser_sid", "status", "account_share_sid", "share_role", "ln_id", "ln_member_id", "sn_id", "nickname", "recruiter_seat_id", "recruiter_contract_id", "recruiter_session_expires_at", "full_name", "avatar_url", "label", "has_premium", "has_sn", "recruiter_status", "smart_limits_enabled", "inmail_credits", "premium_inmail_credits", "recruiter_inmail_credits", "last_premium_check_at", "last_connections_sync_at", "last_conversations_sync_at", "last_sales_navigator_conversations_sync_at", "last_recruiter_conversations_sync_at", "last_connection_requests_sync_at", "last_connection_invitations_sync_at", "last_followers_sync_at", "last_snapshot_at", "initial_sync_completed_at", "initial_sync_held_at", "initial_sync_hold_reason", "last_heartbeat_at", "sync_config", "webhook_config", "created_by", "created_at", "updated_at", "deleted_at" ] }, "result": { "type": "object", "properties": { "status": { "type": "string", "description": "Plugin dispatch status for this read." }, "sales_nav_notifications": { "type": "object", "properties": { "elements": { "type": "array", "items": { "type": "object", "properties": { "notification_urn": { "type": "string", "description": "urn:li:notificationV2:(...). The row identity, and the only field always present." }, "type": { "type": [ "string", "null" ], "description": "Alert kind. Captured so far: ACCOUNT_SHARED_UPDATE, LEAD_SHARED_UPDATE, LEAD_ACCEPTED_INVITATION, LEAD_POSITION_CHANGE_NEW_COMPANY, LEAD_POSITION_CHANGE_SAME_COMPANY, LEAD_PROFILE_VIEW_SIGNAL, EMPLOYEE_AT_ACCOUNT_PROFILE_VIEW. OPEN vocabulary: never validate against that list, LinkedIn adds kinds." }, "headline": { "type": [ "string", "null" ], "description": "Rendered headline, e.g. \"Suggested lead: Jane shared a post\"." }, "body_text": { "type": [ "string", "null" ], "description": "The shared post text. Shared-update alerts only." }, "subline": { "type": [ "string", "null" ], "description": "Secondary line, e.g. \"Acme Corp, Head of Sales\"." }, "published_at": { "type": [ "integer", "null" ], "description": "UNIX epoch MILLISECONDS, passed through exactly as LinkedIn sent it. The ONLY machine-readable timestamp across all three self feeds, and the field to sort on, because the feed itself comes back ordered by relevance." }, "read": { "type": [ "boolean", "null" ] }, "score": { "type": [ "number", "null" ], "description": "LinkedIn's own relevance score for the alert. This is what the feed order is built on." }, "action_target": { "type": [ "string", "null" ], "description": "Main click-through: the post for a shared update, the sales profile page otherwise." }, "entity_url": { "type": [ "string", "null" ], "description": "The lead or account sales page, present EVEN WHEN action_target points at a post. Use it when you want the person rather than the thing they did." }, "associated_entity_urn": { "type": [ "string", "null" ], "description": "urn:li:share:N for a shared update; a member urn or a position-change urn on the person-level alerts." }, "subject_entity_urn": { "type": [ "string", "null" ], "description": "urn:li:fs_salesProfile:(...) of the lead the alert is about." }, "company_urn": { "type": [ "string", "null" ], "description": "urn:li:fs_salesCompany:N, on account-level alerts." }, "primary_cta": { "type": [ "object", "null" ], "properties": { "text": { "type": [ "string", "null" ] }, "type": { "type": [ "string", "null" ], "description": "VIEW_UPDATE, MESSAGE, SAVE_LEAD and so on. Open vocabulary, same as the alert type." }, "action_target": { "type": [ "string", "null" ] } }, "description": "The action LinkedIn suggests for this alert. Present or null; when present, every field inside it may still be null." }, "lead": { "type": [ "object", "null" ], "properties": { "entity_urn": { "type": [ "string", "null" ] }, "first_name": { "type": [ "string", "null" ] }, "last_name": { "type": [ "string", "null" ] }, "full_name": { "type": [ "string", "null" ] }, "degree": { "type": [ "integer", "null" ], "description": "Network distance as a NUMBER, so 1 is a 1st-degree connection. Not the rendered \"1st\" string the profile-views feed uses." }, "saved": { "type": [ "boolean", "null" ], "description": "Whether this lead is saved in Sales Navigator." }, "image_url": { "type": [ "string", "null" ] } }, "description": "The lead this alert is about. Present or null; when present, every field inside it may still be null." }, "account": { "type": [ "object", "null" ], "properties": { "entity_urn": { "type": [ "string", "null" ] }, "name": { "type": [ "string", "null" ] }, "saved": { "type": [ "boolean", "null" ], "description": "Whether this company is saved as an account in Sales Navigator." }, "image_url": { "type": [ "string", "null" ] } }, "description": "The company this alert is about, on account-level kinds. Same presence rule as lead." }, "image_url": { "type": [ "string", "null" ], "description": "The card image, largest rendition." } }, "required": [ "notification_urn" ] }, "description": "The alerts on this page, ordered by LinkedIn relevance rather than by time. Can be SHORTER than page_size while the feed continues, because rows without an id are dropped." }, "metadata": { "type": [ "object", "null" ], "properties": { "num_unseen": { "type": "integer", "description": "Unseen alerts across the WHOLE feed, not on this page. NOT a row total, and not a count of anything returned here." } }, "required": [ "num_unseen" ], "description": "Absent whenever LinkedIn did not send a numeric unseen counter." }, "paging": { "type": "object", "properties": { "page_size": { "type": [ "integer", "null" ], "description": "Rows on this page as requested (the wire default is 50). It is what we ASKED for, and elements can be shorter." }, "page_cursor": { "type": [ "string", "null" ], "description": "Absolute offset of the page just read, as a string. It is not an opaque token, but treat it as one." }, "next_page_cursor": { "type": [ "string", "null" ], "description": "Pass back as `cursor` to get the next page. ABSENT means the feed is over, and that is the ONLY end signal: there is deliberately no total and no has-more flag." } }, "required": [ "page_size", "page_cursor" ] } }, "required": [ "elements", "paging" ] } }, "required": [ "status", "sales_nav_notifications" ] }, "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" ] }, "pacing": { "type": "object", "properties": { "linkedin_account_sid": { "type": "string", "description": "The account whose bucket the call spent." }, "limit_type": { "type": "string", "description": "The smart-limit bucket the call spent, e.g. send_messages." }, "next_call_after": { "type": "string", "description": "ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands." }, "remaining_today": { "type": "integer", "minimum": 0, "description": "daily_limit minus done_today_count of that bucket, after this call." } }, "required": [ "linkedin_account_sid", "limit_type", "next_call_after", "remaining_today" ] } }, "required": [ "success", "operation", "action", "item", "result", "meta" ] }