Splitwise icon

Splitwise Data API: Shared Expenses, Balances and P2P Payments

Splitwise, Inc. · Payments

Splitwise is a shared-expense tracker from Splitwise, Inc. for roommates, couples, travel groups and clubs that need to keep joint bills organized and see who owes whom. Members create groups, record who paid, divide costs equally or by exact amounts, percentages or shares, and add receipts, notes and comments before settling balances. Recurring expenses cover rent and utility bills, while Splitwise Pro adds itemized receipt scanning, spending charts, currency conversion and expense search. Bank and card connections bring transactions into the splitting workflow; eligible US users can also use Splitwise Pay payment requests and a Splitwise wallet.

Paid-versus-owed shares give the shared-expense ledger its member-level detail: paid_share and owed_share sit beside cost, currency_code, group_id and split_method. Expense records retain the description, date, category and creator, while conflictDetected flags conflicting edits. Detail records add receipt_path, comments_count, transaction_method, transaction_status, repeat_interval and next_repeat_timestamp, supporting household accounting that keeps receipts, recurring bills and payment states tied to the same expense.

The group debt graph connects members with original_debts, simplified_debts and repayments; individual obligations retain from, to, amount and currency_code. These records let a travel planner compare outstanding obligations with settlement proposals and recorded repayments. Notification fields source_type, source_id and app_link connect activity to the relevant group or expense, while currency records supply code and unit for consistent amount labels.

Payment requests add requestedAmount, currencyCode, status, expiresAt and warning for tracking unpaid or lapsed requests. Imported transactions pair transactionId with rawName, amount and unsplittableAlert, giving reconciliation tools matching keys and exception signals; batch allocation results distinguish processed from failed items. Wallet statements retain month, opening_balance and closing_balance, alongside funding-source availableBalance and pendingBalance. For accounting tools, group-travel planners and payment-monitoring dashboards, openData Studio turns this shared-expense data into callable open data.

Screenshots

  • Splitwise screenshot 1
  • Splitwise screenshot 2
  • Splitwise screenshot 3
  • Splitwise screenshot 4
  • Splitwise screenshot 5

API surface

