{ "$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-catch-up-response-schema.json", "title": "GetLinkedinAccountMyCatchUpResponse", "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/GetLinkedinAccountMyCatchUpResponse", "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." }, "catch_up": { "type": "object", "properties": { "elements": { "type": "array", "items": { "type": "object", "properties": { "position": { "type": "integer", "description": "Index in the feed. OURS, not LinkedIn's: it counts the cards that parsed, so a card we could not read shifts every card after it. Key a card by card_urn." }, "card_urn": { "type": [ "string", "null" ], "description": "urn:li:prop:(TYPE,id): the id of the NURTURE PROMPT, not of the member and not of a post. The only stable key on the row." }, "type": { "type": [ "string", "null" ], "description": "Prompt type, taken off the urn. Captured so far: BIRTHDAY, JOB_CHANGE, WORK_ANNIVERSARY. OPEN vocabulary, so treat an unseen value as valid rather than as an error." }, "display_name": { "type": [ "string", "null" ], "description": "The person the card is about, as rendered. May carry emoji that a profile field would not." }, "prompt_text": { "type": [ "string", "null" ], "description": "The card's second line, e.g. \"Celebrate Jane's recent birthday on Aug 6\". The date exists ONLY here, as rendered words." }, "suggested_message": { "type": [ "string", "null" ], "description": "The label LinkedIn printed on the card's primary button, which for these cards is the one-click message itself, e.g. \"Happy birthday!\"." }, "message_sent": { "type": [ "boolean", "null" ], "description": "True when this account already sent that card's message, so the card is spent. NULL means LinkedIn reported nothing for it, which is NOT the same as false." }, "first_name": { "type": [ "string", "null" ] }, "last_name": { "type": [ "string", "null" ] }, "url": { "type": [ "string", "null" ] }, "public_identifier": { "type": [ "string", "null" ] }, "profile_id": { "type": [ "string", "null" ] }, "member_urn": { "type": [ "string", "null" ] }, "image_url": { "type": [ "string", "null" ] } }, "required": [ "position" ] }, "description": "The nurture cards on this page. Empty on an exhausted feed, and ALSO empty when the read failed: check status." }, "paging": { "type": "object", "properties": { "page_size": { "type": [ "integer", "null" ], "description": "Always 10. LinkedIn's own request carries no count knob, so the page is server-fixed and this number does not track how many rows actually came back." }, "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", "catch_up" ] }, "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" ] }