instagram-marketing · git:20260713.114ecea · 2026-07-13 · sha256 067e7f9bb0f9c20a

instagram-marketing git:20260713.114eceaA

Immutable. This exact content is served forever at /api/v1/blob/067e7f9bb0f9c20a.

---
name: instagram-marketing
description: Plan, draft, audit, and publish content for Instagram. Use when the user wants to write a caption with a first-125-char hook, plan a slide-by-slide carousel, reverse-engineer the hook from a viral Reel or carousel, size hashtags the 2026 way, remove AI tells from a caption, or plan a week of Reels and carousels. Instagram requires media on every post, so the skills write the caption and the user supplies the image or video; posts publish via the Publora API draft, upload, schedule flow.
---

# Instagram Marketing Skills

A bundle of 7 focused skills for Instagram content ops in 2026. Each skill is
single-purpose, follows the draft then approval then publish pattern, and uses
the [Publora API](https://publora.com) for the media-required publish flow.

## When to use this bundle

- **Writing a caption** (hook in the first 125 chars, body, CTA) -> use `ig-caption-writer`
- **Planning a carousel** slide by slide (hook slide to payoff slide) -> use `ig-carousel-planner`
- **Reverse-engineering the hook** from a viral Reel or carousel -> use `ig-hook-extractor`
- **Sizing hashtags** (the 3-5 niche/mid/broad reality, not 30) -> use `ig-hashtag-strategist`
- **Removing AI tells from a caption, or auditing it before posting** -> use `ig-humanizer` (rewrite plus `--mode audit`, which folds in the post-audit sub-tool)
- **Planning a week** of Reels, carousels, and stories -> use `ig-content-planner`
- **Adapting cross-platform content** (a LinkedIn post, blog, YouTube script, or X thread) into a native Instagram carousel or caption -> use `ig-repurposer`

## Core pattern

Every action-taking skill follows three steps:

1. **Parse the input.** If the user gives an Instagram URL, the skill uses
   `lib/url_parser.py` to extract the username and shortcode.
2. **Draft the content.** The skill applies 2026 research (Instagram hook
   formulas, hashtag sizing, timing, voice rules, ranking heuristics) and shows
   the draft to the user.
3. **Wait for approval, then publish with media.** Instagram needs an image or
   video on every post. The user supplies the media; on approval the skill runs
   the Publora draft then upload then schedule flow.

## Media is required (read this first)

Instagram rejects text-only posts. The writer skills produce the caption, hook,
hashtags, and slide or shot plan. The USER supplies the image or video file. The
publish path is always:

```
1. create a draft (no scheduledTime)  -> postGroupId
2. upload each media file to S3        (2-10 files for a carousel, in order)
3. update the post: status=scheduled + scheduledTime
```

`lib/publora_client.publish_media_post(...)` wraps all three steps. See
`references/media-workflow.md` for the full flow and limits.

## Prerequisites

**Three tiers - pick one.**

### Tier 0 - Draft only (default, no setup)

The skills work out of the box. No API keys, no signup. Every approved caption
is returned as a copy-paste block with a reminder to attach your media in the
Instagram app. Great for trying the skills before committing to any backend.

### Tier 1 - Publora auto-post (recommended, ~2 min)

On approval, point the skill at your local media files and it uploads them and
schedules the post via the [Publora API](https://publora.com).

1. Sign up free: **https://app.publora.com/signup**
2. Connect your Instagram Business or Creator account (Channels then Add Channel)
3. Copy your API key from Publora's API panel
4. Drop into `.env`:
   ```
   PUBLORA_API_KEY=sk_...
   INSTAGRAM_PLATFORM_ID=instagram-...
   ```
5. Run `pip install -r requirements.txt`

Why Publora: posting media to Instagram means creating a draft, getting a
pre-signed S3 URL, uploading each file, and only then scheduling, in that exact
order. Publora does that chain in one call (`publish_media_post`), so we did not
have to reimplement it.

### Tier 2 - Build your own poster (advanced)

Prefer not to SaaS it? Ask Claude Code or Codex to build a custom poster on the
Instagram Graph API. Set `INSTAGRAM_SKILLS_CUSTOM_POSTER=<your command>` and the
skills invoke it on approval. Publora is the 2-minute path.

### Account note

Instagram's publishing API needs a **Business or Creator account**. Personal
accounts are not supported.

## Voice rules (baked into every skill)

1. No em dashes (`—`), en dashes, or double dashes. Biggest AI tell.
2. Use `..` or a line break as a soft pause when rhythm calls for it.
3. Capitalize all personal, company, and product names.
4. Sentence starts can be lowercase (native caption voice); names stay capitalized.
5. Avoid AI vocabulary: `leverage`, `fundamentally`, `streamline`, `harness`,
   `delve`, `unlock`, `elevate`, `foster`.
6. Specific numbers beat adjectives. "47 minutes" beats "fast".
7. One idea per caption. The first 125 chars carry the hook (the "more" fold).
8. Hashtags are sizing, not volume: 3-5 sized tags, not 30.

(Canonical reference: `references/voice-rules.md`. See also
`references/hook-formulas.md`, `references/algorithm-heuristics.md`,
`references/hashtag-strategy.md`, and `references/media-workflow.md`.)

## How Instagram URLs map

| URL shape | Parsed to |
|---|---|
| `https://www.instagram.com/p/SHORTCODE/` | shortcode, type `post` |
| `https://www.instagram.com/reel/SHORTCODE/` | shortcode, type `reel` |
| `https://www.instagram.com/USERNAME/` | username, type `profile` |
| `https://www.instagram.com/stories/USER/ID/` | username + id, type `story` |

`lib.url_parser.parse_instagram_url(url)` returns `{username, shortcode,
url_type, canonical_url}`. A carousel shares the `/p/` path with a single image;
the carousel is detected from the media, not the URL.

## Known gotchas

- **Media is mandatory.** No image or video means no post. The skill returns the
  caption and reminds you to attach media.
- **No mixed media in a carousel.** All images or all video, never both.
- **First 125 chars only.** Everything after that is behind the "more" fold.
- **Carousel is 2-10 items** via the API (the native app allows 20).
- **WebP auto-converts to JPEG** at publish time.
- **Business or Creator account required.** Personal accounts cannot use the API.

## Resources

- [Publora API docs](https://docs.publora.com) - endpoint reference for the publishing layer
- `lib/publora_client.py` - Python client with the full media flow
- `lib/url_parser.py` - Instagram URL to username/shortcode parser

## Acknowledgments

Publishing powered by the [Publora REST API](https://publora.com).