The Mouve API is in active development and not yet live. Follow the changelog for the launch announcement.

Mouve Developers
API reference

API reference

Every endpoint of the Mouve public API: paths, scopes, request and response shapes, and the errors each one returns.

This reference is generated from the code that serves the API — the controllers, their validated request DTOs, and the frozen wire contract. The machine-readable OpenAPI 3.1 document is at /openapi.json; point a code generator at it rather than transcribing these tables.

Calling any endpoint

Base URL: https://api.mouve.it. Every request needs a bearer credential and the scopes listed for the operation:

curl https://api.mouve.it/public/v1/me \
  -H "Authorization: Bearer $MOUVE_TOKEN"

Scopes are exact-match — holding posts.write grants nothing that requires posts.read. See scopes for the full catalog, and authentication for how to obtain a credential.

Endpoints

MethodPathScopeSummary
GET/public/v1/meprofile.readGet the authorizing user
GET/public/v1/users/{username}profile.readGet a user by username
GET/public/v1/users/{username}/postsposts.readList a user's posts
POST/public/v1/postsposts.writeCreate a post or a reply
GET/public/v1/posts/{id}posts.readGet a post
GET/public/v1/posts/{id}/repliesposts.readList replies to a post
DELETE/public/v1/posts/{id}posts.writeDelete a post
GET/public/v1/timelineposts.readRead the authorizing user's timeline

Shared responses

Every operation can return these, from the shared request path rather than from anything specific to the endpoint:

A 404 is also what the whole surface returns while the API is not yet enabled for your account. See errors for the complete registry and the status discipline.

Schemas

PublicProblemDto

RFC 9457 application/problem+json body every /public/v1 error uses. type is a stable URI per code (https://developers.mouve.it/errors/\<kebab>), code is the machine contract, request_id correlates with API logs. errors is present on VALIDATION_FAILED only.

FieldTypeRequiredNotes
typestringyes—
titlestringyes—
statusnumberyes—
codeVALIDATION_FAILED | INVALID_CURSOR | INVALID_IDEMPOTENCY_KEY | UNAUTHENTICATED | TOKEN_EXPIRED | TOKEN_REVOKED | INSUFFICIENT_SCOPE | VENUE_NOT_VERIFIED | APPROVAL_REQUIRED | TOKEN_NOT_PERMITTED | FORBIDDEN | ACCOUNT_SUSPENDED | ONBOARDING_REQUIRED | CLIENT_DISABLED | NOT_FOUND | IDEMPOTENCY_IN_FLIGHT | SLOT_UNAVAILABLE | CHANGESET_STALE | CHANGESET_OPEN | CONFLICT | ENDPOINT_RETIRED | PAYLOAD_TOO_LARGE | IDEMPOTENCY_BODY_MISMATCH | OUTSIDE_HOURS | AUDIENCE_UNAVAILABLE | MEDIA_NOT_FOUND | MEDIA_ALREADY_ATTACHED | MEDIA_URL_INVALID | MEDIA_URL_BLOCKED | MEDIA_FETCH_FAILED | MEDIA_TOO_LARGE | MEDIA_UNSUPPORTED_TYPE | MEDIA_VIDEO_UNSUPPORTED | RATE_LIMITED | USAGE_LIMIT_EXCEEDED | MEDIA_QUOTA_EXCEEDED | INTERNAL | UNAVAILABLE | VENUE_AGENT_WRITES_DISABLEDyes—
detailstringyes—
request_idstringyes—
errorsarray of objectno—
errors[].fieldstringyes—
errors[].messagestringyes—
retry_after_secondsnumbernoExtension members present on 429 responses only.
scopestringno—
windowstringno—
limitnumberno—
fixstringnoAgent-readable remedy ("send starts_at on a 30-minute boundary"). Optional on every code; the venue codes always carry one.
docs_urlstringnoLink to the docs for this code.
approval_urlstringnoAPPROVAL_REQUIRED only: where the owner approves. Not retried.

PublicMeDto

GET /public/v1/me — the authorizing user's own public identity.

FieldTypeRequiredNotes
idstringyes—
usernamestringyesHandle without the leading @, as it appears in a permalink.
display_namestring | nullyes—
avatar_urlstring | nullyes—
biostring | nullyes—
created_atstringyesISO 8601 timestamp in UTC.
verifiedbooleanyes—

PublicUserDto

GET /public/v1/users/:username — viewer-projected. No email, date of birth, sex, height, or weight is ever returned, under any scope.

FieldTypeRequiredNotes
idstringyes—
usernamestringyesHandle without the leading @, as it appears in a permalink.
display_namestring | nullyes—
avatar_urlstring | nullyes—
biostring | nullyes—
created_atstringyesISO 8601 timestamp in UTC.
verifiedbooleanyes—
privatebooleanyesThe account gates its content behind follow approval.

PublicUserRefDto

Embedded author reference on a post.

FieldTypeRequiredNotes
idstringyes—
usernamestringyes—
display_namestring | nullyes—
avatar_urlstring | nullyes—
verifiedbooleanyes—

PublicMediaRefDto

Media attached to a post. id is null for media uploaded through the Mouve apps rather than the API; API-uploaded media carry a real id once the media endpoints ship. width, height, and content_type are null when unknown, and may become non-null later — a nullable field gaining a value is not a breaking change.

FieldTypeRequiredNotes
idstring | nullyes—
urlstringyes—
widthnumber | nullyes—
heightnumber | nullyes—
content_typestring | nullyes—
altstring | nullyes—

PublicPostDto

FieldTypeRequiredNotes
idstringyes—
textstringyes—
authorPublicUserRefDtoyes—
created_atstringyesISO 8601 timestamp in UTC.
audienceeveryone | following | only_meyes—
in_reply_to_post_idstring | nullyesThe post this one replies to; null on a top-level post.
mediaarray of PublicMediaRefDtoyes—
metricsobjectyes—
metrics.like_countnumberyes—
metrics.reply_countnumberyes—
metrics.repost_countnumberyes—
metrics.view_countnumberyes—
permalinkstringyesAbsolute URL, computed server-side: {APP_URL}/{username}/post/{id}.
app_idstring | nullyesProvenance from metadata.agent; null = first-party.

PublicPostListDto

FieldTypeRequiredNotes
dataarray of PublicPostDtoyes—
metaobjectyesnext_cursor is null on the last page.
meta.next_cursorstring | nullyes—

PublicCreatePostRequest

FieldTypeRequiredNotes
textstringyes1–5000 characters
audienceeveryone | following | only_meno—
media_idsarray of string (uuid)noat most 5 items
in_reply_to_post_idstring (uuid)no—