Migrate from Ayrshare
Step-by-step guide to migrate from Ayrshare to Late API
This guide walks you through migrating from Ayrshare to Late, covering API differences, account setup, and a safe cutover strategy.
Quick Reference
The main differences at a glance:
| What | Ayrshare | Late |
|---|---|---|
| Base URL | api.ayrshare.com/api | getlate.dev/api/v1 |
| Content field | post | content |
| Platforms | ["twitter", "facebook"] | [{platform, accountId}] |
| Media | mediaUrls: ["url"] | mediaItems: [{type, url}] |
| Schedule | scheduleDate | scheduledFor |
| Publish now | Omit scheduleDate | publishNow: true |
| Multi-user | Profile-Key header | Profiles as resources |
Before You Start
What you'll need:
- Your Ayrshare API key and Profile Keys
- A Late account (sign up here)
- A Late API key from your dashboard
How Late organizes accounts
Late uses a two-level structure:
Profile: "Acme Corp"
├── Twitter (@acmecorp)
├── LinkedIn (Acme Corp Page)
└── Facebook (Acme Corp)
Profile: "Side Project"
├── Twitter (@sideproject)
└── Instagram (@sideproject)Profiles group social accounts together (like brands or clients). Each Account is a connected social media account with its own accountId.
Step 1: Set Up Late Profiles
For each Ayrshare Profile Key, create a corresponding Late profile:
curl -X POST https://getlate.dev/api/v1/profiles \
-H "Authorization: Bearer YOUR_LATE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "My Brand"}'Save the returned _id — you'll need it to connect accounts.
Step 2: Connect Social Accounts
Initiate OAuth for each platform you had connected in Ayrshare:
curl -X GET "https://getlate.dev/api/v1/connect/{platform}?profileId=PROFILE_ID&redirect_url=https://yourapp.com/callback" \
-H "Authorization: Bearer YOUR_LATE_API_KEY"Supported platforms: twitter instagram facebook linkedin tiktok youtube pinterest reddit bluesky threads googlebusiness
Platform name change: Ayrshare uses gmb for Google My Business. Late uses googlebusiness (no underscore).
The response includes an authUrl — redirect your user there to complete authorization.
Step 3: Get Your Account IDs
After connecting, fetch the account IDs:
curl -X GET "https://getlate.dev/api/v1/accounts?profileId=PROFILE_ID" \
-H "Authorization: Bearer YOUR_LATE_API_KEY"{
"accounts": [
{
"_id": "abc123",
"platform": "twitter",
"username": "@yourhandle",
"displayName": "Your Name"
}
]
}Store this mapping in your database — you'll need the _id values when creating posts.
Step 4: Update Your Post Calls
Here's how the API calls change:
Ayrshare:
curl -X POST https://api.ayrshare.com/api/post \
-H "Authorization: Bearer API_KEY" \
-H "Profile-Key: PROFILE_KEY" \
-d '{
"post": "Hello world!",
"platforms": ["twitter", "linkedin"]
}'Late:
curl -X POST https://getlate.dev/api/v1/posts \
-H "Authorization: Bearer API_KEY" \
-d '{
"content": "Hello world!",
"platforms": [
{"platform": "twitter", "accountId": "abc123"},
{"platform": "linkedin", "accountId": "def456"}
],
"publishNow": true
}'Ayrshare:
curl -X POST https://api.ayrshare.com/api/post \
-d '{
"post": "See you tomorrow!",
"platforms": ["twitter"],
"scheduleDate": "2025-01-15T10:00:00Z"
}'Late:
curl -X POST https://getlate.dev/api/v1/posts \
-d '{
"content": "See you tomorrow!",
"platforms": [
{"platform": "twitter", "accountId": "abc123"}
],
"scheduledFor": "2025-01-15T10:00:00Z"
}'Omit publishNow for scheduled posts — it defaults to false.
Ayrshare:
curl -X POST https://api.ayrshare.com/api/post \
-d '{
"post": "Check this out!",
"platforms": ["twitter"],
"mediaUrls": ["https://example.com/image.jpg"]
}'Late:
curl -X POST https://getlate.dev/api/v1/posts \
-d '{
"content": "Check this out!",
"platforms": [
{"platform": "twitter", "accountId": "abc123"}
],
"mediaItems": [
{"type": "image", "url": "https://example.com/image.jpg"}
],
"publishNow": true
}'Key changes summary
| Ayrshare | Late |
|---|---|
post | content |
platforms: ["twitter"] | platforms: [{platform: "twitter", accountId: "..."}] |
mediaUrls: ["url"] | mediaItems: [{type: "image", url: "..."}] |
scheduleDate | scheduledFor |
| Omit scheduleDate to publish | publishNow: true |
Profile-Key header | Not needed (use accountId in platforms) |
Step 5: Update Media Uploads
Late uses presigned URLs for uploads (supports files up to 5GB):
Request a presigned URL
curl -X POST https://getlate.dev/api/v1/media/presign \
-H "Authorization: Bearer API_KEY" \
-d '{"filename": "photo.jpg", "contentType": "image/jpeg"}'Response:
{
"uploadUrl": "https://storage.../presigned-url",
"publicUrl": "https://media.getlate.dev/temp/photo.jpg"
}Upload your file
curl -X PUT "https://storage.../presigned-url" \
-H "Content-Type: image/jpeg" \
--data-binary "@photo.jpg"Use the public URL in your post
{
"mediaItems": [
{"type": "image", "url": "https://media.getlate.dev/temp/photo.jpg"}
]
}Already have public URLs? Skip the upload — just pass your URLs directly in mediaItems.
Supported types: image/jpeg image/png image/webp image/gif video/mp4 video/quicktime video/webm application/pdf
Step 6: Migrate Scheduled Posts
Don't lose your queued content! Export scheduled posts from Ayrshare and recreate them in Late.
Export from Ayrshare:
curl -X GET https://api.ayrshare.com/api/history \
-H "Authorization: Bearer AYRSHARE_KEY" \
-H "Profile-Key: PROFILE_KEY"Recreate in Late for each post with a future scheduleDate:
curl -X POST https://getlate.dev/api/v1/posts \
-d '{
"content": "...",
"platforms": [{"platform": "twitter", "accountId": "..."}],
"scheduledFor": "2025-01-20T14:00:00Z"
}'Then delete or pause the Ayrshare posts to avoid duplicates.
Cutover Strategy
Don't switch all at once. Use a gradual rollout to catch issues early.
| Phase | Actions |
|---|---|
| Prep | Create Late profiles, connect accounts, build integration |
| Pilot | Test with internal users for a few days |
| Rollout | Enable for 10% → 50% → 100% of users |
| Cutoff | Disable Ayrshare, keep keys for 30 days as fallback |
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| Invalid accountId | Using Ayrshare profile key | Use Late account _id from /v1/accounts |
| Platform not supported | Wrong platform name | Use googlebusiness not gmb |
| Media not found | URL inaccessible | Ensure HTTPS and publicly accessible |
| Post not publishing | Wrong date format | Use ISO 8601 UTC: 2025-01-15T10:00:00Z |
Code Example: Node.js
// Late post function
const createPost = async (content, accounts, media = [], scheduledFor = null) => {
const response = await fetch('https://getlate.dev/api/v1/posts', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.LATE_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
content,
platforms: accounts, // [{platform: "twitter", accountId: "..."}]
mediaItems: media.map(url => ({
type: url.match(/\.(mp4|mov|webm)$/i) ? 'video' : 'image',
url
})),
...(scheduledFor ? { scheduledFor } : { publishNow: true })
}),
});
const data = await response.json();
return data.post._id;
};Need Help?
- Late API Docs: docs.getlate.dev
- Support: miki@getlate.dev
- Rate Limits: 60-1200 req/min depending on plan