API v1

RexiMemo API Documentation

Use your RexiMemo account from scripts and apps without exposing browser sessions.

Quick start

API v1 requests normally require a current 30-day bearer credential. Send it in the HTTP Authorization header. Do not put API keys or bearer credentials in query strings or public client-side code.

Base URLhttps://reximemo.net/api/v1

Authentication example

curl -H 'Authorization: Bearer rxm_YOUR_KEY' \
  https://reximemo.net/api/v1/me

The main API key is shown in full only when generated and RexiMemo stores only its hash. At the same time, Settings shows a short one-time login code that expires after 10 minutes. A client can redeem that code once for its own bearer credential linked to the same API key.

One-time login-code example

curl -X POST \
  -H 'Content-Type: application/json' \
  -d '{"code":"RM-ABCD-EFGH-JKLM"}' \
  https://reximemo.net/api/v1/auth/login-code
Client login codes

Use this flow when a user is signing in to a RexiMemo API-based client and does not want to type or paste the full API key. The one-time code is generated alongside a new key in Settings → API Key, can be entered with or without its hyphens, and is valid for 10 minutes.

One use means one use. After a successful exchange the login code is deleted immediately. A second exchange returns HTTP 401. The bearer credential returned to the client remains linked to the parent API key: revoking, replacing, or expiring the parent also invalidates the client credential.
POST/api/v1/auth/login-codeRedeem a one-time client login code

Exchanges the short login code shown when an API key is generated for a bearer credential linked to that API key. This endpoint does not require an Authorization header. The code expires after 10 minutes and is consumed by the first successful redemption.

JSON body

{
  "code": "RM-ABCD-EFGH-JKLM"
}

Example response

{
  "ok": true,
  "token_type": "Bearer",
  "api_key": "rxm_...",
  "expires_at": 1780000000,
  "expires_in_seconds": 2500000
}
Treat the returned bearer credential like an API key. Replacing, revoking, or allowing the parent API key to expire invalidates it too.
Access rules
Allowed
  • Browse creators, Flipnotes, comments, channels and search.
  • Read your account, favorites, follows, notifications and consoles.
  • Download original Flipnote PPMs and existing memo-comment PPMs.
  • Request real PNG thumbnails and creator profile-picture PNGs.
  • Review and submit your own verified S2R migration requests.
  • Favorite, follow, add stars and post text comments.
  • Edit/delete your own Flipnote metadata and edit channels you own.
Blocked
  • Reading browser or DSi session records.
  • Changing Settings or console configuration.
  • Using moderator/administrator powers.
  • Uploading a PPM that is not yours.
  • Uploading memo-comment PPMs.
API keys act as the account that generated them. Treat a key like a password and revoke it from Settings if it is exposed.
API use is governed by the Terms of Use. Personal, educational, community, open-source and commercial clients are allowed when they follow those Terms. Do not resell raw RexiMemo API access or handle users' keys as a product, and do not rely on a specific endpoint or API version remaining compatible forever.
Account endpoints
GET/api/v1API capabilities

Returns the authenticated account, API permissions, key lifetime, and only the experiment endpoints this account is currently allowed to use.

Example response

{
  "ok": true,
  "version": "v1",
  "permissions": {
    "browse": true,
    "read_sessions": false,
    "write_settings": false,
    "download_flipnote_ppm": true,
    "upload_flipnote_ppm": true
  }
}
GET/api/v1/meMy account

Returns your public account record plus star balances, unread notification count, and ticket status.

GET/api/v1/me/profile-picture.pngMy profile picture PNG

Returns your current profile picture as binary image/png. If your account has no selected profile picture, this returns HTTP 404.

GET/api/v1/me/migrationMigration state and review data

Returns your current Sudomemo migration request, selected/approved/imported IDs, status and user-facing staff message. When the stored S2R files are available, it also includes the full per-Flipnote review data and private preview URLs.