The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.

  • Session sign-in

    POST /v1/shared-costs/sessions openbanking

    Opens an authenticated session. sequence reports how far sign-in progressed and challenge_options lists any second-factor step still required; auth returns the account identity and session token; data_s2 seeds the current user; app_tour carries onboarding state so a fresh device can be routed straight to the ledger.

    Auth: No session required for sign-in; account credentials open a cookie-backed session. The session cookie authenticates later calls, not a bearer token.

    • sequence
    • challenge_options
    • auth
    • data_s2
    • app_tour
    POST /v1/shared-costs/sessions HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    X-Client-Time-Zone: America/New_York
    
    {
      "email": "[email protected]",
      "password": "<example-password>"
    }
    {
      "sequence": "authenticated",
      "challenge_options": [],
      "auth": {
        "user_id": 101,
        "session_token": "<example-session-token>"
      },
      "data_s2": {
        "current_user_id": 101
      },
      "app_tour": {
        "seen": true
      }
    }
  • Account bootstrap payload

    GET /v1/shared-costs/snapshots openfinance

    Returns the whole signed-in state in one payload: the caller's current_user_id plus every expense, group, friend, notification, currency and category already synced. The client uses it to hydrate its local store on cold start, so downstream screens read one consistent membership graph rather than stitching separate list calls.

    Auth: Session cookie; Accept: application/json.

    • current_user_id
    • expenses
    • groups
    • friends
    • notifications
    • currencies
    • categories
    GET /v1/shared-costs/snapshots HTTP/1.1
    Accept: application/json
    Cookie: <example-session-cookie>
    {
      "current_user_id": 101,
      "expenses": [
        {
          "id": 501,
          "description": "Groceries",
          "cost": "86.40",
          "currency_code": "USD",
          "date": "2026-10-18",
          "group_id": 301
        }
      ],
      "groups": [
        {
          "id": 301,
          "name": "Shared household",
          "group_type": "household"
        }
      ],
      "friends": [
        {
          "id": 202,
          "first_name": "Sam",
          "currency_code": "USD"
        }
      ],
      "notifications": [],
      "currencies": [
        {
          "id": 1,
          "code": "USD",
          "unit": "$"
        }
      ],
      "categories": [
        {
          "id": 15,
          "name": "Groceries"
        }
      ]
    }
  • Expense list with filters

    GET /v1/shared-costs/entries openfinance

    Pages through ledger rows, filtered by group_id, friend_id or an updated_after watermark. Each row carries cost and currency_code, the date and payment flag, category and creator, plus comments_count, which lets a sync job pull only what changed since its last cursor.

    Auth: Session cookie.

    • id
    • description
    • cost
    • currency_code
    • date
    • payment
    • group_id
    • category
    • created_by
    • comments_count
    GET /v1/shared-costs/entries?group_id=301&friend_id=202&updated_after=2026-10-01T00:00:00Z HTTP/1.1
    Accept: application/json
    Cookie: <example-session-cookie>
    {
      "expenses": [
        {
          "id": 501,
          "description": "Groceries",
          "cost": "86.40",
          "currency_code": "USD",
          "date": "2026-10-18",
          "payment": false,
          "group_id": 301,
          "category": {
            "id": 15,
            "name": "Groceries"
          },
          "created_by": {
            "id": 101,
            "first_name": "Alex"
          },
          "comments_count": 1
        }
      ]
    }
  • Create or update an expense

    POST /v1/shared-costs/entries/save openfinance

    Writes one ledger row. split_method records how the bill was divided (evenly, by shares, percentage or exact amounts), while each users entry states that member's paid_share and owed_share; creation_method notes which client authored it. conflictDetected in the reply flags an edit that raced a newer server version.

    Auth: Session cookie; form-encoded body.

    • cost
    • description
    • group_id
    • currency_code
    • date
    • split_method
    • category_id
    • creation_method
    • payment
    • users
    • user_id
    • paid_share
    • owed_share
    • conflictDetected
    POST /v1/shared-costs/entries/save HTTP/1.1
    Accept: application/json
    Cookie: <example-session-cookie>
    Content-Type: application/x-www-form-urlencoded
    
    cost=86.40&description=Groceries&group_id=301&currency_code=USD&date=2026-10-18&split_method=evenly&category_id=15&creation_method=android&payment=false&users[0][user_id]=101&users[0][paid_share]=86.40&users[0][owed_share]=43.20&users[1][user_id]=202&users[1][paid_share]=0.00&users[1][owed_share]=43.20
    {
      "expenses": [
        {
          "id": 501,
          "cost": "86.40",
          "description": "Groceries",
          "group_id": 301,
          "currency_code": "USD",
          "date": "2026-10-18",
          "split_method": "evenly",
          "category_id": 15,
          "creation_method": "android",
          "payment": false,
          "users": [
            {
              "user_id": 101,
              "paid_share": "86.40",
              "owed_share": "43.20"
            },
            {
              "user_id": 202,
              "paid_share": "0.00",
              "owed_share": "43.20"
            }
          ]
        }
      ],
      "conflictDetected": false
    }
  • Expense detail with payment legs

    GET /v1/shared-costs/entries/{entry_id}/details openfinance

    Expands a single row into three blocks: expense for the bill itself, payment_details for the funding leg (transaction_method, transaction_confirmed, transaction_status) and expense_bundle_details for recurrence (repeat_interval, next_repeat_timestamp). Receipt paths and notes travel here rather than in list responses.

    Auth: Session cookie.

    • expense
    • payment_details
    • expense_bundle_details
    • id
    • cost
    • currency_code
    • details
    • receipt_path
    • comments_count
    • transaction_method
    • transaction_confirmed
    • transaction_status
    • repeat_interval
    • next_repeat_timestamp
    GET /v1/shared-costs/entries/501/details HTTP/1.1
    Accept: application/json
    Cookie: <example-session-cookie>
    {
      "expense": {
        "id": 501,
        "description": "Groceries",
        "cost": "86.40",
        "currency_code": "USD",
        "date": "2026-10-18",
        "details": "Weekly shared shop",
        "receipt_path": "/illustrations/receipts/receipt-501.jpg",
        "comments_count": 1
      },
      "payment_details": {
        "transaction_method": "card",
        "transaction_confirmed": true,
        "transaction_status": "posted"
      },
      "expense_bundle_details": {
        "repeat_interval": "monthly",
        "next_repeat_timestamp": 1794960000
      }
    }
  • Comment on an expense

    POST /v1/shared-costs/annotations openfinance

    Adds a threaded note to an expense. The response carries content, comment_type, created_at and person, so a ledger reviewer can attribute each remark to a member and order remarks against the expense timeline without loading the whole ledger.

    Auth: Session cookie; form-encoded body.

    • id
    • comment_type
    • content
    • created_at
    • deleted_at
    • expense_id
    • person_id
    • person
    POST /v1/shared-costs/annotations HTTP/1.1
    Accept: application/json
    Cookie: <example-session-cookie>
    Content-Type: application/x-www-form-urlencoded
    
    expense_id=501&content=Receipt%20attached
    {
      "comment": {
        "id": 601,
        "comment_type": "user",
        "content": "Receipt attached",
        "created_at": "2026-10-18T19:42:11Z",
        "deleted_at": null,
        "expense_id": 501,
        "person_id": 101,
        "person": {
          "id": 101,
          "first_name": "Alex"
        }
      }
    }
  • Group ledger and debt graph

    GET /v1/circles/{circle_id}/balances openfinance

    Returns one group with its membership and money graph. original_debts keeps every pairwise obligation as incurred, simplified_debts collapses them into the smallest set of transfers, and repayments records what has already been paid; simplify_by_default and invite_link describe the group's settlement policy and join path.

    Auth: Session cookie.

    • id
    • name
    • group_type
    • simplify_by_default
    • invite_link
    • updated_at
    • members
    • original_debts
    • simplified_debts
    • repayments
    • from
    • to
    • amount
    • currency_code
    GET /v1/circles/301/balances HTTP/1.1
    Accept: application/json
    Cookie: <example-session-cookie>
    {
      "group": {
        "id": 301,
        "name": "Shared household",
        "group_type": "household",
        "simplify_by_default": true,
        "invite_link": "/illustrations/invites/household-example",
        "updated_at": "2026-10-19T08:12:00Z",
        "members": [
          {
            "id": 101,
            "first_name": "Alex"
          },
          {
            "id": 202,
            "first_name": "Sam"
          }
        ],
        "original_debts": [
          {
            "from": 202,
            "to": 101,
            "amount": "43.20",
            "currency_code": "USD"
          }
        ],
        "simplified_debts": [
          {
            "from": 202,
            "to": 101,
            "amount": "43.20",
            "currency_code": "USD"
          }
        ],
        "repayments": []
      }
    }
  • Notification feed

    GET /v1/activity/events openfinance

    Streams recent activity. type and source_type/source_id point every event at the expense or group that caused it, via records the originating client, and app_link gives a deep link. A sync service can use the feed as a change signal, then fetch only the referenced source objects.

    Auth: Session cookie; limit is a query parameter.

    • id
    • type
    • created_at
    • created_by
    • source_type
    • source_id
    • source_url
    • image_url
    • image_shape
    • content
    • via
    • app_link
    GET /v1/activity/events?limit=50 HTTP/1.1
    Accept: application/json
    Cookie: <example-session-cookie>
    {
      "notifications": [
        {
          "id": 701,
          "type": "expense_added",
          "created_at": "2026-10-18T19:40:02Z",
          "created_by": {
            "id": 101,
            "first_name": "Alex"
          },
          "source_type": "expense",
          "source_id": 501,
          "source_url": "/illustrations/expenses/501",
          "image_url": "/illustrations/avatars/member-101.png",
          "image_shape": "circle",
          "content": "Alex added Groceries",
          "via": "android",
          "app_link": "/illustrations/expenses/501"
        }
      ]
    }
  • Currency catalogue

    GET /v1/reference/money-units opendata

    Lists the currencies a ledger line may use, keyed by ISO code with the display unit. It is the reference table that resolves every currency_code on expenses, group debts and wallet balances, so a consumer can label amounts without hard-coding symbols.

    Auth: Session cookie.

    • id
    • code
    • unit
    GET /v1/reference/money-units HTTP/1.1
    Accept: application/json
    Cookie: <example-session-cookie>
    {
      "currencies": [
        {
          "id": 1,
          "code": "USD",
          "unit": "$"
        },
        {
          "id": 2,
          "code": "EUR",
          "unit": "€"
        },
        {
          "id": 3,
          "code": "JPY",
          "unit": "¥"
        }
      ]
    }
  • Create a P2P payment request

    POST /v1/settlements/requests openbanking

    Asks another member to pay through Splitwise Pay. requested_payment_method selects the rail (splitwise_p2p or pay_by_bank), relationship_type/relationship_id tie the request to a group or friend, and the reply adds status, createdAt and expiresAt plus a warning slot when the request could not be delivered immediately.

    Auth: Session cookie; application/json body with a client time-zone header.

    • requestee_id
    • requested_amount
    • currency_code
    • requested_payment_method
    • relationship_type
    • relationship_id
    • status
    • createdAt
    • expiresAt
    • requestedAmount
    • currencyCode
    • relationshipType
    • warning
    POST /v1/settlements/requests HTTP/1.1
    Accept: application/json
    Cookie: <example-session-cookie>
    Content-Type: application/json
    X-Client-Time-Zone: America/New_York
    
    {
      "requestee_id": 202,
      "requested_amount": "43.20",
      "currency_code": "USD",
      "requested_payment_method": "splitwise_p2p",
      "relationship_type": "group",
      "relationship_id": 301
    }
    {
      "data": {
        "type": "payment_request",
        "id": "request_example_1",
        "attributes": {
          "status": "pending",
          "requestedPaymentMethod": "splitwise_p2p",
          "createdAt": "2026-10-20T14:05:00Z",
          "expiresAt": "2026-10-27T14:05:00Z",
          "requestedAmount": "43.20",
          "currencyCode": "USD",
          "relationshipType": "group"
        }
      },
      "included": [],
      "meta": {
        "warning": null
      }
    }
  • Recent payment requests

    GET /v1/settlements/requests/latest openbanking

    Returns the newest payment requests with their lifecycle attributes. status, expiresAt and requestedAmount show which requests are open, paid or lapsed; meta.warning surfaces account-level notices that affect whether new requests can be sent.

    Auth: Session cookie.

    • data
    • status
    • requestedPaymentMethod
    • createdAt
    • expiresAt
    • requestedAmount
    • currencyCode
    • relationshipType
    • meta
    • warning
    GET /v1/settlements/requests/latest HTTP/1.1
    Accept: application/json
    Cookie: <example-session-cookie>
    X-Client-Time-Zone: America/New_York
    {
      "data": [
        {
          "type": "payment_request",
          "id": "request_example_1",
          "attributes": {
            "status": "paid",
            "requestedPaymentMethod": "splitwise_p2p",
            "createdAt": "2026-10-20T14:05:00Z",
            "expiresAt": "2026-10-27T14:05:00Z",
            "requestedAmount": "43.20",
            "currencyCode": "USD",
            "relationshipType": "group"
          }
        }
      ],
      "meta": {
        "warning": null
      }
    }
  • Imported bank and card transactions

    GET /v1/linked-accounts/entries openbanking

    Lists transactions pulled from a linked funding source. status steps through pending, possible_hold and posted; rawName keeps the statement descriptor while name is the cleaned merchant; transactionId and amount support matching against an external card feed, and unsplittableAlert marks rows the importer cannot split as-is.

    Auth: Session cookie; linked bank or card access must already be authorized in the app.

    • id
    • amount
    • categoryId
    • currencyCode
    • status
    • name
    • rawName
    • date
    • dateTime
    • transactionId
    • relatedResource
    • unsplittableAlert
    GET /v1/linked-accounts/entries HTTP/1.1
    Accept: application/json
    Cookie: <example-session-cookie>
    X-Client-Time-Zone: America/New_York
    {
      "data": [
        {
          "type": "imported_transaction",
          "id": "import_example_1",
          "attributes": {
            "amount": "86.40",
            "categoryId": "groceries",
            "currencyCode": "USD",
            "status": "posted",
            "name": "Example grocery shop",
            "rawName": "EXAMPLE GROCER 001",
            "date": "2026-10-18",
            "dateTime": "2026-10-18T17:12:00Z",
            "transactionId": "transaction_example_1",
            "relatedResource": null,
            "unsplittableAlert": false
          }
        }
      ],
      "included": [],
      "meta": {
        "total": 1
      }
    }
  • Split an imported transaction

    POST /v1/linked-accounts/splits openfinance

    Turns one or more imported transactions into shared expenses by binding each to a group or friend. The batch body pairs imported_transaction_id with expense_relationship_type/id, and the reply reports per-item modules plus processed/failed counts so a reconciliation job can retry only the misses.

    Auth: Session cookie; application/json body.

    • imported_transaction_id
    • expense_relationship_id
    • expense_relationship_type
    • data
    • modules
    • metadata
    • processed
    • failed
    POST /v1/linked-accounts/splits HTTP/1.1
    Accept: application/json
    Cookie: <example-session-cookie>
    Content-Type: application/json
    X-Client-Time-Zone: America/New_York
    
    {
      "data": [
        {
          "imported_transaction_id": "import_example_1",
          "attributes": {
            "expense_relationship_id": 301,
            "expense_relationship_type": "group"
          }
        }
      ]
    }
    {
      "data": {
        "modules": [
          {
            "id": "import_example_1",
            "status": "linked",
            "expense_id": 501
          }
        ]
      },
      "metadata": {
        "processed": 1,
        "failed": 0
      }
    }
  • Monthly wallet statements

    GET /v1/cash-accounts/{account_id}/monthly-records openbanking

    Serves Splitwise wallet history month by month. Each statement is keyed by month and brackets the period with opening and closing balances in the wallet currency, which lets a bookkeeping export reconstruct the balance trail behind P2P payments.

    Auth: Session cookie.

    • statements
    • month
    • opening_balance
    • closing_balance
    • currency_code
    GET /v1/cash-accounts/cash_example_1/monthly-records HTTP/1.1
    Accept: application/json
    Cookie: <example-session-cookie>
    X-Client-Time-Zone: America/New_York
    {
      "statements": [
        {
          "month": "2026-09",
          "opening_balance": "120.00",
          "closing_balance": "163.20",
          "currency_code": "USD"
        },
        {
          "month": "2026-10",
          "opening_balance": "163.20",
          "closing_balance": "213.20",
          "currency_code": "USD"
        }
      ]
    }
  • Deposit into Splitwise wallet

    POST /v1/cash-accounts/{account_id}/funding-transfers openbanking

    Moves money from a linked funding source into the wallet and returns the updated source. primaryType distinguishes bank_account, debit_card and wallet_balance rails; availableBalance versus pendingBalance shows what can be spent now versus what is still clearing, and discardedAt marks revoked sources.

    Auth: Session cookie; application/json body naming an authorized funding source.

    • uuid
    • primaryType
    • createdAt
    • updatedAt
    • discardedAt
    • data
    • currencyCode
    • availableBalance
    • pendingBalance
    POST /v1/cash-accounts/cash_example_1/funding-transfers HTTP/1.1
    Accept: application/json
    Cookie: <example-session-cookie>
    Content-Type: application/json
    X-Client-Time-Zone: America/New_York
    
    {
      "amount": "50.00",
      "currency_code": "USD",
      "funding_source_uuid": "source_example_1"
    }
    {
      "wallet_funding_source": {
        "uuid": "source_example_1",
        "primaryType": "bank_account",
        "createdAt": "2026-09-02T10:14:00Z",
        "updatedAt": "2026-10-21T09:00:00Z",
        "discardedAt": null,
        "data": {
          "currencyCode": "USD",
          "availableBalance": "213.20",
          "pendingBalance": "0.00"
        }
      }
    }

