← All Posts

Automating Social Media for a Virtual Music Artist with Late API

5 min readMarch 9, 2026
automationsocial-mediaapipythonmusic

Automating Social Media for a Virtual Music Artist with Late API

Social media automation dashboard
Social media automation dashboard

AgnusBlast scheduler dry-run — Instagram posts with images and hashtag sets
AgnusBlast scheduler dry-run — Instagram posts with images and hashtag sets

I've been building AgnusBlast — a virtual J-pop music artist project with tracks on Spotify, Apple Music, and YouTube. The music exists, but the social media presence was empty. Zero Instagram posts. Zero tweets. I needed to populate both platforms fast, with consistent branding, optimized timing, and actual links to the music.

Manually posting 32 pieces of content across two platforms? No thanks. Here's how I automated the entire pipeline.

The Stack

  • Late API — social media scheduling (free tier: 2 accounts, 20 posts/month each)
  • Claude Cowork — generates weekly content plans as markdown every Monday
  • Imagen 4 (Vertex AI) — generates brand-consistent cosmic visuals
  • Google Drive — public image hosting (free, direct URLs)
  • Python — glue script that ties everything together

Late API: The Scheduling Engine

Late is a social media scheduling tool with a clean REST API. The free tier gives you 2 connected accounts and 20 scheduled posts per month per account. That's enough for a 4-posts-per-week cadence on each platform.

Key things I learned about Late:

  • The 20-post limit is based on active scheduled posts, not API calls. If you delete a scheduled post, that slot frees up immediately.
  • Posts need a platforms array with the platform name and account ID
  • Instagram posts require media — you can't schedule text-only
  • Media must be a publicly accessible URL — no file uploads on the free tier
  • The presigned upload endpoint returns 404 on free plans, so you need to host images elsewhere

The API is straightforward:

requests.post('https://getlate.dev/api/v1/posts', json={
    'platforms': [{'platform': 'instagram', 'accountId': ACCOUNT_ID}],
    'content': caption,
    'scheduledFor': '2026-03-09T07:00:00-07:00',
    'timezone': 'America/Los_Angeles',
    'mediaItems': [{'type': 'image', 'url': public_image_url}]
})

Image Hosting: Google Drive Trick

Since Late needs public image URLs and the presigned upload is a paid feature, I needed free public hosting. Google Drive works perfectly:

  1. Upload images to a Google Drive folder
  2. Set the folder to "Anyone with the link can view"
  3. Use https://lh3.googleusercontent.com/d/{FILE_ID} for direct image serving

The key insight: don't use drive.google.com/uc?export=download — it redirects and Late can't follow redirects. The lh3.googleusercontent.com URL serves the image directly with the correct Content-Type header.

Multi-Platform Content Adaptation

Instagram and X/Twitter have very different content rules:

InstagramX/Twitter
Char limit2,200280
Hashtags3-5 per post1-2 max
LinksNot clickable ("link in bio")Clickable, count as 23 chars
MediaRequiredOptional but recommended

My scheduler handles this by building platform-specific content from the same source post:

def build_instagram_caption(post):
    # Full caption + CTA + 5 hashtags
    return '\n\n'.join([post['caption'], post['cta'], ' '.join(hashtags[:5])])

def build_tweet(post):
    # Shorter caption + link + 1-2 hashtags (under 280 chars)
    # URLs count as 23 chars on X (t.co shortening)
    caption = post['caption'][:200]
    link = select_link(post)  # HyperFollow, Spotify, or YouTube
    return '\n\n'.join([caption, link, ' '.join(hashtags[:2])])

For X/Twitter, I inject HyperFollow links on track posts (sends listeners to Spotify + Apple Music + YouTube from one URL), Spotify playlist links on playlist posts, and YouTube links on behind-the-scenes content.

The Weekly Pipeline

The full automation flow:

  1. Monday 9AM — Claude Cowork generates a weekly content plan as markdown
  2. The plan includes: caption, posting time, content pillar, hashtags, CTA, and image URL for each post
  3. One command schedules everything:
python3 scheduler.py                        # Both platforms
python3 scheduler.py --platform instagram   # Instagram only
python3 scheduler.py --platform twitter     # X only
python3 scheduler.py --dry-run              # Preview without scheduling

The scheduler parses the markdown, builds platform-optimized content, and hits the Late API for each post. It logs results to a JSON file for debugging.

Generating Brand-Consistent Visuals

For posts that don't have existing album art, I generate images with Imagen 4 (Google's image model via Vertex AI). Every prompt gets a brand style prefix to keep visuals consistent:

BRAND_STYLE = (
    'Dreamy cosmic aesthetic, deep space color palette '
    '(deep indigo, midnight blue, soft purple, celestial gold accents), '
    'ethereal glow, cinematic lighting, high quality digital art'
)

full_prompt = BRAND_STYLE + post_specific_prompt
img_bytes = generate_image(full_prompt, aspect_ratio='1:1')

This produced 9 images that all feel like they belong to the same brand, without any manual design work.

Results

From zero to fully scheduled in one session:

  • 16 Instagram posts — 4 weeks of Mon/Wed/Thu/Fri content with album art and generated visuals
  • 16 X/Twitter posts — same schedule, shorter copy, clickable Spotify/YouTube links
  • Optimized timing — Mon 7AM, Wed 7PM, Thu 8PM (peak), Fri 7PM PST
  • Consistent branding — cosmic aesthetic across all generated images
  • Total cost — $0 (Late free tier + Google Drive + existing GCP credits)

Key Takeaways

  1. Late's free tier is genuinely useful — 2 accounts, 20 posts/month each. That's enough for a real content cadence.
  2. Google Drive works as free image hosting — use lh3.googleusercontent.com/d/{FILE_ID}, not the download redirect URL.
  3. Adapt content per platform — don't just cross-post. Instagram wants hashtags and CTAs; X wants links and brevity.
  4. Automate the boring parts — scheduling, hashtag rotation, and link injection are perfect for scripts. Keep the creative work (captions, visual direction) human-guided.
  5. HyperFollow links are underrated — one URL that sends listeners to their preferred streaming platform. Better than picking Spotify or Apple Music.

The entire pipeline — from content plan to scheduled posts on two platforms — runs with a single Python command. That's the kind of automation that actually saves time.