Install
openclaw skills install pickfu-market-researchRun consumer research surveys with PickFu to get real human feedback in minutes — generate images, validate product names, compare logos and packaging, test...
openclaw skills install pickfu-market-researchGet real human feedback on anything — logos, names, packaging, pricing, ads, UX, book covers, Amazon listings, and more. This skill runs end-to-end consumer research: brief → design → create → publish → wait → analyze → iterate.
This skill can:
Call list_available_targeting (read-only). If it succeeds, MCP is connected — use MCP tools for all API calls.
If MCP is unavailable, use the PickFu CLI. Check auth:
npx --yes @pickfu/cli@latest auth status --json
If authenticated, proceed.
If not authenticated, guide the user:
Option 1 — API key (recommended for agents): Tell the user to get a key at app.pickfu.com/settings/api-keys, then:
export PICKFU_API_KEY=sk_...
Option 2 — OAuth (interactive):
npx --yes @pickfu/cli@latest auth login --headless
Show the printed URL to the user and wait for the command to complete. The user clicks the URL, authenticates in their browser, and the CLI catches the callback automatically.
Visit agents.pickfu.com for additional install options.
Run this once per session to learn all available CLI commands and their parameters:
npx --yes @pickfu/cli@latest schema
This returns every command, flag, description, and output schema — use it to discover capabilities not explicitly documented here.
Important: All API fields use camelCase (e.g., mediaUrl, sampleSize, surveyIntent, imageSet). Never use snake_case.
Capture the research objective. Ask:
If the user needs images but doesn't have them:
CLI: npx --yes @pickfu/cli@latest media generate --prompt "..." --aspect-ratio 1:1 --json
MCP: Call generate_image with prompt and optional aspectRatio
The response includes a url — use it as a mediaUrl option in the survey. Generate multiple variations with different prompts to test against each other.
To upload existing files: npx --yes @pickfu/cli@latest media upload --file ./logo.png --json or --url https://...
head_to_head for A/B, ranked for ordering 3+, open_ended for exploratory| Type | Best for | Options |
|---|---|---|
head_to_head | A/B comparison | Exactly 2 |
ranked | Preference ordering | 3-8 |
open_ended | Free-form feedback | 0-1 |
single_select | Pick one favorite | 3-8 |
multi_select | Select multiple | 3-8 |
emoji_rating | Quick sentiment | 0-1 |
star_rating | 1-5 stars + feedback | 0-1 |
click_test | Heatmap clicks | 1 (image) |
five_second_test | First impressions | 1 (image) |
screen_recording | User interaction | 0-1 |
Discover available options:
npx --yes @pickfu/cli@latest targeting list --json and reporting list --jsonlist_available_targeting and list_available_reporting15 (quick signal), 30-50 (standard), 100 (high confidence), 200-500 (large-scale validation)
US (default), CA, AU, DE, GB, JP, MX, ES, FR, IT, KR, BR, ZA, PL
Present the full design to the user for approval before creating.
MCP: Call save_survey (omit surveyId to create new)
CLI: Write survey JSON to a temp file:
cat > /tmp/survey.json << 'EOF'
{
"surveyIntent": "Which logo do pet owners prefer?",
"sampleSize": "50",
"country": "US",
"targeting": ["amznpr"],
"reporting": ["gender", "age-range"],
"questions": [{
"type": "head_to_head",
"prompt": "Which logo do you prefer for a pet food brand?",
"options": [
{ "mediaUrl": "https://cdn.example.com/logo-a.jpg" },
{ "mediaUrl": "https://cdn.example.com/logo-b.jpg" }
]
}]
}
EOF
npx --yes @pickfu/cli@latest survey create --from-file /tmp/survey.json --json
⚠️ Publishing charges the user's account and starts data collection. Always ask for explicit confirmation.
MCP: Call publish_survey with the survey id
CLI: npx --yes @pickfu/cli@latest survey publish <id> --json
Poll until complete:
CLI: npx --yes @pickfu/cli@latest survey get <id> --json | jq '{status, responses_count}'
MCP: Call get_survey with the survey id
Poll every 60 seconds. After 30 minutes, offer to check back later.
Alternative (zero token cost): npx --yes @pickfu/cli@latest survey watch <id> --json — blocks at process level, but may timeout in some runtimes.
Retrieve results:
get_survey + get_survey_responsessurvey get <id> --json + survey responses <id> --jsonGenerate a structured report:
## Research Report
### Executive Summary
[2-3 sentences: key finding, winner, confidence]
### Survey Details
- **Survey**: [URL: https://www.pickfu.com/surveys/<id>]
- **Respondents**: [N] from [country], targeting: [traits]
### Per-Question Analysis
#### Q1: [prompt] ([type])
**Result**: [winner/ranking/rating]
**Distribution**: [breakdown]
**Notable Quotes**:
> "[verbatim quote]" — [demographic]
### Demographic Breakdown
| Segment | Option A | Option B |
|---------|----------|----------|
### Next Steps
- [Recommendation]
- [Follow-up research suggestion]
⚠️ Survey update safety: When using survey update, only include the fields you want to change. Do NOT include questions unless you intend to modify them — if you send questions without option IDs, the API will delete and recreate all questions, losing image attachments. Tags, project, name, sampleSize, and country can all be updated independently without affecting questions.
Attach tags via survey update (creates tags automatically if they don't exist):
MCP: Call save_survey with surveyId and tags: [{"name": "..."}]
CLI:
echo '{"tags": [{"name": "q2-launch"}, {"name": "logo-testing"}]}' | \
npx --yes @pickfu/cli@latest survey update <id> --from-file /dev/stdin --json
Note: tags is a replace-all operation — include all desired tags each time.
MCP: Call save_survey with surveyId and projectId
CLI:
npx --yes @pickfu/cli@latest project create --name "Brand Launch" --json
echo '{"projectId": "<id>"}' | npx --yes @pickfu/cli@latest survey update <survey-id> --from-file /dev/stdin --json
CLI: npx --yes @pickfu/cli@latest survey add-respondents <id> --count 50 --preview --json (preview first, then without --preview to commit)
CLI: npx --yes @pickfu/cli@latest survey list --tag "logo-testing" --status completed --json
After results: review feedback → generate refined options → run follow-up survey → repeat until winner is clear.
| Error | Action |
|---|---|
| Not authenticated | Guide user through Step 0c |
PICKFU_API_KEY invalid | "Generate a new key at app.pickfu.com/settings/api-keys" |
| MCP auth expired | Guide user to reconfigure MCP server auth token |
| Insufficient balance | "Add funds at app.pickfu.com/settings/credits" |
| head_to_head requires 2 options | Fix option count |
| ranked requires 3-8 options | Adjust to 3-8 |
| prompt max 255 characters | Shorten question text |
| URL must use https | Replace http with https |
| Unknown field ignored | Check camelCase — all fields are camelCase (mediaUrl, sampleSize, etc.) |
For more help: pickfu.com/help | pickfu.com/docs
npm i -g @pickfu/cli