Patent transfers take months, cost billions, and are opaque. PatentSync tokenizes them, making them instant, verifiable, and secure. All powered by the XRP Ledger.
Modern-day patent systems are broken. They:
- Take months to transfer - Manual data entry over thousands of patents takes time
- Bleed billions in opportunity costs - Crucial IP transfers from M&A take too long to innovate on
- Opaque - Nobody knows the behind the scenes, least of all IP holders
We fix this by:
- Patent tokenization - Sources files hosted on IPFS, transfers via tokens
- Instant transfers - Using XRPL's native escrow alternative
- Public record of transfers - No more opacity, transaction histories and current holders are transparent
| Layer | Technology |
|---|---|
| Blockchain | XRP Ledger (Testnet) |
| Backend | Python 3.13, FastAPI, xrpl-py 4.4+ |
| Frontend | Next.js 16, React 19, TypeScript, Tailwind CSS 4 |
| File Storage | IPFS via Pinata |
| Auth | Xumm SDK (QR-based signing) + backend fallback |
- User uploads a patent PDF through the frontend (or via
POST /api/patents/tokenize) - The PDF is uploaded to IPFS through Pinata, returning a content-addressed CID
- A metadata JSON file (title, inventor, filing date, SHA-256 hash, IPFS URLs) is also pinned to IPFS
- An
NFTokenMinttransaction is submitted to the XRP Ledger with the IPFS metadata URI - The resulting NFToken ID and transaction details are recorded locally and returned
- The patent owner creates a sell offer (
POST /api/offers/sell) — this commits the NFT on-ledger, acting as escrow - The offer can optionally be restricted to a specific buyer wallet address
- The buyer accepts the offer (
POST /api/offers/accept) — the NFT atomically transfers to their wallet - The transfer is recorded in
transfer_history.jsonand is verifiable on-chain - Either party can cancel the offer before acceptance (
DELETE /api/offers/{offer_id})
GET /api/nfts/{nftoken_id}/historyreturns the full chain of custody- Queries the XRP Ledger (
AccountTx) for allNFTokenAcceptOffertransactions involving the NFT - Merges on-chain data with the local transfer log, deduplicates by transaction hash, and sorts chronologically
- Returns the issuer, current owner, and every transfer event with timestamps and wallet addresses
- Python 3.13+ — python.org
- uv — Python package manager —
pip install uvor docs.astral.sh/uv - Node.js 18+ — nodejs.org
- npm (comes with Node.js)
- An XRPL Testnet wallet seed — generate one with
python scripts/generate_wallet.py - A Pinata account with an API JWT — pinata.cloud (free tier works)
- (Optional) A Xumm developer API key for wallet QR signing — apps.xumm.dev
cd xrpl-patent-backend
# Install dependencies
uv sync
# Create your environment file
cp .env.example .env.local
# Edit .env.local and fill in:
# XRPL_WALLET_SEED=sYourTestnetSeedHere
# PINATA_JWT=eyYourPinataJWTHere
# XRPL_TESTNET_URL=https://testnet.xrpl-labs.com (optional, this is the default)
# XRPL_BASE_URL=http://localhost:8001 (optional, this is the default)
# Start the API server
uv run uvicorn server:app --reload --port 8001The API will be available at http://localhost:8001. Verify with:
curl http://localhost:8001/api/healthcd xrpl-patent-frontend
# Install dependencies
npm install
# (Optional) Create .env.local for Xumm wallet integration:
# NEXT_PUBLIC_XUMM_API_KEY=your-key
# NEXT_PUBLIC_XUMM_API_SECRET=your-secret
# Start the dev server
npm run devThe frontend will be available at http://localhost:3000.
If you don't have a wallet seed yet:
cd xrpl-patent-backend
uv run python scripts/generate_wallet.pyThis creates a new wallet, funds it via the XRPL Testnet faucet, and prints the seed. Copy it into your .env.local.
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/health |
Health check |
GET |
/api/wallet |
Current wallet address |
POST |
/api/wallet/generate |
Generate & fund a new testnet wallet |
GET |
/api/patents |
List all tokenized patents |
GET |
/api/patents/{id} |
Single patent detail |
POST |
/api/patents/tokenize |
Upload PDF → IPFS → mint NFT |
GET |
/api/nfts/{address} |
List NFTs for a wallet |
POST |
/api/offers/sell |
Create a sell offer (escrow) |
GET |
/api/offers/{nftoken_id} |
Query active offers for an NFT |
POST |
/api/offers/accept |
Accept a sell offer (transfer) |
DELETE |
/api/offers/{offer_id} |
Cancel an offer |
GET |
/api/nfts/{nftoken_id}/history |
NFT ownership history |
GET |
/api/transfers |
List all transfer records |
