AiRP
BrowseMy chats
Sign inSign upCreate account
AiRPAboutAI roleplay guideFAQHelpBlogRulesTermsPrivacyCopyright

We’d like to use advertising cookies from OpenAI to see whether our ads bring people here. They stay off unless you agree. Privacy policy

Browse / Help / Create and import a story with AI

Import guide

Create and import a story with AI

Use a copyable prompt and an example JSON file that matches AiRP's import fields.

Import the result

  1. Copy the prompt below into your AI tool and replace [STORY BRIEF] with your premise, characters, constraints, and any existing writing.
  2. Save the resulting JSON as a .json file, or copy its full text. Sign in, open Import, and choose the file or paste the text.
  3. Read the preview for missing, shortened, or unsupported material. Use Open in the editor if you want to choose what to cut; direct import can shorten material to fit the story limit.
  4. Review the private draft in the story editor. Add images, reader-facing intro, tags, content labels, and any other presentation details there before publishing.

Best practices

  • AiRP's own Character Card V2 exports are best for round trips. The plain JSON template below is easier for an AI to compose from scratch.
  • A title and some actual story content are needed; a title-only object will not import.
  • If the preview reports a problem, correct the JSON or its links before importing.

Prompt for your AI tool

Replace [STORY BRIEF] with your idea. You can also select and copy the text below.

Create one roleplay story for AiRP from this brief:

[STORY BRIEF]

Return one valid JSON object only, with no Markdown, comments, or explanation. Use AiRP's plain story shape, not a Character Card V2 wrapper. Use only fields that the importer reads:

{
  "title": "A short story title",
  "tagline": "A reader-facing hook",
  "plot": "The world and the situation at the start of play",
  "rules": "Standing directions for tone, point of view, pacing, and player agency",
  "cast": [
    { "key": "person-1", "name": "Name", "description": "Identity, motive, voice, and behavior" }
  ],
  "tidbits": [
    {
      "key": "detail-1",
      "kind": "tidbit",
      "parent": { "kind": "person", "key": "person-1" },
      "label": "Concise neutral label",
      "keywords": ["specific trigger"],
      "content": "One coherent piece of story information",
      "enabled": true,
      "policy": { "category": "backstory", "mode": "automatic", "revealKeywords": [] }
    }
  ],
  "hooks": [
    { "title": "Opening", "description": "Short spoiler-free summary", "content": "An opening scene that leaves the player room to act" }
  ]
}

Replace every example value. Omit empty example entries. A story needs a title and actual content. Keep essential starting facts in plot and core character identity in cast. Put conditional facts in separate tidbits. Do not repeat long descriptions across fields. Never decide the player's dialogue, thoughts, feelings, or consequential choices; use {{user}} for the player's character.

Every cast member and tidbit key must be unique across both arrays. A parent must point to an existing key: {"kind":"person","key":"character key"} for character details, or {"kind":"location","key":"location key"} for location details. Locations are tidbits with "kind":"location" and their own key, label, keywords, and content. Omit parent for a standalone entry. Avoid circular links.

Choose a policy category as appropriate: general, secret, history, sublocation, backstory, relationship, romance, private_nature, faction, or race. Use "mode":"automatic" by default. For "mode":"keywords", supply precise nonempty keywords; avoid broad triggers such as love, eyes, or gold. History and sublocation belong under a location. Backstory, relationship, romance, and private_nature belong under a person. Sublocations can have a short policy.purpose and actual place-name policy.aliases. Private nature may have policy.sceneCondition.

For each relationship, attach one card to the character whose feelings it describes. Set policy.relationshipTarget to the exact name of the other cast member or {{user}}. Set policy.relationshipKind to the TARGET's role in the OWNER's life: if Ilya is Mara's mother, the card belongs to Mara, targets Ilya, and says "mother". Do not imply that feelings are mutual.

For a secret, use a neutral label and set policy.revealCondition to an event that must actually happen in the chat; keep its contents out of plot, cast descriptions, openings, and ordinary lore. Set policy.revealKeywords to [] unless I specifically ask for phrase-based reveals. A fact becoming eligible for context does not mean every character knows it.

Factions and races may have policy.subjects: [{"kind":"person","name":"Exact cast name"}] or a matching location name. Do not invent images, image URLs, tags, model IDs, dice, variables, galleries, or unsupported fields.

Limits: title 80 characters; tagline 150; character names and opening titles 60; tidbit labels 80; opening descriptions 240; at most six openings and twelve keywords per tidbit. Aim for roughly 100–4,000 characters of plot, under 6,000 of rules, and under 4,000 for each opening. The whole story must fit under 128,000 characters, but keep recurring plot, rules, and cast concise so chat has room to grow.

Before returning, check JSON syntax, exact field names and types, unique keys, existing parent targets, category-specific parents, relationship direction, reveal conditions, limits, and consistency with the brief. If a parser is available, use it. Do not claim to have validated the file if you have not.

Try a complete example

The sample has a character, location, attached history, relationship, and opening. Open the JSON to inspect its structure, or save it and try the import preview.

Download example JSONOpen Import
All help guidesNext: Use tidbits effectively →