{
  "id": "com.lattice.expenses",
  "name": "Shared Expenses",
  "icon": "🧾",
  "color": "#4f46e5",
  "description": "Group expenses and settlements in Splitwise's data format.",
  "provenance": "Splitwise API 3.0, verified 2026-10-14: https://dev.splitwise.com/#tag/expenses/paths/~1get_expense~1{id}/get and https://dev.splitwise.com/#tag/expenses/paths/~1create_expense/post . Adopted expense id, cost, description, details, date, currency_code, group_id, repeat_interval, payment, created_at, updated_at. cost remains the documented decimal string (at most two places); payment is projected from boolean to SQLite 0/1. Participant allocations and balances are outside this expense-row subset. Fixture actions are not Splitwise webhooks.",
  "requested_permissions": {
    "storage": [
      "sql"
    ],
    "network": {
      "allowlist": []
    },
    "events": {
      "expense-added": {
        "description": "An expense or settlement payment was added.",
        "schema": {
          "type": "object",
          "properties": {
            "id": {
              "type": "integer",
              "description": "Expense ID."
            },
            "cost": {
              "type": "string",
              "description": "Decimal string in major currency units, at most two decimal places.",
              "pattern": "^\\d+(\\.\\d{1,2})?$"
            },
            "description": {
              "type": "string",
              "description": "Expense description."
            },
            "details": {
              "type": [
                "string",
                "null"
              ],
              "description": "Expense notes; null means unspecified."
            },
            "date": {
              "type": "string",
              "description": "Expense occurrence timestamp, ISO 8601."
            },
            "currency_code": {
              "type": "string",
              "description": "Three-letter currency code, e.g. USD or EUR.",
              "pattern": "^[A-Z]{3}$"
            },
            "group_id": {
              "type": [
                "integer",
                "null"
              ],
              "description": "Group ID; null means no group."
            },
            "repeat_interval": {
              "type": "string",
              "description": "Repeat frequency.",
              "enum": [
                "never",
                "weekly",
                "fortnightly",
                "monthly",
                "yearly"
              ]
            },
            "payment": {
              "type": "integer",
              "description": "Settlement flag: 0=purchase, 1=settlement payment.",
              "enum": [
                0,
                1
              ]
            },
            "created_at": {
              "type": [
                "string",
                "null"
              ],
              "description": "Creation timestamp, ISO 8601; null means unspecified."
            },
            "updated_at": {
              "type": [
                "string",
                "null"
              ],
              "description": "Last-update timestamp, ISO 8601; null means unspecified."
            }
          },
          "required": [
            "id",
            "cost",
            "description",
            "date",
            "currency_code",
            "payment"
          ],
          "additionalProperties": false
        }
      },
      "expense-updated": {
        "description": "An expense was updated.",
        "schema": {
          "type": "object",
          "properties": {
            "id": {
              "type": "integer",
              "description": "Expense ID."
            },
            "cost": {
              "type": "string",
              "description": "Decimal string in major currency units, at most two decimal places.",
              "pattern": "^\\d+(\\.\\d{1,2})?$"
            },
            "description": {
              "type": "string",
              "description": "Expense description."
            },
            "details": {
              "type": [
                "string",
                "null"
              ],
              "description": "Expense notes; null means unspecified."
            },
            "date": {
              "type": "string",
              "description": "Expense occurrence timestamp, ISO 8601."
            },
            "currency_code": {
              "type": "string",
              "description": "Three-letter currency code, e.g. USD or EUR.",
              "pattern": "^[A-Z]{3}$"
            },
            "group_id": {
              "type": [
                "integer",
                "null"
              ],
              "description": "Group ID; null means no group."
            },
            "repeat_interval": {
              "type": "string",
              "description": "Repeat frequency.",
              "enum": [
                "never",
                "weekly",
                "fortnightly",
                "monthly",
                "yearly"
              ]
            },
            "payment": {
              "type": "integer",
              "description": "Settlement flag: 0=purchase, 1=settlement payment.",
              "enum": [
                0,
                1
              ]
            },
            "created_at": {
              "type": [
                "string",
                "null"
              ],
              "description": "Creation timestamp, ISO 8601; null means unspecified."
            },
            "updated_at": {
              "type": [
                "string",
                "null"
              ],
              "description": "Last-update timestamp, ISO 8601; null means unspecified."
            }
          },
          "required": [
            "id",
            "cost",
            "description",
            "date",
            "currency_code",
            "payment"
          ],
          "additionalProperties": false
        }
      },
      "expense-deleted": {
        "description": "An expense was deleted.",
        "schema": {
          "type": "object",
          "properties": {
            "id": {
              "type": "integer",
              "description": "Expense ID."
            },
            "description": {
              "type": "string",
              "description": "Expense description."
            },
            "cost": {
              "type": "string",
              "description": "Decimal string in major currency units, at most two decimal places.",
              "pattern": "^\\d+(\\.\\d{1,2})?$"
            },
            "currency_code": {
              "type": "string",
              "description": "Three-letter currency code, e.g. USD or EUR.",
              "pattern": "^[A-Z]{3}$"
            }
          },
          "required": [
            "id",
            "description"
          ],
          "additionalProperties": false
        }
      }
    },
    "listeners": {
      "add-expense": {
        "description": "Log an expense or settlement payment.",
        "schema": {
          "type": "object",
          "properties": {
            "id": {
              "type": "integer",
              "description": "Expense ID; generated when omitted."
            },
            "cost": {
              "type": "string",
              "description": "Decimal string in major currency units, at most two decimal places.",
              "pattern": "^\\d+(\\.\\d{1,2})?$"
            },
            "description": {
              "type": "string",
              "description": "Expense description."
            },
            "details": {
              "type": [
                "string",
                "null"
              ],
              "description": "Expense notes; omitted or null means unspecified."
            },
            "date": {
              "type": "string",
              "description": "Expense occurrence timestamp, ISO 8601."
            },
            "currency_code": {
              "type": "string",
              "description": "Three-letter currency code, e.g. USD or EUR.",
              "pattern": "^[A-Z]{3}$"
            },
            "group_id": {
              "type": [
                "integer",
                "null"
              ],
              "description": "Group ID; omitted or null means no group."
            },
            "repeat_interval": {
              "type": "string",
              "description": "Repeat frequency; omitted defaults to never.",
              "enum": [
                "never",
                "weekly",
                "fortnightly",
                "monthly",
                "yearly"
              ]
            },
            "payment": {
              "type": "integer",
              "description": "Settlement flag: 0=purchase, 1=settlement payment; omitted defaults to 0.",
              "enum": [
                0,
                1
              ]
            },
            "created_at": {
              "type": [
                "string",
                "null"
              ],
              "description": "Creation timestamp, ISO 8601; omitted or null means unspecified."
            },
            "updated_at": {
              "type": [
                "string",
                "null"
              ],
              "description": "Last-update timestamp, ISO 8601; omitted or null means unspecified."
            }
          },
          "required": [
            "cost",
            "description",
            "date",
            "currency_code"
          ],
          "additionalProperties": false
        }
      }
    }
  },
  "x-effects": {
    "add-expense": {
      "table": "expenses",
      "emits": "expense-added"
    }
  },
  "source": {
    "assets": [
      "index.html",
      "app.js",
      "app.css",
      "ui.css",
      "emits.js",
      "listens.js"
    ]
  }
}