CivArchive
    ← All articles
    Published November 7, 2025

    Over 10K CivitAI Top NSFW Prompts dataset

    10.2K views18 reactions16 comments on CivitAI145 collected
    generation guidedanbooru tagsnsfw promptsbooru tagsflux promptspromptsdxl prompts

    Hey folks!

    Update V2.0

    Download: https://civitai.com/models/2176651?modelVersionId=2451158

    V1.0

    This is a dataset of over 10,000 pure NSFW prompts pulled from Civitai's top-rated NSFW images (the ones with at least 25 heart likes and marked as 'X' level).

    I filtered out cat faces or landscapes that were tagged as 'X' in the Civitai database and left with pure NSFW prompts, cleaned up the text (tags that could be removed using regex), and packed it all into an easy-to-use JSONL file.

    Update: ComfyUI node

    unzip the comfyui-civitai-prompts.zip and place the folder in

    /ComfyUI/custom_nodes/

    In the "/ComfyUI/models/' directory, create a new folder and name it civitai_prompts

    Place the dataset file 'prompts.jsonl ' in that folder

    Restart the ComfyUI and search for "NSFW Prompt Loader"

    How to use:

    if your browser shows a 'not found' error or complains about CORS:

    Read the README in the zip file.

    Just open the included index.html in your browser, and you've got a simple web tool to browse prompts by ID or grab a random one or use the python script below to interact with the dataset. (included in the zip file in data folder)

    Save the code as fetch.py or any name you prefer. Activate your Python virtual environment, navigate to the directory where the dataset is located, and run the script.

    python fetch.py

    import json
    import random
    import os
    
    JSONL_FILE = 'prompts.jsonl'
    
    def load_prompts():
        prompts = {}
        if not os.path.exists(JSONL_FILE):
            print(f"Error: {JSONL_FILE} not found.")
            return prompts
        
        with open(JSONL_FILE, 'r', encoding='utf-8') as f:
            for line in f:
                try:
                    data = json.loads(line.strip())
                    id_val = data.get('id')
                    prompt = data.get('prompt')
                    if id_val is not None and prompt:
                        prompts[id_val] = prompt
                except json.JSONDecodeError:
                    print("Warning: Invalid JSON line skipped.")
        
        return prompts
    
    def retrieve_prompt(prompts, id_input):
        if id_input.lower() == 'random':
            if not prompts:
                return "No prompts available."
            random_id = random.choice(list(prompts.keys()))
            prompt_text = prompts[random_id]
            return f"Random ID {random_id}:\n### start ###\n{prompt_text}\n#### End ###"
        else:
            try:
                id_val = int(id_input)
                if id_val in prompts:
                    prompt_text = prompts[id_val]
                    return f"ID {id_val}:\n### start ###\n{prompt_text}\n#### End ###"
                else:
                    return f"ID {id_val} not found."
            except ValueError:
                return "Invalid input. Enter an integer ID or 'random'."
    
    # Main loop
    prompts = load_prompts()
    if prompts:
        print(f"Loaded {len(prompts)} prompts.")
        while True:
            user_input = input("Enter ID (int) or 'random' (or 'exit' to quit): ").strip()
            if user_input.lower() == 'exit':
                break
            result = retrieve_prompt(prompts, user_input)
            print(result)
    else:
        print("No prompts loaded. Exiting.")

    Good luck!

    Attachments