MisarPost Flutter SDK
Schedule, publish, generate and analyze social content from Flutter apps on iOS, Android, desktop and web.
17 resource groups · 102 methods · http + crypto only
MisarPost is the AI social command center: publish to X, LinkedIn, Instagram, Threads, Bluesky, TikTok and more from one API, repurpose long-form content with ContentRipple, research trends with TrendPulse and write in your own voice with PersonaForge.
The resource layer is generated from the API's own route tree, so it always matches the server.
Never ship a long-lived API key inside a mobile binary: call MisarPost from your own backend, or hand the app a key scoped to exactly what it needs.
Install
flutter pub add misarpost_flutter
Authentication
Create an API key at https://post.misar.io/dashboard/api-keys. It starts with mpk_ and is
sent as Authorization: Bearer mpk_…. Each key carries scopes (posts:read,
schedule:write, generate:write, …); a call outside them answers 403 with
code: "insufficient_scope". New keys get every scope unless you narrow them.
import 'package:misarpost_flutter/misarpost_flutter.dart';
final post = MisarPostClient(apiKey);
Resources
| Resource | Methods | Scopes |
|---|---|---|
post.analytics |
stats, trends |
analytics:read |
post.composer |
discordChannels, hashnodePublications, hashnodeTags, lemmyCommunities, listmonkLists, listmonkTemplates, mediumPublications, pinterestBoards, redditFlairs, skoolGroups, slackChannels, whopForums |
connections:read |
post.connections |
list, plugs, updatePlugs, wordpressTaxonomies |
connections:read, connections:write |
post.contentripple |
deleteHistory, feed, history, parse, repurpose, schedule, updateVariants, usage |
posts:write, generate:write, posts:read, schedule:write |
post.drafts |
create, list |
posts:write, posts:read |
post.generate |
create, enhance, hashtags, image, optimize, plan |
generate:write |
post.growth |
nextOpportunity, opportunities, overview, playbooks |
analytics:read |
post.media |
delete, list |
media:write, media:read |
post.notifications |
list, readAll, update |
notifications:read, notifications:write |
post.personaforge |
approveReplies, bio, createCompetitors, createPersona, createReplies, createVoice, deletePersona, generate, getPersona, getVoice, listCompetitors, listPersonas, listReplies, personaStatus, updatePersona |
personas:write, generate:write, personas:read |
post.posts |
calendar, cancel, delete, list, reply, revert, revertBatch, schedule, share, unshare, update |
posts:read, posts:write, schedule:write |
post.postTags |
create, delete, list, update |
posts:write, posts:read |
post.postTemplates |
create, delete, get, list, update |
posts:write, posts:read |
post.trendpulse |
createPlatformContent, digest, fetch, hooks, list, listPlatformContent, performance, pipeline, refresh, usePlatformContent |
trends:write, trends:read, analytics:read, schedule:write |
post.video |
avatars, generate, script, status, voices |
media:read, generate:write |
post.webhooks |
createOutbound, deleteOutbound, listOutbound, updateOutbound |
webhooks:write, webhooks:read |
post.workspaces |
addMember, create, list, members, removeMember |
workspaces:write, workspaces:read |
Methods take path parameters positionally, then named body: (when the endpoint reads one) and query:, and return Future<Map<String, dynamic>>.
Client
| Thing | Detail |
|---|---|
| Entry point | MisarPostClient(apiKey, baseUrl: …, maxRetries: 3, timeout: …, httpClient: …) |
| Base URL | https://api.misar.io/post (also served at https://post.misar.io/api) |
| Transport | package:http (pass your own http.Client) |
| Retried | 429 throttles, 500, 502, 503, 504 and network failures — exponential backoff from 200 ms honouring Retry-After |
| Never retried | Plan refusals (MisarPostPlanLimitException) |
| Errors | MisarPostException, MisarPostPlanLimitException |
| Also exported | paginate, verifyWebhookSignature |
Quick start
final post = MisarPostClient('mpk_your_key');
final accounts = await post.connections.list();
await post.generate.create(body: {'prompt': 'Announce our v2 launch', 'platforms': ['linkedin']});
await post.posts.schedule(body: {
'accountIds': ['<account id>'],
'content': 'We just shipped v2',
'scheduledAt': '2026-11-01T09:00:00Z',
});
Pagination
await for (final page in paginate((p) => post.posts.list(query: {'status': 'queued', 'page': p}))) {
print(page['posts']);
}
Plan limits
When a monthly allowance is spent, or a feature is not on the plan, the API answers
402 with code: "plan_limit_exceeded" and an upgrade offer. The SDK detects the
code before it looks at the status, throws MisarPostPlanLimitException, and never
retries it. All copy comes from the server.
try {
await post.generate.enhance(body: {'content': '…'});
} on MisarPostPlanLimitException catch (e) {
print('${e.offer?['headline']} ${e.offer?['cta']}');
print('Upgrade: ${e.upgradeUrl}, resets in ${e.retryAfter}s');
}
Webhooks
final ok = verifyWebhookSignature(secret, rawBodyBytes, request.headers[webhookSignatureHeader]);
Method reference
| Call | HTTP | Scope |
|---|---|---|
post.analytics.stats(…) |
GET /stats |
analytics:read |
post.analytics.trends(…) |
GET /analytics/trends |
analytics:read |
post.composer.discordChannels(…) |
GET /composer/discord/channels |
connections:read |
post.composer.hashnodePublications(…) |
GET /composer/hashnode/publications |
connections:read |
post.composer.hashnodeTags(…) |
GET /composer/hashnode/tags |
connections:read |
post.composer.lemmyCommunities(…) |
GET /composer/lemmy/communities |
connections:read |
post.composer.listmonkLists(…) |
GET /composer/listmonk/lists |
connections:read |
post.composer.listmonkTemplates(…) |
GET /composer/listmonk/templates |
connections:read |
post.composer.mediumPublications(…) |
GET /composer/medium/publications |
connections:read |
post.composer.pinterestBoards(…) |
GET /composer/pinterest/boards |
connections:read |
post.composer.redditFlairs(…) |
GET /composer/reddit/flairs |
connections:read |
post.composer.skoolGroups(…) |
GET /composer/skool/groups |
connections:read |
post.composer.slackChannels(…) |
GET /composer/slack/channels |
connections:read |
post.composer.whopForums(…) |
GET /composer/whop/forums |
connections:read |
post.connections.list(…) |
GET /connections |
connections:read |
post.connections.plugs(…) |
GET /connections/:accountId/plugs |
connections:read |
post.connections.updatePlugs(…) |
PATCH /connections/:accountId/plugs |
connections:write |
post.connections.wordpressTaxonomies(…) |
GET /connections/:accountId/wordpress-taxonomies |
connections:read |
post.contentripple.deleteHistory(…) |
DELETE /contentripple/history |
posts:write |
post.contentripple.feed(…) |
POST /contentripple/feed |
generate:write |
post.contentripple.history(…) |
GET /contentripple/history |
posts:read |
post.contentripple.parse(…) |
POST /contentripple/parse |
generate:write |
post.contentripple.repurpose(…) |
POST /contentripple |
generate:write |
post.contentripple.schedule(…) |
POST /contentripple/schedule |
schedule:write |
post.contentripple.updateVariants(…) |
PATCH /contentripple/variants |
posts:write |
post.contentripple.usage(…) |
GET /contentripple |
posts:read |
post.drafts.create(…) |
POST /drafts |
posts:write |
post.drafts.list(…) |
GET /drafts |
posts:read |
post.generate.create(…) |
POST /generate |
generate:write |
post.generate.enhance(…) |
POST /generate/enhance |
generate:write |
post.generate.hashtags(…) |
POST /generate/hashtags |
generate:write |
post.generate.image(…) |
POST /generate/image |
generate:write |
post.generate.optimize(…) |
GET /generate/optimize |
generate:write |
post.generate.plan(…) |
POST /generate/plan |
generate:write |
post.growth.nextOpportunity(…) |
GET /growth/next-opportunity |
analytics:read |
post.growth.opportunities(…) |
GET /growth/opportunities |
analytics:read |
post.growth.overview(…) |
GET /growth/overview |
analytics:read |
post.growth.playbooks(…) |
GET /growth/playbooks |
analytics:read |
post.media.delete(…) |
DELETE /media/:id |
media:write |
post.media.list(…) |
GET /media |
media:read |
post.notifications.list(…) |
GET /notifications |
notifications:read |
post.notifications.readAll(…) |
POST /notifications/read-all |
notifications:write |
post.notifications.update(…) |
PATCH /notifications/:id |
notifications:write |
post.personaforge.approveReplies(…) |
POST /personaforge/replies/approve |
personas:write |
post.personaforge.bio(…) |
POST /personaforge/bio |
generate:write |
post.personaforge.createCompetitors(…) |
POST /personaforge/competitors |
personas:write |
post.personaforge.createPersona(…) |
POST /personaforge/personas |
personas:write |
post.personaforge.createReplies(…) |
POST /personaforge/replies |
personas:write |
post.personaforge.createVoice(…) |
POST /personaforge/voice |
personas:write |
post.personaforge.deletePersona(…) |
DELETE /personaforge/personas/:id |
personas:write |
post.personaforge.generate(…) |
POST /personaforge/generate |
generate:write |
post.personaforge.getPersona(…) |
GET /personaforge/personas/:id |
personas:read |
post.personaforge.getVoice(…) |
GET /personaforge/voice |
personas:read |
post.personaforge.listCompetitors(…) |
GET /personaforge/competitors |
personas:read |
post.personaforge.listPersonas(…) |
GET /personaforge/personas |
personas:read |
post.personaforge.listReplies(…) |
GET /personaforge/replies |
personas:read |
post.personaforge.personaStatus(…) |
GET /personaforge/personas/status/:jobId |
personas:read |
post.personaforge.updatePersona(…) |
PATCH /personaforge/personas/:id |
personas:write |
post.posts.calendar(…) |
GET /calendar |
posts:read |
post.posts.cancel(…) |
DELETE /posts |
posts:write |
post.posts.delete(…) |
DELETE /posts/:id |
posts:write |
post.posts.list(…) |
GET /posts |
posts:read |
post.posts.reply(…) |
POST /posts/:id/reply |
posts:write |
post.posts.revert(…) |
POST /posts/:id/revert |
posts:write |
post.posts.revertBatch(…) |
POST /posts/revert-batch |
posts:write |
post.posts.schedule(…) |
POST /schedule |
schedule:write |
post.posts.share(…) |
POST /posts/:id/share |
posts:write |
post.posts.unshare(…) |
DELETE /posts/:id/share |
posts:write |
post.posts.update(…) |
PATCH /posts/:id |
posts:write |
post.postTags.create(…) |
POST /post-tags |
posts:write |
post.postTags.delete(…) |
DELETE /post-tags/:id |
posts:write |
post.postTags.list(…) |
GET /post-tags |
posts:read |
post.postTags.update(…) |
PATCH /post-tags/:id |
posts:write |
post.postTemplates.create(…) |
POST /post-templates |
posts:write |
post.postTemplates.delete(…) |
DELETE /post-templates/:id |
posts:write |
post.postTemplates.get(…) |
GET /post-templates/:id |
posts:read |
post.postTemplates.list(…) |
GET /post-templates |
posts:read |
post.postTemplates.update(…) |
PATCH /post-templates/:id |
posts:write |
post.trendpulse.createPlatformContent(…) |
POST /trendpulse/platform-content |
trends:write |
post.trendpulse.digest(…) |
POST /trendpulse/digest |
trends:write |
post.trendpulse.fetch(…) |
POST /trendpulse/fetch |
trends:write |
post.trendpulse.hooks(…) |
GET /trendpulse/hooks |
trends:read |
post.trendpulse.list(…) |
GET /trendpulse |
trends:read |
post.trendpulse.listPlatformContent(…) |
GET /trendpulse/platform-content |
trends:read |
post.trendpulse.performance(…) |
GET /trendpulse/performance |
analytics:read |
post.trendpulse.pipeline(…) |
POST /trendpulse/pipeline |
schedule:write |
post.trendpulse.refresh(…) |
POST /trendpulse |
trends:write |
post.trendpulse.usePlatformContent(…) |
POST /trendpulse/platform-content/use |
trends:write |
post.video.avatars(…) |
GET /video/avatars |
media:read |
post.video.generate(…) |
POST /video/generate |
generate:write |
post.video.script(…) |
POST /video/script |
generate:write |
post.video.status(…) |
GET /video/status/:jobId |
media:read |
post.video.voices(…) |
GET /video/voices |
media:read |
post.webhooks.createOutbound(…) |
POST /webhooks/outbound |
webhooks:write |
post.webhooks.deleteOutbound(…) |
DELETE /webhooks/outbound/:id |
webhooks:write |
post.webhooks.listOutbound(…) |
GET /webhooks/outbound |
webhooks:read |
post.webhooks.updateOutbound(…) |
PATCH /webhooks/outbound/:id |
webhooks:write |
post.workspaces.addMember(…) |
POST /workspaces/:id/members |
workspaces:write |
post.workspaces.create(…) |
POST /workspaces |
workspaces:write |
post.workspaces.list(…) |
GET /workspaces |
workspaces:read |
post.workspaces.members(…) |
GET /workspaces/:id/members |
workspaces:read |
post.workspaces.removeMember(…) |
DELETE /workspaces/:id/members |
workspaces:write |
Links
- Website — https://www.misarpost.com
- App — https://post.misar.io
- Parent — https://misar.io
- Documentation — https://docs.misar.io/post
- API reference — https://api.misar.io/post/openapi.json
- Source — https://github.com/Misar-AI/misarpost-sdks
- pub.dev — https://pub.dev/packages/misarpost_flutter
MIT © Misar.AI
Libraries
- misarpost_flutter
- MisarPost Flutter SDK — https://docs.misar.io/post