MisarPost Flutter SDK

Schedule, publish, generate and analyze social content from Flutter apps on iOS, Android, desktop and web.

pub license

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

MIT © Misar.AI

Libraries

misarpost_flutter
MisarPost Flutter SDK — https://docs.misar.io/post