POST/api/v1/me/migration/reviewValidate S2R files and build a review

Uploads one or more verified .S2R files without creating the final migration request yet. RexiMemo verifies the manifests and Nintendo PPM signatures, stores the files privately for this account, and returns a review.descriptor plus per-Flipnote eligibility.

Multipart form

multipart/form-data

file field (repeatable):
  s2r_file

optional text fields:
  source_account
  user_notes
This is the one upload exception to the normal no-PPM-upload API rule: the API accepts only the signed PPMs inside a validated Sudo2RexiMemo .S2R migration archive. Direct PPM publication uploads remain blocked.
POST/api/v1/me/migrationSubmit an actual migration request

Submits the migration selection and then runs the same final eligibility/import checks as the website. You can either upload the S2R files directly as multipart data or submit JSON using the review.descriptor returned by the review endpoint.

JSON body

{
  "review_descriptor": [
    {"filename":"95FD4F3065E2146D@DSi.S2R","sha256":"..."}
  ],
  "source_account": "Sudomemo username or profile URL",
  "user_notes": "optional",
  "selected_flipnotes": ["WATCH_ID_1", "WATCH_ID_2"],
  "avatar_flipnote": "WATCH_ID_1",
  "confirm_no_stars": true
}
For a one-request multipart submission, send the same s2r_file field(s), plus source_account, user_notes, selected_flipnotes as a JSON array string, optional avatar_flipnote, and confirm_no_stars=1. If every selected Flipnote passes final checks it can be imported immediately; otherwise the unresolved selection remains for staff review.
DELETE/api/v1/me/migrationCancel migration request

Cancels the current migration request and removes its private S2R/review files. Flipnotes that were already imported are intentionally kept.

GET/api/v1/me/migration/review/{sha256}/{index}/thumbnail.pngMigration review thumbnail

Returns a private PNG thumbnail for a staged/current S2R Flipnote. The SHA-256 and entry index come from the review response.

GET/api/v1/me/migration/review/{sha256}/{index}/file.ppmMigration review PPM

Returns the verified PPM from your own private migration review. This is a read/download route; it does not publish anything.

GET/api/v1/me/settingsSafe settings snapshot

Reads profile, notification preferences, consoles, Discord link state, passkey metadata, migration status, granted experiment access and API-key metadata.

Sessions are deliberately omitted. The response includes sessions: null and API keys cannot access session records.
GET/api/v1/me/consolesMy consoles

Lists linked console FSIDs and device metadata. This does not expose session IDs, IP addresses, browser user agents, or session history.

GET/api/v1/me/notificationsNotifications

Lists your notifications.

Query parameters

  • page — page number, starting at 1.
  • per_page — 1–50 items per page.
POST/api/v1/me/notifications/readMark notifications read

Mark one notification, or all notifications, as read.

JSON body

{
  "id": 123
}

or

{
  "all": true
}
GET/api/v1/me/favoritesMy favorites

Lists Flipnotes you have favorited.

Query parameters

  • page — page number, starting at 1.
  • per_page — 1–50 items per page.
GET/api/v1/me/followersMy followers

Lists accounts following you.

Query parameters

  • page — page number, starting at 1.
  • per_page — 1–50 items per page.
GET/api/v1/me/followingAccounts I follow

Lists accounts you follow.

Query parameters

  • page — page number, starting at 1.
  • per_page — 1–50 items per page.
GET/api/v1/me/flipnotesMy Flipnotes

Lists Flipnotes owned by your account.

Query parameters

  • page — page number, starting at 1.
  • per_page — 1–50 items per page.
  • sort — new, recent, top, popular, or hot.
GET/api/v1/me/channelsMy channels

Lists channels owned by your account.

Query parameters

  • page — page number, starting at 1.
  • per_page — 1–50 items per page.
GET/api/v1/me/star-balanceStar balance

Returns your current colored-star balances.

GET/api/v1/me/ticketTicket status

Returns the current ticket status and star balances.

