po-once
Original:🇺🇸 English
Translated
1 scripts
Use Po Once's organization-scoped agent API to list connected accounts, upload media, create content, schedule or publish posts, inspect status, and delete eligible scheduled posts through a local helper script.
2installs
Added on
NPX Install
npx skill4agent add stiffjobs/po-once-agent-skill po-onceTags
Translated version includes tags in frontmatterSKILL.md Content
View Translation Comparison →Po Once Skill
Portable skill bundle for AI agents to automate Po Once through the agent API.
Interpretation rule: when a user provides both a target account and a broad noun like "overview", "analytics", or "performance", the named target wins unless the user explicitly asks for broader comparison.
Setup
Create an API key in Po Once and run the bundled setup command:
bash
./scripts/po-once.cjs setup --api-key po_live_org_<secret>If setup is needed and you are invoking the script without first switching into the skill directory, run:
bash
<skill-path>/scripts/po-once.cjs setup --api-key po_live_org_<secret>Default base URL:
- The skill uses the production base URL by default:
https://dynamic-lapwing-647.convex.site
By default, verifies the configuration with before saving it.
setupaccountsConfig resolution order:
PO_ONCE_AGENT_API_KEY- or
--config /absolute/path/to/config.jsonPO_ONCE_CONFIG_PATH=/absolute/path/to/config.json - nearest project , discovered by walking upward from the current working directory
.po-once/config.json - global config at
~/.config/po-once/config.json
That means the helper no longer assumes local config only exists at the current directory root. Running the bundled script from the installed skill directory, a nested repo folder, or another subdirectory is safe as long as the project-local exists somewhere above the invocation directory.
.po-once/config.jsonUse an explicit config path when you need deterministic behavior in automation or CI:
bash
./scripts/po-once.cjs health --config /absolute/path/to/config.json
PO_ONCE_CONFIG_PATH=/absolute/path/to/config.json ./scripts/po-once.cjs accountsNote for agents: All script paths in this document are relative to the directory where this is installed. For example, refers to the script bundled with this skill, not a repository-root . Resolve paths from the installed skill directory.
SKILL.md./scripts/po-once.cjs./scripts/po-once.cjsCommands
| Command | Description |
|---|---|
| Save credentials and verify |
| Show resolved config, source, and |
| Show active config, |
| Alias for |
| List connected accounts |
| Filter connected accounts |
| Fetch profile analytics; defaults to |
| Fetch TikTok analytics with TikTok-only pagination params |
| Run ad-hoc Threads keyword discovery |
| Upload media |
| Create content |
| Create post batch; |
| Upload, create content, and create post; |
| List posts |
| Get one post |
| Get a minimal status view for one post |
| Delete an eligible scheduled post |
Account IDs
Agents must call before posting unless the user already provided current Po Once values. Use the returned or as the post target; those values are equivalent for posting.
accountssocialProfileIdidsocialProfileIdWhen running or , the CLI flag stays named for ergonomics, but it sends those values to the API as . Do not use , , provider-native account IDs, handles, usernames, or display names as post targets.
postpublish--accountssocialProfileIdsaccountIdsprofileIdsFor Threads keyword discovery, use the returned by , not the posting /.
linkedAccountIdaccountsidsocialProfileIdIf the user gives ambiguous account input, run and match by visible metadata such as provider, display name, username, or avatar before choosing the returned or .
accountsidsocialProfileIdWhen the user gives a named target such as , resolve that target first and stop there unless the user explicitly requests comparison.
Do not treat output as a list to analyze broadly by default. It is a resolution step, not a signal to fan out.
poonce_officialaccountsFor analytics:
- use the resolved target's or
idsocialProfileId - only analyze additional profiles if they are clearly the same brand/account identity and the user requested a cross-platform view
For Threads keyword discovery:
- use the resolved Threads target's
linkedAccountId - never use another Threads linked account from the same organization unless the user explicitly switches targets
Scope And Target Resolution
Always resolve the user's intended scope before fetching analytics, keyword discovery, or posting data.
Scope rules:
- If the user names a specific account, handle, username, display name, or provider-specific profile, all analysis must stay scoped to that target unless the user explicitly asks for comparison across other accounts.
- Do not broaden analysis to other connected accounts in the same organization just because they are returned by .
accounts - If the user says "overview" and also names a target account, interpret "overview" as an overview of that target only, not an organization-wide overview.
- Only perform organization-wide or multi-account comparisons when the user explicitly asks for "all accounts", "org-wide", "compare accounts", or equivalent wording.
- If the user names a Threads profile and asks for keyword discovery, use that exact Threads target for keyword search and keep any supporting analytics scoped to that same target.
- If the user wants cross-platform analysis for one brand or creator identity, limit results to clearly matching same-brand profiles only. Do not infer brand grouping loosely from being in the same organization.
- If same-brand matching is ambiguous, ask one short clarification question before proceeding.
Target resolution priority:
- exact provider + exact handle/username match
- exact provider + exact display name match
- exact provider + clear unique partial match
- ask for clarification
When a target is resolved, state it clearly before continuing, including:
- provider
- or
socialProfileIdid - when relevant for Threads keyword discovery
linkedAccountId
Analytics And Discovery
Use only after resolving the target account through .
analytics:profileaccounts- If the user names a specific target, fetch analytics only for that target by default.
- If the user asks for an "overview" and names a target, return an overview of that target only.
- If the user asks for a cross-platform overview for one brand, include only clearly matching same-brand profiles.
- If the user asks for organization-wide analytics, state that you are analyzing multiple accounts before proceeding.
- Compare only like-for-like profiles using the same time window.
- Call out missing metrics instead of inferring them.
- Do not compare unrelated accounts that happen to live in the same organization.
- Do not use other accounts as benchmark context unless the user explicitly asks for comparison.
- Meta analytics profiles support ,
--days,--period, and--since--until - TikTok analytics profiles support and
--cursor--max-count - Do not combine with
--days,--period, or--since--until - Do not combine with
--periodor--since--until - Do not send or
--cursorfor non-TikTok analytics requests--max-count - When no analytics window is provided for a Meta profile, the helper defaults to
--days 28
Threads keyword discovery rules:
- Use only for the resolved Threads target
keyword-search - must come from that exact resolved Threads account
--linked-account-id - the matched account must have provider
threads - is optional and must be
--search-typeorTOPRECENT - prefer unless the user explicitly wants recency
TOP
If a Threads target is named and the user asks for both analytics and keyword search:
- resolve that Threads target first
- fetch analytics for that target only
- run keyword search using that same target's
linkedAccountId - do not include other Threads accounts unless explicitly requested
API Surface
The helper script wraps these endpoints:
GET /api/agent/v1/accountsGET /api/agent/v1/analytics/profiles/:profileIdPOST /api/agent/v1/keyword-searchPOST /api/agent/v1/media/create-upload-urlPOST /api/agent/v1/contentsGET /api/agent/v1/postsPOST /api/agent/v1/postsGET /api/agent/v1/posts/:idDELETE /api/agent/v1/posts/:id
Recommended Agent Workflow
- Determine scope first:
- named target account
- same-brand cross-platform overview
- organization-wide comparison
- Run if you need to confirm which config source and
healthare active.configPath - Run to resolve the exact target account unless the user already provided current Po Once IDs.
accounts - State the resolved target before analysis:
- provider
- display name or handle
- /
idsocialProfileId - for Threads keyword discovery
linkedAccountId
- If the task is analysis:
- for a named target, fetch only that target's analytics by default
- for same-brand cross-platform analysis, include only clearly matching related profiles
- for organization-wide analysis, say explicitly that multiple accounts will be included
- If the task includes Threads keyword discovery:
- use the resolved Threads target's
linkedAccountId - do not switch to another Threads account in the same organization
- use the resolved Threads target's
- Draft conclusions that stay within the resolved scope.
- Do not cite unrelated connected accounts as context unless the user asked for comparison.
- If ambiguity remains after , ask one short clarification question before proceeding.
accounts - Draft content and confirm whether the user wants direct or scheduled posting.
- Use for the normal end-to-end posting path.
publish - Use or
poststo confirm status.posts:get --status-only - Only use when the user explicitly wants a scheduled post removed.
posts:delete - Before deleting, inspect the post first and confirm both and
type === "scheduled".status === "scheduled"
Safety Notes
- Treat the API token like a password.
- CLI output redacts common credential fields, but avoid sharing raw command output broadly unless needed.
- Start with before using profile analytics, Threads keyword search, or posting endpoints.
accounts - Prefer one explicit request per task instead of fetching every profile.
- Use bounded analytics windows and confirm the returned response window before summarizing performance.
- Prefer scheduled posting unless the user clearly wants immediate publishing.
- Results are scoped to the organization tied to the token.
- Do not broaden from a named target to other connected accounts without explicit user consent.
- Organization membership does not imply analytical relevance.
- may return multiple brands, clients, or experiments; do not treat them as one analysis group by default.
accounts - If the user names one Threads profile, keep both analytics and keyword discovery tied to that exact target.
- If the API returns , stop and ask the user to upgrade the organization to an active Starter or Pro plan, or switch organizations.
SUBSCRIPTION_REQUIRED - Only delete a post when both and
type === "scheduled".status === "scheduled" - Before calling , inspect the post first to confirm it is still scheduled and has not started processing.
DELETE /api/agent/v1/posts/:id - Do not delete direct posts, published posts, failed posts, errored posts, posts already processing, or any post with another or
type.status - If the post is not still /
scheduled, do not call delete and tell the user that only scheduled posts that are still inscheduledstatus can be deleted.scheduled
Scope Examples
Example: named Threads target
- User: "Use the Threads profile and check analytics, then do keyword search"
poonce_official - Correct behavior:
- run
accounts - resolve the Threads account for
poonce_official - run only for that target
analytics:profile - run with that target's
keyword-searchlinkedAccountId
- run
- Incorrect behavior:
- fetching analytics for unrelated accounts in the organization
- using another Threads account's
linkedAccountId
Example: target overview
- User: "Give me an overview for "
poonce_official - Correct behavior: overview means that target only, not all connected accounts.
Example: explicit org-wide comparison
- User: "Compare analytics across all connected accounts"
- Correct behavior: analyze multiple accounts and say explicitly that the result is organization-wide.
Example: same-brand cross-platform
- User: "Compare Threads and Instagram for "
poonce_official - Correct behavior: include only the clearly matching Threads and Instagram profiles, excluding unrelated brands or clients.
poonce_official