Introduction
wavpost lets you publish to LinkedIn, Twitter, and YouTube from a single HTTP endpoint. Connect accounts once via OAuth โ then post everywhere with one call.
Base URL
https://api.wavpost.com
Auth
API key (sk_live_โฆ)
Format
JSON
Authentication
Programmatic access uses an Authorization: Bearer sk_live_โฆ API key (create and revoke under Dashboard โ API Keys). The dashboard web app uses a first-party session cookie after you sign in โ not a Firebase JWT in Authorization.
Keys start with sk_live_. The full secret is shown only once when created.
Authorization: Bearer sk_live_your_api_key_hereQuickstart
From zero to publishing in 3 steps.
Get your API key
Go to Dashboard โ API Keys โ Create key.
sk_live_abc123efg456... # store this securely, shown only onceCheck connected platforms
curl https://api.wavpost.com/api/connect/status \
-H "Authorization: Bearer sk_live_your_key"Publish a post
curl -X POST https://api.wavpost.com/api/v1/posts \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"text": "Hello from the API!",
"platforms": ["linkedin", "twitter"]
}'Posts
/api/v1/postsPublish a postParameters
| Name | Type | Description |
|---|---|---|
| text* | string | Post content. Max 3000 chars for LinkedIn. |
| platforms* | string[] | linkedin ยท twitter ยท youtube |
| mediaUrls | string[] | Public image URLs. Up to 9 for LinkedIn. |
| scheduledFor | datetime | ISO 8601 UTC. Saves post as scheduled. |
| profile | string | Profile slug. Defaults to default profile. |
curl -X POST https://api.wavpost.com/api/v1/posts \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"text": "New feature drop!",
"platforms": ["linkedin", "twitter"],
"mediaUrls": ["https://your-cdn.com/image.jpg"]
}'Response 201
{
"id": "a6c01b90-37da-4224-9338-e2025626b7bf",
"text": "New feature drop!",
"platforms": ["linkedin", "twitter"],
"status": "published",
"createdAt": "2025-03-19T07:19:57Z",
"platformResults": {
"linkedin": { "ok": true, "platformPostId": "urn:li:share:123456" },
"twitter": { "ok": false, "error": "Twitter not connected." }
}
}/api/v1/postsList all postscurl https://api.wavpost.com/api/v1/posts \
-H "Authorization: Bearer sk_live_your_key"Profiles
Profiles let you manage multiple brands or clients. Each profile has its own set of connected platform accounts. A default profile is created automatically on signup.
/api/profilesList profilescurl https://api.wavpost.com/api/profiles \
-H "Authorization: Bearer sk_live_your_key"/api/profilesCreate a profileParameters
| Name | Type | Description |
|---|---|---|
| name* | string | Display name for the profile |
curl -X POST https://api.wavpost.com/api/profiles \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{"name": "My Brand"}'/api/profiles/{profileId}Update a profileParameters
| Name | Type | Description |
|---|---|---|
| name | string | New display name |
| isDefault | boolean | Set as the default profile |
/api/profiles/{profileId}Delete a profilecurl -X DELETE https://api.wavpost.com/api/profiles/profile-uuid \
-H "Authorization: Bearer sk_live_your_key"Connections
Connect social accounts via OAuth. Users open the connect URL in their browser โ no platform developer apps needed.
/api/connect/statusCheck platform connection statusParameters
| Name | Type | Description |
|---|---|---|
| profileId | string | Query param. Uses default profile if omitted. |
curl "https://api.wavpost.com/api/connect/status?profileId=uuid" \
-H "Authorization: Bearer sk_live_your_key"Response 200
{
"linkedin": { "connected": true, "displayName": "Anshu Raj Singh" },
"twitter": { "connected": false, "displayName": null },
"youtube": { "connected": false, "displayName": null }
}/api/auth/{platform}Start OAuth (browser redirect)Open this URL in a browser to start the OAuth flow. After connecting, the user is redirected to the dashboard.
# Open in browser โ supported platforms: linkedin, twitter, youtube
https://api.wavpost.com/api/auth/linkedin?profileId=your-profile-id/api/connect/{platform}/disconnectDisconnect a platformParameters
| Name | Type | Description |
|---|---|---|
| profileId | string | Optional. Uses default profile if omitted. |
curl -X POST https://api.wavpost.com/api/connect/linkedin/disconnect \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{"profileId": "uuid"}'Logs
Every publish attempt, platform connection, and profile change is automatically logged.
/api/logsGet activity logsParameters
| Name | Type | Description |
|---|---|---|
| limit | integer | Number of logs. Default 50, max 200. |
| offset | integer | Pagination offset. Default 0. |
curl "https://api.wavpost.com/api/logs?limit=20&offset=0" \
-H "Authorization: Bearer sk_live_your_key"Response 200
{
"logs": [
{
"id": "uuid",
"action": "post.published",
"platform": "linkedin",
"profileName": "Default",
"status": "success",
"metadata": {
"text": "New feature drop!",
"platformPostId": "urn:li:share:123456"
},
"createdAt": "2025-03-19T07:19:57Z"
}
],
"total": 42,
"limit": 20,
"offset": 0
}Action types
post.publishedplatform.connectedplatform.disconnectedprofile.createdprofile.deletedAPI Keys
API keys start with sk_live_ and don't expire unless revoked. The raw key is shown only once โ store it immediately.
/api/keysList API keyscurl https://api.wavpost.com/api/keys \
-H "Authorization: Bearer sk_live_your_key"/api/keysCreate an API keyParameters
| Name | Type | Description |
|---|---|---|
| name* | string | Label to identify this key |
curl -X POST https://api.wavpost.com/api/keys \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{"name": "My agent key"}'Response 201
{
"key": { "id": "uuid", "name": "My agent key", "keyPreview": "...x9z2" },
"rawKey": "sk_live_abc123..." // shown only once
}/api/keys/{keyId}Revoke an API keycurl -X DELETE https://api.wavpost.com/api/keys/key-uuid \
-H "Authorization: Bearer sk_live_your_key"Usage & Credits
Check your current plan, credit balance, and recent usage transactions.
/api/usageGet usage and credit balancecurl https://api.wavpost.com/api/usage \
-H "Authorization: Bearer sk_live_your_key"Response 200
{
"plan": {
"id": "free",
"label": "Free",
"price": 0
},
"credits": {
"balance": 480,
"monthlyAllowance": 500,
"used": 20,
"resetAt": "2026-04-01T00:00:00.000Z"
},
"recentTransactions": [
{
"amount": -2,
"action": "post.published",
"metadata": { "platforms": ["linkedin"], "breakdown": { "linkedin": 2 } },
"createdAt": "2026-03-20T09:56:05.000Z"
}
]
}Credit costs
| Action | Cost |
|---|---|
| Twitter/X โ post tweet | 3 credits |
| Twitter/X โ send DM | 2 credits |
| Twitter/X โ like, unlike, follow, unfollow, bookmark, delete, hide reply | 1 credit each |
| Twitter/X โ timeline read, user lookup | Free |
| LinkedIn โ create post | 1 credit |
| LinkedIn โ delete post, reshare | 1 credit each |
| YouTube โ post | 1 credit |
| Credits reset | Monthly, on plan renewal |
Current access
Scopes approved: openid profile email w_member_social โ covers personal profile identity and publishing posts as a member.
1. Connect a LinkedIn account
Open the OAuth URL in a browser. After the user grants access, they are redirected back and the account is saved to the profile.
/api/auth/linkedinStart LinkedIn OAuthParameters
| Name | Type | Description |
|---|---|---|
| profileId | string | Query param. Which profile to connect the account to. Uses default if omitted. |
# Open in browser
https://api.wavpost.com/api/auth/linkedin?profileId=your-profile-id2. What profile data is returned
After connecting, WavPost fetches the user's identity via the OpenID Connect /v2/userinfo endpoint.
| Field | Scope | Description |
|---|---|---|
| sub | openid | Unique LinkedIn member ID |
| name | profile | Full name |
| picture | profile | Profile photo URL |
| Primary email address |
// Stored internally as:
{
"id": "abc123", // LinkedIn member ID (sub)
"authorUrn": "urn:li:person:abc123", // used as post author
"displayName": "Anshu Raj Singh",
"picture": "https://media.licdn.com/..."
}3. Publishing posts
Use the standard POST /api/v1/posts endpoint with "linkedin" in the platforms array.
Text post
curl -X POST https://api.wavpost.com/api/v1/posts \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"text": "Excited to share our latest update!",
"platforms": ["linkedin"]
}'Single image post
curl -X POST https://api.wavpost.com/api/v1/posts \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"text": "Check out this visual!",
"platforms": ["linkedin"],
"mediaUrls": ["https://your-cdn.com/image.jpg"]
}'Multi-image post (up to 9)
curl -X POST https://api.wavpost.com/api/v1/posts \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"text": "Our product gallery:",
"platforms": ["linkedin"],
"mediaUrls": [
"https://your-cdn.com/img1.jpg",
"https://your-cdn.com/img2.jpg",
"https://your-cdn.com/img3.jpg"
]
}'4. Response
{
"id": "post-uuid",
"status": "published",
"platformResults": {
"linkedin": {
"ok": true,
"platformPostId": "urn:li:share:7123456789"
}
}
}The platformPostId is the LinkedIn post URN โ you can use this to reference the post on LinkedIn.
5. Limits & notes
| Constraint | Value |
|---|---|
| Max text length | 3,000 characters |
| Max images per post | 9 (multi-image carousel) |
| Image format | JPEG, PNG, GIF (public URL required) |
| Post visibility | PUBLIC (feed distribution) |
| Post author | Personal member only (company pages require Community Management API) |
| Access token expiry | 60 days (LinkedIn default) |
5. Delete a post
/api/v1/linkedin/postDelete a LinkedIn post โ 1 creditParameters
| Name | Type | Description |
|---|---|---|
| post_urn* | string | LinkedIn post URN returned from create post (e.g. urn:li:share:123456) |
curl -X DELETE https://api.wavpost.com/api/v1/linkedin/post \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{"post_urn": "urn:li:share:7442092074763481088"}'Response 200
{ "ok": true, "deleted": true, "postUrn": "urn:li:share:7442092074763481088" }6. Reshare a post
/api/v1/linkedin/reshareReshare a LinkedIn post โ 1 creditParameters
| Name | Type | Description |
|---|---|---|
| post_urn* | string | URN of the post to reshare (e.g. urn:li:share:123456) |
| commentary | string | Optional text to add above the reshare. Max 3000 chars. |
curl -X POST https://api.wavpost.com/api/v1/linkedin/reshare \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"post_urn": "urn:li:share:7442092074763481088",
"commentary": "Great post worth sharing!"
}'Response 201
{ "ok": true, "reshareId": "urn:li:share:7442092169974145024" }Not available โ requires LinkedIn Partnership
- โข Reactions (like, praise, etc.) โ requires
partnerApiReactions - โข Comments on posts โ requires
partnerApiSocialActions - โข Analytics (impressions, clicks) โ requires
r_member_social
Twitter / X
Current access
Uses OAuth 2.0 PKCE. Scopes requested:
tweet.readtweet.writeusers.readoffline.accessmedia.writelike.readlike.writefollows.readfollows.writebookmark.readbookmark.writetweet.moderate.writedm.readdm.write1. Connect a Twitter / X account
/api/auth/twitterStart Twitter OAuth (PKCE)Parameters
| Name | Type | Description |
|---|---|---|
| profileId | string | Query param. Which profile to connect the account to. Uses default if omitted. |
# Open in browser
https://api.wavpost.com/api/auth/twitter?profileId=your-profile-id2. Profile data returned
| Field | Description |
|---|---|
| id | Unique Twitter user ID |
| name | Display name |
| username | Handle (e.g. wavpost) |
| picture | Profile image URL |
3. Publishing tweets
Publish tweets with text. Media uploads (photos, videos) are available via the media.write scope.
/api/v1/postsPublish a tweetcurl -X POST https://api.wavpost.com/api/v1/posts \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"text": "Shipping social features in minutes. ๐",
"platforms": ["twitter"]
}'Response 201
{
"id": "post-uuid",
"status": "published",
"platformResults": {
"twitter": {
"ok": true,
"platformPostId": "1856234567890123456"
}
}
}4. Delete a tweet
/api/v1/twitter/tweetDelete a tweet โ 1 creditParameters
| Name | Type | Description |
|---|---|---|
| tweet_id* | string | ID of the tweet to delete |
curl -X DELETE https://api.wavpost.com/api/v1/twitter/tweet \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{"tweet_id": "1856234567890123456"}'{ "ok": true, "deleted": true, "tweetId": "1856234567890123456" }5. Like / Unlike a tweet
/api/v1/twitter/likeLike a tweet โ 1 creditParameters
| Name | Type | Description |
|---|---|---|
| tweet_id* | string | ID of the tweet to like |
curl -X POST https://api.wavpost.com/api/v1/twitter/like \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{"tweet_id": "1856234567890123456"}'{ "ok": true, "liked": true }/api/v1/twitter/likeUnlike a tweet โ 1 creditParameters
| Name | Type | Description |
|---|---|---|
| tweet_id* | string | ID of the tweet to unlike |
{ "ok": true, "liked": false }6. Follow / Unfollow a user
Use GET /api/v1/twitter/user?username=handle to resolve a username to a user ID first.
/api/v1/twitter/followFollow a user โ 1 creditParameters
| Name | Type | Description |
|---|---|---|
| target_user_id* | string | Twitter user ID to follow |
curl -X POST https://api.wavpost.com/api/v1/twitter/follow \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{"target_user_id": "3433773514"}'{ "ok": true, "following": true, "pending_follow": false }/api/v1/twitter/followUnfollow a user โ 1 creditParameters
| Name | Type | Description |
|---|---|---|
| target_user_id* | string | Twitter user ID to unfollow |
{ "ok": true, "following": false }7. Bookmark / Remove bookmark
/api/v1/twitter/bookmarkBookmark a tweet โ 1 creditParameters
| Name | Type | Description |
|---|---|---|
| tweet_id* | string | ID of the tweet to bookmark |
curl -X POST https://api.wavpost.com/api/v1/twitter/bookmark \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{"tweet_id": "1856234567890123456"}'{ "ok": true, "bookmarked": true }/api/v1/twitter/bookmarkRemove a bookmark โ freeParameters
| Name | Type | Description |
|---|---|---|
| tweet_id* | string | ID of the tweet to un-bookmark |
{ "ok": true, "bookmarked": false }8. Send a Direct Message
/api/v1/twitter/dmSend a DM โ 2 creditsParameters
| Name | Type | Description |
|---|---|---|
| recipient_id* | string | Twitter user ID of the recipient |
| text* | string | Message text |
curl -X POST https://api.wavpost.com/api/v1/twitter/dm \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{"recipient_id": "3433773514", "text": "Hey, great post!"}'{ "ok": true, "dm_conversation_id": "...", "dm_event_id": "..." }9. Hide / Unhide a reply
Hides a reply made on one of your own tweets. Only works on replies to your tweets โ not on your own replies.
/api/v1/twitter/reply/hideHide or unhide a reply โ 1 creditParameters
| Name | Type | Description |
|---|---|---|
| tweet_id* | string | ID of the reply tweet to hide |
| hidden | boolean | true to hide, false to unhide. Defaults to true. |
curl -X PUT https://api.wavpost.com/api/v1/twitter/reply/hide \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{"tweet_id": "1856234567890123456", "hidden": true}'{ "ok": true, "hidden": true }10. Read timeline
/api/v1/twitter/timelineGet your recent tweets โ freeParameters
| Name | Type | Description |
|---|---|---|
| max_results | integer | Number of tweets to return. Min 5, max 100. Default 10. |
curl "https://api.wavpost.com/api/v1/twitter/timeline?max_results=10" \
-H "Authorization: Bearer sk_live_your_key"{
"ok": true,
"tweets": [
{ "id": "1856234567890123456", "text": "Hello world!", "createdAt": "2026-03-24T09:00:00.000Z" }
],
"count": 1
}11. Look up a user by username
/api/v1/twitter/userResolve username to user ID โ freeParameters
| Name | Type | Description |
|---|---|---|
| username* | string | Twitter handle without @ |
curl "https://api.wavpost.com/api/v1/twitter/user?username=ishaansehgal" \
-H "Authorization: Bearer sk_live_your_key"{ "ok": true, "user": { "id": "3433773514", "name": "Ishaan Sehgal", "username": "ishaansehgal" } }12. Limits & notes
| Constraint | Value |
|---|---|
| Max tweet length | 280 characters |
| Access token expiry | 2 hours โ auto-refreshed silently via refresh token |
| Auth method | OAuth 2.0 PKCE |
| Post tweet | 3 credits |
| Send DM | 2 credits |
| Like, unlike, follow, unfollow, bookmark, delete, hide reply | 1 credit each |
| Timeline read, user lookup | Free (0 credits) |
| Requires paid plan | All Twitter endpoints โ free plan users are blocked |
YouTube
Current access
Scopes: youtube.upload youtube.readonly openid profile โ supports video uploads and community text posts.
1. Connect a YouTube channel
/api/auth/youtubeStart YouTube OAuthParameters
| Name | Type | Description |
|---|---|---|
| profileId | string | Query param. Which profile to connect the account to. Uses default if omitted. |
# Open in browser
https://api.wavpost.com/api/auth/youtube?profileId=your-profile-id2. Profile data returned
| Field | Description |
|---|---|
| id | YouTube channel ID |
| displayName | Channel name |
| picture | Channel thumbnail URL |
3. Publishing
WavPost auto-detects the post type based on mediaUrls: if a video URL is present it uploads a video; otherwise it creates a community post.
Video upload
Pass a direct video URL in mediaUrls. The first line of text becomes the video title (max 100 chars); the full text becomes the description.
curl -X POST https://api.wavpost.com/api/v1/posts \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"text": "My video title\nFull description goes here.",
"platforms": ["youtube"],
"mediaUrls": ["https://your-cdn.com/video.mp4"]
}'Community post (text)
Requires 500+ subscribers on the connected channel.
curl -X POST https://api.wavpost.com/api/v1/posts \
-H "Authorization: Bearer sk_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"text": "Check out our latest update!",
"platforms": ["youtube"]
}'Response 201
// Video upload
{
"platformResults": {
"youtube": {
"ok": true,
"platformPostId": "https://youtube.com/watch?v=dQw4w9WgXcQ"
}
}
}
// Community post
{
"platformResults": {
"youtube": {
"ok": true,
"platformPostId": "Ug_community_post_id"
}
}
}4. Limits & notes
| Constraint | Value |
|---|---|
| Video formats | mp4, mov, avi, mkv, webm, flv, wmv (public URL required) |
| Video title | First line of text, max 100 characters |
| Video visibility | Public |
| Video category | People & Blogs (categoryId: 22) |
| Community posts | Requires 500+ subscribers |
| Access token expiry | 1 hour (refresh token issued automatically) |
| Auth method | OAuth 2.0 (Google) |
| Credit cost | 1 credit per post |
Platforms
| Platform | ID | Text | Images | Auth method |
|---|---|---|---|---|
| โ | Up to 9 | OAuth 2.0 | ||
| Twitter / X | โ | โ | OAuth 2.0 PKCE | |
| YouTube | youtube | โ | โ | OAuth 2.0 |
AI Agents
Two machine-readable formats are available for AI agents and OpenAPI toolchains.
llms.txt
Plain-text API reference for LLMs. Feed this to any AI agent to give it full knowledge of the API.
/llms.txt โ
OpenAPI 3.0
Machine-readable spec. Works with LangChain, CrewAI, OpenAI function calling, and any OpenAPI toolchain.
/openapi.json โ
# 1. Fetch the API reference for your agent
curl https://api.wavpost.com/llms.txt
# 2. Agent calls the API
curl -X POST https://api.wavpost.com/api/v1/posts \
-H "Authorization: Bearer sk_live_agent_key" \
-H "Content-Type: application/json" \
-d '{"text": "Agent-generated post!", "platforms": ["linkedin"]}'Errors
All errors return a JSON body with an error field.
{ "error": "Missing or invalid 'text' (string)" }| Status | Meaning |
|---|---|
| 200 | Success |
| 201 | Resource created successfully |
| 400 | Bad request โ missing or invalid fields |
| 401 | Unauthorized โ missing, invalid, or revoked token |
| 404 | Not found โ profile or platform does not exist |