POST/api/v1/me/ticket/redeemRedeem a ticket

Draws a ticket using the configured Drawing Ticket rules. Winning responses include the selected prize and reward amounts. Returns HTTP 429 while the ticket is on cooldown.

JSON body

{}
Creator endpoints
GET/api/v1/users/{public_id}Creator profile

Returns a creator and viewer-specific follow/subscription state.

GET/api/v1/users/{public_id}/profile-picture.pngCreator profile picture PNG

Returns that creator’s current profile picture as binary image/png. Returns 404 when the creator has no selected profile picture.

GET/api/v1/users/{public_id}/flipnotesCreator Flipnotes

Lists a creator’s Flipnotes.

Query parameters

  • page — page number, starting at 1.
  • per_page — 1–50 items per page.
  • sort — new, recent, top, popular, or hot.
GET/api/v1/users/{public_id}/favoritesCreator favorites

Lists a creator’s public favorites.

Query parameters

  • page — page number, starting at 1.
  • per_page — 1–50 items per page.
GET/api/v1/users/{public_id}/followersCreator followers

Lists a creator’s followers.

Query parameters

  • page — page number, starting at 1.
  • per_page — 1–50 items per page.
GET/api/v1/users/{public_id}/followingCreator following

Lists accounts followed by a creator.

Query parameters

  • page — page number, starting at 1.
  • per_page — 1–50 items per page.
GET/api/v1/users/{public_id}/channelsCreator channels

Lists channels owned by a creator.

Query parameters

  • page — page number, starting at 1.
  • per_page — 1–50 items per page.
POST/api/v1/users/{public_id}/followFollow or unfollow

Sets your follow state for another creator.

JSON body

{
  "enabled": true
}
POST/api/v1/users/{public_id}/upload-notificationsCreator upload notifications

Turns upload notifications for a creator on or off.

JSON body

{
  "enabled": true
}
Flipnote endpoints
GET/api/v1/flipnotesBrowse Flipnotes

Lists Flipnotes across RexiMemo.

Query parameters

  • page / per_page — pagination, up to 50 per page.
  • sort — new, recent, top, popular, or hot.
  • creator — creator public ID.
  • channel — channel public ID.
POST/api/v1/flipnotesUpload a Flipnote PPM

Publishes a PPM upload to your account.

Multipart form

multipart/form-data

file field:
  ppm                   required Flipnote Studio .PPM file

optional text fields:
  title                 up to 80 characters; defaults to "Flipnote by <username>"
  description           up to 500 characters
  channel_public_id     optional channel public ID
  comments_enabled      1 | 0; defaults to 1
The PPM must be your Flipnote or it may not be accepted. A successful upload returns the created Flipnote in the normal API response format.
GET/api/v1/flipnotes/{public_id}Flipnote details

Returns metadata, creator/channel data, views, downloads, star totals, viewer state, and direct API URLs for the PPM and PNG thumbnail.

GET/api/v1/flipnotes/{public_id}/commentsFlipnote comments

Lists text and memo comments.

Query parameters

  • page — page number, starting at 1.
  • per_page — 1–50 items per page.
GET/api/v1/flipnotes/{public_id}/thumbnail.pngFull PNG thumbnail

Renders and returns the real Flipnote thumbnail as image/png. This is binary image data, not JSON.

Use the normal Authorization: Bearer header even though the response is an image.
GET/api/v1/flipnotes/{public_id}/file.ppmOriginal Flipnote PPM

Returns the original Flipnote .ppm as binary data.

Query parameters

  • download=1 — additionally count the request as a Flipnote download.
This downloads an existing RexiMemo PPM.
POST/api/v1/flipnotes/{public_id}/favoriteFavorite or unfavorite

Sets your favorite state.

JSON body

{
  "enabled": true
}
POST/api/v1/flipnotes/{public_id}/starsAdd stars

Adds stars using your account balance and the same restrictions as the website.

