How to use
- Copy the installation command and review the source package before installing it in your own agent environment.
- Check the source document for required tools, credentials and supported hosts.
- Describe your input and desired deliverable; review the output against the source material.
npx skills add https://github.com/apidojo-io/apidojo-skills --skill analyzing-competitor-instagram-content-strategyBefore you start
- Installation does not include a model subscription, API allowance or permission to access your files.
- Repository stars and installation counts describe activity, not an independent quality or security test.
Rendered from the source repository. Headings, examples, code, tables, links, and referenced images are preserved.
Analyzing Competitor Instagram Content Strategy
Reverse-engineers a competitor's Instagram content strategy by analyzing their last 50+ posts. Identifies what content formats, themes, and posting patterns drive their highest engagement.
Prerequisites
APIFY_TOKENenvironment variable set- Optional: Apify MCP server installed
Inputs
| Parameter | Type | Required | Default | Notes |
|---|---|---|---|---|
startUrls | array | ✅ | [] | Instagram URLs — profiles, hashtags, locations, audio pages, reels |
until | string | Optional | — | Scrape posts until this date (YYYY-MM-DD) |
maxItems | number | Optional | Unlimited | Maximum posts to return |
customMapFunction | string | Optional | — | JavaScript function to transform each output object |
Workflow
Progress:
- [ ] Step 1: Scrape competitor's recent posts
- [ ] Step 2: Classify content types
- [ ] Step 3: Calculate engagement metrics per content type
- [ ] Step 4: Analyze posting patterns
- [ ] Step 5: (Optional) Compare to your account
- [ ] Step 6: Deliver strategy reportStep 1: Scrape Competitor Profile
Recommended — run_actor.js (handles waiting, output, and file saving automatically):
# Quick answer (prints table to chat)
node scripts/run_actor.js \
--actor "apidojo~instagram-scraper" \
--input '{"param": "value"}'
# Save as CSV
node scripts/run_actor.js \
--actor "apidojo~instagram-scraper" \
--input '{"param": "value"}' \
--output YYYY-MM-DD_results.csv --format csv
# Save as JSON
node scripts/run_actor.js \
--actor "apidojo~instagram-scraper" \
--input '{"param": "value"}' \
--output YYYY-MM-DD_results.json --format jsonAPIFY_TOKENmust be set in environment or.envfile.
If Apify MCP is available:
Tool: apify:run-actor
Actor: "apidojo~instagram-scraper"
Input:
{
"usernames": ["[COMPETITOR_HANDLE]"],
"maxItems": 50
}REST API fallback:
curl -X POST "https://api.apify.com/v2/acts/apidojo~instagram-scraper/runs?token=$APIFY_TOKEN" -H "Content-Type: application/json" -d '{"usernames": ["competitor_handle"], "maxItems": 50}'Step 2: Content Classification
For each post, classify:
content_type:
PRODUCT = post primarily shows product
LIFESTYLE = product in context / aspirational
EDUCATIONAL = tips, how-to, facts (carousel with text)
SOCIAL_PROOF = testimonial, user tag, press feature
ENTERTAINMENT = meme, trending audio, humor
PROMOTIONAL = sale, discount, CTA-heavy
BEHIND_SCENES = team, office, processFormat: IMAGE | VIDEO | CAROUSEL
Step 3: Calculate Metrics
engagement_rate = (likes + comments) / follower_count * 100
per_type_avg_engagement = avg(engagement_rate for all posts of that type)
content_type_share = count(posts of type) / total_posts * 100Top performing post: highest (likes + comments * 3) — comments weighted higher as active signal.
Posting cadence:
posts_per_week = total_posts / (date_range_days / 7)
best_day = day_of_week with highest avg engagement
best_hour = hour_of_day with highest avg engagement (use post `timestamp`)Step 4: Edge Cases
- Competitor has very few posts (< 20): Report available data; note low sample size; extend to 180-day window
- Engagement rate << 1%: Account may have bot followers or inactive audience; note this as "audience quality concern"
- All posts are product/promo: This competitor is over-indexed on promotional content — opportunity for content that educates or entertains
- Carousel shows as single image: Some scrapers return first image only; note when
type = CAROUSELfor accurate content type count
Output Format
# Competitor Instagram Strategy: @[COMPETITOR_HANDLE]
Posts analyzed: [N] | Followers: [N] | Overall Eng Rate: [X%] | Date: [DATE]
## Content Mix
| Type | % of Posts | Avg Eng Rate | Best Post Example |
|------|-----------|-------------|------------------|
| Product | [X%] | [X%] | [post excerpt] |
| Lifestyle | [X%] | [X%] | |
| Educational | [X%] | [X%] | |
## Format Distribution
Images: [X%] | Carousels: [X%] | Videos/Reels: [X%]
Best format by engagement: [FORMAT] ([X%] eng rate)
## Top 5 Posts (by Engagement)
| # | Type | Format | Likes | Comments | Eng Rate | Caption Preview |
|---|------|--------|-------|----------|----------|----------------|
## Posting Cadence
Frequency: [X] posts/week | Best day: [Day] | Best hour: [HH:00]
## Key Observations
1. [Pattern observation — e.g. "Carousel educational posts get 2× engagement of product posts"]
2. [Observation]
3. [Opportunity gap]Troubleshooting
Scraper returns only recent 12 posts: Instagram limits API access to recent posts. For 50-post analysis, run scraper and note actual count returned. Engagement rate seems wrong: Verify follower_count is current — scraper may return the follower count at time of scrape, which could differ from post-date count for historical posts. Competitor has very high engagement: Distinguish between genuine engagement and pods/bought engagement — genuine engagement shows variety in commenters; pod engagement shows the same accounts commenting repeatedly.

