Get Claude Max
For Free

Complete step-by-step guide to unlock Claude Max using the SEPA payment method. Simple, fast, and 100% working.

Start Now View Script
5
Easy Steps
100%
Working
Free
No Cost
5 min
Setup Time
Why This Method

What You Get

Full access to Claude Max features using a simple browser trick

5x

5x More Usage

Get 5x the usage limits compared to the free tier. Send more prompts and get longer responses without hitting limits.

Priority Access

Skip the queue during high-traffic periods. Get instant responses even when servers are under heavy load.

🚀

Latest Models

Access Claude 3.5 Sonnet and other premium models with extended context windows for complex tasks.

🔒

SEPA Method

Uses German SEPA direct debit payment system. No credit card needed, no recurring charges.

🌐

VPN Based

Simple VPN connection to Germany unlocks the SEPA payment option on Claude's checkout page.

Tampermonkey Script

Powerful userscript intercepts and modifies the checkout response to enable the Cassia payment flow.

Step by Step

Complete Guide

Follow each step carefully. Takes about 5 minutes total.

1

Install Tampermonkey Required

Open Chrome Web Store and install the Tampermonkey browser extension. This is a userscript manager that will run our script on Claude's website.

2

Add the Script

Click the Tampermonkey icon → "Create a new script" → Delete the default code → Paste the Claude Script below → Click File → Save.

3

Connect VPN to Germany Important

Turn on any VPN and connect to a German server. This is required to make the SEPA payment option appear on Claude's checkout page.

4

Change Country & Select SEPA

Open claude.ai, go to upgrade page. Change the country 2-3 times until the SEPA Payment option appears. Select Germany as country and SEPA as payment method.

5

Fill Details & Complete

Use FakeXy for a German address. Use @random1ban_bot on Telegram for a random German bank account number. Enter all details and submit.

Tampermonkey Script

The Script

Copy this script and paste it into Tampermonkey for Claude Max

claude-checkout-mock.user.js
// ==UserScript==
// @name         TestExample Cassia Response Mock
// @namespace    local.testexample.checkout
// @version      1.1.0
// @description  Rewrite checkout_capabilities response to cassia
// @match        *://claude.ai/*
// @match        *://*.claude.ai/*
// @run-at       document-start
// @grant        none
// @sandbox      raw
// ==/UserScript==