JSON body

{
  "color": "yellow",
  "amount": 1
}
amount is clamped to 1–100. Yellow-star limits and colored-star balances are enforced.
POST/api/v1/flipnotes/{public_id}/commentsPost a text comment

Posts a text comment. Replies use the parent comment’s public ID.

JSON body

{
  "text": "Nice Flipnote!",
  "reply_to": "COMMENT_PUBLIC_ID"
}
Text comments only. PPM/memo-comment publication uploads are not supported through this comment endpoint.
PATCH/api/v1/flipnotes/{public_id}Edit my Flipnote

Edits metadata on a Flipnote owned by your account. Any other field is rejected.

JSON body

{
  "title": "New title",
  "description": "Updated description",
  "channel_public_id": "CHANNEL_PUBLIC_ID",
  "comments_enabled": true
}
Send only the fields you want to change. Set channel_public_id to null or an empty string to remove the channel.
DELETE/api/v1/flipnotes/{public_id}Delete my Flipnote

Deletes a Flipnote owned by your account. API keys cannot delete someone else’s Flipnotes.

Comment endpoints
GET/api/v1/comments/{public_id}Comment details

Returns one text or memo comment.

GET/api/v1/comments/{public_id}/thumbnail.pngMemo-comment PNG thumbnail

For memo comments, returns a rendered image/png thumbnail.

GET/api/v1/comments/{public_id}/file.ppmMemo-comment PPM

For an existing memo comment, downloads its original PPM. This does not provide memo-comment upload access.

Channels & discovery
GET/api/v1/channelsBrowse channels

Lists channels.

Query parameters

  • page — page number, starting at 1.
  • per_page — 1–50 items per page.
GET/api/v1/channels/{public_id}Channel details

Returns one channel.

GET/api/v1/channels/{public_id}/flipnotesChannel Flipnotes

Lists Flipnotes in a channel.

Query parameters

  • page — page number, starting at 1.
  • per_page — 1–50 items per page.
  • sort — new, recent, top, popular, or hot.
PATCH/api/v1/channels/{public_id}Edit a channel

Edits the title and/or description when your account has owner-level permission.

JSON body

{
  "title": "Channel title",
  "description": "Channel description"
}
GET/api/v1/categoriesCategories

Returns RexiMemo’s category list.

GET/api/v1/searchSearch

Searches Flipnotes, channels, and creators.

Query parameters

  • q — search text.
  • limit — 1–50 results per result type; default 30.
GET/api/v1/trending-creatorsTrending creators

Returns creators in ranked order.

Query parameters

  • limit — 1–100 creators; default 25.
Binary downloads

PPM and PNG endpoints return binary files directly instead of JSON. They still require the bearer header. PNG routes include Flipnote thumbnails, memo-comment thumbnails, profile pictures, and migration-review thumbnails.

Download a PPM

curl -L \
  -H 'Authorization: Bearer rxm_YOUR_KEY' \
  -o flipnote.ppm \
  https://reximemo.net/api/v1/flipnotes/FLIPNOTE_PUBLIC_ID/file.ppm

Download a PNG thumbnail

curl -L \
  -H 'Authorization: Bearer rxm_YOUR_KEY' \
  -o thumbnail.png \
  https://reximemo.net/api/v1/flipnotes/FLIPNOTE_PUBLIC_ID/thumbnail.png

Append ?download=1 to a Flipnote PPM request only when you want RexiMemo to increment that Flipnote’s download count.

Errors & status codes

JSON endpoints use this error envelope:

{
  "ok": false,
  "error": "invalid_api_key",
  "message": "Supply a current RexiMemo API key in the Authorization: Bearer header."
}
400 invalid request or data401 missing/expired/revoked API key403 authenticated but forbidden404 resource/endpoint not found or experiment not granted405 method not allowed413 encoder input too large429 rate limit or ticket cooldown

Binary endpoints return JSON error bodies when processing fails.