Data categories

  • shared expenses
  • expense shares
  • groups and members
  • friends
  • settle-up debts
  • comments
  • notifications
  • currencies
  • payment requests
  • imported bank transactions
  • wallet statements
  • wallet funding sources

Where teams use this data

  • Household ledger consolidation

    A finance app pulls every expense with cost, currency_code, group_id and each member's paid_share and owed_share, then mirrors the household ledger into its own accounting model so rent, utilities and groceries reconcile without manual entry.

  • Settlement planning

    A group-travel or club tool reads members, original_debts, simplified_debts and repayments to compute the smallest set of transfers that clears every balance, then tracks which suggestions were actually paid.

  • Card-feed reconciliation

    An expense-automation service matches imported_transactions by transactionId and rawName against a corporate card feed, waits for status to reach posted, then splits each row into the right group through the extracted expense endpoint.

  • P2P request monitoring

    A treasury dashboard watches payment requests by requestedAmount, expiresAt, status and warning to see which peer transfers are open, which lapsed unpaid, and whether new requests can be issued for a given account.

Frequently asked questions

How do expense shares relate to group settlement balances?

An expense records cost, currency_code and split_method, with user_id, paid_share and owed_share for each participant. group_id connects it to the shared ledger, category_id classifies the bill, and conflictDetected flags conflicting edits. Group records contain members, original_debts, simplified_debts and repayments. The debt entries identify from, to, amount and currency_code, so a planner can distinguish original obligations from suggested settlement transfers and recorded repayments.

