OXYGENOxygen/ Docs
Data

Posts

Stored LinkedIn and X post performance, and the Publishing Community queue for public comments on owned posts.

Posts published through Oxygen's LinkedIn and X Publishing paths are stored as Posts data, and recent posts created directly on a connected LinkedIn account are discovered into the same store. The latest cumulative metric snapshots back Publishing → Analytics; public comments on recent owned LinkedIn posts back the durable, oldest-first Publishing → Community queue.

Three things that look alike and are not: a public comment and its thread belong to Posts; a private DM is a Message in the Unibox; draft text, assignment, and notes attached to a public comment are local workspace state that saving never posts.

Analytics

oxygen publishing analytics summary --range 30d --json
oxygen publishing analytics summary --channel x --range 30d --json
oxygen publishing analytics post <post-id> --json

The summary defaults to owned LinkedIn posts recorded in Oxygen, including recently discovered posts created directly on LinkedIn. --channel x instead covers X posts published through Oxygen. Both paths read stored snapshots and never call the selected provider when opened or queried. snapshotted_posts counts posts with a stored background sync pass; its legacy alias measured_posts does not mean every engagement value was populated. Use coverage.<metric>.measured_posts to see how many posts reported a non-null value for each metric. A null is unknown or unavailable, never zero. Stale and pending snapshots retry automatically; there is no manual provider retry to run.

The current LinkedIn rail can supply reactions, comments, and reposts but not trustworthy impressions, saves, or sends. X ordinary post lookup maps impressions, likes, replies, reposts, bookmarks, conditional link clicks, and conditional video views into the same canonical fields; it exposes no send counter. LinkedIn's richer member-post analytics and X account analytics remain separate, unregistered capabilities.

Publishing Community

oxygen publishing comments list --view unanswered --json
oxygen publishing comments list --view all --json
oxygen publishing comments get <comment-id> --json

unanswered is an operating queue, not one database state: it spans needs_reply, draft, awaiting_approval, and action_unavailable. all adds replied, resolved, ignored, and spam, still bounded to the rolling 30-day recent-owned-post scope — not lifetime LinkedIn history. For one exact state pass --status <state> instead; --view and --status cannot be combined.

Opening this queue is a local tenant-database read. It uses 0 Oxygen credits and makes no provider call. A background worker discovers and polls recent owned posts with a six-hour freshness target.

Every list response includes empty_queue_is_current beside the count and a freshness block:

FieldMeaning
statuscurrent, awaiting_first_sync, partial, stale, backing_off, or no_targets
sync_target_postsRecent owned posts the worker should poll
completed_postsPosts that have completed at least one pass
current_postsPosts with a successful pass inside the six-hour target
failed_postsPosts whose latest pass failed and is waiting to retry
last_completed_atLatest successful pass, or null before the first success
next_sync_atNext scheduled attempt or retry
last_errorExact provider/quota failure when polling is backing off
counts_trustworthytrue only when discovery and comment polling are current
automatic_retry_atScheduled automatic retry while backing off
manual_retry_availableAlways false; the worker owns quota-safe retry timing
guidanceSelf-contained degraded-state instruction, or null when none is needed

If an empty response has empty_queue_is_current: false, do not conclude that LinkedIn has no comments. freshness.counts_trustworthy remains false and freshness.guidance names the automatic retry time and exact failure. There is deliberately no manual sync button or retry command: the worker retries automatically, while a user-triggered retry loop could consume the same LinkedIn account quota that caused the backoff.

A reply written directly on LinkedIn is reconciled by the next successful provider sync. Oxygen recognizes the connected account as the author and moves only that reply's exact parent comment to replied; local drafts, notes, and reply receipts remain available for inspection. Creating or approving a reply through Oxygen is refused if the bound LinkedIn sender is no longer active.

Local queue versus live provider reads

oxygen posts get|comments|reactions are a separate low-level path for one known LinkedIn post. Each is a live provider read. It uses 0 Oxygen credits but consumes the connected sender's metered account-read allowance, and it does not populate or refresh the durable queue. Do not use that path when a task forbids provider calls.

Safe public reply flow

oxygen publishing comments update <comment-id> --draft "Exact reply" --json
oxygen publishing comments reply <comment-id> --text "Exact reply" --json
oxygen publishing comments approve <action-id> --content-hash <sha256> --approved --json

update saves only local workspace state. reply freezes an exact unsent preview and returns its immutable action id plus SHA-256 content hash; it makes no provider call. Only approve performs the public LinkedIn write, and only for the newest preview with the exact hash. Never retry an effect_unknown action automatically—open the returned comment deep-link and verify the public thread first.

CLI, MCP, and the web workspace run the same contract. Over MCP it is oxygen_publishing_comments, which is not in a fresh client's default set — reconnect with ?toolset=publishing. LinkedIn is the only channel in Community today.

  • Approvals — the external-write gate.
  • CLI and MCP — the two execution surfaces.
  • Sequences — private outreach after a commenter becomes a warm lead.

On this page