diff --git a/lnbits/extensions/lnurlpayout/README.md b/lnbits/extensions/lnurlpayout/README.md
new file mode 100644
index 000000000..ddf209fe4
--- /dev/null
+++ b/lnbits/extensions/lnurlpayout/README.md
@@ -0,0 +1,3 @@
+# LNURLPayOut
+
+## Auto-dump a wallets funds to an LNURLpay
diff --git a/lnbits/extensions/lnurlpayout/__init__.py b/lnbits/extensions/lnurlpayout/__init__.py
new file mode 100644
index 000000000..e40549dde
--- /dev/null
+++ b/lnbits/extensions/lnurlpayout/__init__.py
@@ -0,0 +1,16 @@
+from fastapi import APIRouter
+
+from lnbits.db import Database
+from lnbits.helpers import template_renderer
+
+db = Database("ext_lnurlpayout")
+
+lnurlpayout_ext: APIRouter = APIRouter(prefix="/lnurlpayout", tags=["lnurlpayout"])
+
+
+def lnurlpayout_renderer():
+ return template_renderer(["lnbits/extensions/lnurlpayout/templates"])
+
+
+from .views_api import * # noqa
+from .views import * # noqa
diff --git a/lnbits/extensions/lnurlpayout/config.json b/lnbits/extensions/lnurlpayout/config.json
new file mode 100644
index 000000000..1e72c0c1e
--- /dev/null
+++ b/lnbits/extensions/lnurlpayout/config.json
@@ -0,0 +1,6 @@
+{
+ "name": "LNURLPayout",
+ "short_description": "Autodump wallet funds to LNURLpay",
+ "icon": "exit_to_app",
+ "contributors": ["arcbtc"]
+}
diff --git a/lnbits/extensions/lnurlpayout/crud.py b/lnbits/extensions/lnurlpayout/crud.py
new file mode 100644
index 000000000..ca97c6375
--- /dev/null
+++ b/lnbits/extensions/lnurlpayout/crud.py
@@ -0,0 +1,42 @@
+from typing import List, Optional, Union
+
+from lnbits.helpers import urlsafe_short_hash
+
+from . import db
+from .models import lnurlpayout, CreateLnurlPayoutData
+
+
+async def create_lnurlpayout(wallet_id: str, data: CreateLnurlPayoutData) -> lnurlpayout:
+ lnurlpayout_id = urlsafe_short_hash()
+ await db.execute(
+ """
+ INSERT INTO lnurlpayout.lnurlpayouts (id, wallet, lnurlpay, threshold)
+ VALUES (?, ?, ?, ?)
+ """,
+ (lnurlpayout_id, wallet_id, data.name, data.currency),
+ )
+
+ lnurlpayout = await get_lnurlpayout(lnurlpayout_id)
+ assert lnurlpayout, "Newly created lnurlpayout couldn't be retrieved"
+ return lnurlpayout
+
+
+async def get_lnurlpayout(lnurlpayout_id: str) -> Optional[lnurlpayout]:
+ row = await db.fetchone("SELECT * FROM lnurlpayout.lnurlpayouts WHERE id = ?", (lnurlpayout_id,))
+ return lnurlpayout.from_row(row) if row else None
+
+
+async def get_lnurlpayouts(wallet_ids: Union[str, List[str]]) -> List[lnurlpayout]:
+ if isinstance(wallet_ids, str):
+ wallet_ids = [wallet_ids]
+
+ q = ",".join(["?"] * len(wallet_ids))
+ rows = await db.fetchall(
+ f"SELECT * FROM lnurlpayout.lnurlpayouts WHERE wallet IN ({q})", (*wallet_ids,)
+ )
+
+ return [lnurlpayout.from_row(row) for row in rows]
+
+
+async def delete_lnurlpayout(lnurlpayout_id: str) -> None:
+ await db.execute("DELETE FROM lnurlpayout.lnurlpayouts WHERE id = ?", (lnurlpayout_id,))
diff --git a/lnbits/extensions/lnurlpayout/migrations.py b/lnbits/extensions/lnurlpayout/migrations.py
new file mode 100644
index 000000000..fde01566b
--- /dev/null
+++ b/lnbits/extensions/lnurlpayout/migrations.py
@@ -0,0 +1,14 @@
+async def m001_initial(db):
+ """
+ Initial lnurlpayouts table.
+ """
+ await db.execute(
+ """
+ CREATE TABLE lnurlpayout.lnurlpayouts (
+ id TEXT PRIMARY KEY,
+ wallet TEXT NOT NULL,
+ lnurlpay TEXT NOT NULL,
+ threshold INT NOT NULL
+ );
+ """
+ )
diff --git a/lnbits/extensions/lnurlpayout/models.py b/lnbits/extensions/lnurlpayout/models.py
new file mode 100644
index 000000000..f749ae9d6
--- /dev/null
+++ b/lnbits/extensions/lnurlpayout/models.py
@@ -0,0 +1,14 @@
+from sqlite3 import Row
+
+from pydantic import BaseModel
+
+class CreateLnurlPayoutData(BaseModel):
+ wallet: str
+ lnurlpay: str
+ threshold: int
+
+class lnurlpayout(BaseModel):
+ id: str
+ wallet: str
+ lnurlpay: str
+ threshold: str
diff --git a/lnbits/extensions/lnurlpayout/templates/lnurlpayout/_api_docs.html b/lnbits/extensions/lnurlpayout/templates/lnurlpayout/_api_docs.html
new file mode 100644
index 000000000..1ccc5d0da
--- /dev/null
+++ b/lnbits/extensions/lnurlpayout/templates/lnurlpayout/_api_docs.html
@@ -0,0 +1,90 @@
+GET
+ /lnurlpayout/api/v1/lnurlpayouts
+ Headers
+ {"X-Api-Key": <invoice_key>}
+ Body (application/json)
+
+ Returns 200 OK (application/json)
+
+ [<lnurlpayout_object>, ...]
+ Curl example
+ curl -X GET {{ request.base_url }}api/v1/lnurlpayouts -H "X-Api-Key:
+ <invoice_key>"
+
+ POST
+ /lnurlpayout/api/v1/lnurlpayouts
+ Headers
+ {"X-Api-Key": <invoice_key>}
+ Body (application/json)
+ {"name": <string>, "currency": <string*ie USD*>}
+
+ Returns 201 CREATED (application/json)
+
+ {"currency": <string>, "id": <string>, "name":
+ <string>, "wallet": <string>}
+ Curl example
+ curl -X POST {{ request.base_url }}api/v1/lnurlpayouts -d '{"name":
+ <string>, "currency": <string>}' -H "Content-type:
+ application/json" -H "X-Api-Key: <admin_key>"
+
+ DELETE
+ /lnurlpayout/api/v1/lnurlpayouts/<lnurlpayout_id>
+ Headers
+ {"X-Api-Key": <admin_key>}
+ Returns 204 NO CONTENT
+
+
Curl example
+ curl -X DELETE {{ request.base_url
+ }}api/v1/lnurlpayouts/<lnurlpayout_id> -H "X-Api-Key:
+ <admin_key>"
+
+