# Welcome

Welcome to the Investhub developer and product documentation.

## What is Investhub?

Investhub provides a legal and compliant solution for onboarding investors, from individuals to large groups. The platform supports tokenization of shares, bonds, and other financial instruments, with wallet-based investing and multiple payment options.

## Getting started

* [**API Reference**](/overview) — Backend APIs (Supabase Edge Functions), authentication, base URL, and the full OpenAPI spec for all endpoints.
* [**Investments guide**](/guides/investments) — Creating an investment, payment methods, and the main API flow.
* [**Portfolio Dashboard guide**](/guides/portfolio-dashboard) — Net worth overview, allocation chart, transaction history, CSV export, caching, and testing checklist.
* [**Liquidation Management**](/guides/liquidation) — Bankruptcy workflows: verify USDC quote, e-sign claim transfer, receive USDC (e.g. [envion.investhub.io](https://envion.investhub.io/)).

## Quick links

* **App**: [investhub.io](https://investhub.io)


# API Reference

Investhub’s backend is built on **Supabase Edge Functions**. The frontend calls them via the Supabase client:

```ts
const { data, error } = await supabase.functions.invoke('function-name', {
  body: { ... }
});
```

## Try the API (interactive docs)

Use the **API Reference** in this documentation to browse all endpoints and **try them out** (send requests, see responses). That experience is powered by the same standard as [Swagger / OpenAPI](https://swagger.io/why-swagger/) — an OpenAPI spec is imported into GitBook so you get interactive “Test it” for each endpoint. You do **not** need to open the raw spec file on GitHub; everything is available here in the API Reference section.

If the API Reference is not yet visible in the sidebar, an admin needs to add the OpenAPI specification once in GitBook (Integrations → Add OpenAPI specification → URL or File). After that, readers can try endpoints directly from the docs.

## Base URL

Edge Functions are served under your project’s Supabase URL:

* **Production**: `https://<project-ref>.supabase.co/functions/v1/<function-name>`
* Requests use **POST** with `Content-Type: application/json` when sending a body.

## Authentication

Most endpoints require a **Privy JWT**. Send it in the `Authorization` header:

```http
Authorization: Bearer <privy_access_token>
```

The backend verifies the token and derives the user ID from the JWT `sub` claim. Some endpoints are **public** (e.g. `get-opportunities`, `get-opportunity`, `get-token-price`, `create-commitment`). The API Reference indicates which require auth.

## What’s documented

The OpenAPI spec used by this space covers a large part of the app:

| Area                                           | Examples                                                                                                                                                              |
| ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Auth**                                       | `get-profile`, `update-profile`, `sync-privy-profile`, `wallet-auth`, `verify-wallet-signature`                                                                       |
| **Opportunities**                              | `get-opportunities`, `get-opportunity`, `create-opportunity`                                                                                                          |
| **Investments**                                | `create-investment`, `pay-investment`, `process-crypto-payment`, `get-user-investments`, `sponsored-transaction`                                                      |
| **KYC**                                        | `get-kyc-status`, `get-kyc-info`, `submit-kyc`, `get-sumsub-token`                                                                                                    |
| **Company**                                    | `get-company`, `update-company`, `create-tenant`, `manage-shareholders`                                                                                               |
| **Incorporate**                                | `save-incorporation-draft`, `get-incorporation-draft`, `create-incorporation-checkout`, `create-tokenized-ag`, `generate-lvc-documents`, `calculate-lvc-risk-factors` |
| **Manage – Expenses**                          | `get-expenses`, `create-expense`, `approve-expense`, `reject-expense`, `manage-expense-report-templates`                                                              |
| **Manage – Accounts / Branches / Cards**       | `get-accounts`, `create-account`, `get-branches`, `create-branch`, `get-cards`, `create-card`                                                                         |
| **Manage – Categories / Groups / Tax / Users** | `get-categories`, `manage-groups`, `get-tax-rates`, `get-users`, `invite-user-with-role`                                                                              |
| **Manage – Xero**                              | `get-xero-settings`, `sync-xero-data`, `create-xero-invoice`, `create-xero-payment`                                                                                   |
| **Wallets**                                    | `get-wallets`, `add-wallet`, `manage-wallet-tokens`, `get-wallet-assets-v2`, `get-token-price`, `get-swap-quote`                                                      |
| **Portfolio**                                  | `get-portfolio-cached`, `get-portfolio-snapshots`, `save-portfolio-snapshot`                                                                                          |
| **Payments**                                   | `assign-volt-viban`, `create-stripe-checkout-session`, Monerium endpoints, Coinbase onramp, subscriptions                                                             |
| **Security**                                   | IP whitelist, MFA status                                                                                                                                              |
| **Documents**                                  | `upload-document-v2`, `extract-document-data-v2`, `parse-invoice`                                                                                                     |

For the full list and to try any endpoint, use the **API Reference** in the sidebar (OpenAPI-powered).

## Regenerating the spec (maintainers)

The OpenAPI YAML is generated from `scripts/openapi-config.json`. To add or change endpoints:

```bash
npm run docs:generate
```

Then commit and push `docs/gitbook/api/openapi.yaml`. If GitBook is configured to use the spec via URL, it will pick up updates automatically; otherwise update the spec in GitBook (Integrations → OpenAPI → Update).


# Auth

## POST /get-profile

> Get current user profile

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-profile":{"post":{"operationId":"get_profile","summary":"Get current user profile","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /update-profile

> Update user profile

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/update-profile":{"post":{"operationId":"update_profile","summary":"Update user profile","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /sync-privy-profile

> Sync profile from Privy

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/sync-privy-profile":{"post":{"operationId":"sync_privy_profile","summary":"Sync profile from Privy","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /wallet-auth

> Authenticate with wallet

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/wallet-auth":{"post":{"operationId":"wallet_auth","summary":"Authenticate with wallet","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /verify-wallet-signature

> Verify wallet signature

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/verify-wallet-signature":{"post":{"operationId":"verify_wallet_signature","summary":"Verify wallet signature","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /request-wallet-nonce

> Request nonce for wallet auth

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/request-wallet-nonce":{"post":{"operationId":"request_wallet_nonce","summary":"Request nonce for wallet auth","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-privy-app-id

> Get Privy app ID (public)

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[],"paths":{"/get-privy-app-id":{"post":{"operationId":"get_privy_app_id","summary":"Get Privy app ID (public)","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}
```


# Opportunities

## POST /get-opportunities

> List opportunities (paginated, filterable)

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[],"paths":{"/get-opportunities":{"post":{"operationId":"get_opportunities","summary":"List opportunities (paginated, filterable)","tags":["Opportunities"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}
```

## POST /get-opportunity

> Get single opportunity by slug

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[],"paths":{"/get-opportunity":{"post":{"operationId":"get_opportunity","summary":"Get single opportunity by slug","tags":["Opportunities"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}
```

## POST /create-opportunity

> Create an opportunity

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-opportunity":{"post":{"operationId":"create_opportunity","summary":"Create an opportunity","tags":["Opportunities"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Investments

## POST /create-investment

> Create an investment

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-investment":{"post":{"operationId":"create_investment","summary":"Create an investment","tags":["Investments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /pay-investment

> Complete payment for an investment

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/pay-investment":{"post":{"operationId":"pay_investment","summary":"Complete payment for an investment","tags":["Investments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /process-crypto-payment

> Process crypto payment (e.g. MetaMask)

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/process-crypto-payment":{"post":{"operationId":"process_crypto_payment","summary":"Process crypto payment (e.g. MetaMask)","tags":["Investments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /process-metamask-payment

> Process MetaMask payment

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/process-metamask-payment":{"post":{"operationId":"process_metamask_payment","summary":"Process MetaMask payment","tags":["Investments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /sponsored-transaction

> Request sponsored (gasless) tx; returns 402 if insufficient credits

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/sponsored-transaction":{"post":{"operationId":"sponsored_transaction","summary":"Request sponsored (gasless) tx; returns 402 if insufficient credits","tags":["Investments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required (insufficient sponsorship credits)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-user-investments

> List investments for the current user

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-user-investments":{"post":{"operationId":"get_user_investments","summary":"List investments for the current user","tags":["Investments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-commitment

> Create commitment (guest flow)

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[],"paths":{"/create-commitment":{"post":{"operationId":"create_commitment","summary":"Create commitment (guest flow)","tags":["Investments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}
```

## POST /sync-tenant-investment

> Sync tenant investment data

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/sync-tenant-investment":{"post":{"operationId":"sync_tenant_investment","summary":"Sync tenant investment data","tags":["Investments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# KYC

## POST /get-kyc-status

> Get KYC status

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-kyc-status":{"post":{"operationId":"get_kyc_status","summary":"Get KYC status","tags":["KYC"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-kyc-info

> Get KYC info

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-kyc-info":{"post":{"operationId":"get_kyc_info","summary":"Get KYC info","tags":["KYC"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /save-kyc-info

> Save KYC info

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/save-kyc-info":{"post":{"operationId":"save_kyc_info","summary":"Save KYC info","tags":["KYC"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /submit-kyc

> Submit KYC verification

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/submit-kyc":{"post":{"operationId":"submit_kyc","summary":"Submit KYC verification","tags":["KYC"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /submit-kyc-verification

> Submit KYC verification (alternate)

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/submit-kyc-verification":{"post":{"operationId":"submit_kyc_verification","summary":"Submit KYC verification (alternate)","tags":["KYC"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-sumsub-token

> Get Sumsub token for KYC flow

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-sumsub-token":{"post":{"operationId":"get_sumsub_token","summary":"Get Sumsub token for KYC flow","tags":["KYC"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Company

## POST /get-company

> Get company details

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-company":{"post":{"operationId":"get_company","summary":"Get company details","tags":["Company"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /update-company

> Update company

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/update-company":{"post":{"operationId":"update_company","summary":"Update company","tags":["Company"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-companies

> List companies

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-companies":{"post":{"operationId":"get_companies","summary":"List companies","tags":["Company"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-tenant

> Create tenant

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-tenant":{"post":{"operationId":"create_tenant","summary":"Create tenant","tags":["Company"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-manage-company

> Create company in Manage

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-manage-company":{"post":{"operationId":"create_manage_company","summary":"Create company in Manage","tags":["Company"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-company-permissions

> Get company permissions

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-company-permissions":{"post":{"operationId":"get_company_permissions","summary":"Get company permissions","tags":["Company"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /update-company-permissions

> Update company permissions

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/update-company-permissions":{"post":{"operationId":"update_company_permissions","summary":"Update company permissions","tags":["Company"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /manage-shareholders

> Manage shareholders

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/manage-shareholders":{"post":{"operationId":"manage_shareholders","summary":"Manage shareholders","tags":["Company"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Incorporate

## POST /save-incorporation-draft

> Save incorporation draft

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/save-incorporation-draft":{"post":{"operationId":"save_incorporation_draft","summary":"Save incorporation draft","tags":["Incorporate"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-incorporation-draft

> Get incorporation draft

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-incorporation-draft":{"post":{"operationId":"get_incorporation_draft","summary":"Get incorporation draft","tags":["Incorporate"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /delete-incorporation-draft

> Delete incorporation draft

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/delete-incorporation-draft":{"post":{"operationId":"delete_incorporation_draft","summary":"Delete incorporation draft","tags":["Incorporate"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-incorporation-checkout

> Create incorporation checkout session

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-incorporation-checkout":{"post":{"operationId":"create_incorporation_checkout","summary":"Create incorporation checkout session","tags":["Incorporate"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /handle-incorporation-payment-webhook

> Webhook for incorporation payment

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/handle-incorporation-payment-webhook":{"post":{"operationId":"handle_incorporation_payment_webhook","summary":"Webhook for incorporation payment","tags":["Incorporate"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-tokenized-ag

> Create tokenized AG

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-tokenized-ag":{"post":{"operationId":"create_tokenized_ag","summary":"Create tokenized AG","tags":["Incorporate"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /generate-lvc-documents

> Generate LVC documents

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/generate-lvc-documents":{"post":{"operationId":"generate_lvc_documents","summary":"Generate LVC documents","tags":["Incorporate"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /calculate-lvc-risk-factors

> Calculate LVC risk factors

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/calculate-lvc-risk-factors":{"post":{"operationId":"calculate_lvc_risk_factors","summary":"Calculate LVC risk factors","tags":["Incorporate"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /check-domain-availability

> Check domain availability

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/check-domain-availability":{"post":{"operationId":"check_domain_availability","summary":"Check domain availability","tags":["Incorporate"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Manage   Expenses

## POST /get-expenses

> List expenses

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-expenses":{"post":{"operationId":"get_expenses","summary":"List expenses","tags":["Manage - Expenses"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-expense

> Get single expense

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-expense":{"post":{"operationId":"get_expense","summary":"Get single expense","tags":["Manage - Expenses"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-expense

> Create expense

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-expense":{"post":{"operationId":"create_expense","summary":"Create expense","tags":["Manage - Expenses"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /delete-expense

> Delete expense

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/delete-expense":{"post":{"operationId":"delete_expense","summary":"Delete expense","tags":["Manage - Expenses"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /approve-expense

> Approve expense

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/approve-expense":{"post":{"operationId":"approve_expense","summary":"Approve expense","tags":["Manage - Expenses"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /reject-expense

> Reject expense

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/reject-expense":{"post":{"operationId":"reject_expense","summary":"Reject expense","tags":["Manage - Expenses"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /manage-expense-report-templates

> Manage expense report templates

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/manage-expense-report-templates":{"post":{"operationId":"manage_expense_report_templates","summary":"Manage expense report templates","tags":["Manage - Expenses"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Manage   Accounts

## POST /get-accounts

> List accounts

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-accounts":{"post":{"operationId":"get_accounts","summary":"List accounts","tags":["Manage - Accounts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-accounts-all

> List all accounts

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-accounts-all":{"post":{"operationId":"get_accounts_all","summary":"List all accounts","tags":["Manage - Accounts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-account

> Get single account

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-account":{"post":{"operationId":"get_account","summary":"Get single account","tags":["Manage - Accounts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-account

> Create account

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-account":{"post":{"operationId":"create_account","summary":"Create account","tags":["Manage - Accounts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /delete-account

> Delete account

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/delete-account":{"post":{"operationId":"delete_account","summary":"Delete account","tags":["Manage - Accounts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Manage   Branches

## POST /get-branches

> List branches

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-branches":{"post":{"operationId":"get_branches","summary":"List branches","tags":["Manage - Branches"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-branches-all

> List all branches

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-branches-all":{"post":{"operationId":"get_branches_all","summary":"List all branches","tags":["Manage - Branches"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-branch

> Get single branch

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-branch":{"post":{"operationId":"get_branch","summary":"Get single branch","tags":["Manage - Branches"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-branch

> Create branch

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-branch":{"post":{"operationId":"create_branch","summary":"Create branch","tags":["Manage - Branches"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /update-branch

> Update branch

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/update-branch":{"post":{"operationId":"update_branch","summary":"Update branch","tags":["Manage - Branches"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /delete-branch

> Delete branch

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/delete-branch":{"post":{"operationId":"delete_branch","summary":"Delete branch","tags":["Manage - Branches"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /manage-branches

> Manage branches

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/manage-branches":{"post":{"operationId":"manage_branches","summary":"Manage branches","tags":["Manage - Branches"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Manage   Cards

## POST /get-cards

> List cards

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-cards":{"post":{"operationId":"get_cards","summary":"List cards","tags":["Manage - Cards"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-cards-all

> List all cards

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-cards-all":{"post":{"operationId":"get_cards_all","summary":"List all cards","tags":["Manage - Cards"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-card

> Get single card

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-card":{"post":{"operationId":"get_card","summary":"Get single card","tags":["Manage - Cards"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-card

> Create card

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-card":{"post":{"operationId":"create_card","summary":"Create card","tags":["Manage - Cards"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /update-card

> Update card

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/update-card":{"post":{"operationId":"update_card","summary":"Update card","tags":["Manage - Cards"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /delete-card

> Delete card

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/delete-card":{"post":{"operationId":"delete_card","summary":"Delete card","tags":["Manage - Cards"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-account-cards

> Get cards for account

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-account-cards":{"post":{"operationId":"get_account_cards","summary":"Get cards for account","tags":["Manage - Cards"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-card-transactions

> Get card transactions

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-card-transactions":{"post":{"operationId":"get_card_transactions","summary":"Get card transactions","tags":["Manage - Cards"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Manage   Categories

## POST /get-categories

> List categories

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-categories":{"post":{"operationId":"get_categories","summary":"List categories","tags":["Manage - Categories"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-categories-all

> List all categories

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-categories-all":{"post":{"operationId":"get_categories_all","summary":"List all categories","tags":["Manage - Categories"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-category

> Get single category

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-category":{"post":{"operationId":"get_category","summary":"Get single category","tags":["Manage - Categories"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-category

> Create category

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-category":{"post":{"operationId":"create_category","summary":"Create category","tags":["Manage - Categories"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /update-category

> Update category

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/update-category":{"post":{"operationId":"update_category","summary":"Update category","tags":["Manage - Categories"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /delete-category

> Delete category

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/delete-category":{"post":{"operationId":"delete_category","summary":"Delete category","tags":["Manage - Categories"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /batch-edit-categories

> Batch edit categories

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/batch-edit-categories":{"post":{"operationId":"batch_edit_categories","summary":"Batch edit categories","tags":["Manage - Categories"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /batch-disable-categories

> Batch disable categories

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/batch-disable-categories":{"post":{"operationId":"batch_disable_categories","summary":"Batch disable categories","tags":["Manage - Categories"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /import-categories

> Import categories

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/import-categories":{"post":{"operationId":"import_categories","summary":"Import categories","tags":["Manage - Categories"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Manage   Groups

## POST /get-groups

> List groups

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-groups":{"post":{"operationId":"get_groups","summary":"List groups","tags":["Manage - Groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-groups-all

> List all groups

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-groups-all":{"post":{"operationId":"get_groups_all","summary":"List all groups","tags":["Manage - Groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-group

> Get single group

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-group":{"post":{"operationId":"get_group","summary":"Get single group","tags":["Manage - Groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-group

> Create group

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-group":{"post":{"operationId":"create_group","summary":"Create group","tags":["Manage - Groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /update-group

> Update group

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/update-group":{"post":{"operationId":"update_group","summary":"Update group","tags":["Manage - Groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /delete-group

> Delete group

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/delete-group":{"post":{"operationId":"delete_group","summary":"Delete group","tags":["Manage - Groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /manage-groups

> Manage groups

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/manage-groups":{"post":{"operationId":"manage_groups","summary":"Manage groups","tags":["Manage - Groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /import-groups

> Import groups

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/import-groups":{"post":{"operationId":"import_groups","summary":"Import groups","tags":["Manage - Groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Manage   Contacts

## POST /get-contacts

> List contacts

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-contacts":{"post":{"operationId":"get_contacts","summary":"List contacts","tags":["Manage - Contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-contacts-all

> List all contacts

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-contacts-all":{"post":{"operationId":"get_contacts_all","summary":"List all contacts","tags":["Manage - Contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-contact

> Create contact

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-contact":{"post":{"operationId":"create_contact","summary":"Create contact","tags":["Manage - Contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /update-contact

> Update contact

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/update-contact":{"post":{"operationId":"update_contact","summary":"Update contact","tags":["Manage - Contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /delete-contact

> Delete contact

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/delete-contact":{"post":{"operationId":"delete_contact","summary":"Delete contact","tags":["Manage - Contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Manage   Tax

## POST /get-tax-rates

> List tax rates

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-tax-rates":{"post":{"operationId":"get_tax_rates","summary":"List tax rates","tags":["Manage - Tax"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-tax-rates-all

> List all tax rates

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-tax-rates-all":{"post":{"operationId":"get_tax_rates_all","summary":"List all tax rates","tags":["Manage - Tax"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-tax-rate

> Get single tax rate

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-tax-rate":{"post":{"operationId":"get_tax_rate","summary":"Get single tax rate","tags":["Manage - Tax"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-tax-rate

> Create tax rate

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-tax-rate":{"post":{"operationId":"create_tax_rate","summary":"Create tax rate","tags":["Manage - Tax"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /update-tax-rate

> Update tax rate

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/update-tax-rate":{"post":{"operationId":"update_tax_rate","summary":"Update tax rate","tags":["Manage - Tax"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /delete-tax-rate

> Delete tax rate

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/delete-tax-rate":{"post":{"operationId":"delete_tax_rate","summary":"Delete tax rate","tags":["Manage - Tax"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /import-tax-rates

> Import tax rates

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/import-tax-rates":{"post":{"operationId":"import_tax_rates","summary":"Import tax rates","tags":["Manage - Tax"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Manage   Users

## POST /get-users

> List users

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-users":{"post":{"operationId":"get_users","summary":"List users","tags":["Manage - Users"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-users-all

> List all users

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-users-all":{"post":{"operationId":"get_users_all","summary":"List all users","tags":["Manage - Users"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-user

> Create user

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-user":{"post":{"operationId":"create_user","summary":"Create user","tags":["Manage - Users"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /update-user

> Update user

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/update-user":{"post":{"operationId":"update_user","summary":"Update user","tags":["Manage - Users"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /delete-user

> Delete user

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/delete-user":{"post":{"operationId":"delete_user","summary":"Delete user","tags":["Manage - Users"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /invite-user-with-role

> Invite user with role

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/invite-user-with-role":{"post":{"operationId":"invite_user_with_role","summary":"Invite user with role","tags":["Manage - Users"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-invitation

> Get invitation

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-invitation":{"post":{"operationId":"get_invitation","summary":"Get invitation","tags":["Manage - Users"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /accept-invitation

> Accept invitation

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/accept-invitation":{"post":{"operationId":"accept_invitation","summary":"Accept invitation","tags":["Manage - Users"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /resend-invitation

> Resend invitation

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/resend-invitation":{"post":{"operationId":"resend_invitation","summary":"Resend invitation","tags":["Manage - Users"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-current-user-roles

> Get current user roles

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-current-user-roles":{"post":{"operationId":"get_current_user_roles","summary":"Get current user roles","tags":["Manage - Users"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /manage-roles

> Manage roles

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/manage-roles":{"post":{"operationId":"manage_roles","summary":"Manage roles","tags":["Manage - Users"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Manage

## POST /manage-approval-rules

> Manage approval rules

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/manage-approval-rules":{"post":{"operationId":"manage_approval_rules","summary":"Manage approval rules","tags":["Manage"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /manage-reject-reasons

> Manage reject reasons

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/manage-reject-reasons":{"post":{"operationId":"manage_reject_reasons","summary":"Manage reject reasons","tags":["Manage"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /manage-departments

> Manage departments

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/manage-departments":{"post":{"operationId":"manage_departments","summary":"Manage departments","tags":["Manage"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /manage-projects

> Manage projects

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/manage-projects":{"post":{"operationId":"manage_projects","summary":"Manage projects","tags":["Manage"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-projects-all

> List all projects

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-projects-all":{"post":{"operationId":"get_projects_all","summary":"List all projects","tags":["Manage"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-dashboard-data

> Get dashboard data

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-dashboard-data":{"post":{"operationId":"get_dashboard_data","summary":"Get dashboard data","tags":["Manage"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-spending-caps

> Get spending caps

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-spending-caps":{"post":{"operationId":"get_spending_caps","summary":"Get spending caps","tags":["Manage"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-spending-cap

> Create spending cap

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-spending-cap":{"post":{"operationId":"create_spending_cap","summary":"Create spending cap","tags":["Manage"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /update-spending-cap

> Update spending cap

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/update-spending-cap":{"post":{"operationId":"update_spending_cap","summary":"Update spending cap","tags":["Manage"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /delete-spending-cap

> Delete spending cap

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/delete-spending-cap":{"post":{"operationId":"delete_spending_cap","summary":"Delete spending cap","tags":["Manage"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Manage   Xero

## POST /get-xero-settings

> Get Xero settings

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-xero-settings":{"post":{"operationId":"get_xero_settings","summary":"Get Xero settings","tags":["Manage - Xero"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /save-xero-settings

> Save Xero settings

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/save-xero-settings":{"post":{"operationId":"save_xero_settings","summary":"Save Xero settings","tags":["Manage - Xero"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /sync-xero-data

> Sync Xero data

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/sync-xero-data":{"post":{"operationId":"sync_xero_data","summary":"Sync Xero data","tags":["Manage - Xero"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-xero-accounts

> Get Xero accounts

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-xero-accounts":{"post":{"operationId":"get_xero_accounts","summary":"Get Xero accounts","tags":["Manage - Xero"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-xero-account-settings

> Get Xero account settings

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-xero-account-settings":{"post":{"operationId":"get_xero_account_settings","summary":"Get Xero account settings","tags":["Manage - Xero"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /update-xero-account-settings

> Update Xero account settings

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/update-xero-account-settings":{"post":{"operationId":"update_xero_account_settings","summary":"Update Xero account settings","tags":["Manage - Xero"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-xero-account

> Create Xero account

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-xero-account":{"post":{"operationId":"create_xero_account","summary":"Create Xero account","tags":["Manage - Xero"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-xero-chart-of-accounts

> Get Xero chart of accounts

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-xero-chart-of-accounts":{"post":{"operationId":"get_xero_chart_of_accounts","summary":"Get Xero chart of accounts","tags":["Manage - Xero"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-xero-invoice

> Create Xero invoice

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-xero-invoice":{"post":{"operationId":"create_xero_invoice","summary":"Create Xero invoice","tags":["Manage - Xero"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-xero-payment

> Create Xero payment

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-xero-payment":{"post":{"operationId":"create_xero_payment","summary":"Create Xero payment","tags":["Manage - Xero"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /update-xero-invoice-with-gas-fee

> Update Xero invoice with gas fee

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/update-xero-invoice-with-gas-fee":{"post":{"operationId":"update_xero_invoice_with_gas_fee","summary":"Update Xero invoice with gas fee","tags":["Manage - Xero"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /sync-xero-contact

> Sync Xero contact

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/sync-xero-contact":{"post":{"operationId":"sync_xero_contact","summary":"Sync Xero contact","tags":["Manage - Xero"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /sync-wallet-to-xero

> Sync wallet to Xero

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/sync-wallet-to-xero":{"post":{"operationId":"sync_wallet_to_xero","summary":"Sync wallet to Xero","tags":["Manage - Xero"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Wallets

## POST /get-wallets

> Get user wallets

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-wallets":{"post":{"operationId":"get_wallets","summary":"Get user wallets","tags":["Wallets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /add-wallet

> Add wallet

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/add-wallet":{"post":{"operationId":"add_wallet","summary":"Add wallet","tags":["Wallets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /remove-wallet

> Remove wallet

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/remove-wallet":{"post":{"operationId":"remove_wallet","summary":"Remove wallet","tags":["Wallets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /manage-wallet-tokens

> Manage wallet tokens

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/manage-wallet-tokens":{"post":{"operationId":"manage_wallet_tokens","summary":"Manage wallet tokens","tags":["Wallets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-wallet-assets-v2

> Get wallet assets (v2)

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-wallet-assets-v2":{"post":{"operationId":"get_wallet_assets_v2","summary":"Get wallet assets (v2)","tags":["Wallets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-wallet-assets-batch

> Get wallet assets (batch)

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-wallet-assets-batch":{"post":{"operationId":"get_wallet_assets_batch","summary":"Get wallet assets (batch)","tags":["Wallets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-wallet-stats

> Get wallet stats

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-wallet-stats":{"post":{"operationId":"get_wallet_stats","summary":"Get wallet stats","tags":["Wallets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-wallet-transactions

> Get wallet transactions

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-wallet-transactions":{"post":{"operationId":"get_wallet_transactions","summary":"Get wallet transactions","tags":["Wallets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-token-price

> Get token price (public)

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[],"paths":{"/get-token-price":{"post":{"operationId":"get_token_price","summary":"Get token price (public)","tags":["Wallets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}
```

## POST /get-token-history

> Get token price history

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-token-history":{"post":{"operationId":"get_token_history","summary":"Get token price history","tags":["Wallets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-swap-quote

> Get swap quote

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-swap-quote":{"post":{"operationId":"get_swap_quote","summary":"Get swap quote","tags":["Wallets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-1inch-quote

> Get 1inch quote

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-1inch-quote":{"post":{"operationId":"get_1inch_quote","summary":"Get 1inch quote","tags":["Wallets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-lifi-quote

> Get LiFi quote

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-lifi-quote":{"post":{"operationId":"get_lifi_quote","summary":"Get LiFi quote","tags":["Wallets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /whitelist-wallet

> Whitelist wallet

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/whitelist-wallet":{"post":{"operationId":"whitelist_wallet","summary":"Whitelist wallet","tags":["Wallets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Portfolio

## POST /get-portfolio-cached

> Get portfolio (cached)

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-portfolio-cached":{"post":{"operationId":"get_portfolio_cached","summary":"Get portfolio (cached)","tags":["Portfolio"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-portfolio-snapshots

> Get portfolio snapshots

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-portfolio-snapshots":{"post":{"operationId":"get_portfolio_snapshots","summary":"Get portfolio snapshots","tags":["Portfolio"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /save-portfolio-snapshot

> Save portfolio snapshot

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/save-portfolio-snapshot":{"post":{"operationId":"save_portfolio_snapshot","summary":"Save portfolio snapshot","tags":["Portfolio"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Payments

## POST /assign-volt-viban

> Assign Volt IBAN

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/assign-volt-viban":{"post":{"operationId":"assign_volt_viban","summary":"Assign Volt IBAN","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-user-viban

> Get user Volt IBAN

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-user-viban":{"post":{"operationId":"get_user_viban","summary":"Get user Volt IBAN","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-bank-transfer-details

> Get bank transfer details

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-bank-transfer-details":{"post":{"operationId":"get_bank_transfer_details","summary":"Get bank transfer details","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-currency-rate

> Get currency rate

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-currency-rate":{"post":{"operationId":"get_currency_rate","summary":"Get currency rate","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-stripe-checkout-session

> Create Stripe checkout session

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-stripe-checkout-session":{"post":{"operationId":"create_stripe_checkout_session","summary":"Create Stripe checkout session","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-stripe-investment-checkout

> Create Stripe investment checkout

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-stripe-investment-checkout":{"post":{"operationId":"create_stripe_investment_checkout","summary":"Create Stripe investment checkout","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-stripe-onramp-session

> Create Stripe onramp session

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-stripe-onramp-session":{"post":{"operationId":"create_stripe_onramp_session","summary":"Create Stripe onramp session","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-stripe-config

> Get Stripe config

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-stripe-config":{"post":{"operationId":"get_stripe_config","summary":"Get Stripe config","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-monerium-config

> Get Monerium config

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-monerium-config":{"post":{"operationId":"get_monerium_config","summary":"Get Monerium config","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /monerium-fetch-data

> Monerium fetch data

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/monerium-fetch-data":{"post":{"operationId":"monerium_fetch_data","summary":"Monerium fetch data","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /monerium-token-exchange

> Monerium token exchange

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/monerium-token-exchange":{"post":{"operationId":"monerium_token_exchange","summary":"Monerium token exchange","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /monerium-link-address

> Monerium link address

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/monerium-link-address":{"post":{"operationId":"monerium_link_address","summary":"Monerium link address","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /monerium-move-iban

> Monerium move IBAN

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/monerium-move-iban":{"post":{"operationId":"monerium_move_iban","summary":"Monerium move IBAN","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /monerium-payment

> Monerium payment

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/monerium-payment":{"post":{"operationId":"monerium_payment","summary":"Monerium payment","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /monerium-buy-order

> Monerium buy order

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/monerium-buy-order":{"post":{"operationId":"monerium_buy_order","summary":"Monerium buy order","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-mtpelerin-key

> Get Mt Pelerin key

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-mtpelerin-key":{"post":{"operationId":"get_mtpelerin_key","summary":"Get Mt Pelerin key","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-coinbase-session-token

> Create Coinbase session token

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-coinbase-session-token":{"post":{"operationId":"create_coinbase_session_token","summary":"Create Coinbase session token","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-coinbase-buy-quote

> Create Coinbase buy quote

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-coinbase-buy-quote":{"post":{"operationId":"create_coinbase_buy_quote","summary":"Create Coinbase buy quote","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-coinbase-apple-pay-order

> Create Coinbase Apple Pay order

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-coinbase-apple-pay-order":{"post":{"operationId":"create_coinbase_apple_pay_order","summary":"Create Coinbase Apple Pay order","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /create-subscription-checkout

> Create subscription checkout

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/create-subscription-checkout":{"post":{"operationId":"create_subscription_checkout","summary":"Create subscription checkout","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-subscription

> Get subscription

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-subscription":{"post":{"operationId":"get_subscription","summary":"Get subscription","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /cancel-subscription

> Cancel subscription

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/cancel-subscription":{"post":{"operationId":"cancel_subscription","summary":"Cancel subscription","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Security

## POST /add-ip-whitelist

> Add IP whitelist

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/add-ip-whitelist":{"post":{"operationId":"add_ip_whitelist","summary":"Add IP whitelist","tags":["Security"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /remove-ip-whitelist

> Remove IP whitelist

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/remove-ip-whitelist":{"post":{"operationId":"remove_ip_whitelist","summary":"Remove IP whitelist","tags":["Security"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /toggle-ip-whitelist

> Toggle IP whitelist

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/toggle-ip-whitelist":{"post":{"operationId":"toggle_ip_whitelist","summary":"Toggle IP whitelist","tags":["Security"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /get-ip-whitelists

> Get IP whitelists

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/get-ip-whitelists":{"post":{"operationId":"get_ip_whitelists","summary":"Get IP whitelists","tags":["Security"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /sync-mfa-status

> Sync MFA status

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/sync-mfa-status":{"post":{"operationId":"sync_mfa_status","summary":"Sync MFA status","tags":["Security"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /update-mfa-status

> Update MFA status

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/update-mfa-status":{"post":{"operationId":"update_mfa_status","summary":"Update MFA status","tags":["Security"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Documents

## POST /upload-document-v2

> Upload document

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/upload-document-v2":{"post":{"operationId":"upload_document_v2","summary":"Upload document","tags":["Documents"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /extract-document-data-v2

> Extract document data

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/extract-document-data-v2":{"post":{"operationId":"extract_document_data_v2","summary":"Extract document data","tags":["Documents"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /parse-invoice

> Parse invoice

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/parse-invoice":{"post":{"operationId":"parse_invoice","summary":"Parse invoice","tags":["Documents"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Utility

## POST /resolve-ens

> Resolve ENS name

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/resolve-ens":{"post":{"operationId":"resolve_ens","summary":"Resolve ENS name","tags":["Utility"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## POST /validate-voucher

> Validate voucher

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"servers":[{"url":"https://{project}.supabase.co/functions/v1","variables":{"project":{"default":"your-project-ref","description":"Supabase project reference"}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Privy access token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/validate-voucher":{"post":{"operationId":"validate_voucher","summary":"Validate voucher","tags":["Utility"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"See Edge Function source for exact request shape (e.g. interface XxxRequest in index.ts)"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


# Models

## The Error object

```json
{"openapi":"3.0.3","info":{"title":"Investhub API","version":"1.0.0"},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}
```


# Guides


# Investments

This guide describes how investments work in Investhub: creating an investment, payment methods, and the main API flow.

> **Diagrams:** For Mermaid diagrams to render in GitBook, install the **Mermaid** integration in your space (Integrations → Mermaid), then add or edit diagrams using **Insert → Mermaid block** (type `/` and choose Mermaid) in the editor. Synced code blocks may show as code until re-added as native Mermaid blocks.

## Overview

Users invest in opportunities (e.g. tokenized offerings) by creating an investment record and then completing payment. Payment can be **crypto** (wallet), **card** (Stripe), **bank** (Volt, Monerium, etc.), or other configured methods.

## Create investment flow

1. **Client** calls `create-investment` with amount, token details, payment method, and (for crypto) network and wallet.
2. **Backend** validates the user (Privy JWT), opportunity, and spending caps; creates the investment record; and returns success or an error (e.g. 402 if sponsorship credits are required and insufficient).
3. For **crypto**: client may then call `pay-investment` or `process-crypto-payment` to execute the on-chain payment.
4. For **card/bank**: the client follows the returned payment link or session (e.g. Stripe Checkout, Monerium).

## Payment method flow (flowchart example)

{% @mermaid/diagram content="sequenceDiagram
participant Client
participant create\_investment
participant pay\_investment
participant Blockchain

Client->>create\_investment: POST (privy\_user\_id, amount, paymentMethod, ...)
create\_investment-->>Client: 200 + investment record or 4xx

alt Crypto payment
Client->>pay\_investment: POST (investment id, wallet, tx params)
pay\_investment->>Blockchain: Contract call
Blockchain-->>pay\_investment: Receipt
pay\_investment-->>Client: 200 + payment result
else Card / Bank
Client->>Client: Redirect to Stripe / Monerium / Volt etc.
end" %}

Another way to visualize the flow is with a flowchart showing how the backend routes by payment method:

{% @mermaid/diagram content="flowchart LR
A\[Client] --> B\[create-investment]
B --> C{paymentMethod?}
C -->|crypto| D\[pay-investment / process-crypto-payment]
C -->|card| E\[Stripe Checkout]
C -->|bank / iban| F\[Monerium / Volt / etc.]
D --> G\[Blockchain]
E --> G
F --> G" %}

## Investment lifecycle (steps)

End-to-end steps from browsing to completed investment:

{% @mermaid/diagram content="flowchart TB
subgraph steps \[User journey]
A\[Browse opportunities\n get-opportunities / get-opportunity] --> B\[Create investment\n create-investment]
B --> C{Payment method}
C -->|crypto| D\[Pay on-chain\n pay-investment / process-crypto-payment]
C -->|card / bank| E\[Redirect to provider\n Stripe, Monerium, Volt...]
D --> F\[Investment completed]
E --> F
end" %}

## create-investment response outcomes

Possible responses when calling `create-investment` (useful to see if this diagram renders from Git sync):

{% @mermaid/diagram content="flowchart LR
A\[POST create-investment] --> B{Result}
B -->|OK| C\[200 + investment record]
B -->|Validation| D\[400 Bad request]
B -->|Auth| E\[401 Unauthorized]
B -->|Sponsorship| F\[402 Payment required]
B -->|Server| G\[500 Error]" %}

## Main endpoints

| Function                 | Purpose                                                                                                                                                                                                    |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `create-investment`      | Create an investment (auth required). Body: `privy_user_id`, `opportunityId`, `amount`, `tokenAmount`, `tokenSymbol`, `tokenPrice`, `currency`, `paymentMethod`, `network`, optional `walletAddress`, etc. |
| `pay-investment`         | Complete payment for an existing investment (e.g. crypto).                                                                                                                                                 |
| `process-crypto-payment` | Process a crypto payment (e.g. MetaMask).                                                                                                                                                                  |
| `get-user-investments`   | List investments for the authenticated user.                                                                                                                                                               |
| `sponsored-transaction`  | Request a sponsored (gasless) transaction; returns **402** if sponsorship credits are insufficient.                                                                                                        |

## Screenshots

Below is an example of how a screenshot appears in the docs. Replace this with a real capture from the app (or use CI/Playwright to generate it).


# Portfolio Dashboard

This guide covers the portfolio dashboard, its sections, data sources, and features such as the net worth overview, allocation chart, transaction history, and CSV export.

## Overview

The portfolio dashboard (`/portfolio`) gives users a consolidated view of their net worth across on-chain wallets, manual tokens, and investment commitments. It is available to users with the `personal` or `administrator` role.

{% @mermaid/diagram content="flowchart LR
subgraph sources \[Data sources]
W\[Wallets & on-chain balances\n Alchemy via get-wallet-assets-v2]
T\[Manual tokens\n wallet\_tokens table]
I\[Investments\n get-user-investments]
S\[Snapshots\n portfolio\_snapshots table]
end
subgraph dashboard \[Portfolio Dashboard]
O\[Total assets overview]
A\[Allocation by asset]
C\[Performance chart]
MI\[My Investments]
TH\[Transaction history]
AT\[Assets table]
WL\[Wallets list]
R\[Rewards]
EX\[Export CSV]
end
W --> O
T --> O
I --> O
W --> A
W --> AT
S --> C
I --> MI
I --> TH
I --> EX
W --> EX" %}

## Dashboard sections

### Total assets overview

Displays the aggregate portfolio value with profit/loss when entry prices are available.

| Element           | Description                                                                                 |
| ----------------- | ------------------------------------------------------------------------------------------- |
| **Total assets**  | Sum of on-chain wallet balances + manual tokens. An info tooltip explains what is included. |
| **P\&L**          | `Total value - Total invested`. Requires entry prices (set via the "Manage Tokens" dialog). |
| **Breakdown**     | Shows "On-chain & tokens: $X" and "Committed to opportunities: $Y" separately.              |
| **Compact trend** | A small sparkline (1-month history) rendered inline from `portfolio_snapshots`.             |

**Key files:** `src/components/portfolio/PortfolioOverview.tsx`, `src/hooks/usePortfolioHistory.ts`

### Allocation by asset

A horizontal bar chart showing the top 6 assets by USD value. Computed client-side from current wallet balances — no additional API call.

**Key file:** `src/components/portfolio/PortfolioOverview.tsx`

### Performance chart

A larger area chart with selectable time ranges (1M, 6M, 12M, 24M). Data comes from `portfolio_snapshots` via the `get-portfolio-snapshots` edge function.

Portfolio snapshots are saved automatically (at most once per hour) when the user visits the dashboard. The `save-portfolio-snapshot` edge function aggregates all wallet balances for the user and inserts a row into `portfolio_snapshots`.

**Key files:** `src/components/portfolio/PortfolioChart.tsx`, `src/hooks/usePortfolioHistory.ts`

### My Investments

Lists all investments the user has made through InvestHub opportunities. Each card shows: opportunity name, amount, currency, status badge, token/network info, payment method, and a link to the opportunity or block explorer (if a `tx_hash` exists).

**Key file:** `src/components/portfolio/MyInvestments.tsx`

### Transaction history

A chronological ledger of investment events (created, paid, refunded). Sorted newest-first and capped at 10 entries by default. Each row includes: date, opportunity name, amount, status, and an explorer/opportunity link.

This section reuses the same `get-user-investments` data — no additional backend endpoint is required.

**Key file:** `src/components/portfolio/TransactionHistory.tsx`

### Assets table

Shows all detected on-chain assets aggregated by symbol. Includes balance, price, value, allocation %, and chain badges. Two view modes:

* **Combined view** (`AssetsTable`) — all assets in one table, grouped by symbol.
* **Per-wallet view** (`WalletAssetsView`) — assets grouped by wallet address.

**Key files:** `src/components/portfolio/AssetsTable.tsx`, `src/components/portfolio/WalletAssetsView.tsx`

### Wallets list

Lists all tracked wallets (address, source label). Users can add wallets via the "Add Wallet" dialog.

**Key file:** `src/components/portfolio/WalletsList.tsx`

### Rewards

Rewards functionality is planned but not yet available. The section displays a "Coming soon" state with an icon and short description.

**Key file:** `src/components/portfolio/RewardsSection.tsx`

## Export CSV

Users can export their portfolio and investment data as a CSV file by clicking the **Export CSV** button in the dashboard header.

The CSV contains three sections:

1. **Summary** — export date, total value, total invested.
2. **Assets** — symbol, name, balance, price, value, chain, wallet address.
3. **Investments** — date, opportunity name, amount, currency, status, network.

Export is performed entirely client-side (no backend endpoint); the browser generates the file from the current dashboard state.

**Key files:** `src/utils/exportPortfolioCsv.ts`, `src/pages/PortfolioDashboard.tsx`

## Data flow

{% @mermaid/diagram content="sequenceDiagram
participant User
participant Dashboard as PortfolioDashboard
participant Hooks as React Hooks
participant Supabase as Supabase Edge Functions
participant Alchemy

User->>Dashboard: Visit /portfolio
Dashboard->>Hooks: useWallets, usePortfolioData, useUserInvestments, usePortfolioHistory
Hooks->>Supabase: get-wallets, get-wallet-assets-v2, get-user-investments, get-portfolio-snapshots
Supabase->>Alchemy: Fetch on-chain balances
Alchemy-->>Supabase: Token balances & prices
Supabase-->>Hooks: Data responses
Hooks-->>Dashboard: Reactive state
Dashboard-->>User: Rendered dashboard

Note over Dashboard: After loading, triggers save-portfolio-snapshot (max 1/hour)
Dashboard->>Supabase: save-portfolio-snapshot (fire & forget)" %}

## Caching

The dashboard uses two layers of caching for instant display:

| Layer                   | Mechanism                                                                                                                                              | TTL                             |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------- |
| **Local storage cache** | `usePortfolioCache` stores summary values (total, counts) in `localStorage`. On next visit the cached data renders immediately while fresh data loads. | Until overwritten by fresh data |
| **React Query**         | `useWalletAssets`, `usePortfolioData`, and `usePortfolioHistory` use `staleTime` of 5-10 minutes. No auto-refetch on window focus.                     | 5-10 minutes                    |

## View modes

The `ViewModeToggle` lets users switch between:

* **All wallets** — aggregated view across every tracked wallet.
* **Single wallet** — filters assets and value to one specific wallet.

## Related API endpoints

| Endpoint                  | Purpose                                        |
| ------------------------- | ---------------------------------------------- |
| `get-wallets`             | List tracked wallets for the user              |
| `get-wallet-assets-v2`    | Fetch on-chain balances for a wallet (Alchemy) |
| `get-user-investments`    | List all investment records                    |
| `get-portfolio-cached`    | Return cached portfolio summary                |
| `get-portfolio-snapshots` | Historical snapshots for charting              |
| `save-portfolio-snapshot` | Save a new snapshot (triggered on visit)       |

For details on each endpoint, see the [API Reference](https://github.com/Equanimity-Blockchain-Holdings-Pte-Ltd/investhubio/blob/main/docs/gitbook/api/overview.md).

## Testing

Below is a manual checklist to verify each dashboard feature.

### Total assets overview

1. Log in and navigate to `/portfolio`.
2. Verify the "Total assets" headline is visible with an info (i) icon. Hover over the icon to see the tooltip.
3. If entry prices have been set for any token, confirm P\&L appears with a green or red arrow and percentage.
4. If the user has investments, confirm the breakdown line shows both "On-chain & tokens" and "Committed to opportunities" values.
5. With no wallets and no investments, verify the value reads `$0.00` and no breakdown or P\&L appears.

### Allocation by asset

1. Add at least two wallets with different token holdings.
2. Confirm the "Allocation by asset" bar chart appears below the total value, showing up to 6 assets sorted by value.
3. Each bar should have a symbol label (left), proportional bar, and USD amount (right).
4. With zero assets, confirm the section is hidden entirely (no empty chart).

### Compact trend sparkline

1. Ensure the user has at least 2 data points in `portfolio_snapshots` (visit the dashboard on two different days, or insert test rows directly in Supabase).
2. Confirm a small sparkline appears under the total assets value.
3. With fewer than 2 snapshots, confirm the sparkline is hidden.

### Performance chart

1. With snapshot data, select each time range (1M, 6M, 12M, 24M) and verify the area chart updates.
2. With no data, confirm the "No historical data available yet" empty state appears.
3. On mobile, verify the time range selector is a dropdown rather than buttons.

### Transaction history

1. Create one or more investments via `/instant-investment` or an opportunity page.
2. Navigate to `/portfolio` and scroll to "Transaction history".
3. Verify entries are sorted newest-first, showing date, opportunity name, amount, status badge, and explorer link (when `tx_hash` is present).
4. Click an explorer link and confirm it opens the correct block explorer for the network (Base, Polygon, Ethereum, etc.).
5. With zero investments, confirm the empty-state message "No transactions yet" appears.

### Export CSV

1. With assets and/or investments loaded, click **Export CSV** in the header.
2. Verify a file named `portfolio-export-YYYY-MM-DD.csv` downloads.
3. Open the CSV and confirm three sections: Summary (total value, total invested), Assets (symbol, name, balance, price, value, chain, wallet), and Investments (date, opportunity, amount, currency, status, network).
4. Verify values with commas or quotes are properly escaped.
5. With no data, confirm the CSV still downloads with headers but empty data rows.

### Rewards section

1. Navigate to `/portfolio` and scroll to the right column.
2. Confirm the Rewards card shows a sparkles icon, "Coming soon" heading, and a short description.
3. Verify there are no mock data items, claim buttons, or "total earned" amounts.

### View mode toggle

1. Add two or more wallets.
2. Use the view mode toggle to switch between "All wallets" and a specific wallet address.
3. Confirm the assets table, overview values, and allocation chart update to reflect only the selected wallet.
4. Switch back to "All wallets" and confirm the aggregated view returns.

### Refresh

1. Click the **Refresh** button in the header.
2. Confirm the spinner icon animates while data reloads.
3. In the browser network tab, verify new calls to `get-wallet-assets-v2` and `get-user-investments`.

### Skeleton loading states

1. Clear the portfolio cache from `localStorage` (DevTools > Application > Local Storage > remove `portfolio_cache` key).
2. Hard-reload `/portfolio`.
3. Confirm skeleton placeholders appear for the overview, investments, assets, and rewards sections until data loads.


# White-Label Tenants

This guide covers **UI tenants** — branded investor-facing hostnames on the **single** `investhubio` deployment. Operators (issuers, Dagobert, liquidation cases) get their own subdomain, logo, and deal filter while sharing the same app, KYC, and compliance stack under the ECSP umbrella.

> **Terminology:** A **UI tenant** is **not** the legacy **KYC SaaS tenant** (separate GraphQL stack per issuer, e.g. old Envion liquidation). See [`docs/planning/MULTI_TENANT_ARCHITECTURE.md`](https://github.com/Equanimity-Blockchain-Holdings-Pte-Ltd/investhubio/blob/main/docs/planning/MULTI_TENANT_ARCHITECTURE.md).

> **x402 Protocol:** The tenant provisioning API uses the [x402 protocol](https://www.x402.org/) for payment. On first call, the API returns HTTP 402 with USDC payment instructions. The client signs an ERC-3009 `transferWithAuthorization`, then retries with the signed payload in the `X-PAYMENT` header. Payment is verified and settled on-chain via the Coinbase facilitator before the tenant is created.

## Overview

A **UI tenant** is a branded hostname (e.g. `envion.investhub.io`, `dagobert.investhub.org`) served from **one** React + Supabase deployment. `TenantContext` resolves config at runtime from the request hostname. Each issuer UI can show a different subset of deals via `allowedTokenIds`; KYC and invest flows are **platform-wide**, not per-repo.

Each tenant can configure:

| Setting           | Description                                       |
| ----------------- | ------------------------------------------------- |
| `appName`         | Display name shown in browser title and UI        |
| `logoUrl`         | Primary logo (light mode)                         |
| `logoDarkUrl`     | Logo for dark mode                                |
| `faviconUrl`      | Browser favicon                                   |
| `primaryColor`    | HSL primary color (e.g. `210 100% 50%`)           |
| `accentColor`     | HSL accent color                                  |
| `allowedTokenIds` | Array of token IDs visible to this tenant's users |
| `hiddenRoutes`    | Array of URL paths to hide from navigation        |
| `privyAppId`      | Optional tenant-specific Privy application ID     |

## Pricing

| Fee             | Amount     | When                                                |
| --------------- | ---------- | --------------------------------------------------- |
| Setup           | 5,000 USDC | One-time, paid via x402 on Base                     |
| Monthly renewal | 39 USDC    | Push model — owner pays each month via x402 on Base |

If a tenant's subscription expires and is not renewed, the tenant is automatically suspended (`STOPPED`) by a cron job. Suspended tenants lose their custom branding and fall back to the default InvestHub experience.

## Setup flow

```mermaid
sequenceDiagram
    participant Agent as Client / Agent
    participant Edge as create-tenant-x402
    participant Fac as Coinbase Facilitator
    participant DB as Supabase DB
    participant CF as Cloudflare DNS

    Agent->>Edge: POST /create-tenant-x402 (no X-PAYMENT)
    Edge-->>Agent: 402 Payment Required + payment instructions

    Agent->>Agent: Sign ERC-3009 USDC authorization (5000 USDC)
    Agent->>Edge: POST /create-tenant-x402 + X-PAYMENT header
    Edge->>Fac: POST /verify (payment payload)
    Fac-->>Edge: { isValid: true }
    Edge->>Fac: POST /settle (payment payload)
    Fac-->>Edge: { success: true, txHash }
    Edge->>DB: INSERT tenant + tenant_payment
    Edge->>CF: Create DNS CNAME record
    Edge-->>Agent: 200 { tenant, txHash }
```

## Renewal flow

```mermaid
sequenceDiagram
    participant Owner as Tenant Owner
    participant Edge as renew-tenant-x402
    participant Fac as Coinbase Facilitator
    participant DB as Supabase DB

    Owner->>Edge: POST /renew-tenant-x402 (no X-PAYMENT)
    Edge-->>Owner: 402 Payment Required (39 USDC)

    Owner->>Owner: Sign ERC-3009 USDC authorization
    Owner->>Edge: POST /renew-tenant-x402 + X-PAYMENT header
    Edge->>Fac: Verify + Settle
    Fac-->>Edge: { success, txHash }
    Edge->>DB: UPDATE subscription_paid_until += 30 days
    Edge-->>Owner: 200 { tenant, new expiry }
```

## API Reference

All endpoints use **Privy JWT** authentication. Include `Authorization: Bearer <privy_access_token>` in every request.

### POST `/functions/v1/create-tenant-x402`

Create a new white-label tenant. Payment-gated at 5,000 USDC on Base.

**Request body:**

```json
{
  "subdomainType": "investhubSubdomain",
  "customDomain": "buyersclub",
  "appName": "BuyersClub",
  "logoUrl": "https://example.com/logo.png",
  "logoDarkUrl": "https://example.com/logo-dark.png",
  "primaryColor": "210 100% 50%",
  "accentColor": "160 80% 45%",
  "allowedTokenIds": [1, 3, 7],
  "hiddenRoutes": ["/incorporate", "/manage"]
}
```

| Field             | Type                                       | Required | Description                                                                                                            |
| ----------------- | ------------------------------------------ | -------- | ---------------------------------------------------------------------------------------------------------------------- |
| `subdomainType`   | `"investhubSubdomain"` \| `"ownSubdomain"` | Yes      | Use `investhubSubdomain` for `*.investhub.io` (DNS auto-configured) or `ownSubdomain` for a custom domain (manual DNS) |
| `customDomain`    | string                                     | Yes      | Subdomain name (e.g. `buyersclub`) or full domain (e.g. `app.buyersclub.com`)                                          |
| `appName`         | string                                     | No       | Display name                                                                                                           |
| `logoUrl`         | string                                     | No       | Logo URL (light mode)                                                                                                  |
| `logoDarkUrl`     | string                                     | No       | Logo URL (dark mode)                                                                                                   |
| `primaryColor`    | string                                     | No       | HSL color string                                                                                                       |
| `accentColor`     | string                                     | No       | HSL color string                                                                                                       |
| `allowedTokenIds` | number\[]                                  | No       | Token IDs to show (null = show all)                                                                                    |
| `hiddenRoutes`    | string\[]                                  | No       | Routes to hide from navigation                                                                                         |

**Responses:**

* **402** (no `X-PAYMENT` header): Returns payment instructions.

```json
{
  "x402Version": 1,
  "accepts": [{
    "scheme": "exact",
    "network": "eip155:8453",
    "maxAmountRequired": "5000000000",
    "resource": "https://<supabase>/functions/v1/create-tenant-x402",
    "description": "White-label tenant setup fee ($5,000 USDC on Base)",
    "mimeType": "application/json",
    "payTo": "0xC122a2F4BA78B9A890E59abEF99ec992A2C5b06a",
    "maxTimeoutSeconds": 300,
    "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
  }]
}
```

* **200** (with valid `X-PAYMENT` header): Tenant created.

```json
{
  "success": true,
  "tenant": {
    "id": "uuid",
    "host": "buyersclub.investhub.io",
    "status": "RUNNING",
    "subdomain_type": "investhubSubdomain",
    "subscription_paid_until": "2026-04-08T14:00:00.000Z"
  },
  "payment": {
    "txHash": "0x...",
    "amount": "$5,000 USDC",
    "chain": "Base"
  }
}
```

### POST `/functions/v1/renew-tenant-x402`

Renew the subscription for an existing tenant. Payment-gated at 39 USDC on Base.

**Request body:** None required (tenant is resolved from the authenticated user's profile).

**Responses:**

* **402** (no `X-PAYMENT` header): Returns payment instructions for 39 USDC.
* **200** (with valid `X-PAYMENT` header): Subscription extended by 30 days.

```json
{
  "success": true,
  "tenant": {
    "id": "uuid",
    "host": "buyersclub.investhub.io",
    "status": "RUNNING",
    "subscription_paid_until": "2026-05-08T14:00:00.000Z"
  },
  "payment": {
    "txHash": "0x...",
    "amount": "$39 USDC",
    "chain": "Base"
  }
}
```

### GET `/functions/v1/get-tenant-config`

Public endpoint. Returns branding configuration for the tenant matching the `Origin` header's hostname. No authentication required.

**Response:**

```json
{
  "appName": "BuyersClub",
  "logoUrl": "https://example.com/logo.png",
  "logoDarkUrl": "https://example.com/logo-dark.png",
  "faviconUrl": null,
  "primaryColor": "210 100% 50%",
  "accentColor": "160 80% 45%",
  "allowedTokenIds": [1, 3, 7],
  "hiddenRoutes": ["/incorporate", "/manage"],
  "privyAppId": null
}
```

### POST `/functions/v1/check-tenant-subscriptions`

Internal/cron endpoint. Suspends all tenants whose `subscription_paid_until` has passed. No authentication required (intended for cron/scheduler invocation).

**Response:**

```json
{
  "suspended": 2,
  "tenants": [
    { "id": "uuid", "host": "expired.investhub.io", "expired_at": "2026-03-01T00:00:00Z" }
  ],
  "message": "Suspended 2 expired tenant(s)"
}
```

## Agent integration example

An AI agent or script can provision a tenant programmatically using the [x402 fetch wrapper](https://www.npmjs.com/package/@x402/fetch):

```typescript
import { wrapFetch } from '@x402/fetch';

const x402Fetch = wrapFetch(fetch, {
  privateKey: process.env.WALLET_PRIVATE_KEY,
});

const response = await x402Fetch(
  'https://<supabase>/functions/v1/create-tenant-x402',
  {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${privyAccessToken}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      subdomainType: 'investhubSubdomain',
      customDomain: 'myoperator',
      appName: 'My Operator',
      logoUrl: 'https://example.com/logo.png',
      primaryColor: '220 90% 56%',
      allowedTokenIds: [1, 2],
    }),
  },
);

const result = await response.json();
console.log('Tenant created:', result.tenant);
console.log('Payment tx:', result.payment.txHash);
```

The `@x402/fetch` wrapper automatically:

1. Detects the 402 response
2. Signs an ERC-3009 `transferWithAuthorization` for the required USDC amount
3. Retries the request with the `X-PAYMENT` header

## Manual testing with curl

You can also test the x402 flow manually in two steps:

**Step 1 — Get payment instructions:**

```bash
curl -X POST https://<supabase>/functions/v1/create-tenant-x402 \
  -H "Authorization: Bearer <privy_token>" \
  -H "Content-Type: application/json" \
  -d '{"subdomainType":"investhubSubdomain","customDomain":"testdomain"}'
```

This returns HTTP 402 with the payment requirements JSON.

**Step 2 — Pay and create:**

After signing the ERC-3009 authorization off-chain, retry with the payment payload:

```bash
curl -X POST https://<supabase>/functions/v1/create-tenant-x402 \
  -H "Authorization: Bearer <privy_token>" \
  -H "Content-Type: application/json" \
  -H "X-PAYMENT: <signed_payment_payload>" \
  -d '{"subdomainType":"investhubSubdomain","customDomain":"testdomain","appName":"Test"}'
```

## Database schema

### `tenants` table (relevant columns)

| Column                    | Type        | Description                       |
| ------------------------- | ----------- | --------------------------------- |
| `subscription_paid_until` | timestamptz | When the paid period expires      |
| `app_name`                | text        | Display name                      |
| `logo_url`                | text        | Logo (light mode)                 |
| `logo_dark_url`           | text        | Logo (dark mode)                  |
| `favicon_url`             | text        | Favicon URL                       |
| `primary_color`           | text        | HSL primary color                 |
| `accent_color`            | text        | HSL accent color                  |
| `allowed_token_ids`       | integer\[]  | Token IDs visible to tenant users |
| `hidden_routes`           | text\[]     | Routes hidden from navigation     |
| `privy_app_id`            | text        | Tenant-specific Privy app ID      |

### `tenant_payments` table

| Column         | Type          | Description                                 |
| -------------- | ------------- | ------------------------------------------- |
| `id`           | uuid          | Primary key                                 |
| `tenant_id`    | uuid          | FK to tenants                               |
| `user_id`      | uuid          | FK to profiles                              |
| `payment_type` | text          | `setup` or `recurring`                      |
| `amount_usdc`  | numeric(18,6) | Payment amount                              |
| `tx_hash`      | text          | On-chain transaction hash (unique)          |
| `chain`        | text          | Blockchain (default: `base`)                |
| `network_id`   | text          | EIP-155 network ID (default: `eip155:8453`) |
| `status`       | text          | `pending`, `confirmed`, or `failed`         |
| `period_start` | timestamptz   | Subscription period start                   |
| `period_end`   | timestamptz   | Subscription period end                     |


# Liquidation Management

This guide describes Investhub’s **liquidation management** product: a white-label workflow for bankruptcy and insolvency cases where token holders can verify their **USDC compensation quote**, complete KYC, **sign claim-transfer documents**, deposit tokens on-chain, and receive **USDC payouts**.

The production reference deployment is [**envion.investhub.io**](https://envion.investhub.io/) — built for **Envion AG in Liquidation** (EVN token holders in the Swiss bankruptcy process). Today this runs on the **legacy KYC SaaS stack** (separate repo under `reference-code/kyc-saas/`), not as an **investhubio UI tenant**. The platform goal is to host Envion and other issuers as **UI tenants** on one `investhubio` app under the same ECSP umbrella — see [`docs/planning/MULTI_TENANT_ARCHITECTURE.md`](https://github.com/Equanimity-Blockchain-Holdings-Pte-Ltd/investhubio/blob/main/docs/planning/MULTI_TENANT_ARCHITECTURE.md).

> **Demo:** See the [Envion liquidation walkthrough on YouTube](https://www.youtube.com/watch?v=IEq1fkCRRcA\&t=62s).

***

## Overview

| Step            | What the user does                          | What the platform does                                                            |
| --------------- | ------------------------------------------- | --------------------------------------------------------------------------------- |
| 1. Quote        | Enters Ethereum wallet address              | Reads on-chain ENV transfers via Etherscan; calculates USDC compensation          |
| 2. Wallet proof | Signs a MetaMask message                    | Confirms wallet ownership; locks receiving address                                |
| 3. KYC          | Completes identity verification             | Liquidation-specific disclaimers and creditor onboarding                          |
| 4. Sign         | E-signs Transfer of Claims PDFs             | SignNow / Skribble; multi-party signature workflow                                |
| 5. Deposit      | Sends ENV tokens to platform holder address | Tracks inbound transfers as `CompensationTracking` records                        |
| 6. Payout       | Waits for compliance approval               | Admin sends **USDC** on Ethereum; tx hash recorded and linked to signed documents |

**Payout currency:** USDC on Ethereum mainnet (`0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`, 6 decimals).

**Source token (Envion):** EVN/ENVION ERC-20 on Ethereum (`0xd780ae2bf04cd96e577d3d014762f831d97129d0`).

***

## Where the code lives

Liquidation is implemented in the **KYC SaaS stack** (GraphQL backend + React frontend), not in the main Supabase Edge Function app. In the GitHub repo:

| Layer                                           | Path                                                                                                 |
| ----------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| **Backend GraphQL API**                         | `reference-code/kyc-saas/kyc-saas-backend/`                                                          |
| **Liquidation resolvers**                       | `…/src/resolvers/liquidation.js`                                                                     |
| **Liquidation service (rates, amounts)**        | `…/src/service/liquidationService.js`                                                                |
| **Etherscan token history**                     | `…/src/service/etherscanService.js`                                                                  |
| **PDF + e-sign (Transfer of Claims)**           | `…/src/service/pdfService.js`, `…/src/service/signnowService.js`, `…/src/service/skribbleService.js` |
| **GraphQL schema**                              | `…/src/typeDefs/liquidation.js`                                                                      |
| **USDC contract config**                        | `…/src/config/liquidation.js`                                                                        |
| **Frontend**                                    | `reference-code/kyc-saas/kyc-saas-frontend/`                                                         |
| **Quote + wallet UI**                           | `…/src/components/WalletValidationForm.jsx`                                                          |
| **Admin USDC payout button**                    | `…/src/components/SendCompensationButton.jsx`                                                        |
| **Admin compensatable table**                   | `…/src/components/AdminCompensatableTable.jsx`                                                       |
| **Routes (`/transfer-claim`, wallet validate)** | `…/src/routes.jsx`, `…/src/pages/WalletValidate.jsx`                                                 |

The **main Investhub app** (`src/`, Supabase) references Envion in token metadata and supports off-chain liquidation valuations in the portfolio cache, but the full liquidation **quote → sign → USDC** pipeline still runs on the **legacy KYC SaaS** deployment at `envion.investhub.io` until ported to a **UI tenant** on `investhubio`.

Token metadata in the main app: `src/constants/tokenData.ts` (Envion AG, Liquidation Payout 1#/2# children).

***

## Architecture

```mermaid
flowchart TB
  subgraph user [Creditor / token holder]
    W[Ethereum wallet with ENV tokens]
    MM[MetaMask]
  end

  subgraph ui [envion.investhub.io — KYC SaaS frontend]
    WV[WalletValidationForm]
    KYC[KYC + liquidation disclaimers]
    TC[Transfer of Claims e-sign]
  end

  subgraph api [KYC SaaS GraphQL backend]
    Q[checkWalletCompensation]
    CW[confirmLiquidationWallet]
    TR[trackPayoutTransaction]
    SN[signLiquidationForm]
    SP[savePayout]
  end

  subgraph chain [Ethereum mainnet]
    ENV[ENV token contract]
    USDC[USDC contract]
    ES[Etherscan API]
  end

  W --> WV
  MM --> WV
  WV --> Q
  Q --> ES
  ES --> ENV
  WV --> CW
  KYC --> SN
  SN --> TC
  W -->|transfer ENV to holder address| ENV
  ENV --> TR
  TR --> ES
  TC -->|admin approves| SP
  SP --> USDC
  USDC -->|USDC transfer| W
```

***

## Compensation quote

### How the quote is calculated

When a user clicks **Check compensation**, the backend runs `checkWalletCompensation`:

1. Load tenant settings: `liquidation_contract_address`, `liquidation_token_decimal`, `liquidation_holder_addresses`.
2. Call Etherscan `tokentx` for the wallet and ENV contract.
3. Filter transfers **from** the user’s wallet **to** configured holder addresses.
4. Sum token amounts (adjusted for decimals).
5. Multiply by the **compensation rate** from `liquidationService.getCompensationRate()`.

```
compensation_usdc = total_env_tokens × compensation_rate
```

**Default rate:** `0.081` USDC per ENV token (overridable per tenant via `liquidation_compensation_rate`).

**Per-wallet overrides:** `liquidation_specific_compensation_rate` — newline-separated `address,rate` pairs.

**Code:** `reference-code/kyc-saas/kyc-saas-backend/src/resolvers/liquidation.js` (`checkWalletCompensation`), `liquidationService.js`.

### GraphQL

```graphql
query checkWalletCompensation($walletAddress: String!) {
  checkWalletCompensation(walletAddress: $walletAddress)
}
```

**Response shape:**

```json
{
  "token": 12345.67,
  "compensation": 1000.00
}
```

(`compensation` is in USDC.)

***

## Wallet validation and ownership proof

After a positive quote, the user clicks **Use this wallet**:

1. MetaMask connects and signs: *"Please sign this message to confirm the ownership of provided wallet"*.
2. Backend verifies signer address matches the entered wallet.
3. `confirmLiquidationWallet` checks the wallet still holds ENV tokens (via Etherscan).
4. User record updated: `is_valid_liquidation_wallet: true`, `wallet_address` set, wallet change disabled.

User is then redirected to `/application` for KYC.

**Frontend:** `WalletValidationForm.jsx`\
**Backend:** `confirmLiquidationWallet` in `liquidation.js`

***

## KYC and Transfer of Claims signing

For tenants with `token_type = LIQUIDATION`, the KYC flow includes liquidation-specific disclaimers (claim transfer, consent, GDPR).

When a **creditor number** is assigned (`updateCreditorNumber`), the platform generates a **Transfer of Claims** PDF bundle and sends it for e-signature via **SignNow** (and optionally **Skribble**):

| Template flag | Document section                            |
| ------------- | ------------------------------------------- |
| `trado`       | Trado / GDPR addendum                       |
| `envion`      | Envion claim transfer (2 pages)             |
| `gtcm`        | GTCM (non-German)                           |
| `amb`         | AMB (German)                                |
| `contract`    | Contract when no legal protection insurance |

PDF assembly: `pdfService.createSignnowEnvionFormData()` — merges templates from `pdfs/liquidationForm/`.

E-sign workflow: `signnowService.signLiquidationForm()` — two signers:

1. **Signer 1:** Creditor (customer email)
2. **Signer 2:** Compliance / payout approver (tenant `mailgun.from_kyc_approval_email`)

Signature requirements before payout:

* Payout **≥ 5,000 USDC:** full document must be `fulfilled` (both signers).
* Payout **< 5,000 USDC:** creditor signature alone is sufficient.

**Code:** `customerIndividual.js` (`updateCreditorNumber`), `signnowService.js` (`signLiquidationForm`, `createEnvionDocument`).

***

## Token deposit and tracking

After KYC approval, the creditor sends ENV tokens from their wallet to a **platform holder address** (configured in tenant settings).

Each inbound transfer is recorded in **`CompensationTracking`**:

| Field                            | Meaning                         |
| -------------------------------- | ------------------------------- |
| `transactionHash`                | On-chain ENV transfer tx        |
| `amount`                         | Raw token amount (wei-style)    |
| `decimal`                        | Token decimals                  |
| `compensationRateAtConfirmation` | Rate locked at tracking time    |
| `status`                         | `NOT_PAID` → `PENDING` → `PAID` |
| `transferedAt`                   | Block timestamp                 |

Tracking is refreshed via `trackPayoutTransaction()` when KYC status changes — it re-scans Etherscan for new transfers to holder addresses.

***

## USDC payout

### Admin flow

Compliance officers use **AdminCompensatableTable** + **SendCompensationButton**:

1. Review `getUserCompensationTracking` — list of ENV deposits and total USDC due.
2. Confirm `checkLiquidationDocumentHasNeededSignatures` is satisfied.
3. Connect MetaMask wallet funded with USDC.
4. Click **Send compensation** — calls USDC `transfer(recipient, amount)` on Ethereum.
5. On tx success, call `savePayout` with `payoutTxHash` and tracking IDs.

Backend waits for on-chain confirmation, parses USDC amount from tx input, creates `CompensationPayout`, marks tracking rows `PAID`, and prefills the SignNow document with `transaction_hash`.

**USDC transfer (frontend):** `SendCompensationButton.jsx` — encodes `contract.methods.transfer(addressTo, amount * 10^6)`.

**Payout recording (backend):** `savePayout` / `savePayoutForKyc` in `liquidation.js`.

### GraphQL mutations

```graphql
mutation confirmLiquidationWallet($walletAddress: String!) {
  confirmLiquidationWallet(walletAddress: $walletAddress)
}

mutation savePayout($payoutTxHash: String!, $transactionIds: [ID]!, $userId: ID!) {
  savePayout(payoutTxHash: $payoutTxHash, transactionIds: $transactionIds, userId: $userId)
}
```

***

## End-to-end sequence

```mermaid
sequenceDiagram
  participant User
  participant UI as envion.investhub.io
  participant API as KYC GraphQL API
  participant ES as Etherscan
  participant Sign as SignNow
  participant Admin
  participant USDC as USDC contract

  User->>UI: Enter wallet, Check compensation
  UI->>API: checkWalletCompensation(wallet)
  API->>ES: tokentx (ENV contract, wallet → holders)
  ES-->>API: transfer list
  API-->>UI: { token, compensation USDC }

  User->>UI: Sign MetaMask message, Use this wallet
  UI->>API: confirmLiquidationWallet
  API-->>UI: OK → redirect to KYC

  User->>UI: Complete KYC + disclaimers
  Admin->>API: updateCreditorNumber
  API->>Sign: Transfer of Claims PDF invite
  User->>Sign: E-sign as creditor
  Admin->>Sign: E-sign as approver

  User->>User: Send ENV tokens to holder address
  API->>ES: trackPayoutTransaction
  ES-->>API: CompensationTracking NOT_PAID

  Admin->>UI: Send compensation (USDC)
  UI->>USDC: transfer(userWallet, amount)
  USDC-->>UI: txHash
  UI->>API: savePayout(txHash, trackingIds)
  API-->>User: USDC received; status PAID
```

***

## Tenant configuration

Each liquidation tenant (e.g. `envion.investhub.io`) stores these settings:

| Setting                                  | Purpose                                              |
| ---------------------------------------- | ---------------------------------------------------- |
| `token_type`                             | Must be `LIQUIDATION`                                |
| `liquidation_contract_address`           | Source token contract (ENV for Envion)               |
| `liquidation_token_decimal`              | Token decimals for amount math                       |
| `liquidation_holder_addresses`           | Newline-separated addresses that accept ENV deposits |
| `liquidation_compensation_rate`          | Default USDC-per-token rate (e.g. `0.081`)           |
| `liquidation_specific_compensation_rate` | Optional per-wallet overrides: `0xabc...,0.09`       |
| SignNow credentials                      | E-sign for Transfer of Claims                        |

**DNS:** `envion.investhub.io` → CNAME → `app.investhub.io` (tenant resolved at runtime by hostname).

**Code reference:** `reference-code/investhub-gitlab/backend/src/resolvers/tenant.js` (allowed hosts include `envion.investhub.io`).

***

## User-facing routes (KYC SaaS frontend)

| Route                                    | Purpose                                                   |
| ---------------------------------------- | --------------------------------------------------------- |
| `/`                                      | Dashboard; liquidation tenants link to `/transfer-claim`  |
| `/transfer-claim`                        | Main claim transfer entry (Envion-specific UI)            |
| `/transfer-claim/guide`                  | Step-by-step guide                                        |
| `/transfer-claim/claim-with-liquidator`  | Claim via liquidator path                                 |
| `/transfer-claim/claim-with-credit-card` | Alternative claim path                                    |
| `/transfer-claim/claim-with-bitcoin`     | Alternative claim path                                    |
| Wallet validate page                     | Quote calculator + MetaMask confirmation → `/application` |

> **Note:** `TransferClaim` page components are referenced in `routes.jsx` but may not be present in all repo snapshots; the core quote/sign/payout logic is in the components listed above.

***

## Relation to main Investhub platform

| Feature                 | KYC SaaS (liquidation)      | Main app (investhub.io)                                                             |
| ----------------------- | --------------------------- | ----------------------------------------------------------------------------------- |
| Quote from wallet       | ✅ `checkWalletCompensation` | —                                                                                   |
| KYC + e-sign            | ✅ SignNow / Skribble        | SumSub KYC                                                                          |
| USDC payout on-chain    | ✅ `SendCompensationButton`  | Crypto payments via crowdsale contracts                                             |
| Portfolio valuation     | —                           | `get-portfolio-cached` supports `manual_valuation` for off-chain liquidation values |
| Shareholder broadcasts  | —                           | `xmtp-broadcast` supports message type `liquidation`                                |
| Token explorer metadata | —                           | `tokenData.ts` — Envion, Liquidation Payout 1#/2#                                   |

***

## Related GraphQL API (compliance / admin)

| Query / mutation                              | Role                                             | Min rights          |
| --------------------------------------------- | ------------------------------------------------ | ------------------- |
| `getUserCompensationTracking`                 | List ENV deposits + totals                       | COMPLIANCE\_OFFICER |
| `getUserCompensationPayout`                   | Payout history                                   | COMPLIANCE\_OFFICER |
| `checkLiquidationDocumentHasNeededSignatures` | Sign-off gate                                    | COMPLIANCE\_OFFICER |
| `checkBatchCompensate`                        | Batch payout eligibility                         | COMPLIANCE\_OFFICER |
| `getUserCompensationRate`                     | Current rate for logged-in user                  | Auth                |
| `addLiquidationProof`                         | Upload tx hashes or files (lawyer transfer path) | Auth                |
| `savePayoutForKyc`                            | Record payout by KYC id                          | COMPLIANCE\_OFFICER |

Full schema: `reference-code/kyc-saas/kyc-saas-backend/src/typeDefs/liquidation.js`.

***

## Reusing for other liquidations

The same pattern applies to any tokenized bankruptcy:

1. Create a white-label tenant (`*.investhub.io` or custom domain).
2. Set `token_type = LIQUIDATION` and liquidation\_\* settings.
3. Configure holder addresses and compensation rate(s).
4. Customize PDF templates in `pdfs/liquidationForm/`.
5. Fund an admin USDC wallet for payouts.

This is the infrastructure referenced in the ECSP strategy as prior art: **automated creditor onboarding, signed claim transfer, on-chain token receipt, and USDC distribution** — proven at scale with Envion (\~6,000 creditors in related materials).

***

## Further reading

* [Investments guide](/guides/investments) — main platform subscription flow
* [White-Label Tenants](/guides/white-label) — tenant provisioning on Investhub
* [Envion bankruptcy portal](https://www.envion-konkurs.ch/) — official creditor information
* Envion token on Etherscan: [0xd780ae2bf04cd96e577d3d014762f831d97129d0](https://etherscan.io/token/0xd780ae2bf04cd96e577d3d014762f831d97129d0)


