Automating Social Media for a Virtual Music Artist with Late API
Automating Social Media for a Virtual Music Artist with Late API


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
platformsarray 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:
- Upload images to a Google Drive folder
- Set the folder to "Anyone with the link can view"
- 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:
| X/Twitter | ||
|---|---|---|
| Char limit | 2,200 | 280 |
| Hashtags | 3-5 per post | 1-2 max |
| Links | Not clickable ("link in bio") | Clickable, count as 23 chars |
| Media | Required | Optional 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:
- Monday 9AM — Claude Cowork generates a weekly content plan as markdown
- The plan includes: caption, posting time, content pillar, hashtags, CTA, and image URL for each post
- 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
- Late's free tier is genuinely useful — 2 accounts, 20 posts/month each. That's enough for a real content cadence.
- Google Drive works as free image hosting — use
lh3.googleusercontent.com/d/{FILE_ID}, not the download redirect URL. - Adapt content per platform — don't just cross-post. Instagram wants hashtags and CTAs; X wants links and brevity.
- Automate the boring parts — scheduling, hashtag rotation, and link injection are perfect for scripts. Keep the creative work (captions, visual direction) human-guided.
- 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.