What supports bank or card transaction reconciliation?

Imported transactions contain transactionId, amount, currencyCode, name and rawName, plus a status such as pending, possible_hold or posted. relatedResource and unsplittableAlert support matching and exception handling, while expense-allocation results report processed and failed counts.

Which fields track payment requests and wallet balance history?

Request records expose requestedAmount, currencyCode, requestedPaymentMethod, relationshipType, status, createdAt and expiresAt. A warning field carries delivery or account notices that may affect a request. Monthly statements provide month, opening_balance, closing_balance and currency_code. Funding-source records separately expose primaryType, availableBalance, pendingBalance and discardedAt to distinguish the funding rail, clearing status and revoked sources.

Are these endpoint paths official service addresses?

No. The paths and request and response payloads on this page are illustrative integration examples, not official Splitwise service addresses. The examples retain session-cookie authentication and use placeholder credentials; they do not grant access to an account or permission to initiate payments.

Apps similar to Splitwise

  • tricount — tricount is a free Android and iPhone app from Tricount SA that records shared trip, dinner and household bills, supports custom splits and multiple currencies, and can import existing Splitwise groups.
  • Settle Up — Settle Up, from Step Up Labs, is a web, Android and iPhone app that tracks a group's shared expenses, syncs them across members, and calculates the fewest transfers needed to settle up.
  • Splid — Splid is an iOS and Android shared-expense app for holidays, housemates or couples that records group bills online or offline without a sign-up and converts amounts across more than 150 currencies.
  • Kittysplit — Kittysplit is a browser, iPhone and Android tool for splitting group costs by sharing a Kitty link, with optional sign-up, no daily expense cap on the free tier, and a Splitwise CSV import.
  • Venmo — Venmo is PayPal’s U.S. payments app for sending and receiving money between friends, and its product pages list splitting group expenses alongside those transfers.
  • Spliit — Spliit is a free open-source web and iPhone app for tracking shared expenses in a group without creating an account, with splits by percentage, shares or amount and optimized reimbursements.
  • Splitser — Splitser is a group-expense app for friends, families, roommates and travellers that records costs in 150-plus currencies and calculates a settlement that minimizes mutual payments.

Topics

  • Splitwise data API
  • shared expense data
  • paid_share owed_share
  • group debt graph
  • expense split methods
  • payment request status
  • imported card transactions
  • monthly wallet statements
  • household expense reconciliation

Need this app's data API integrated?

We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.

  • NDA + SOW on every engagement
  • Delivery in 3–7 days
  • Payment only after acceptance
  • Work scoped to authorized use

Get a quote