{
  "id": "paypal",
  "name": "PayPal",
  "service": "paypal",
  "country": "global",
  "trust": "community",
  "version": "2026-08-13",
  "minVersion": "0.7.0.10",
  "domain": "paypal.com",
  "match": [
    "https://www.paypal.com/*"
  ],
  "openUrl": "https://www.paypal.com/myaccount/activities/",
  "categories": [
    "banking"
  ],
  "schema": "transaction@1",
  "auth": {
    "mode": "cookie",
    "replayHeaders": [
      "x-csrf-token",
      "x-requested-with"
    ],
    "capturePaths": [
      "/myaccount/activities"
    ]
  },
  "api": {
    "host": "https://www.paypal.com",
    "list": {
      "path": "/myaccount/activities/loadmore",
      "paging": "cursor",
      "cursorParam": "nextPageToken",
      "nextPath": "data.data.activity.nextPageToken",
      "itemsPath": "data.data.activity.transactions",
      "params": {
        "transactionType": "ALL",
        "selectedCurrency": "ALL",
        "start_date": "2005-01-01",
        "end_date": "2035-12-31",
        "free_text_search": "",
        "type": "",
        "status": "",
        "currency": "",
        "filter_id": "",
        "issuance_product_name": "",
        "asset_names": "",
        "asset_symbols": "",
        "isClearFreeTextSearch": "false",
        "isClearFilterSelection": "false",
        "isClientSideFiltering": "false"
      },
      "headers": {
        "x-requested-with": "XMLHttpRequest"
      }
    },
    "detail": {
      "path": "/myaccount/activities/details/inline/{internalId}",
      "method": "GET",
      "headers": {
        "x-requested-with": "XMLHttpRequest"
      },
      "json": true,
      "root": "data",
      "fields": {
        "status": "displayStatus",
        "invoiceId": "invoiceId",
        "isCredit": "isCredit",
        "gross": "amount.rawAmounts.gross.value",
        "currency": "amount.rawAmounts.gross.currencyCode",
        "net": "amount.netAmount",
        "fee": "amount.feeAmount",
        "counterparty": "counterparty.name",
        "counterpartyEmail": "counterparty.email",
        "isBusiness": "counterparty.isBusiness"
      },
      "items": {
        "path": "itemDetails.itemList",
        "fields": {
          "name": "name",
          "price": "price",
          "total": "itemTotalPrice"
        }
      }
    }
  },
  "fields": {
    "internalId": "id",
    "date": "date.rawDate.date",
    "amount": "amountInfo.contents.amountText",
    "currency": "amounts.currencyCode",
    "counterparty": "counterpartyInfo.counterpartyName",
    "description": "descriptionInfo.content.transactionDescriptionText",
    "type": "primitiveTxnType"
  },
  "notes": "Personal PayPal activity (payments sent/received). Built from a real in-session capture (2026-07-23), replacing the earlier unverified woob-derived draft. LIST: GET /myaccount/activities/loadmore returns data.data.activity.transactions[] and a data.data.activity.nextPageToken cursor (absent on the last page); a wide start_date/end_date window pulls the whole history. AUTH: cookie session + a captured x-csrf-token header (rotates; captured from /myaccount/activities requests) + x-requested-with. AMOUNT: the list gives a locale-formatted amountText ('-9,00 €') which money() parses (comma decimal + sign preserved) and amounts.currencyCode for the currency; DATE: date.rawDate.date is ISO-8601. Field mapping VERIFIED offline against 79 real captured transactions (id/date/amount/currency/counterparty). BETA: the pagination ENTRY (first loadmore call carries no nextPageToken → expected to return page 1) is not yet confirmed live for a multi-page account; a per-transaction DETAIL endpoint (GET /myaccount/activities/details/inline/{id} → data.amount.rawAmounts.gross.value, counterparty, itemDetails.itemList[]) and downloadable statements/reports (async /reports/apis/common/ql) are captured and can be added as enrichment/streams later.",
  "content": {
    "en": {
      "slug": "paypal-transactions",
      "docs": "transactions",
      "h1": "How to download your PayPal transaction history",
      "intro": "PayPal does let you download activity reports, but they arrive separately from everything else you are trying to keep, and pulling them regularly is a manual chore you have to remember.",
      "note": "Habeas is not here because PayPal hides your history — it does not. It is here so that history lands in the same archive as your other services, automatically, without a monthly detour through the export screen."
    },
    "es": {
      "slug": "movimientos-paypal",
      "docs": "movimientos",
      "h1": "Cómo descargar tus movimientos de PayPal",
      "intro": "PayPal sí te deja descargar informes de actividad, pero llegan aparte de todo lo demás que intentas conservar, y hacerlo con regularidad es una tarea manual que tienes que acordarte de repetir.",
      "note": "Habeas no está aquí porque PayPal esconda tu historial —no lo hace—. Está para que ese historial acabe en el mismo archivo que el resto de tus servicios, automáticamente y sin pasar cada mes por la pantalla de exportación."
    }
  },
  "brand": "PayPal",
  "changelog": [
    {
      "version": "2026-08-13",
      "changes": "Declara country: global. PayPal funciona en cualquier país, pero al no declararlo quedaba sin clasificar justo cuando la extensión y la web han empezado a ordenar las fuentes por relevancia geográfica."
    },
    {
      "version": "2026-08-08",
      "changes": "Adds `content` (bilingual copy for the guide page on habeas.dev) and `brand`."
    }
  ]
}