(function () {
  "use strict";

  const TARGET_HOST = "claude.ai";

  const TARGET_PATH =
    /^\/api\/organizations\/[^/]+\/subscription\/checkout_capabilities\/?$/;

  const MOCK_DATA = {
    checkout_flow: "cassia"
  };

  const MOCK_BODY = JSON.stringify(MOCK_DATA);
  const MOCK_LENGTH =
    new TextEncoder().encode(MOCK_BODY).byteLength;

  function getTargetUrl(input, method = "GET") {
    try {
      let rawUrl;

      if (typeof input === "string" || input instanceof URL) {
        rawUrl = String(input);
      } else if (input && typeof input.url === "string") {
        rawUrl = input.url;
      } else {
        return null;
      }

      const url = new URL(rawUrl, location.href);

      if (String(method).toUpperCase() !== "GET") {
        return null;
      }

      const hostMatched =
        url.hostname === TARGET_HOST ||
        url.hostname.endsWith("." + TARGET_HOST);

      if (!hostMatched) {
        return null;
      }

      if (!TARGET_PATH.test(url.pathname)) {
        return null;
      }

      return url;
    } catch (error) {
      console.error("[Cassia Mock] URL parse failed:", error);
      return null;
    }
  }

  function createMockResponse(originalResponse) {
    const headers = new Headers(originalResponse.headers);

    headers.delete("content-length");
    headers.delete("content-encoding");
    headers.delete("etag");
    headers.delete("content-md5");

    headers.set(
      "content-type",
      "application/json; charset=utf-8"
    );
    headers.set("content-length", String(MOCK_LENGTH));
    headers.set("cache-control", "no-store");

    const response = new Response(MOCK_BODY, {
      status: 200,
      statusText: "OK",
      headers
    });

    try {
      Object.defineProperties(response, {
        url: {
          value: originalResponse.url,
          configurable: true
        },
        redirected: {
          value: originalResponse.redirected,
          configurable: true
        },
        type: {
          value: originalResponse.type,
          configurable: true
        }
      });
    } catch (_) {}

    return response;
  }

  /* Intercept Fetch */
  const nativeFetch = window.fetch;

  window.fetch = async function (input, init) {
    const method =
      init?.method ||
      (input instanceof Request ? input.method : "GET");

    const targetUrl = getTargetUrl(input, method);

    const originalResponse =
      await nativeFetch.apply(this, arguments);

    if (!targetUrl) {
      return originalResponse;
    }

    console.warn(
      "[Cassia Mock] Fetch response overridden:",
      targetUrl.href,
      MOCK_DATA
    );

    return createMockResponse(originalResponse);
  };

  /* Intercept XMLHttpRequest */
  const XhrPrototype = XMLHttpRequest.prototype;
  const xhrInfo = new WeakMap();
  const loggedXhrs = new WeakSet();

  const nativeOpen = XhrPrototype.open;
  const nativeSend = XhrPrototype.send;
  const nativeGetResponseHeader =
    XhrPrototype.getResponseHeader;
  const nativeGetAllResponseHeaders =
    XhrPrototype.getAllResponseHeaders;

  XhrPrototype.open = function (method, url) {
    let absoluteUrl;

    try {
      absoluteUrl = new URL(
        String(url),
        location.href
      ).href;
    } catch (_) {
      absoluteUrl = String(url);
    }

    xhrInfo.set(this, {
      method: String(method || "GET").toUpperCase(),
      url: absoluteUrl
    });

    return nativeOpen.apply(this, arguments);
  };

  function getMatchedXhr(xhr) {
    const info = xhrInfo.get(xhr);

    if (
      !info ||
      xhr.readyState !== XMLHttpRequest.DONE
    ) {
      return null;
    }

    return getTargetUrl(info.url, info.method);
  }

  function replaceXhrGetter(propertyName, replacement) {
    const descriptor =
      Object.getOwnPropertyDescriptor(
        XhrPrototype,
        propertyName
      );

    if (
      !descriptor ||
      typeof descriptor.get !== "function" ||
      descriptor.configurable === false
    ) {
      console.warn(
        `[Cassia Mock] Cannot override XHR.${propertyName}`
      );
      return;
    }

    const nativeGetter = descriptor.get;

    Object.defineProperty(XhrPrototype, propertyName, {
      ...descriptor,
      get: function () {
        if (!getMatchedXhr(this)) {
          return nativeGetter.call(this);
        }
        return replacement.call(this, nativeGetter);
      }
    });
  }

  replaceXhrGetter(
    "responseText",
    function (nativeGetter) {
      if (
        this.responseType !== "" &&
        this.responseType !== "text"
      ) {
        return nativeGetter.call(this);
      }
      return MOCK_BODY;
    }
  );

  replaceXhrGetter(
    "response",
    function (nativeGetter) {
      if (this.responseType === "json") {
        return { checkout_flow: "cassia" };
      }
      if (
        this.responseType === "" ||
        this.responseType === "text"
      ) {
        return MOCK_BODY;
      }
      return nativeGetter.call(this);
    }
  );

  replaceXhrGetter("status", function () {
    return 200;
  });

  replaceXhrGetter("statusText", function () {
    return "OK";
  });

  XhrPrototype.getResponseHeader = function (name) {
    if (!getMatchedXhr(this)) {
      return nativeGetResponseHeader.apply(
        this, arguments
      );
    }
    switch (String(name).toLowerCase()) {
      case "content-type":
        return "application/json; charset=utf-8";
      case "content-length":
        return String(MOCK_LENGTH);
      case "cache-control":
        return "no-store";
      case "content-encoding":
      case "etag":
      case "content-md5":
        return null;
      default:
        return nativeGetResponseHeader.apply(
          this, arguments
        );
    }
  };

  XhrPrototype.getAllResponseHeaders = function () {
    const originalHeaders =
      nativeGetAllResponseHeaders.apply(this, arguments);
    if (!getMatchedXhr(this)) {
      return originalHeaders;
    }
    const headers = String(originalHeaders || "")
      .split(/\r?\n/)
      .filter(Boolean)
      .filter(function (line) {
        const name = line
          .split(":", 1)[0]
          .trim()
          .toLowerCase();
        return ![
          "content-type", "content-length",
          "content-encoding", "cache-control",
          "etag", "content-md5"
        ].includes(name);
      });
    headers.push(
      "content-type: application/json; charset=utf-8",
      `content-length: ${MOCK_LENGTH}`,
      "cache-control: no-store"
    );
    return headers.join("\r\n") + "\r\n";
  };

  XhrPrototype.send = function () {
    this.addEventListener(
      "readystatechange",
      function () {
        const targetUrl = getMatchedXhr(this);
        if (targetUrl && !loggedXhrs.has(this)) {
          loggedXhrs.add(this);
          console.warn(
            "[Cassia Mock] XHR response overridden:",
            targetUrl.href, MOCK_DATA
          );
        }
      }
    );
    return nativeSend.apply(this, arguments);
  };

  /* Status Badge */
  function showStatusBadge() {
    if (!document.documentElement) {
      document.addEventListener(
        "DOMContentLoaded",
        showStatusBadge,
        { once: true }
      );
      return;
    }
    if (document.getElementById("cassia-mock-badge")) {
      return;
    }
    const badge = document.createElement("div");
    badge.id = "cassia-mock-badge";
    badge.textContent = "Cassia Mock ON";
    Object.assign(badge.style, {
      position: "fixed",
      right: "12px",
      bottom: "12px",
      zIndex: "2147483647",
      padding: "7px 11px",
      color: "#ffffff",
      background: "#167c3a",
      borderRadius: "6px",
      fontSize: "12px",
      fontFamily: "sans-serif",
      boxShadow: "0 2px 8px rgba(0,0,0,.3)"
    });
    document.documentElement.appendChild(badge);
  }

  window.__cassiaMockInstalled = true;

  console.info(
    "[Cassia Mock] Script loaded:",
    location.href
  );

  showStatusBadge();
})();
FAQ

Common Questions

Answers to frequently asked questions about this method

Is this method safe to use?

The Tampermonkey script only modifies the browser-side response for the checkout API call. It does not interact with any other websites or steal data. Use a VPN and fake details for your safety.

Do I need a German bank account?

No. You can use the Telegram bot @random1ban_bot to generate random German bank account details (IBAN/BIC). These are temporary generated numbers that work for the SEPA form.

Which VPN should I use?

Any VPN with German servers works. Popular options include NordVPN, Surfshark, ProtonVPN (free), or Windscribe (free). Connect to Germany before opening Claude.

Will I be charged anything?

The SEPA method creates a pending authorization, but since the bank details are randomly generated, no actual charge goes through. However, always use caution with payment methods.

Does it work on mobile?

No. Tampermonkey only works on desktop browsers (Chrome, Firefox, Edge). You need a computer to install and run the userscript.

The SEPA option is not showing up?

Make sure your VPN is connected to Germany. Try switching between different German server locations. Also clear your browser cache and try changing the country selector 2-3 times on the checkout page.