├── LICENSE ├── README.md ├── assets └── up-api.jpg ├── community └── EXAMPLES.md └── v1 └── openapi.json /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Up 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ⚡️ Up API 2 | 3 | Let’s **hack** on _banking_ together! 4 | 5 | Calling all makers, creators, hackers, and hobbyists. 6 | Welcome to the first stage of [Up’s](https://up.com.au) API: a beta release 7 | that gives you programmatic access to your balances and transaction data. You 8 | can request past transactions or set up webhooks to receive real time events 9 | when new transactions hit your account. It’s new, exciting and just the 10 | beginning. 11 | 12 |
13 | Up API 14 |
15 | 16 | ## Links 17 | 18 | * 🕶 [The Up Website](https://up.com.au) 19 | * 📖 [API Documentation](https://developer.up.com.au) 20 | * 🕵️ [API Issues and Support](https://github.com/up-banking/api/issues) 21 | * 🚀 [API Changelog](https://github.com/up-banking/api/issues/31) 22 | 23 | Please ensure you keep any personal information out of issues submitted on this 24 | repository. 25 | 26 | ## Getting Started 27 | 28 | The Up API is currently in beta 🔧. Many features you would expect are notably 29 | absent but will be added over time. In this early phase access is limited to 30 | personal use only. 31 | 32 | If you don’t already have an Up bank account, you can head over to 33 | https://up.com.au to download the app and create a free account. 34 | [Terms and conditions](https://up.com.au/terms) apply. 35 | 36 | Once you have an Up account, you can get your Personal Access Token at 37 | https://api.up.com.au. 38 | 39 | Head on over and read the API documentation at https://developer.up.com.au once 40 | you have your access token ❤️. 41 | 42 | ## The OpenAPI Specification 43 | 44 | This repository contains the 45 | [OpenAPI Specification](https://swagger.io/specification/) for the Up API. 46 | Issues and feature requests relating to the Up API should be filed against this 47 | repository. 48 | 49 | While the OpenAPI document is itself a valid OpenAPI schema, it includes some 50 | additional vendor-specific extensions to support automatic generation of 51 | documentation that would otherwise be difficult or impossible to achieve with 52 | OpenAPI alone. These vendor-specific extensions are prefixed with `x-up:`. 53 | Tools designed to support OpenAPI specification files should ignore these 54 | fields. Currently we only include `x-up:example` but we anticipate adding new 55 | `x-up:` prefixed fields over time as our documentation capability evolves. 56 | 57 | ## Community Examples 58 | 59 | You can find community provided example projects in 60 | [community/EXAMPLES.md](community/EXAMPLES.md). 61 | -------------------------------------------------------------------------------- /assets/up-api.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/up-banking/api/7074155a06da138f120710f41f7ac35eb514ae0a/assets/up-api.jpg -------------------------------------------------------------------------------- /community/EXAMPLES.md: -------------------------------------------------------------------------------- 1 | # Community Examples Using the Up API 2 | 3 | This document contains a listing of projects that have been submitted by 4 | the community of developers using the Up API. 5 | 6 | > 🚨 Up is not affiliated with, nor makes any warranty as to the security of 7 | > any of these applications. You should vet the code yourself before using 8 | > these applications. If you are unable to vet the code, you should not use the 9 | > application 🚨 10 | 11 | If you have a project that you would like listed here, fork this repository and 12 | [create a pull request](https://github.com/up-banking/api/pulls) with your 13 | additions to this document. 14 | 15 | ## Account balance in Google Sheets 16 | 17 | **Author:** [@ilievskizoran](https://github.com/ilievskizoran) \ 18 | **Repository:** https://github.com/ilievskizoran/up-banking-apps-script \ 19 | **Created:** 01/06/2020 \ 20 | **Languages:** JavaScript 21 | 22 | Create an apps script function which queries the API and sets the value of a 23 | cell with a balance of a specified account. 24 | 25 | ## Up Banking Home Assistant 26 | 27 | **Author:** [@jupys](https://github.com/jupys) \ 28 | **Repository:** https://github.com/jupys/up_banking_homeassistant \ 29 | **Created:** 01/08/2020 \ 30 | **Languages:** YAML, HomeAssistant (?) 31 | 32 | Sensors for Home Assistant integration of Up Banking's API 33 | 34 | ## Beancount Importer 35 | 36 | **Author:** [@johnmee](https://github.com/johnmee) \ 37 | **Repository:** https://github.com/johnmee/aussie-bean-tools \ 38 | **Created:** 01/01/2024 \ 39 | **Languages:** Python 40 | 41 | CLI tool for downloading and importing transactions to [beancount](https://github.com/beancount/beancount) 42 | 43 | ## Home Assistant Up Bank 44 | 45 | **Author:** [@jay-oswald](https://github.com/jay-oswald) \ 46 | **Repository:** https://github.com/jay-oswald/ha-up-bank \ 47 | **Created:** 06/12/2023 \ 48 | **Languages:** Python 49 | 50 | Entities for each accounts balance, with more features planned 51 | 52 | ## up web 53 | 54 | **Author:** [@salamagd](https://github.com/salamagd) \ 55 | **Repository:** https://github.com/salamagd/up-web \ 56 | **Created:** 28/07/2020 \ 57 | **Languages:** JavaScript, CSS 58 | 59 | A demo app which can be used to view your Up Banking accounts and transactions 60 | in a web browser. 61 | 62 | ## up-bank-api 63 | 64 | **Author:** [@jcwillox](https://github.com/jcwillox) \ 65 | **Repository:** https://github.com/jcwillox/up-bank-api \ 66 | **Created:** 15/08/2020 \ 67 | **Languages:** Python 68 | 69 | 💎 Fully typed Python client for (a)sync interaction with Up's banking API, available on [PyPI](https://pypi.org/project/up-bank-api). 70 | 71 | ## upbankpy 72 | 73 | **Author:** [@alyssadev](https://github.com/alyssadev) \ 74 | **Repository:** https://github.com/alyssadev/upbankpy \ 75 | **Created:** 28/07/2020 \ 76 | **Languages:** Python 77 | 78 | A Python wrapper for the newly released API for up.com.au 79 | 80 | ## Up Banking CLI 81 | 82 | **Author:** [@etopiei](https://github.com/etopiei)\ 83 | **Repository:** https://github.com/etopiei/up-cli \ 84 | **Created:** 29/07/2020\ 85 | **Languages:** Rust 86 | 87 | This is a simple command line program to interact with the Up Banking API. 88 | 89 | ## UP Flow 90 | 91 | **Author:** [@JDsnyke](https://github.com/JDsnyke)\ 92 | **Repository:** https://github.com/JDsnyke/UP-Flow \ 93 | **Created:** 20/07/2020\ 94 | **Languages:** Ruby 95 | 96 | Windows program for checking your recent balance using your banking API. 97 | 98 | ## Up Api web example 99 | 100 | **Author:** [@svnm](https://github.com/svnm)\ 101 | **Repository:** https://github.com/svnm/up-api-web-example \ 102 | **Created:** 20/07/2020\ 103 | **Languages:** TypeScript 104 | 105 | Example web client using Up API. 106 | 107 | ## lookUPtx 108 | 109 | **Author:** [@simbesh](https://gitlab.com/simbesh)\ 110 | **Repository:** https://gitlab.com/simbesh/lookup \ 111 | **Created:** 11/08/2020\ 112 | **Languages:** Javascript & React 113 | 114 | Web client to look up your transactions. 115 | 116 | ## Up Bank API - TypeScript SDK 117 | 118 | **Author:** [@ndench](https://github.com/ndench)\ 119 | **Repository:** https://github.com/ndench/up-bank-api \ 120 | **Created:** 04/09/2020\ 121 | **Languages:** TypeScript 122 | 123 | Example web client using Up API. 124 | 125 | ## Up Bank API - .Net SDK 126 | 127 | **Author:** [@SelectSystemsInternational](https://github.com/SelectSystemsInternational)\ 128 | **Repository:** https://github.com/SelectSystemsInternational/up-bank-api \ 129 | **Created:** 21/09/2020\ 130 | **Languages:** .Netcore 131 | 132 | A .Netcore SDK for the Up Bank Api 133 | 134 | ## fitbit-upbankbalance 135 | 136 | **Author:** [@alyssadev](https://github.com/alyssadev) \ 137 | **Repository:** https://github.com/alyssadev/fitbit-upbankbalance \ 138 | **Created:** 09/11/2020 \ 139 | **Languages:** JS/CSS 140 | 141 | A Fitbit app that displays the sum of balances in a user's transactional and saver accounts 142 | 143 | ## up-to-ynab 144 | 145 | **Author:** [@BrodieSutherland](https://github.com/BrodieSutherland) \ 146 | **Repository:** https://github.com/BrodieSutherland/up-to-ynab \ 147 | **Created:** 24/04/2021 \ 148 | **Languages:** Python, Heroku 149 | 150 | An automatic transaction forwarder to YNAB's budgeting system 151 | 152 | ## Up.NET 153 | 154 | **Author:** [@Hona](https://github.com/Hona) \ 155 | **Repository:** https://github.com/Hona/Up.NET \ 156 | **Created:** 31/08/2021 \ 157 | **Languages:** C#, .NET 158 | 159 | Complete .NET wrapper of the API in .NET 5 160 | 161 | ## UpBlazor 162 | 163 | **Author:** [@Hona](https://github.com/Hona) \ 164 | **Repository:** https://github.com/Hona/UpBlazor \ 165 | **Created:** 14/09/2021 \ 166 | **Languages:** C# 167 | 168 | A full website designed to assist you with budgetting and insights - integrating with your Up account! 169 | 170 | ## upbank2firefly 171 | 172 | **Author:** [@richwalm](https://github.com/richwalm) \ 173 | **Repository:** https://github.com/richwalm/upbank2firefly \ 174 | **Created:** 03/10/2021 \ 175 | **Languages:** Python 176 | 177 | Webhook handler to automatically add Up transactions to [Firefly III](https://github.com/firefly-iii/firefly-iii), a personal finances manager. 178 | 179 | ## Up macOS Application (Provenance) 180 | 181 | **Author:** [@themuzzleflare](https://github.com/themuzzleflare) \ 182 | **Repository:** https://github.com/themuzzleflare/ProvenanceMacOS \ 183 | **Created:** 05/10/2021 \ 184 | **Languages:** Swift 185 | 186 | A native macOS application that displays your bank accounts, transactions, categories and tags. You can list and filter transactions by account, tag and category, add/remove tags from transactions. Includes widgets and shortcuts app integration on macOS Monterey. Requires macOS 11.0+. 187 | 188 | ## Up Power BI Connector 189 | 190 | **Author:** [@nicholas-russell](https://github.com/nicholas-russell) \ 191 | **Repository:** https://github.com/nicholas-russell/upbank-powerbi \ 192 | **Created:** 05/04/2022 \ 193 | **Languages:** Power Query M 194 | 195 | A custom Power BI connector to help you visualise your Up account, your way. 196 | 197 | ## Up Grafana Datasource Plugin 198 | 199 | **Author:** [@ScriptSmith](https://github.com/scriptsmith) \ 200 | **Repository:** https://github.com/ScriptSmith/up-datasource \ 201 | **Created:** 25/10/2022 \ 202 | **Languages:** Typescript 203 | 204 | A Grafana plugin to visualise transactions & accounts 205 | -------------------------------------------------------------------------------- /v1/openapi.json: -------------------------------------------------------------------------------- 1 | { 2 | "openapi": "3.0.3", 3 | "info": { 4 | "title": "Up API", 5 | "version": "v1", 6 | "description": "The Up API gives you programmatic access to your balances and\ntransaction data. You can request past transactions or set up\nwebhooks to receive real-time events when new transactions hit your\naccount. It’s new, it’s exciting and it’s just the beginning.\n", 7 | "contact": { 8 | "name": "API Specification and Support", 9 | "url": "https://github.com/up-banking/api" 10 | } 11 | }, 12 | "servers": [ 13 | { 14 | "url": "https://api.up.com.au/api/v1" 15 | } 16 | ], 17 | "components": { 18 | "securitySchemes": { 19 | "bearer_auth": { 20 | "type": "http", 21 | "scheme": "bearer" 22 | } 23 | }, 24 | "schemas": { 25 | "AccountTypeEnum": { 26 | "enum": ["SAVER", "TRANSACTIONAL", "HOME_LOAN"], 27 | "description": "Specifies the type of bank account. Currently returned values are\n`SAVER`, `TRANSACTIONAL` and `HOME_LOAN`.\n" 28 | }, 29 | "OwnershipTypeEnum": { 30 | "enum": ["INDIVIDUAL", "JOINT"], 31 | "description": "Specifies the structure under which a bank account is owned. Currently\nreturned values are `INDIVIDUAL` and `JOINT`.\n" 32 | }, 33 | "MoneyObject": { 34 | "type": "object", 35 | "description": "Provides information about a value of money.\n", 36 | "properties": { 37 | "currencyCode": { 38 | "type": "string", 39 | "description": "The ISO 4217 currency code.\n" 40 | }, 41 | "value": { 42 | "type": "string", 43 | "description": "The amount of money, formatted as a string in the relevant currency.\nFor example, for an Australian dollar value of $10.56, this field will\nbe `\"10.56\"`. The currency symbol is not included in the string.\n" 44 | }, 45 | "valueInBaseUnits": { 46 | "type": "integer", 47 | "description": "The amount of money in the smallest denomination for the currency, as a\n64-bit integer. For example, for an Australian dollar value of $10.56,\nthis field will be `1056`.\n" 48 | } 49 | }, 50 | "required": ["currencyCode", "value", "valueInBaseUnits"] 51 | }, 52 | "AccountResource": { 53 | "type": "object", 54 | "description": "Provides information about an Up bank account.\n", 55 | "properties": { 56 | "type": { 57 | "type": "string", 58 | "description": "The type of this resource: `accounts`" 59 | }, 60 | "id": { 61 | "type": "string", 62 | "description": "The unique identifier for this account.\n" 63 | }, 64 | "attributes": { 65 | "type": "object", 66 | "properties": { 67 | "displayName": { 68 | "type": "string", 69 | "description": "The name associated with the account in the Up application.\n" 70 | }, 71 | "accountType": { 72 | "description": "The bank account type of this account.\n", 73 | "allOf": [ 74 | { 75 | "$ref": "#/components/schemas/AccountTypeEnum" 76 | } 77 | ] 78 | }, 79 | "ownershipType": { 80 | "description": "The ownership structure for this account.\n", 81 | "allOf": [ 82 | { 83 | "$ref": "#/components/schemas/OwnershipTypeEnum" 84 | } 85 | ] 86 | }, 87 | "balance": { 88 | "description": "The available balance of the account, taking into account any amounts\nthat are currently on hold.\n", 89 | "allOf": [ 90 | { 91 | "$ref": "#/components/schemas/MoneyObject" 92 | } 93 | ] 94 | }, 95 | "createdAt": { 96 | "type": "string", 97 | "format": "date-time", 98 | "description": "The date-time at which this account was first opened.\n" 99 | } 100 | }, 101 | "required": [ 102 | "displayName", 103 | "accountType", 104 | "ownershipType", 105 | "balance", 106 | "createdAt" 107 | ] 108 | }, 109 | "relationships": { 110 | "type": "object", 111 | "properties": { 112 | "transactions": { 113 | "type": "object", 114 | "properties": { 115 | "links": { 116 | "type": "object", 117 | "properties": { 118 | "related": { 119 | "type": "string", 120 | "description": "The link to retrieve the related resource(s) in this relationship.\n" 121 | } 122 | }, 123 | "required": ["related"] 124 | } 125 | } 126 | } 127 | }, 128 | "required": ["transactions"] 129 | }, 130 | "links": { 131 | "type": "object", 132 | "properties": { 133 | "self": { 134 | "type": "string", 135 | "description": "The canonical link to this resource within the API.\n" 136 | } 137 | }, 138 | "required": ["self"] 139 | } 140 | }, 141 | "required": ["type", "id", "attributes", "relationships"] 142 | }, 143 | "ListAccountsResponse": { 144 | "type": "object", 145 | "description": "Successful response to get all accounts. This returns a paginated list of\naccounts, which can be scrolled by following the `prev` and `next` links\nif present.\n", 146 | "properties": { 147 | "data": { 148 | "type": "array", 149 | "items": { 150 | "$ref": "#/components/schemas/AccountResource" 151 | }, 152 | "description": "The list of accounts returned in this response.\n" 153 | }, 154 | "links": { 155 | "type": "object", 156 | "properties": { 157 | "prev": { 158 | "type": "string", 159 | "nullable": true, 160 | "description": "The link to the previous page in the results. If this value is `null`\nthere is no previous page.\n" 161 | }, 162 | "next": { 163 | "type": "string", 164 | "nullable": true, 165 | "description": "The link to the next page in the results. If this value is `null`\nthere is no next page.\n" 166 | } 167 | }, 168 | "required": ["prev", "next"] 169 | } 170 | }, 171 | "required": ["data", "links"] 172 | }, 173 | "GetAccountResponse": { 174 | "type": "object", 175 | "description": "Successful response to get a single account.\n", 176 | "properties": { 177 | "data": { 178 | "description": "The account returned in this response.\n", 179 | "allOf": [ 180 | { 181 | "$ref": "#/components/schemas/AccountResource" 182 | } 183 | ] 184 | } 185 | }, 186 | "required": ["data"] 187 | }, 188 | "AttachmentResource": { 189 | "type": "object", 190 | "properties": { 191 | "type": { 192 | "type": "string", 193 | "description": "The type of this resource: `attachments`" 194 | }, 195 | "id": { 196 | "type": "string", 197 | "description": "The unique identifier for this attachment.\n" 198 | }, 199 | "attributes": { 200 | "type": "object", 201 | "properties": { 202 | "createdAt": { 203 | "type": "string", 204 | "format": "date-time", 205 | "nullable": true, 206 | "description": "The date-time when the file was created.\n" 207 | }, 208 | "fileURL": { 209 | "type": "string", 210 | "nullable": true, 211 | "description": "A temporary link to download the file.\n" 212 | }, 213 | "fileURLExpiresAt": { 214 | "type": "string", 215 | "format": "date-time", 216 | "description": "The date-time at which the `fileURL` link expires.\n" 217 | }, 218 | "fileExtension": { 219 | "type": "string", 220 | "nullable": true, 221 | "description": "File extension for the uploaded attachment.\n" 222 | }, 223 | "fileContentType": { 224 | "type": "string", 225 | "nullable": true, 226 | "description": "Content type for the uploaded attachment.\n" 227 | } 228 | }, 229 | "required": [ 230 | "createdAt", 231 | "fileURL", 232 | "fileURLExpiresAt", 233 | "fileExtension", 234 | "fileContentType" 235 | ] 236 | }, 237 | "relationships": { 238 | "type": "object", 239 | "properties": { 240 | "transaction": { 241 | "type": "object", 242 | "properties": { 243 | "data": { 244 | "type": "object", 245 | "properties": { 246 | "type": { 247 | "type": "string", 248 | "description": "The type of this resource: `transactions`" 249 | }, 250 | "id": { 251 | "type": "string", 252 | "description": "The unique identifier of the resource within its type.\n" 253 | } 254 | }, 255 | "required": ["type", "id"] 256 | }, 257 | "links": { 258 | "type": "object", 259 | "properties": { 260 | "related": { 261 | "type": "string", 262 | "description": "The link to retrieve the related resource(s) in this relationship.\n" 263 | } 264 | }, 265 | "required": ["related"] 266 | } 267 | }, 268 | "required": ["data"] 269 | } 270 | }, 271 | "required": ["transaction"] 272 | }, 273 | "links": { 274 | "type": "object", 275 | "properties": { 276 | "self": { 277 | "type": "string", 278 | "description": "The canonical link to this resource within the API.\n" 279 | } 280 | }, 281 | "required": ["self"] 282 | } 283 | }, 284 | "required": ["type", "id", "attributes", "relationships"] 285 | }, 286 | "ListAttachmentsResponse": { 287 | "type": "object", 288 | "description": "Successful response to get all attachments. This returns a paginated list of\nattachments, which can be scrolled by following the `prev` and `next` links if\npresent.\n", 289 | "properties": { 290 | "data": { 291 | "type": "array", 292 | "items": { 293 | "$ref": "#/components/schemas/AttachmentResource" 294 | }, 295 | "description": "The list of attachments returned in this response.\n" 296 | }, 297 | "links": { 298 | "type": "object", 299 | "properties": { 300 | "prev": { 301 | "type": "string", 302 | "nullable": true, 303 | "description": "The link to the previous page in the results. If this value is `null`\nthere is no previous page.\n" 304 | }, 305 | "next": { 306 | "type": "string", 307 | "nullable": true, 308 | "description": "The link to the next page in the results. If this value is `null`\nthere is no next page.\n" 309 | } 310 | }, 311 | "required": ["prev", "next"] 312 | } 313 | }, 314 | "required": ["data", "links"] 315 | }, 316 | "GetAttachmentResponse": { 317 | "type": "object", 318 | "description": "Successful response to get a single attachment.\n", 319 | "properties": { 320 | "data": { 321 | "description": "The attachment returned in this response.\n", 322 | "allOf": [ 323 | { 324 | "$ref": "#/components/schemas/AttachmentResource" 325 | } 326 | ] 327 | } 328 | }, 329 | "required": ["data"] 330 | }, 331 | "CategoryResource": { 332 | "type": "object", 333 | "description": "Provides information about a category and its ancestry.\n", 334 | "properties": { 335 | "type": { 336 | "type": "string", 337 | "description": "The type of this resource: `categories`" 338 | }, 339 | "id": { 340 | "type": "string", 341 | "description": "The unique identifier for this category. This is a human-readable but\nURL-safe value.\n" 342 | }, 343 | "attributes": { 344 | "type": "object", 345 | "properties": { 346 | "name": { 347 | "type": "string", 348 | "description": "The name of this category as seen in the Up application.\n" 349 | } 350 | }, 351 | "required": ["name"] 352 | }, 353 | "relationships": { 354 | "type": "object", 355 | "properties": { 356 | "parent": { 357 | "type": "object", 358 | "properties": { 359 | "data": { 360 | "type": "object", 361 | "properties": { 362 | "type": { 363 | "type": "string", 364 | "description": "The type of this resource: `categories`" 365 | }, 366 | "id": { 367 | "type": "string", 368 | "description": "The unique identifier of the resource within its type.\n" 369 | } 370 | }, 371 | "required": ["type", "id"], 372 | "nullable": true 373 | }, 374 | "links": { 375 | "type": "object", 376 | "properties": { 377 | "related": { 378 | "type": "string", 379 | "description": "The link to retrieve the related resource(s) in this relationship.\n" 380 | } 381 | }, 382 | "required": ["related"] 383 | } 384 | }, 385 | "required": ["data"] 386 | }, 387 | "children": { 388 | "type": "object", 389 | "properties": { 390 | "data": { 391 | "type": "array", 392 | "items": { 393 | "type": "object", 394 | "properties": { 395 | "type": { 396 | "type": "string", 397 | "description": "The type of this resource: `categories`" 398 | }, 399 | "id": { 400 | "type": "string", 401 | "description": "The unique identifier of the resource within its type.\n" 402 | } 403 | }, 404 | "required": ["type", "id"] 405 | } 406 | }, 407 | "links": { 408 | "type": "object", 409 | "properties": { 410 | "related": { 411 | "type": "string", 412 | "description": "The link to retrieve the related resource(s) in this relationship.\n" 413 | } 414 | }, 415 | "required": ["related"] 416 | } 417 | }, 418 | "required": ["data"] 419 | } 420 | }, 421 | "required": ["parent", "children"] 422 | }, 423 | "links": { 424 | "type": "object", 425 | "properties": { 426 | "self": { 427 | "type": "string", 428 | "description": "The canonical link to this resource within the API.\n" 429 | } 430 | }, 431 | "required": ["self"] 432 | } 433 | }, 434 | "required": ["type", "id", "attributes", "relationships"] 435 | }, 436 | "ListCategoriesResponse": { 437 | "type": "object", 438 | "description": "Successful response to get all categories and their ancestry. The\nreturned list is not paginated.\n", 439 | "properties": { 440 | "data": { 441 | "type": "array", 442 | "items": { 443 | "$ref": "#/components/schemas/CategoryResource" 444 | }, 445 | "description": "The list of categories returned in this response.\n" 446 | } 447 | }, 448 | "required": ["data"] 449 | }, 450 | "GetCategoryResponse": { 451 | "type": "object", 452 | "description": "Successful response to get a single category and its ancestry.\n", 453 | "properties": { 454 | "data": { 455 | "description": "The category returned in this response.\n", 456 | "allOf": [ 457 | { 458 | "$ref": "#/components/schemas/CategoryResource" 459 | } 460 | ] 461 | } 462 | }, 463 | "required": ["data"] 464 | }, 465 | "CategoryInputResourceIdentifier": { 466 | "type": "object", 467 | "description": "Uniquely identifies a category in the API.\n", 468 | "properties": { 469 | "type": { 470 | "type": "string", 471 | "description": "The type of this resource: `categories`" 472 | }, 473 | "id": { 474 | "type": "string", 475 | "description": "The unique identifier of the category, as returned by the `/categories`\nendpoint.\n" 476 | } 477 | }, 478 | "required": ["type", "id"] 479 | }, 480 | "UpdateTransactionCategoryRequest": { 481 | "type": "object", 482 | "description": "Request to update the category associated with a transaction.\n", 483 | "properties": { 484 | "data": { 485 | "nullable": true, 486 | "description": "The category to set on the transaction. Set this entire key to `null`\nde-categorize a transaction.\n", 487 | "allOf": [ 488 | { 489 | "$ref": "#/components/schemas/CategoryInputResourceIdentifier" 490 | } 491 | ] 492 | } 493 | }, 494 | "required": ["data"] 495 | }, 496 | "PingResponse": { 497 | "type": "object", 498 | "description": "Basic ping response to verify authentication.\n", 499 | "properties": { 500 | "meta": { 501 | "type": "object", 502 | "properties": { 503 | "id": { 504 | "type": "string", 505 | "description": "The unique identifier of the authenticated customer.\n" 506 | }, 507 | "statusEmoji": { 508 | "type": "string", 509 | "description": "A cute emoji that represents the response status.\n" 510 | } 511 | }, 512 | "required": ["id", "statusEmoji"] 513 | } 514 | }, 515 | "required": ["meta"] 516 | }, 517 | "ErrorObject": { 518 | "type": "object", 519 | "description": "Provides information about an error processing a request.\n", 520 | "properties": { 521 | "status": { 522 | "type": "string", 523 | "description": "The HTTP status code associated with this error. This can also be\nobtained from the response headers. The status indicates the broad type\nof error according to HTTP semantics.\n" 524 | }, 525 | "title": { 526 | "type": "string", 527 | "description": "A short description of this error. This should be stable across\nmultiple occurrences of this type of error and typically expands on the\nreason for the status code.\n" 528 | }, 529 | "detail": { 530 | "type": "string", 531 | "description": "A detailed description of this error. This should be considered unique\nto individual occurrences of an error and subject to change. It is\nuseful for debugging purposes.\n" 532 | }, 533 | "source": { 534 | "type": "object", 535 | "properties": { 536 | "parameter": { 537 | "type": "string", 538 | "description": "If this error relates to a query parameter, the name of the\nparameter.\n" 539 | }, 540 | "pointer": { 541 | "type": "string", 542 | "description": "If this error relates to an attribute in the request body, a\nrfc-6901 JSON pointer to the attribute.\n" 543 | } 544 | }, 545 | "description": "If applicable, location in the request that this error relates to. This\nmay be a parameter in the query string, or a an attribute in the\nrequest body.\n" 546 | } 547 | }, 548 | "required": ["status", "title", "detail"] 549 | }, 550 | "ErrorResponse": { 551 | "type": "object", 552 | "description": "Generic error response that returns one or more errors.\n", 553 | "properties": { 554 | "errors": { 555 | "type": "array", 556 | "items": { 557 | "$ref": "#/components/schemas/ErrorObject" 558 | }, 559 | "description": "The list of errors returned in this response.\n" 560 | } 561 | }, 562 | "required": ["errors"] 563 | }, 564 | "TagResource": { 565 | "type": "object", 566 | "description": "Provides information about a tag.\n", 567 | "properties": { 568 | "type": { 569 | "type": "string", 570 | "description": "The type of this resource: `tags`" 571 | }, 572 | "id": { 573 | "type": "string", 574 | "description": "The label of the tag, which also acts as the tag’s unique identifier.\n" 575 | }, 576 | "relationships": { 577 | "type": "object", 578 | "properties": { 579 | "transactions": { 580 | "type": "object", 581 | "properties": { 582 | "links": { 583 | "type": "object", 584 | "properties": { 585 | "related": { 586 | "type": "string", 587 | "description": "The link to retrieve the related resource(s) in this relationship.\n" 588 | } 589 | }, 590 | "required": ["related"] 591 | } 592 | } 593 | } 594 | }, 595 | "required": ["transactions"] 596 | } 597 | }, 598 | "required": ["type", "id", "relationships"] 599 | }, 600 | "ListTagsResponse": { 601 | "type": "object", 602 | "description": "Successful response to get all tags. This returns a paginated list of\ntags, which can be scrolled by following the `prev` and `next` links if\npresent.\n", 603 | "properties": { 604 | "data": { 605 | "type": "array", 606 | "items": { 607 | "$ref": "#/components/schemas/TagResource" 608 | }, 609 | "description": "The list of tags returned in this response.\n" 610 | }, 611 | "links": { 612 | "type": "object", 613 | "properties": { 614 | "prev": { 615 | "type": "string", 616 | "nullable": true, 617 | "description": "The link to the previous page in the results. If this value is `null`\nthere is no previous page.\n" 618 | }, 619 | "next": { 620 | "type": "string", 621 | "nullable": true, 622 | "description": "The link to the next page in the results. If this value is `null`\nthere is no next page.\n" 623 | } 624 | }, 625 | "required": ["prev", "next"] 626 | } 627 | }, 628 | "required": ["data", "links"] 629 | }, 630 | "TagInputResourceIdentifier": { 631 | "type": "object", 632 | "description": "Uniquely identifies a single tag in the API.\n", 633 | "properties": { 634 | "type": { 635 | "type": "string", 636 | "description": "The type of this resource: `tags`" 637 | }, 638 | "id": { 639 | "type": "string", 640 | "description": "The label of the tag, which also acts as the tag’s unique identifier.\n" 641 | } 642 | }, 643 | "required": ["type", "id"] 644 | }, 645 | "UpdateTransactionTagsRequest": { 646 | "type": "object", 647 | "description": "Request to add or remove tags associated with a transaction.\n", 648 | "properties": { 649 | "data": { 650 | "type": "array", 651 | "items": { 652 | "$ref": "#/components/schemas/TagInputResourceIdentifier" 653 | }, 654 | "description": "The tags to add to or remove from the transaction.\n" 655 | } 656 | }, 657 | "required": ["data"] 658 | }, 659 | "TransactionStatusEnum": { 660 | "enum": ["HELD", "SETTLED"], 661 | "description": "Specifies which stage of processing a transaction is currently at.\nCurrently returned values are `HELD` and `SETTLED`. When a transaction is\nheld, its account’s `availableBalance` is affected. When a transaction is\nsettled, its account’s `currentBalance` is affected.\n" 662 | }, 663 | "HoldInfoObject": { 664 | "type": "object", 665 | "description": "Provides information about the amount at which a transaction was in the\n`HELD` status.\n", 666 | "properties": { 667 | "amount": { 668 | "description": "The amount of this transaction while in the `HELD` status, in\nAustralian dollars.\n", 669 | "allOf": [ 670 | { 671 | "$ref": "#/components/schemas/MoneyObject" 672 | } 673 | ] 674 | }, 675 | "foreignAmount": { 676 | "nullable": true, 677 | "description": "The foreign currency amount of this transaction while in the `HELD`\nstatus. This field will be `null` for domestic transactions. The amount\nwas converted to the AUD amount reflected in the `amount` field.\n", 678 | "allOf": [ 679 | { 680 | "$ref": "#/components/schemas/MoneyObject" 681 | } 682 | ] 683 | } 684 | }, 685 | "required": ["amount", "foreignAmount"] 686 | }, 687 | "RoundUpObject": { 688 | "type": "object", 689 | "description": "Provides information about how a Round Up was applied, such as whether or\nnot a boost was included in the Round Up.\n", 690 | "properties": { 691 | "amount": { 692 | "description": "The total amount of this Round Up, including any boosts, represented as\na negative value.\n", 693 | "allOf": [ 694 | { 695 | "$ref": "#/components/schemas/MoneyObject" 696 | } 697 | ] 698 | }, 699 | "boostPortion": { 700 | "nullable": true, 701 | "description": "The portion of the Round Up `amount` owing to boosted Round Ups,\nrepresented as a negative value. If no boost was added to the Round Up\nthis field will be `null`.\n", 702 | "allOf": [ 703 | { 704 | "$ref": "#/components/schemas/MoneyObject" 705 | } 706 | ] 707 | } 708 | }, 709 | "required": ["amount", "boostPortion"] 710 | }, 711 | "CashbackObject": { 712 | "type": "object", 713 | "description": "Provides information about an instant reimbursement in the form of\ncashback.\n", 714 | "properties": { 715 | "description": { 716 | "type": "string", 717 | "description": "A brief description of why this cashback was paid.\n" 718 | }, 719 | "amount": { 720 | "description": "The total amount of cashback paid, represented as a positive value.\n", 721 | "allOf": [ 722 | { 723 | "$ref": "#/components/schemas/MoneyObject" 724 | } 725 | ] 726 | } 727 | }, 728 | "required": ["description", "amount"] 729 | }, 730 | "CardPurchaseMethodEnum": { 731 | "enum": [ 732 | "BAR_CODE", 733 | "OCR", 734 | "CARD_PIN", 735 | "CARD_DETAILS", 736 | "CARD_ON_FILE", 737 | "ECOMMERCE", 738 | "MAGNETIC_STRIPE", 739 | "CONTACTLESS" 740 | ], 741 | "description": "Specifies the type of card charge.\n" 742 | }, 743 | "CardPurchaseMethodObject": { 744 | "type": "object", 745 | "description": "Provides information about the card used for a transaction.\n", 746 | "properties": { 747 | "method": { 748 | "description": "The type of card purchase.\n", 749 | "allOf": [ 750 | { 751 | "$ref": "#/components/schemas/CardPurchaseMethodEnum" 752 | } 753 | ] 754 | }, 755 | "cardNumberSuffix": { 756 | "type": "string", 757 | "nullable": true, 758 | "description": "The last four digits of the card used for the purchase, if applicable.\n" 759 | } 760 | }, 761 | "required": ["method", "cardNumberSuffix"] 762 | }, 763 | "NoteObject": { 764 | "type": "object", 765 | "description": "Provides information about the note and attachement.\n", 766 | "properties": { 767 | "text": { 768 | "type": "string", 769 | "description": "A text note about the transaction.\n" 770 | } 771 | }, 772 | "required": ["text"] 773 | }, 774 | "CustomerObject": { 775 | "type": "object", 776 | "description": "Provides information about the customer who initiated a transaction\n", 777 | "properties": { 778 | "displayName": { 779 | "type": "string", 780 | "description": "The Upname or preferred name of the customer\n" 781 | } 782 | }, 783 | "required": ["displayName"] 784 | }, 785 | "TransactionResource": { 786 | "type": "object", 787 | "properties": { 788 | "type": { 789 | "type": "string", 790 | "description": "The type of this resource: `transactions`" 791 | }, 792 | "id": { 793 | "type": "string", 794 | "description": "The unique identifier for this transaction.\n" 795 | }, 796 | "attributes": { 797 | "type": "object", 798 | "properties": { 799 | "status": { 800 | "description": "The current processing status of this transaction, according to\nwhether or not this transaction has settled or is still held.\n", 801 | "allOf": [ 802 | { 803 | "$ref": "#/components/schemas/TransactionStatusEnum" 804 | } 805 | ] 806 | }, 807 | "rawText": { 808 | "type": "string", 809 | "nullable": true, 810 | "description": "The original, unprocessed text of the transaction. This is often not\na perfect indicator of the actual merchant, but it is useful for\nreconciliation purposes in some cases.\n" 811 | }, 812 | "description": { 813 | "type": "string", 814 | "description": "A short description for this transaction. Usually the merchant name\nfor purchases.\n" 815 | }, 816 | "message": { 817 | "type": "string", 818 | "nullable": true, 819 | "description": "Attached message for this transaction, such as a payment message, or a\ntransfer note.\n" 820 | }, 821 | "isCategorizable": { 822 | "type": "boolean", 823 | "description": "Boolean flag set to true on transactions that support the use of\ncategories.\n" 824 | }, 825 | "holdInfo": { 826 | "nullable": true, 827 | "description": "If this transaction is currently in the `HELD` status, or was ever in\nthe `HELD` status, the `amount` and `foreignAmount` of the\ntransaction while `HELD`.\n", 828 | "allOf": [ 829 | { 830 | "$ref": "#/components/schemas/HoldInfoObject" 831 | } 832 | ] 833 | }, 834 | "roundUp": { 835 | "nullable": true, 836 | "description": "Details of how this transaction was rounded-up. If no Round Up was\napplied this field will be `null`.\n", 837 | "allOf": [ 838 | { 839 | "$ref": "#/components/schemas/RoundUpObject" 840 | } 841 | ] 842 | }, 843 | "cashback": { 844 | "nullable": true, 845 | "description": "If all or part of this transaction was instantly reimbursed in the\nform of cashback, details of the reimbursement.\n", 846 | "allOf": [ 847 | { 848 | "$ref": "#/components/schemas/CashbackObject" 849 | } 850 | ] 851 | }, 852 | "amount": { 853 | "description": "The amount of this transaction in Australian dollars. For\ntransactions that were once `HELD` but are now `SETTLED`, refer to\nthe `holdInfo` field for the original `amount` the transaction was\n`HELD` at.\n", 854 | "allOf": [ 855 | { 856 | "$ref": "#/components/schemas/MoneyObject" 857 | } 858 | ] 859 | }, 860 | "foreignAmount": { 861 | "nullable": true, 862 | "description": "The foreign currency amount of this transaction. This field will be\n`null` for domestic transactions. The amount was converted to the AUD\namount reflected in the `amount` of this transaction. Refer to the\n`holdInfo` field for the original `foreignAmount` the transaction was\n`HELD` at.\n", 863 | "allOf": [ 864 | { 865 | "$ref": "#/components/schemas/MoneyObject" 866 | } 867 | ] 868 | }, 869 | "cardPurchaseMethod": { 870 | "nullable": true, 871 | "description": "Information about the card used for this transaction, if applicable.\n", 872 | "allOf": [ 873 | { 874 | "$ref": "#/components/schemas/CardPurchaseMethodObject" 875 | } 876 | ] 877 | }, 878 | "settledAt": { 879 | "type": "string", 880 | "format": "date-time", 881 | "nullable": true, 882 | "description": "The date-time at which this transaction settled. This field will be\n`null` for transactions that are currently in the `HELD` status.\n" 883 | }, 884 | "createdAt": { 885 | "type": "string", 886 | "format": "date-time", 887 | "description": "The date-time at which this transaction was first encountered.\n" 888 | }, 889 | "transactionType": { 890 | "type": "string", 891 | "nullable": true, 892 | "description": "A description of the transaction method used e.g. Purchase, BPAY Payment.\n" 893 | }, 894 | "note": { 895 | "nullable": true, 896 | "description": "A customer provided note about the transaction. Can only be provided by Up High subscribers.\n", 897 | "allOf": [ 898 | { 899 | "$ref": "#/components/schemas/NoteObject" 900 | } 901 | ] 902 | }, 903 | "performingCustomer": { 904 | "nullable": true, 905 | "description": "The customer who initated the transaction. For 2Up accounts this could be the customer who's card was used.\n", 906 | "allOf": [ 907 | { 908 | "$ref": "#/components/schemas/CustomerObject" 909 | } 910 | ] 911 | } 912 | }, 913 | "required": [ 914 | "status", 915 | "rawText", 916 | "description", 917 | "message", 918 | "isCategorizable", 919 | "holdInfo", 920 | "roundUp", 921 | "cashback", 922 | "amount", 923 | "foreignAmount", 924 | "cardPurchaseMethod", 925 | "settledAt", 926 | "createdAt", 927 | "transactionType", 928 | "note", 929 | "performingCustomer" 930 | ] 931 | }, 932 | "relationships": { 933 | "type": "object", 934 | "properties": { 935 | "account": { 936 | "type": "object", 937 | "properties": { 938 | "data": { 939 | "type": "object", 940 | "properties": { 941 | "type": { 942 | "type": "string", 943 | "description": "The type of this resource: `accounts`" 944 | }, 945 | "id": { 946 | "type": "string", 947 | "description": "The unique identifier of the resource within its type.\n" 948 | } 949 | }, 950 | "required": ["type", "id"] 951 | }, 952 | "links": { 953 | "type": "object", 954 | "properties": { 955 | "related": { 956 | "type": "string", 957 | "description": "The link to retrieve the related resource(s) in this relationship.\n" 958 | } 959 | }, 960 | "required": ["related"] 961 | } 962 | }, 963 | "required": ["data"] 964 | }, 965 | "transferAccount": { 966 | "type": "object", 967 | "properties": { 968 | "data": { 969 | "type": "object", 970 | "properties": { 971 | "type": { 972 | "type": "string", 973 | "description": "The type of this resource: `accounts`" 974 | }, 975 | "id": { 976 | "type": "string", 977 | "description": "The unique identifier of the resource within its type.\n" 978 | } 979 | }, 980 | "required": ["type", "id"], 981 | "nullable": true 982 | }, 983 | "links": { 984 | "type": "object", 985 | "properties": { 986 | "related": { 987 | "type": "string", 988 | "description": "The link to retrieve the related resource(s) in this relationship.\n" 989 | } 990 | }, 991 | "required": ["related"] 992 | } 993 | }, 994 | "required": ["data"], 995 | "description": "If this transaction is a transfer between accounts, this relationship\nwill contain the account the transaction went to/came from. The\n`amount` field can be used to determine the direction of the transfer.\n" 996 | }, 997 | "category": { 998 | "type": "object", 999 | "properties": { 1000 | "data": { 1001 | "type": "object", 1002 | "properties": { 1003 | "type": { 1004 | "type": "string", 1005 | "description": "The type of this resource: `categories`" 1006 | }, 1007 | "id": { 1008 | "type": "string", 1009 | "description": "The unique identifier of the resource within its type.\n" 1010 | } 1011 | }, 1012 | "required": ["type", "id"], 1013 | "nullable": true 1014 | }, 1015 | "links": { 1016 | "type": "object", 1017 | "properties": { 1018 | "self": { 1019 | "type": "string", 1020 | "description": "The link to retrieve or modify linkage between this resources and the\nrelated resource(s) in this relationship.\n" 1021 | }, 1022 | "related": { 1023 | "type": "string", 1024 | "description": "The link to retrieve the related resource(s) in this relationship.\n" 1025 | } 1026 | }, 1027 | "required": ["self"] 1028 | } 1029 | }, 1030 | "required": ["data"] 1031 | }, 1032 | "parentCategory": { 1033 | "type": "object", 1034 | "properties": { 1035 | "data": { 1036 | "type": "object", 1037 | "properties": { 1038 | "type": { 1039 | "type": "string", 1040 | "description": "The type of this resource: `categories`" 1041 | }, 1042 | "id": { 1043 | "type": "string", 1044 | "description": "The unique identifier of the resource within its type.\n" 1045 | } 1046 | }, 1047 | "required": ["type", "id"], 1048 | "nullable": true 1049 | }, 1050 | "links": { 1051 | "type": "object", 1052 | "properties": { 1053 | "related": { 1054 | "type": "string", 1055 | "description": "The link to retrieve the related resource(s) in this relationship.\n" 1056 | } 1057 | }, 1058 | "required": ["related"] 1059 | } 1060 | }, 1061 | "required": ["data"] 1062 | }, 1063 | "tags": { 1064 | "type": "object", 1065 | "properties": { 1066 | "data": { 1067 | "type": "array", 1068 | "items": { 1069 | "type": "object", 1070 | "properties": { 1071 | "type": { 1072 | "type": "string", 1073 | "description": "The type of this resource: `tags`" 1074 | }, 1075 | "id": { 1076 | "type": "string", 1077 | "description": "The label of the tag, which also acts as the tag’s unique identifier.\n" 1078 | } 1079 | }, 1080 | "required": ["type", "id"] 1081 | } 1082 | }, 1083 | "links": { 1084 | "type": "object", 1085 | "properties": { 1086 | "self": { 1087 | "type": "string", 1088 | "description": "The link to retrieve or modify linkage between this resources and the\nrelated resource(s) in this relationship.\n" 1089 | } 1090 | }, 1091 | "required": ["self"] 1092 | } 1093 | }, 1094 | "required": ["data"] 1095 | }, 1096 | "attachment": { 1097 | "type": "object", 1098 | "properties": { 1099 | "data": { 1100 | "type": "object", 1101 | "properties": { 1102 | "type": { 1103 | "type": "string", 1104 | "description": "The type of this resource: `attachments`" 1105 | }, 1106 | "id": { 1107 | "type": "string", 1108 | "description": "The unique identifier of the resource within its type.\n" 1109 | } 1110 | }, 1111 | "required": ["type", "id"], 1112 | "nullable": true 1113 | }, 1114 | "links": { 1115 | "type": "object", 1116 | "properties": { 1117 | "related": { 1118 | "type": "string", 1119 | "description": "The link to retrieve the related resource(s) in this relationship.\n" 1120 | } 1121 | }, 1122 | "required": ["related"] 1123 | } 1124 | }, 1125 | "required": ["data"] 1126 | } 1127 | }, 1128 | "required": [ 1129 | "account", 1130 | "transferAccount", 1131 | "category", 1132 | "parentCategory", 1133 | "tags", 1134 | "attachment" 1135 | ] 1136 | }, 1137 | "links": { 1138 | "type": "object", 1139 | "properties": { 1140 | "self": { 1141 | "type": "string", 1142 | "description": "The canonical link to this resource within the API.\n" 1143 | } 1144 | }, 1145 | "required": ["self"] 1146 | } 1147 | }, 1148 | "required": ["type", "id", "attributes", "relationships"] 1149 | }, 1150 | "ListTransactionsResponse": { 1151 | "type": "object", 1152 | "description": "Successful response to get all transactions. This returns a paginated\nlist of transactions, which can be scrolled by following the `prev` and\n`next` links if present.\n", 1153 | "properties": { 1154 | "data": { 1155 | "type": "array", 1156 | "items": { 1157 | "$ref": "#/components/schemas/TransactionResource" 1158 | }, 1159 | "description": "The list of transactions returned in this response.\n" 1160 | }, 1161 | "links": { 1162 | "type": "object", 1163 | "properties": { 1164 | "prev": { 1165 | "type": "string", 1166 | "nullable": true, 1167 | "description": "The link to the previous page in the results. If this value is `null`\nthere is no previous page.\n" 1168 | }, 1169 | "next": { 1170 | "type": "string", 1171 | "nullable": true, 1172 | "description": "The link to the next page in the results. If this value is `null`\nthere is no next page.\n" 1173 | } 1174 | }, 1175 | "required": ["prev", "next"] 1176 | } 1177 | }, 1178 | "required": ["data", "links"] 1179 | }, 1180 | "GetTransactionResponse": { 1181 | "type": "object", 1182 | "description": "Successful response to get a single transaction.\n", 1183 | "properties": { 1184 | "data": { 1185 | "description": "The transaction returned in this response.\n", 1186 | "allOf": [ 1187 | { 1188 | "$ref": "#/components/schemas/TransactionResource" 1189 | } 1190 | ] 1191 | } 1192 | }, 1193 | "required": ["data"] 1194 | }, 1195 | "WebhookResource": { 1196 | "type": "object", 1197 | "description": "Provides information about a webhook.\n", 1198 | "properties": { 1199 | "type": { 1200 | "type": "string", 1201 | "description": "The type of this resource: `webhooks`" 1202 | }, 1203 | "id": { 1204 | "type": "string", 1205 | "description": "The unique identifier for this webhook.\n" 1206 | }, 1207 | "attributes": { 1208 | "type": "object", 1209 | "properties": { 1210 | "url": { 1211 | "type": "string", 1212 | "description": "The URL that this webhook is configured to `POST` events to.\n" 1213 | }, 1214 | "description": { 1215 | "type": "string", 1216 | "nullable": true, 1217 | "description": "An optional description that was provided at the time the webhook was\ncreated.\n" 1218 | }, 1219 | "secretKey": { 1220 | "type": "string", 1221 | "description": "A shared secret key used to sign all webhook events sent to the\nconfigured webhook URL. This field is returned only once, upon the\ninitial creation of the webhook. If lost, create a new webhook and\ndelete this webhook.\n\nThe webhook URL receives a request with a\n`X-Up-Authenticity-Signature` header, which is the SHA-256 HMAC of\nthe entire raw request body signed using this `secretKey`. It is\nadvised to compute and check this signature to verify the\nauthenticity of requests sent to the webhook URL. See\n[Handling webhook events](#callback_post_webhookURL) for full\ndetails.\n" 1222 | }, 1223 | "createdAt": { 1224 | "type": "string", 1225 | "format": "date-time", 1226 | "description": "The date-time at which this webhook was created.\n" 1227 | } 1228 | }, 1229 | "required": ["url", "description", "createdAt"] 1230 | }, 1231 | "relationships": { 1232 | "type": "object", 1233 | "properties": { 1234 | "logs": { 1235 | "type": "object", 1236 | "properties": { 1237 | "links": { 1238 | "type": "object", 1239 | "properties": { 1240 | "related": { 1241 | "type": "string", 1242 | "description": "The link to retrieve the related resource(s) in this relationship.\n" 1243 | } 1244 | }, 1245 | "required": ["related"] 1246 | } 1247 | } 1248 | } 1249 | }, 1250 | "required": ["logs"] 1251 | }, 1252 | "links": { 1253 | "type": "object", 1254 | "properties": { 1255 | "self": { 1256 | "type": "string", 1257 | "description": "The canonical link to this resource within the API.\n" 1258 | } 1259 | }, 1260 | "required": ["self"] 1261 | } 1262 | }, 1263 | "required": ["type", "id", "attributes", "relationships"] 1264 | }, 1265 | "ListWebhooksResponse": { 1266 | "type": "object", 1267 | "description": "Successful response to get all webhooks. This returns a paginated list of\nwebhooks, which can be scrolled by following the `prev` and `next` links\nif present.\n", 1268 | "properties": { 1269 | "data": { 1270 | "type": "array", 1271 | "items": { 1272 | "$ref": "#/components/schemas/WebhookResource" 1273 | }, 1274 | "description": "The list of webhooks returned in this response.\n" 1275 | }, 1276 | "links": { 1277 | "type": "object", 1278 | "properties": { 1279 | "prev": { 1280 | "type": "string", 1281 | "nullable": true, 1282 | "description": "The link to the previous page in the results. If this value is `null`\nthere is no previous page.\n" 1283 | }, 1284 | "next": { 1285 | "type": "string", 1286 | "nullable": true, 1287 | "description": "The link to the next page in the results. If this value is `null`\nthere is no next page.\n" 1288 | } 1289 | }, 1290 | "required": ["prev", "next"] 1291 | } 1292 | }, 1293 | "required": ["data", "links"] 1294 | }, 1295 | "WebhookInputResource": { 1296 | "type": "object", 1297 | "description": "Represents a webhook specified as request input.\n", 1298 | "properties": { 1299 | "attributes": { 1300 | "type": "object", 1301 | "properties": { 1302 | "url": { 1303 | "type": "string", 1304 | "format": "uri", 1305 | "description": "The URL that this webhook should post events to. This must be a valid\nHTTP or HTTPS URL that does not exceed 300 characters in length.\n" 1306 | }, 1307 | "description": { 1308 | "type": "string", 1309 | "nullable": true, 1310 | "description": "An optional description for this webhook, up to 64 characters in\nlength.\n" 1311 | } 1312 | }, 1313 | "required": ["url"] 1314 | } 1315 | }, 1316 | "required": ["attributes"] 1317 | }, 1318 | "CreateWebhookRequest": { 1319 | "type": "object", 1320 | "description": "Request to create a new webhook. This currently only requires a `url`\nattribute.\n", 1321 | "properties": { 1322 | "data": { 1323 | "description": "The webhook resource to create.\n", 1324 | "allOf": [ 1325 | { 1326 | "$ref": "#/components/schemas/WebhookInputResource" 1327 | } 1328 | ] 1329 | } 1330 | }, 1331 | "required": ["data"] 1332 | }, 1333 | "CreateWebhookResponse": { 1334 | "type": "object", 1335 | "description": "Successful response after creating a webhook.\n", 1336 | "properties": { 1337 | "data": { 1338 | "description": "The webhook that was created.\n", 1339 | "allOf": [ 1340 | { 1341 | "$ref": "#/components/schemas/WebhookResource" 1342 | } 1343 | ] 1344 | } 1345 | }, 1346 | "required": ["data"] 1347 | }, 1348 | "WebhookEventTypeEnum": { 1349 | "enum": [ 1350 | "TRANSACTION_CREATED", 1351 | "TRANSACTION_SETTLED", 1352 | "TRANSACTION_DELETED", 1353 | "PING" 1354 | ], 1355 | "description": "Specifies the type of a webhook event. This can be used to determine what\naction to take in response to the event, such as which relationships to\nexpect.\n" 1356 | }, 1357 | "WebhookEventResource": { 1358 | "type": "object", 1359 | "description": "Provides the event data used in asynchronous webhook event callbacks to\nsubscribed endpoints. Webhooks events have defined `eventType`s and may\noptionally relate to other resources within the Up API.\n", 1360 | "properties": { 1361 | "type": { 1362 | "type": "string", 1363 | "description": "The type of this resource: `webhook-events`" 1364 | }, 1365 | "id": { 1366 | "type": "string", 1367 | "description": "The unique identifier for this event. This will remain constant across\ndelivery retries.\n" 1368 | }, 1369 | "attributes": { 1370 | "type": "object", 1371 | "properties": { 1372 | "eventType": { 1373 | "description": "The type of this event. This can be used to determine what action to\ntake in response to the event.\n", 1374 | "allOf": [ 1375 | { 1376 | "$ref": "#/components/schemas/WebhookEventTypeEnum" 1377 | } 1378 | ] 1379 | }, 1380 | "createdAt": { 1381 | "type": "string", 1382 | "format": "date-time", 1383 | "description": "The date-time at which this event was generated.\n" 1384 | } 1385 | }, 1386 | "required": ["eventType", "createdAt"] 1387 | }, 1388 | "relationships": { 1389 | "type": "object", 1390 | "properties": { 1391 | "webhook": { 1392 | "type": "object", 1393 | "properties": { 1394 | "data": { 1395 | "type": "object", 1396 | "properties": { 1397 | "type": { 1398 | "type": "string", 1399 | "description": "The type of this resource: `webhooks`" 1400 | }, 1401 | "id": { 1402 | "type": "string", 1403 | "description": "The unique identifier of the resource within its type.\n" 1404 | } 1405 | }, 1406 | "required": ["type", "id"] 1407 | }, 1408 | "links": { 1409 | "type": "object", 1410 | "properties": { 1411 | "related": { 1412 | "type": "string", 1413 | "description": "The link to retrieve the related resource(s) in this relationship.\n" 1414 | } 1415 | }, 1416 | "required": ["related"] 1417 | } 1418 | }, 1419 | "required": ["data"] 1420 | }, 1421 | "transaction": { 1422 | "type": "object", 1423 | "properties": { 1424 | "data": { 1425 | "type": "object", 1426 | "properties": { 1427 | "type": { 1428 | "type": "string", 1429 | "description": "The type of this resource: `transactions`" 1430 | }, 1431 | "id": { 1432 | "type": "string", 1433 | "description": "The unique identifier of the resource within its type.\n" 1434 | } 1435 | }, 1436 | "required": ["type", "id"] 1437 | }, 1438 | "links": { 1439 | "type": "object", 1440 | "properties": { 1441 | "related": { 1442 | "type": "string", 1443 | "description": "The link to retrieve the related resource(s) in this relationship.\n" 1444 | } 1445 | }, 1446 | "required": ["related"] 1447 | } 1448 | }, 1449 | "required": ["data"] 1450 | } 1451 | }, 1452 | "required": ["webhook"] 1453 | } 1454 | }, 1455 | "required": ["type", "id", "attributes", "relationships"] 1456 | }, 1457 | "WebhookEventCallback": { 1458 | "type": "object", 1459 | "description": "Asynchronous callback request used for webhook event delivery.\n", 1460 | "properties": { 1461 | "data": { 1462 | "description": "The webhook event data sent to the subscribed webhook.\n", 1463 | "allOf": [ 1464 | { 1465 | "$ref": "#/components/schemas/WebhookEventResource" 1466 | } 1467 | ] 1468 | } 1469 | }, 1470 | "required": ["data"] 1471 | }, 1472 | "GetWebhookResponse": { 1473 | "type": "object", 1474 | "description": "Successful response to get a single webhook.\n", 1475 | "properties": { 1476 | "data": { 1477 | "description": "The webhook returned in this response.\n", 1478 | "allOf": [ 1479 | { 1480 | "$ref": "#/components/schemas/WebhookResource" 1481 | } 1482 | ] 1483 | } 1484 | }, 1485 | "required": ["data"] 1486 | }, 1487 | "WebhookDeliveryStatusEnum": { 1488 | "enum": ["DELIVERED", "UNDELIVERABLE", "BAD_RESPONSE_CODE"], 1489 | "description": "Specifies the nature of the success or failure of a webhook delivery\nattempt to the subscribed webhook URL. The currently returned values are\ndescribed below:\n\n- **`DELIVERED`**: The event was delivered to the webhook URL\n successfully and a `200` response was received.\n- **`UNDELIVERABLE`**: The webhook URL was not reachable, or timed out.\n- **`BAD_RESPONSE_CODE`**: The event was delivered to the webhook URL\n but a non-`200` response was received.\n" 1490 | }, 1491 | "WebhookDeliveryLogResource": { 1492 | "type": "object", 1493 | "description": "Provides historical webhook event delivery information for analysis and\ndebugging purposes.\n", 1494 | "properties": { 1495 | "type": { 1496 | "type": "string", 1497 | "description": "The type of this resource: `webhook-delivery-logs`" 1498 | }, 1499 | "id": { 1500 | "type": "string", 1501 | "description": "The unique identifier for this log entry.\n" 1502 | }, 1503 | "attributes": { 1504 | "type": "object", 1505 | "properties": { 1506 | "request": { 1507 | "type": "object", 1508 | "properties": { 1509 | "body": { 1510 | "type": "string", 1511 | "description": "The payload that was sent in the request body.\n" 1512 | } 1513 | }, 1514 | "required": ["body"], 1515 | "description": "Information about the request that was sent to the webhook URL.\n" 1516 | }, 1517 | "response": { 1518 | "type": "object", 1519 | "properties": { 1520 | "statusCode": { 1521 | "type": "integer", 1522 | "description": "The HTTP status code received in the response.\n" 1523 | }, 1524 | "body": { 1525 | "type": "string", 1526 | "description": "The payload that was received in the response body.\n" 1527 | } 1528 | }, 1529 | "required": ["statusCode", "body"], 1530 | "nullable": true, 1531 | "description": "Information about the response that was received from the webhook URL.\n" 1532 | }, 1533 | "deliveryStatus": { 1534 | "description": "The success or failure status of this delivery attempt.\n", 1535 | "allOf": [ 1536 | { 1537 | "$ref": "#/components/schemas/WebhookDeliveryStatusEnum" 1538 | } 1539 | ] 1540 | }, 1541 | "createdAt": { 1542 | "type": "string", 1543 | "format": "date-time", 1544 | "description": "The date-time at which this log entry was created.\n" 1545 | } 1546 | }, 1547 | "required": ["request", "response", "deliveryStatus", "createdAt"] 1548 | }, 1549 | "relationships": { 1550 | "type": "object", 1551 | "properties": { 1552 | "webhookEvent": { 1553 | "type": "object", 1554 | "properties": { 1555 | "data": { 1556 | "type": "object", 1557 | "properties": { 1558 | "type": { 1559 | "type": "string", 1560 | "description": "The type of this resource: `webhook-events`" 1561 | }, 1562 | "id": { 1563 | "type": "string", 1564 | "description": "The unique identifier of the resource within its type.\n" 1565 | } 1566 | }, 1567 | "required": ["type", "id"] 1568 | } 1569 | }, 1570 | "required": ["data"] 1571 | } 1572 | }, 1573 | "required": ["webhookEvent"] 1574 | } 1575 | }, 1576 | "required": ["type", "id", "attributes", "relationships"] 1577 | }, 1578 | "ListWebhookDeliveryLogsResponse": { 1579 | "type": "object", 1580 | "description": "Successful response to get all delivery logs for a webhook. This returns\na paginated list of delivery logs, which can be scrolled by following the\n`next` and `prev` links if present.\n", 1581 | "properties": { 1582 | "data": { 1583 | "type": "array", 1584 | "items": { 1585 | "$ref": "#/components/schemas/WebhookDeliveryLogResource" 1586 | }, 1587 | "description": "The list of delivery logs returned in this response.\n" 1588 | }, 1589 | "links": { 1590 | "type": "object", 1591 | "properties": { 1592 | "prev": { 1593 | "type": "string", 1594 | "nullable": true, 1595 | "description": "The link to the previous page in the results. If this value is `null`\nthere is no previous page.\n" 1596 | }, 1597 | "next": { 1598 | "type": "string", 1599 | "nullable": true, 1600 | "description": "The link to the next page in the results. If this value is `null`\nthere is no next page.\n" 1601 | } 1602 | }, 1603 | "required": ["prev", "next"] 1604 | } 1605 | }, 1606 | "required": ["data", "links"] 1607 | } 1608 | } 1609 | }, 1610 | "security": [ 1611 | { 1612 | "bearer_auth": [] 1613 | } 1614 | ], 1615 | "tags": [ 1616 | { 1617 | "name": "Accounts", 1618 | "description": "Accounts represent the underlying store used to track balances\nand the transactions that have occurred to modify those balances\nover time. Up currently has three types of account: `SAVER`—used to\nearn interest and to hit savings goals, `TRANSACTIONAL`—used\nfor everyday spending, and `HOME_LOAN`-for those with an Up Home loan.\n" 1619 | }, 1620 | { 1621 | "name": "Categories", 1622 | "description": "Categories enable understanding where your money goes by driving\npowerful insights in Up. All categories in Up are pre-defined\nand are automatically assigned to new purchases in most cases. A\nparent-child relationship is used to represent categories,\nhowever parent categories cannot be directly assigned to\ntransactions.\n" 1623 | }, 1624 | { 1625 | "name": "Tags", 1626 | "description": "Tags are custom labels that can be associated with transactions\non Up. Within the Up application, tags provide additional insight\ninto spending. For example, you could have a \"Take Away\" tag that\nyou apply to purchases from food delivery services. The Up API\nallows you to manage the tags associated with transactions. Each\ntransaction may have up to 6 tags.\n\nTags are identified by their labels, which are unique strings,\nso the tag \"Holiday\" has also the `id` `\"Holiday\"`.\n" 1627 | }, 1628 | { 1629 | "name": "Transactions", 1630 | "description": "Transactions represent the movement of money into and out of an\naccount. They have many characteristics that vary depending on\nthe kind of transaction. Transactions may be temporarily `HELD`\n(pending) or `SETTLED`, typically depending on which payment\nmethod was used at the point of sale.\n" 1631 | }, 1632 | { 1633 | "name": "Attachments", 1634 | "description": "Attachments represent uploaded files that are attached to transactions, these are commonly receipts.\n" 1635 | }, 1636 | { 1637 | "name": "Utility endpoints", 1638 | "description": "Some endpoints exist not to expose data, but to test the API\nitself. Currently there is only one endpoint in this group: ping!\n" 1639 | }, 1640 | { 1641 | "name": "Webhooks", 1642 | "description": "Webhooks provide a mechanism for a configured URL to receive\nevents when transaction activity occurs on Up. You can think of\nwebhooks as being like push notifications for your server-side\napplication.\n" 1643 | } 1644 | ], 1645 | "paths": { 1646 | "/accounts": { 1647 | "get": { 1648 | "tags": ["Accounts"], 1649 | "summary": "List accounts", 1650 | "description": "Retrieve a paginated list of all accounts for the currently\nauthenticated user. The returned list is paginated and can be scrolled\nby following the `prev` and `next` links where present.\n", 1651 | "parameters": [ 1652 | { 1653 | "name": "page[size]", 1654 | "in": "query", 1655 | "schema": { 1656 | "type": "integer" 1657 | }, 1658 | "required": false, 1659 | "example": 30, 1660 | "description": "The number of records to return in each page.\n" 1661 | }, 1662 | { 1663 | "name": "filter[accountType]", 1664 | "in": "query", 1665 | "schema": { 1666 | "$ref": "#/components/schemas/AccountTypeEnum" 1667 | }, 1668 | "required": false, 1669 | "example": "SAVER", 1670 | "description": "The type of account for which to return records. This\ncan be used to filter Savers from spending accounts.\n" 1671 | }, 1672 | { 1673 | "name": "filter[ownershipType]", 1674 | "in": "query", 1675 | "schema": { 1676 | "$ref": "#/components/schemas/OwnershipTypeEnum" 1677 | }, 1678 | "required": false, 1679 | "example": "INDIVIDUAL", 1680 | "description": "The account ownership structure for which to return\nrecords. This can be used to filter 2Up accounts from Up\naccounts.\n" 1681 | } 1682 | ], 1683 | "responses": { 1684 | "200": { 1685 | "description": "Successful Response", 1686 | "content": { 1687 | "application/json": { 1688 | "schema": { 1689 | "$ref": "#/components/schemas/ListAccountsResponse" 1690 | } 1691 | } 1692 | }, 1693 | "x-up:example": { 1694 | "type": "exampleRequestResponse", 1695 | "request": { 1696 | "headers": { 1697 | "Authorization": "Bearer up:demo:z4qtHErGAZuuouwl" 1698 | }, 1699 | "pathParameters": {}, 1700 | "queryParameters": { 1701 | "page[size]": 1 1702 | }, 1703 | "payload": null 1704 | }, 1705 | "response": { 1706 | "data": [ 1707 | { 1708 | "type": "accounts", 1709 | "id": "5b54e6ef-ecf1-4c49-aa03-2104a490c849", 1710 | "attributes": { 1711 | "displayName": "Spending", 1712 | "accountType": "TRANSACTIONAL", 1713 | "ownershipType": "INDIVIDUAL", 1714 | "balance": { 1715 | "currencyCode": "AUD", 1716 | "value": "1.00", 1717 | "valueInBaseUnits": 100 1718 | }, 1719 | "createdAt": "2024-08-06T12:18:29+10:00" 1720 | }, 1721 | "relationships": { 1722 | "transactions": { 1723 | "links": { 1724 | "related": "https://api.up.com.au/api/v1/accounts/5b54e6ef-ecf1-4c49-aa03-2104a490c849/transactions" 1725 | } 1726 | } 1727 | }, 1728 | "links": { 1729 | "self": "https://api.up.com.au/api/v1/accounts/5b54e6ef-ecf1-4c49-aa03-2104a490c849" 1730 | } 1731 | } 1732 | ], 1733 | "links": { 1734 | "prev": null, 1735 | "next": "https://api.up.com.au/api/v1/accounts?page%5Bafter%5D=WyIyMDI0LTA4LTA2VDAyOjE4OjI5LjMwMzgzOTAwMFoiLCI1YjU0ZTZlZi1lY2YxLTRjNDktYWEwMy0yMTA0YTQ5MGM4NDkiXQ%3D%3D&page%5Bsize%5D=1" 1736 | } 1737 | } 1738 | } 1739 | } 1740 | } 1741 | } 1742 | }, 1743 | "/accounts/{id}": { 1744 | "get": { 1745 | "tags": ["Accounts"], 1746 | "summary": "Retrieve account", 1747 | "description": "Retrieve a specific account by providing its unique identifier.\n", 1748 | "parameters": [ 1749 | { 1750 | "name": "id", 1751 | "in": "path", 1752 | "schema": { 1753 | "type": "string" 1754 | }, 1755 | "required": true, 1756 | "example": "7699cfe5-eabd-4855-bbe7-9dfe3f70cebf", 1757 | "description": "The unique identifier for the account.\n" 1758 | } 1759 | ], 1760 | "responses": { 1761 | "200": { 1762 | "description": "Successful Response", 1763 | "content": { 1764 | "application/json": { 1765 | "schema": { 1766 | "$ref": "#/components/schemas/GetAccountResponse" 1767 | } 1768 | } 1769 | }, 1770 | "x-up:example": { 1771 | "type": "exampleRequestResponse", 1772 | "request": { 1773 | "headers": { 1774 | "Authorization": "Bearer up:demo:dvJloDOxw0NWMnzk" 1775 | }, 1776 | "pathParameters": { 1777 | "id": "e647dd54-4d10-41d0-8071-21eb0a3f6214" 1778 | }, 1779 | "queryParameters": {}, 1780 | "payload": null 1781 | }, 1782 | "response": { 1783 | "data": { 1784 | "type": "accounts", 1785 | "id": "e647dd54-4d10-41d0-8071-21eb0a3f6214", 1786 | "attributes": { 1787 | "displayName": "🐷 Savings", 1788 | "accountType": "SAVER", 1789 | "ownershipType": "INDIVIDUAL", 1790 | "balance": { 1791 | "currencyCode": "AUD", 1792 | "value": "125.36", 1793 | "valueInBaseUnits": 12536 1794 | }, 1795 | "createdAt": "2024-08-06T12:18:30+10:00" 1796 | }, 1797 | "relationships": { 1798 | "transactions": { 1799 | "links": { 1800 | "related": "https://api.up.com.au/api/v1/accounts/e647dd54-4d10-41d0-8071-21eb0a3f6214/transactions" 1801 | } 1802 | } 1803 | }, 1804 | "links": { 1805 | "self": "https://api.up.com.au/api/v1/accounts/e647dd54-4d10-41d0-8071-21eb0a3f6214" 1806 | } 1807 | } 1808 | } 1809 | } 1810 | } 1811 | } 1812 | } 1813 | }, 1814 | "/attachments": { 1815 | "get": { 1816 | "tags": ["Attachments"], 1817 | "summary": "List attachments", 1818 | "description": "Retrieve a list of all attachments. The returned list is [paginated](#pagination) and can\nbe scrolled by following the `next` and `prev` links where present.\n", 1819 | "responses": { 1820 | "200": { 1821 | "description": "Successful Response", 1822 | "content": { 1823 | "application/json": { 1824 | "schema": { 1825 | "$ref": "#/components/schemas/ListAttachmentsResponse" 1826 | } 1827 | } 1828 | }, 1829 | "x-up:example": { 1830 | "type": "exampleRequestResponse", 1831 | "request": { 1832 | "headers": { 1833 | "Authorization": "Bearer up:demo:cV5W9g033vq1tYZ4" 1834 | }, 1835 | "pathParameters": {}, 1836 | "queryParameters": {}, 1837 | "payload": null 1838 | }, 1839 | "response": { 1840 | "data": [ 1841 | { 1842 | "type": "attachments", 1843 | "id": "23bc06a0-cff4-40ae-bcb3-463fac19b5b0", 1844 | "attributes": { 1845 | "createdAt": "2024-08-06T12:18:31+10:00", 1846 | "fileURL": "http://localhost:8080/asset/customer_transaction_attachment.jpg?filename=uploads%2Fcustomer_transaction_attachments%2Fmodels%2Fattachment%2Ffile%2F1%2Fattachment.jpg×tamp=1722910712&token=881b77d17579aa98214271fc29a3e4b4438b937e0e818b0f543fdb5bd921822c", 1847 | "fileURLExpiresAt": "2024-08-06T12:33:32+10:00", 1848 | "fileExtension": "jpg", 1849 | "fileContentType": "image/jpeg" 1850 | }, 1851 | "relationships": { 1852 | "transaction": { 1853 | "data": { 1854 | "type": "transactions", 1855 | "id": "9dd0a25a-c5ca-46c6-8e07-420274d5e8fe" 1856 | }, 1857 | "links": { 1858 | "related": "https://api.up.com.au/api/v1/transactions/9dd0a25a-c5ca-46c6-8e07-420274d5e8fe" 1859 | } 1860 | } 1861 | }, 1862 | "links": { 1863 | "self": "https://api.up.com.au/api/v1/attachments/23bc06a0-cff4-40ae-bcb3-463fac19b5b0" 1864 | } 1865 | }, 1866 | { 1867 | "type": "attachments", 1868 | "id": "86f6e316-691e-48a6-b896-331362bb9b52", 1869 | "attributes": { 1870 | "createdAt": "2024-08-06T12:18:31+10:00", 1871 | "fileURL": "http://localhost:8080/asset/customer_transaction_attachment.jpg?filename=uploads%2Fcustomer_transaction_attachments%2Fmodels%2Fattachment%2Ffile%2F2%2Fattachment.jpg×tamp=1722910712&token=a775955e0ae11f61b453dbdc9bd6d06b303a3aa4e6abacdcd1def8e4f8351559", 1872 | "fileURLExpiresAt": "2024-08-06T12:33:32+10:00", 1873 | "fileExtension": "jpg", 1874 | "fileContentType": "image/jpeg" 1875 | }, 1876 | "relationships": { 1877 | "transaction": { 1878 | "data": { 1879 | "type": "transactions", 1880 | "id": "40390cc7-8c76-422f-b2a0-7a22c7d1c915" 1881 | }, 1882 | "links": { 1883 | "related": "https://api.up.com.au/api/v1/transactions/40390cc7-8c76-422f-b2a0-7a22c7d1c915" 1884 | } 1885 | } 1886 | }, 1887 | "links": { 1888 | "self": "https://api.up.com.au/api/v1/attachments/86f6e316-691e-48a6-b896-331362bb9b52" 1889 | } 1890 | } 1891 | ], 1892 | "links": { 1893 | "prev": null, 1894 | "next": null 1895 | } 1896 | } 1897 | } 1898 | } 1899 | } 1900 | } 1901 | }, 1902 | "/attachments/{id}": { 1903 | "get": { 1904 | "tags": ["Attachments"], 1905 | "summary": "Retrieve attachment", 1906 | "description": "Retrieve a specific attachment by providing its unique identifier.\n", 1907 | "parameters": [ 1908 | { 1909 | "name": "id", 1910 | "in": "path", 1911 | "schema": { 1912 | "type": "string" 1913 | }, 1914 | "required": true, 1915 | "example": "3672d7fb-e56d-4c4a-b546-7c11ddb5e5e7", 1916 | "description": "The unique identifier for the attachment.\n" 1917 | } 1918 | ], 1919 | "responses": { 1920 | "200": { 1921 | "description": "Successful Response", 1922 | "content": { 1923 | "application/json": { 1924 | "schema": { 1925 | "$ref": "#/components/schemas/GetAttachmentResponse" 1926 | } 1927 | } 1928 | }, 1929 | "x-up:example": { 1930 | "type": "exampleRequestResponse", 1931 | "request": { 1932 | "headers": { 1933 | "Authorization": "Bearer up:demo:lfQuAyww8UOTKTD4" 1934 | }, 1935 | "pathParameters": { 1936 | "id": "4fcb7c00-5332-41bb-ae5a-26b66dda316b" 1937 | }, 1938 | "queryParameters": {}, 1939 | "payload": null 1940 | }, 1941 | "response": { 1942 | "data": { 1943 | "type": "attachments", 1944 | "id": "4fcb7c00-5332-41bb-ae5a-26b66dda316b", 1945 | "attributes": { 1946 | "createdAt": "2024-08-06T12:18:33+10:00", 1947 | "fileURL": "http://localhost:8080/asset/customer_transaction_attachment.jpg?filename=uploads%2Fcustomer_transaction_attachments%2Fmodels%2Fattachment%2Ffile%2F5%2Fattachment.jpg×tamp=1722910713&token=3abc7139ebfbcaee1dc8a37d5bf0bc7d02334857919d7ce6695629bf340afbad", 1948 | "fileURLExpiresAt": "2024-08-06T12:33:33+10:00", 1949 | "fileExtension": "jpg", 1950 | "fileContentType": "image/jpeg" 1951 | }, 1952 | "relationships": { 1953 | "transaction": { 1954 | "data": { 1955 | "type": "transactions", 1956 | "id": "b416028a-9c12-4716-a759-94913fe4dd49" 1957 | }, 1958 | "links": { 1959 | "related": "https://api.up.com.au/api/v1/transactions/b416028a-9c12-4716-a759-94913fe4dd49" 1960 | } 1961 | } 1962 | }, 1963 | "links": { 1964 | "self": "https://api.up.com.au/api/v1/attachments/4fcb7c00-5332-41bb-ae5a-26b66dda316b" 1965 | } 1966 | } 1967 | } 1968 | } 1969 | } 1970 | } 1971 | } 1972 | }, 1973 | "/categories": { 1974 | "get": { 1975 | "tags": ["Categories"], 1976 | "summary": "List categories", 1977 | "description": "Retrieve a list of all categories and their ancestry. The returned list\nis not paginated.\n", 1978 | "parameters": [ 1979 | { 1980 | "name": "filter[parent]", 1981 | "in": "query", 1982 | "schema": { 1983 | "type": "string" 1984 | }, 1985 | "required": false, 1986 | "example": "good-life", 1987 | "description": "The unique identifier of a parent category for which to\nreturn only its children. Providing an invalid category\nidentifier results in a `404` response.\n" 1988 | } 1989 | ], 1990 | "responses": { 1991 | "200": { 1992 | "description": "Successful Response", 1993 | "content": { 1994 | "application/json": { 1995 | "schema": { 1996 | "$ref": "#/components/schemas/ListCategoriesResponse" 1997 | } 1998 | } 1999 | }, 2000 | "x-up:example": { 2001 | "type": "exampleRequestResponse", 2002 | "request": { 2003 | "headers": { 2004 | "Authorization": "Bearer up:demo:OTFUmA1YX3oq9Mtp" 2005 | }, 2006 | "pathParameters": {}, 2007 | "queryParameters": { 2008 | "filter[parent]": "good-life" 2009 | }, 2010 | "payload": null 2011 | }, 2012 | "response": { 2013 | "data": [ 2014 | { 2015 | "type": "categories", 2016 | "id": "hobbies", 2017 | "attributes": { 2018 | "name": "Hobbies" 2019 | }, 2020 | "relationships": { 2021 | "parent": { 2022 | "data": { 2023 | "type": "categories", 2024 | "id": "good-life" 2025 | }, 2026 | "links": { 2027 | "related": "https://api.up.com.au/api/v1/categories/good-life" 2028 | } 2029 | }, 2030 | "children": { 2031 | "data": [], 2032 | "links": { 2033 | "related": "https://api.up.com.au/api/v1/categories?filter%5Bparent%5D=hobbies" 2034 | } 2035 | } 2036 | }, 2037 | "links": { 2038 | "self": "https://api.up.com.au/api/v1/categories/hobbies" 2039 | } 2040 | }, 2041 | { 2042 | "type": "categories", 2043 | "id": "restaurants-and-cafes", 2044 | "attributes": { 2045 | "name": "Restaurants & Cafes" 2046 | }, 2047 | "relationships": { 2048 | "parent": { 2049 | "data": { 2050 | "type": "categories", 2051 | "id": "good-life" 2052 | }, 2053 | "links": { 2054 | "related": "https://api.up.com.au/api/v1/categories/good-life" 2055 | } 2056 | }, 2057 | "children": { 2058 | "data": [], 2059 | "links": { 2060 | "related": "https://api.up.com.au/api/v1/categories?filter%5Bparent%5D=restaurants-and-cafes" 2061 | } 2062 | } 2063 | }, 2064 | "links": { 2065 | "self": "https://api.up.com.au/api/v1/categories/restaurants-and-cafes" 2066 | } 2067 | } 2068 | ] 2069 | } 2070 | } 2071 | } 2072 | } 2073 | } 2074 | }, 2075 | "/categories/{id}": { 2076 | "get": { 2077 | "tags": ["Categories"], 2078 | "summary": "Retrieve category", 2079 | "description": "Retrieve a specific category by providing its unique identifier.\n", 2080 | "parameters": [ 2081 | { 2082 | "name": "id", 2083 | "in": "path", 2084 | "schema": { 2085 | "type": "string" 2086 | }, 2087 | "required": true, 2088 | "example": "restaurants-and-cafes", 2089 | "description": "The unique identifier for the category.\n" 2090 | } 2091 | ], 2092 | "responses": { 2093 | "200": { 2094 | "description": "Successful Response", 2095 | "content": { 2096 | "application/json": { 2097 | "schema": { 2098 | "$ref": "#/components/schemas/GetCategoryResponse" 2099 | } 2100 | } 2101 | }, 2102 | "x-up:example": { 2103 | "type": "exampleRequestResponse", 2104 | "request": { 2105 | "headers": { 2106 | "Authorization": "Bearer up:demo:h3cqAp7XGqD2Jpg4" 2107 | }, 2108 | "pathParameters": { 2109 | "id": "home" 2110 | }, 2111 | "queryParameters": {}, 2112 | "payload": null 2113 | }, 2114 | "response": { 2115 | "data": { 2116 | "type": "categories", 2117 | "id": "home", 2118 | "attributes": { 2119 | "name": "Home" 2120 | }, 2121 | "relationships": { 2122 | "parent": { 2123 | "data": null 2124 | }, 2125 | "children": { 2126 | "data": [ 2127 | { 2128 | "type": "categories", 2129 | "id": "groceries" 2130 | } 2131 | ], 2132 | "links": { 2133 | "related": "https://api.up.com.au/api/v1/categories?filter%5Bparent%5D=home" 2134 | } 2135 | } 2136 | }, 2137 | "links": { 2138 | "self": "https://api.up.com.au/api/v1/categories/home" 2139 | } 2140 | } 2141 | } 2142 | } 2143 | } 2144 | } 2145 | } 2146 | }, 2147 | "/transactions/{transactionId}/relationships/category": { 2148 | "patch": { 2149 | "tags": ["Categories"], 2150 | "summary": "Categorize transaction", 2151 | "description": "Updates the category associated with a transaction. Only transactions\nfor which `isCategorizable` is set to true support this operation. The\n`id` is taken from the list exposed on `/categories` and cannot be one of\nthe top-level (parent) categories. To de-categorize a transaction, set\nthe entire `data` key to `null`. An HTTP `204` is returned on success.\nThe associated category, along with its request URL is also exposed via\nthe `category` relationship on the transaction resource returned from\n`/transactions/{id}`.\n", 2152 | "requestBody": { 2153 | "content": { 2154 | "application/json": { 2155 | "schema": { 2156 | "$ref": "#/components/schemas/UpdateTransactionCategoryRequest" 2157 | } 2158 | } 2159 | } 2160 | }, 2161 | "parameters": [ 2162 | { 2163 | "name": "transactionId", 2164 | "in": "path", 2165 | "schema": { 2166 | "type": "string" 2167 | }, 2168 | "required": true, 2169 | "example": "88b4ed70-7f15-4b46-a676-46aafad4c183", 2170 | "description": "The unique identifier for the transaction.\n" 2171 | } 2172 | ], 2173 | "responses": { 2174 | "204": { 2175 | "description": "Successful Response", 2176 | "x-up:example": { 2177 | "type": "exampleRequestResponse", 2178 | "request": { 2179 | "headers": { 2180 | "Authorization": "Bearer up:demo:jxaEroUCArojsqOr", 2181 | "Content-Type": "application/json" 2182 | }, 2183 | "pathParameters": { 2184 | "transactionId": "b2372db2-f032-4350-b276-bfe25467087b" 2185 | }, 2186 | "queryParameters": {}, 2187 | "payload": { 2188 | "data": { 2189 | "type": "categories", 2190 | "id": "restaurants-and-cafes" 2191 | } 2192 | } 2193 | }, 2194 | "response": null 2195 | } 2196 | } 2197 | } 2198 | } 2199 | }, 2200 | "/util/ping": { 2201 | "get": { 2202 | "tags": ["Utility endpoints"], 2203 | "summary": "Ping", 2204 | "description": "Make a basic ping request to the API. This is useful to verify that\nauthentication is functioning correctly. On authentication success an\nHTTP `200` status is returned. On failure an HTTP `401` error response\nis returned.\n", 2205 | "responses": { 2206 | "200": { 2207 | "description": "Successful Response", 2208 | "content": { 2209 | "application/json": { 2210 | "schema": { 2211 | "$ref": "#/components/schemas/PingResponse" 2212 | } 2213 | } 2214 | }, 2215 | "x-up:example": { 2216 | "type": "exampleRequestResponse", 2217 | "request": { 2218 | "headers": { 2219 | "Authorization": "Bearer up:demo:qrwv9tQgS76mnS9G" 2220 | }, 2221 | "pathParameters": {}, 2222 | "queryParameters": {}, 2223 | "payload": null 2224 | }, 2225 | "response": { 2226 | "meta": { 2227 | "id": "f8178615-7fd7-47a6-9a6e-cf62b3313848", 2228 | "statusEmoji": "⚡️" 2229 | } 2230 | } 2231 | } 2232 | }, 2233 | "401": { 2234 | "description": "Not Authorized", 2235 | "content": { 2236 | "application/json": { 2237 | "schema": { 2238 | "$ref": "#/components/schemas/ErrorResponse" 2239 | } 2240 | } 2241 | }, 2242 | "x-up:example": { 2243 | "type": "exampleRequestResponse", 2244 | "request": { 2245 | "headers": {}, 2246 | "pathParameters": {}, 2247 | "queryParameters": {}, 2248 | "payload": null 2249 | }, 2250 | "response": { 2251 | "errors": [ 2252 | { 2253 | "status": "401", 2254 | "title": "Not Authorized", 2255 | "detail": "The request was not authenticated because no valid credential was found in the Authorization header, or the Authorization header was not present." 2256 | } 2257 | ] 2258 | } 2259 | } 2260 | } 2261 | } 2262 | } 2263 | }, 2264 | "/tags": { 2265 | "get": { 2266 | "tags": ["Tags"], 2267 | "summary": "List tags", 2268 | "description": "Retrieve a list of all tags currently in use. The returned list is\n[paginated](#pagination) and can be scrolled by following the `next`\nand `prev` links where present. Results are ordered lexicographically.\nThe `transactions` relationship for each tag exposes a link\nto get the transactions with the given tag.\n", 2269 | "parameters": [ 2270 | { 2271 | "name": "page[size]", 2272 | "in": "query", 2273 | "schema": { 2274 | "type": "integer" 2275 | }, 2276 | "required": false, 2277 | "example": 50, 2278 | "description": "The number of records to return in each page.\n" 2279 | } 2280 | ], 2281 | "responses": { 2282 | "200": { 2283 | "description": "Successful Response", 2284 | "content": { 2285 | "application/json": { 2286 | "schema": { 2287 | "$ref": "#/components/schemas/ListTagsResponse" 2288 | } 2289 | } 2290 | }, 2291 | "x-up:example": { 2292 | "type": "exampleRequestResponse", 2293 | "request": { 2294 | "headers": { 2295 | "Authorization": "Bearer up:demo:bXd8NjT6vO5gfMvG" 2296 | }, 2297 | "pathParameters": {}, 2298 | "queryParameters": { 2299 | "page[size]": 2 2300 | }, 2301 | "payload": null 2302 | }, 2303 | "response": { 2304 | "data": [ 2305 | { 2306 | "type": "tags", 2307 | "id": "Holiday", 2308 | "relationships": { 2309 | "transactions": { 2310 | "links": { 2311 | "related": "https://api.up.com.au/api/v1/transactions?filter%5Btag%5D=Holiday" 2312 | } 2313 | } 2314 | } 2315 | }, 2316 | { 2317 | "type": "tags", 2318 | "id": "Pizza Night", 2319 | "relationships": { 2320 | "transactions": { 2321 | "links": { 2322 | "related": "https://api.up.com.au/api/v1/transactions?filter%5Btag%5D=Pizza+Night" 2323 | } 2324 | } 2325 | } 2326 | } 2327 | ], 2328 | "links": { 2329 | "prev": null, 2330 | "next": "https://api.up.com.au/api/v1/tags?page%5Bafter%5D=WyJQaXp6YSBOaWdodCJd&page%5Bsize%5D=2" 2331 | } 2332 | } 2333 | } 2334 | } 2335 | } 2336 | } 2337 | }, 2338 | "/transactions/{transactionId}/relationships/tags": { 2339 | "post": { 2340 | "tags": ["Tags"], 2341 | "summary": "Add tags to transaction", 2342 | "description": "Associates one or more tags with a specific transaction. No more than 6\ntags may be present on any single transaction. Duplicate tags are\nsilently ignored. An HTTP `204` is returned on success. The associated\ntags, along with this request URL, are also exposed via the `tags`\nrelationship on the transaction resource returned from\n`/transactions/{id}`.\n", 2343 | "requestBody": { 2344 | "content": { 2345 | "application/json": { 2346 | "schema": { 2347 | "$ref": "#/components/schemas/UpdateTransactionTagsRequest" 2348 | } 2349 | } 2350 | } 2351 | }, 2352 | "parameters": [ 2353 | { 2354 | "name": "transactionId", 2355 | "in": "path", 2356 | "schema": { 2357 | "type": "string" 2358 | }, 2359 | "required": true, 2360 | "example": "6259eac2-feac-417d-893e-84876c575913", 2361 | "description": "The unique identifier for the transaction.\n" 2362 | } 2363 | ], 2364 | "responses": { 2365 | "204": { 2366 | "description": "Successful Response", 2367 | "x-up:example": { 2368 | "type": "exampleRequestResponse", 2369 | "request": { 2370 | "headers": { 2371 | "Authorization": "Bearer up:demo:UvlljHmCb9A9P78m", 2372 | "Content-Type": "application/json" 2373 | }, 2374 | "pathParameters": { 2375 | "transactionId": "667fd9d3-05d7-4eb4-b496-a406ca7da08d" 2376 | }, 2377 | "queryParameters": {}, 2378 | "payload": { 2379 | "data": [ 2380 | { 2381 | "type": "tags", 2382 | "id": "Holiday" 2383 | }, 2384 | { 2385 | "type": "tags", 2386 | "id": "Queensland" 2387 | } 2388 | ] 2389 | } 2390 | }, 2391 | "response": null 2392 | } 2393 | } 2394 | } 2395 | }, 2396 | "delete": { 2397 | "tags": ["Tags"], 2398 | "summary": "Remove tags from transaction", 2399 | "description": "Disassociates one or more tags from a specific transaction. Tags that are\nnot associated are silently ignored. An HTTP `204` is returned on\nsuccess. The associated tags, along with this request URL, are also\nexposed via the `tags` relationship on the transaction resource returned\nfrom `/transactions/{id}`.\n", 2400 | "requestBody": { 2401 | "content": { 2402 | "application/json": { 2403 | "schema": { 2404 | "$ref": "#/components/schemas/UpdateTransactionTagsRequest" 2405 | } 2406 | } 2407 | } 2408 | }, 2409 | "parameters": [ 2410 | { 2411 | "name": "transactionId", 2412 | "in": "path", 2413 | "schema": { 2414 | "type": "string" 2415 | }, 2416 | "required": true, 2417 | "example": "86aacb90-a718-43f2-bb06-c1e32542ab26", 2418 | "description": "The unique identifier for the transaction.\n" 2419 | } 2420 | ], 2421 | "responses": { 2422 | "204": { 2423 | "description": "Successful Response", 2424 | "x-up:example": { 2425 | "type": "exampleRequestResponse", 2426 | "request": { 2427 | "headers": { 2428 | "Authorization": "Bearer up:demo:RFntp7VQQkErMliU", 2429 | "Content-Type": "application/json" 2430 | }, 2431 | "pathParameters": { 2432 | "transactionId": "8f3bd8ef-8d89-4e86-8d10-aa3e61c4afd6" 2433 | }, 2434 | "queryParameters": {}, 2435 | "payload": { 2436 | "data": [ 2437 | { 2438 | "type": "tags", 2439 | "id": "Holiday" 2440 | }, 2441 | { 2442 | "type": "tags", 2443 | "id": "Queensland" 2444 | } 2445 | ] 2446 | } 2447 | }, 2448 | "response": null 2449 | } 2450 | } 2451 | } 2452 | } 2453 | }, 2454 | "/transactions": { 2455 | "get": { 2456 | "tags": ["Transactions"], 2457 | "summary": "List transactions", 2458 | "description": "Retrieve a list of all transactions across all accounts for the currently\nauthenticated user. The returned list is [paginated](#pagination) and can\nbe scrolled by following the `next` and `prev` links where present. To\nnarrow the results to a specific date range pass one or both of\n`filter[since]` and `filter[until]` in the query string. These filter\nparameters **should not** be used for pagination. Results are ordered\nnewest first to oldest last.\n", 2459 | "parameters": [ 2460 | { 2461 | "name": "page[size]", 2462 | "in": "query", 2463 | "schema": { 2464 | "type": "integer" 2465 | }, 2466 | "required": false, 2467 | "example": 30, 2468 | "description": "The number of records to return in each page.\n" 2469 | }, 2470 | { 2471 | "name": "filter[status]", 2472 | "in": "query", 2473 | "schema": { 2474 | "$ref": "#/components/schemas/TransactionStatusEnum" 2475 | }, 2476 | "required": false, 2477 | "example": "HELD", 2478 | "description": "The transaction status for which to return records. This\ncan be used to filter `HELD` transactions from those\nthat are `SETTLED`.\n" 2479 | }, 2480 | { 2481 | "name": "filter[since]", 2482 | "in": "query", 2483 | "schema": { 2484 | "type": "string", 2485 | "format": "date-time" 2486 | }, 2487 | "required": false, 2488 | "example": "2020-01-01T01:02:03+10:00", 2489 | "description": "The start date-time from which to return records,\nformatted according to rfc-3339. Not to be used for\npagination purposes.\n" 2490 | }, 2491 | { 2492 | "name": "filter[until]", 2493 | "in": "query", 2494 | "schema": { 2495 | "type": "string", 2496 | "format": "date-time" 2497 | }, 2498 | "required": false, 2499 | "example": "2020-02-01T01:02:03+10:00", 2500 | "description": "The end date-time up to which to return records,\nformatted according to rfc-3339. Not to be used for\npagination purposes.\n" 2501 | }, 2502 | { 2503 | "name": "filter[category]", 2504 | "in": "query", 2505 | "schema": { 2506 | "type": "string" 2507 | }, 2508 | "required": false, 2509 | "example": "good-life", 2510 | "description": "The category identifier for which to filter transactions.\nBoth parent and child categories can be filtered through\nthis parameter. Providing an invalid category identifier\nresults in a `404` response.\n" 2511 | }, 2512 | { 2513 | "name": "filter[tag]", 2514 | "in": "query", 2515 | "schema": { 2516 | "type": "string" 2517 | }, 2518 | "required": false, 2519 | "example": "Holiday", 2520 | "description": "A transaction tag to filter for which to return records.\nIf the tag does not exist, zero records are returned and\na success response is given.\n" 2521 | } 2522 | ], 2523 | "responses": { 2524 | "200": { 2525 | "description": "Successful Response", 2526 | "content": { 2527 | "application/json": { 2528 | "schema": { 2529 | "$ref": "#/components/schemas/ListTransactionsResponse" 2530 | } 2531 | } 2532 | }, 2533 | "x-up:example": { 2534 | "type": "exampleRequestResponse", 2535 | "request": { 2536 | "headers": { 2537 | "Authorization": "Bearer up:demo:x2IN1pBWVKpwYQ1C" 2538 | }, 2539 | "pathParameters": {}, 2540 | "queryParameters": { 2541 | "page[size]": 1, 2542 | "filter[tag]": "Pizza Night", 2543 | "filter[status]": "SETTLED" 2544 | }, 2545 | "payload": null 2546 | }, 2547 | "response": { 2548 | "data": [ 2549 | { 2550 | "type": "transactions", 2551 | "id": "e38f484c-276e-4e87-9031-224564067d83", 2552 | "attributes": { 2553 | "status": "SETTLED", 2554 | "rawText": null, 2555 | "description": "David Taylor", 2556 | "message": "Money for the pizzas last night.", 2557 | "isCategorizable": true, 2558 | "holdInfo": null, 2559 | "roundUp": null, 2560 | "cashback": null, 2561 | "amount": { 2562 | "currencyCode": "AUD", 2563 | "value": "-59.98", 2564 | "valueInBaseUnits": -5998 2565 | }, 2566 | "foreignAmount": null, 2567 | "cardPurchaseMethod": null, 2568 | "settledAt": "2024-08-05T05:16:50+10:00", 2569 | "createdAt": "2024-08-05T05:16:50+10:00", 2570 | "transactionType": null, 2571 | "note": null, 2572 | "performingCustomer": { 2573 | "displayName": "Bobby" 2574 | } 2575 | }, 2576 | "relationships": { 2577 | "account": { 2578 | "data": { 2579 | "type": "accounts", 2580 | "id": "b47aa85f-0b67-46b2-a8d4-902f8e8b9d97" 2581 | }, 2582 | "links": { 2583 | "related": "https://api.up.com.au/api/v1/accounts/b47aa85f-0b67-46b2-a8d4-902f8e8b9d97" 2584 | } 2585 | }, 2586 | "transferAccount": { 2587 | "data": null 2588 | }, 2589 | "category": { 2590 | "data": null, 2591 | "links": { 2592 | "self": "https://api.up.com.au/api/v1/transactions/e38f484c-276e-4e87-9031-224564067d83/relationships/category" 2593 | } 2594 | }, 2595 | "parentCategory": { 2596 | "data": null 2597 | }, 2598 | "tags": { 2599 | "data": [ 2600 | { 2601 | "type": "tags", 2602 | "id": "Pizza Night" 2603 | } 2604 | ], 2605 | "links": { 2606 | "self": "https://api.up.com.au/api/v1/transactions/e38f484c-276e-4e87-9031-224564067d83/relationships/tags" 2607 | } 2608 | }, 2609 | "attachment": { 2610 | "data": null 2611 | } 2612 | }, 2613 | "links": { 2614 | "self": "https://api.up.com.au/api/v1/transactions/e38f484c-276e-4e87-9031-224564067d83" 2615 | } 2616 | } 2617 | ], 2618 | "links": { 2619 | "prev": null, 2620 | "next": null 2621 | } 2622 | } 2623 | } 2624 | } 2625 | } 2626 | } 2627 | }, 2628 | "/transactions/{id}": { 2629 | "get": { 2630 | "tags": ["Transactions"], 2631 | "summary": "Retrieve transaction", 2632 | "description": "Retrieve a specific transaction by providing its unique identifier.\n", 2633 | "parameters": [ 2634 | { 2635 | "name": "id", 2636 | "in": "path", 2637 | "schema": { 2638 | "type": "string" 2639 | }, 2640 | "required": true, 2641 | "example": "57a749fd-4fc9-40da-a8d9-ec9cf1d8c9ff", 2642 | "description": "The unique identifier for the transaction.\n" 2643 | } 2644 | ], 2645 | "responses": { 2646 | "200": { 2647 | "description": "Successful Response", 2648 | "content": { 2649 | "application/json": { 2650 | "schema": { 2651 | "$ref": "#/components/schemas/GetTransactionResponse" 2652 | } 2653 | } 2654 | }, 2655 | "x-up:example": { 2656 | "type": "exampleRequestResponse", 2657 | "request": { 2658 | "headers": { 2659 | "Authorization": "Bearer up:demo:zaoUoVWJiy1FHOQ5" 2660 | }, 2661 | "pathParameters": { 2662 | "id": "20f1a541-356b-4363-aeba-18e21661b8e5" 2663 | }, 2664 | "queryParameters": {}, 2665 | "payload": null 2666 | }, 2667 | "response": { 2668 | "data": { 2669 | "type": "transactions", 2670 | "id": "20f1a541-356b-4363-aeba-18e21661b8e5", 2671 | "attributes": { 2672 | "status": "SETTLED", 2673 | "rawText": "WARUNG BEBEK, UBUD INDONES", 2674 | "description": "Warung Bebek Bengil", 2675 | "message": null, 2676 | "isCategorizable": true, 2677 | "holdInfo": { 2678 | "amount": { 2679 | "currencyCode": "AUD", 2680 | "value": "-107.92", 2681 | "valueInBaseUnits": -10792 2682 | }, 2683 | "foreignAmount": null 2684 | }, 2685 | "roundUp": { 2686 | "amount": { 2687 | "currencyCode": "AUD", 2688 | "value": "-0.08", 2689 | "valueInBaseUnits": -8 2690 | }, 2691 | "boostPortion": null 2692 | }, 2693 | "cashback": null, 2694 | "amount": { 2695 | "currencyCode": "AUD", 2696 | "value": "-107.92", 2697 | "valueInBaseUnits": -10792 2698 | }, 2699 | "foreignAmount": { 2700 | "currencyCode": "IDR", 2701 | "value": "-1053698.77", 2702 | "valueInBaseUnits": -105369877 2703 | }, 2704 | "cardPurchaseMethod": { 2705 | "method": "CARD_ON_FILE", 2706 | "cardNumberSuffix": "0001" 2707 | }, 2708 | "settledAt": "2024-08-03T04:00:00+10:00", 2709 | "createdAt": "2024-08-03T04:00:00+10:00", 2710 | "transactionType": null, 2711 | "note": null, 2712 | "performingCustomer": { 2713 | "displayName": "Bobby" 2714 | } 2715 | }, 2716 | "relationships": { 2717 | "account": { 2718 | "data": { 2719 | "type": "accounts", 2720 | "id": "20388753-0ba8-46ab-92f8-d186a9b3e2a8" 2721 | }, 2722 | "links": { 2723 | "related": "https://api.up.com.au/api/v1/accounts/20388753-0ba8-46ab-92f8-d186a9b3e2a8" 2724 | } 2725 | }, 2726 | "transferAccount": { 2727 | "data": null 2728 | }, 2729 | "category": { 2730 | "data": null, 2731 | "links": { 2732 | "self": "https://api.up.com.au/api/v1/transactions/20f1a541-356b-4363-aeba-18e21661b8e5/relationships/category" 2733 | } 2734 | }, 2735 | "parentCategory": { 2736 | "data": null 2737 | }, 2738 | "tags": { 2739 | "data": [], 2740 | "links": { 2741 | "self": "https://api.up.com.au/api/v1/transactions/20f1a541-356b-4363-aeba-18e21661b8e5/relationships/tags" 2742 | } 2743 | }, 2744 | "attachment": { 2745 | "data": null 2746 | } 2747 | }, 2748 | "links": { 2749 | "self": "https://api.up.com.au/api/v1/transactions/20f1a541-356b-4363-aeba-18e21661b8e5" 2750 | } 2751 | } 2752 | } 2753 | } 2754 | } 2755 | } 2756 | } 2757 | }, 2758 | "/accounts/{accountId}/transactions": { 2759 | "get": { 2760 | "tags": ["Transactions"], 2761 | "summary": "List transactions by account", 2762 | "description": "Retrieve a list of all transactions for a specific account. The returned\nlist is [paginated](#pagination) and can be scrolled by following the\n`next` and `prev` links where present. To narrow the results to a\nspecific date range pass one or both of `filter[since]` and\n`filter[until]` in the query string. These filter parameters\n**should not** be used for pagination. Results are ordered newest first\nto oldest last.\n", 2763 | "parameters": [ 2764 | { 2765 | "name": "accountId", 2766 | "in": "path", 2767 | "schema": { 2768 | "type": "string" 2769 | }, 2770 | "required": true, 2771 | "example": "689a08de-fa65-4f2d-8b58-e49b17117dc7", 2772 | "description": "The unique identifier for the account.\n" 2773 | }, 2774 | { 2775 | "name": "page[size]", 2776 | "in": "query", 2777 | "schema": { 2778 | "type": "integer" 2779 | }, 2780 | "required": false, 2781 | "example": 30, 2782 | "description": "The number of records to return in each page.\n" 2783 | }, 2784 | { 2785 | "name": "filter[status]", 2786 | "in": "query", 2787 | "schema": { 2788 | "$ref": "#/components/schemas/TransactionStatusEnum" 2789 | }, 2790 | "required": false, 2791 | "example": "HELD", 2792 | "description": "The transaction status for which to return records. This\ncan be used to filter `HELD` transactions from those\nthat are `SETTLED`.\n" 2793 | }, 2794 | { 2795 | "name": "filter[since]", 2796 | "in": "query", 2797 | "schema": { 2798 | "type": "string", 2799 | "format": "date-time" 2800 | }, 2801 | "required": false, 2802 | "example": "2020-01-01T01:02:03+10:00", 2803 | "description": "The start date-time from which to return records,\nformatted according to rfc-3339. Not to be used for\npagination purposes.\n" 2804 | }, 2805 | { 2806 | "name": "filter[until]", 2807 | "in": "query", 2808 | "schema": { 2809 | "type": "string", 2810 | "format": "date-time" 2811 | }, 2812 | "required": false, 2813 | "example": "2020-02-01T01:02:03+10:00", 2814 | "description": "The end date-time up to which to return records,\nformatted according to rfc-3339. Not to be used for\npagination purposes.\n" 2815 | }, 2816 | { 2817 | "name": "filter[category]", 2818 | "in": "query", 2819 | "schema": { 2820 | "type": "string" 2821 | }, 2822 | "required": false, 2823 | "example": "good-life", 2824 | "description": "The category identifier for which to filter transactions.\nBoth parent and child categories can be filtered through\nthis parameter. Providing an invalid category identifier\nresults in a `404` response.\n" 2825 | }, 2826 | { 2827 | "name": "filter[tag]", 2828 | "in": "query", 2829 | "schema": { 2830 | "type": "string" 2831 | }, 2832 | "required": false, 2833 | "example": "Holiday", 2834 | "description": "A transaction tag to filter for which to return records.\nIf the tag does not exist, zero records are returned and\na success response is given.\n" 2835 | } 2836 | ], 2837 | "responses": { 2838 | "200": { 2839 | "description": "Successful Response", 2840 | "content": { 2841 | "application/json": { 2842 | "schema": { 2843 | "$ref": "#/components/schemas/ListTransactionsResponse" 2844 | } 2845 | } 2846 | }, 2847 | "x-up:example": { 2848 | "type": "exampleRequestResponse", 2849 | "request": { 2850 | "headers": { 2851 | "Authorization": "Bearer up:demo:k6Zc7WP5K3WuBcLc" 2852 | }, 2853 | "pathParameters": { 2854 | "accountId": "bccfbe8a-8d06-415d-b6fb-9f4e4507a3c2" 2855 | }, 2856 | "queryParameters": { 2857 | "page[size]": 1, 2858 | "filter[status]": "HELD", 2859 | "filter[category]": "good-life" 2860 | }, 2861 | "payload": null 2862 | }, 2863 | "response": { 2864 | "data": [ 2865 | { 2866 | "type": "transactions", 2867 | "id": "08e78dd1-539c-40cc-a124-2af02e078d20", 2868 | "attributes": { 2869 | "status": "HELD", 2870 | "rawText": "Spotify 0123456789", 2871 | "description": "Spotify", 2872 | "message": null, 2873 | "isCategorizable": true, 2874 | "holdInfo": { 2875 | "amount": { 2876 | "currencyCode": "AUD", 2877 | "value": "-11.95", 2878 | "valueInBaseUnits": -1195 2879 | }, 2880 | "foreignAmount": null 2881 | }, 2882 | "roundUp": null, 2883 | "cashback": null, 2884 | "amount": { 2885 | "currencyCode": "AUD", 2886 | "value": "-11.95", 2887 | "valueInBaseUnits": -1195 2888 | }, 2889 | "foreignAmount": null, 2890 | "cardPurchaseMethod": null, 2891 | "settledAt": null, 2892 | "createdAt": "2024-08-03T08:09:59+10:00", 2893 | "transactionType": null, 2894 | "note": null, 2895 | "performingCustomer": { 2896 | "displayName": "Bobby" 2897 | } 2898 | }, 2899 | "relationships": { 2900 | "account": { 2901 | "data": { 2902 | "type": "accounts", 2903 | "id": "bccfbe8a-8d06-415d-b6fb-9f4e4507a3c2" 2904 | }, 2905 | "links": { 2906 | "related": "https://api.up.com.au/api/v1/accounts/bccfbe8a-8d06-415d-b6fb-9f4e4507a3c2" 2907 | } 2908 | }, 2909 | "transferAccount": { 2910 | "data": null 2911 | }, 2912 | "category": { 2913 | "data": { 2914 | "type": "categories", 2915 | "id": "tv-and-music" 2916 | }, 2917 | "links": { 2918 | "self": "https://api.up.com.au/api/v1/transactions/08e78dd1-539c-40cc-a124-2af02e078d20/relationships/category", 2919 | "related": "https://api.up.com.au/api/v1/categories/tv-and-music" 2920 | } 2921 | }, 2922 | "parentCategory": { 2923 | "data": { 2924 | "type": "categories", 2925 | "id": "good-life" 2926 | }, 2927 | "links": { 2928 | "related": "https://api.up.com.au/api/v1/categories/good-life" 2929 | } 2930 | }, 2931 | "tags": { 2932 | "data": [], 2933 | "links": { 2934 | "self": "https://api.up.com.au/api/v1/transactions/08e78dd1-539c-40cc-a124-2af02e078d20/relationships/tags" 2935 | } 2936 | }, 2937 | "attachment": { 2938 | "data": null 2939 | } 2940 | }, 2941 | "links": { 2942 | "self": "https://api.up.com.au/api/v1/transactions/08e78dd1-539c-40cc-a124-2af02e078d20" 2943 | } 2944 | } 2945 | ], 2946 | "links": { 2947 | "prev": null, 2948 | "next": null 2949 | } 2950 | } 2951 | } 2952 | } 2953 | } 2954 | } 2955 | }, 2956 | "/webhooks": { 2957 | "get": { 2958 | "tags": ["Webhooks"], 2959 | "summary": "List webhooks", 2960 | "description": "Retrieve a list of configured webhooks. The returned list is\n[paginated](#pagination) and can be scrolled by following the `next`\nand `prev` links where present. Results are ordered oldest first to\nnewest last.\n", 2961 | "parameters": [ 2962 | { 2963 | "name": "page[size]", 2964 | "in": "query", 2965 | "schema": { 2966 | "type": "integer" 2967 | }, 2968 | "required": false, 2969 | "example": 30, 2970 | "description": "The number of records to return in each page.\n" 2971 | } 2972 | ], 2973 | "responses": { 2974 | "200": { 2975 | "description": "Successful Response", 2976 | "content": { 2977 | "application/json": { 2978 | "schema": { 2979 | "$ref": "#/components/schemas/ListWebhooksResponse" 2980 | } 2981 | } 2982 | }, 2983 | "x-up:example": { 2984 | "type": "exampleRequestResponse", 2985 | "request": { 2986 | "headers": { 2987 | "Authorization": "Bearer up:demo:sGbPklakZzGRpyN8" 2988 | }, 2989 | "pathParameters": {}, 2990 | "queryParameters": { 2991 | "page[size]": 1 2992 | }, 2993 | "payload": null 2994 | }, 2995 | "response": { 2996 | "data": [ 2997 | { 2998 | "type": "webhooks", 2999 | "id": "906ffa4f-9ce2-4e24-838b-c0f2ac1941d9", 3000 | "attributes": { 3001 | "url": "http://example.com/webhook-1", 3002 | "description": "Webhook number 1", 3003 | "createdAt": "2024-08-04T12:19:01+10:00" 3004 | }, 3005 | "relationships": { 3006 | "logs": { 3007 | "links": { 3008 | "related": "https://api.up.com.au/api/v1/webhooks/906ffa4f-9ce2-4e24-838b-c0f2ac1941d9/logs" 3009 | } 3010 | } 3011 | }, 3012 | "links": { 3013 | "self": "https://api.up.com.au/api/v1/webhooks/906ffa4f-9ce2-4e24-838b-c0f2ac1941d9" 3014 | } 3015 | } 3016 | ], 3017 | "links": { 3018 | "prev": null, 3019 | "next": "https://api.up.com.au/api/v1/webhooks?page%5Bafter%5D=WyIyMDI0LTA4LTA0VDAyOjE5OjAxLjE3MDA3ODAwMFoiLCI5MDZmZmE0Zi05Y2UyLTRlMjQtODM4Yi1jMGYyYWMxOTQxZDkiXQ%3D%3D&page%5Bsize%5D=1" 3020 | } 3021 | } 3022 | } 3023 | } 3024 | } 3025 | }, 3026 | "post": { 3027 | "tags": ["Webhooks"], 3028 | "summary": "Create webhook", 3029 | "description": "Create a new webhook with a given URL. The URL will receive webhook\nevents as JSON-encoded `POST` requests. The URL must respond with a HTTP\n`200` status on success.\n\nThere is currently a limit of 10 webhooks at any given time. Once this\nlimit is reached, existing webhooks will need to be deleted before new\nwebhooks can be created.\n\nEvent delivery is retried with exponential backoff if the URL is\nunreachable or it does not respond with a `200` status. The response\nincludes a `secretKey` attribute, which is used to sign requests sent to\nthe webhook URL. It will not be returned from any other endpoints within\nthe Up API. If the `secretKey` is lost, simply create a new webhook with\nthe same URL, capture its `secretKey` and then delete the original\nwebhook. See [Handling webhook events](#callback_post_webhookURL) for\ndetails on how to process webhook events.\n\nIt is probably a good idea to test the webhook by\n[sending it a `PING` event](#post_webhooks_webhookId_ping) after creating\nit.\n", 3030 | "requestBody": { 3031 | "content": { 3032 | "application/json": { 3033 | "schema": { 3034 | "$ref": "#/components/schemas/CreateWebhookRequest" 3035 | } 3036 | } 3037 | } 3038 | }, 3039 | "responses": { 3040 | "201": { 3041 | "description": "Created", 3042 | "content": { 3043 | "application/json": { 3044 | "schema": { 3045 | "$ref": "#/components/schemas/CreateWebhookResponse" 3046 | } 3047 | } 3048 | }, 3049 | "x-up:example": { 3050 | "type": "exampleRequestResponse", 3051 | "request": { 3052 | "headers": { 3053 | "Authorization": "Bearer up:demo:Ai3k0uTDg9UbsMSn", 3054 | "Content-Type": "application/json" 3055 | }, 3056 | "pathParameters": {}, 3057 | "queryParameters": {}, 3058 | "payload": { 3059 | "data": { 3060 | "attributes": { 3061 | "url": "http://example.com/webhook", 3062 | "description": "Example webhook" 3063 | } 3064 | } 3065 | } 3066 | }, 3067 | "response": { 3068 | "data": { 3069 | "type": "webhooks", 3070 | "id": "e1dc11ce-c175-4c43-a969-6f8ffc8adc5b", 3071 | "attributes": { 3072 | "url": "http://example.com/webhook", 3073 | "description": "Example webhook", 3074 | "secretKey": "EIY19vc8Z7n4Ub58Ex13RxKfsnLyZ6pwwT6wyuv4WboOgvA3xW33BZpkxLDb5hfQ", 3075 | "createdAt": "2024-08-06T12:19:01+10:00" 3076 | }, 3077 | "relationships": { 3078 | "logs": { 3079 | "links": { 3080 | "related": "https://api.up.com.au/api/v1/webhooks/e1dc11ce-c175-4c43-a969-6f8ffc8adc5b/logs" 3081 | } 3082 | } 3083 | }, 3084 | "links": { 3085 | "self": "https://api.up.com.au/api/v1/webhooks/e1dc11ce-c175-4c43-a969-6f8ffc8adc5b" 3086 | } 3087 | } 3088 | } 3089 | } 3090 | } 3091 | }, 3092 | "callbacks": { 3093 | "Event": { 3094 | "{webhookURL}": { 3095 | "post": { 3096 | "summary": "Handling webhook events", 3097 | "description": "Once you have created a webhook in the Up API, events are sent to the\nwebhook’s configured URL as JSON-encoded `POST` requests. The webhook\nURL must respond with a HTTP `200` status on success.\n\nIt is important that the URL responds in a timely manner. If the URL\ntakes too long to respond (currently 30s), the request will be timed\nout. For this reason it is strongly advised to avoid any heavy\nprocessing before a response has been returned from the URL. A common\nsolution to this problem is to use a message broker such as RabbitMQ\nto do the work asynchronously.\n\nEvent delivery is retried with exponential backoff in the case of any\nnon-`200` response status, if the URL is unreachable, or if the request\nis timed out.\n\nRefer to the `eventType` attribute in order to determine what course of\naction to take when handling the event. The following event types are\ncurrently sent:\n\n**`PING`**\n\nManually triggered by calls to the webhook `ping` endpoint. Used for\ntesting and debugging purposes.\n\n**`TRANSACTION_CREATED`**\n\nTriggered whenever a new transaction is created in Up. This event\nincludes a `transaction` relationship that provides the unique\nidentifier for the transaction and a link to the transaction within the\nUp API. This link should be used to retrieve the complete transaction\ndata.\n\n**`TRANSACTION_SETTLED`**\n\nTriggered whenever a transaction transitions from the `HELD` status to\nthe `SETTLED` status. This event includes a `transaction` relationship\nthat provides the unique identifier for the transaction and a link to\nthe transaction within the Up API. This link should be used to retrieve\nthe complete transaction data.\n\nDue to external factors in banking processes, on rare occasions this\nevent may not be triggered. Separate `TRANSACTION_DELETED` and\n`TRANSACTION_CREATED` events will be received in its place.\n\n**`TRANSACTION_DELETED`**\n\nTriggered whenever a `HELD` transaction is deleted from Up. This\ngenerally occurs for example when a hotel deposit is returned. This\nevent includes a `transaction` relationship that provides the unique\nidentifier for the transaction, however no link is provided to the\ntransaction within the Up API as it no longer exists.\n\n## Securing Webhook Event Handlers\n\nIncoming webhook event requests include a `X-Up-Authenticity-Signature`\nheader, which can be used to verify that the event was sent by Up.\nVerification of the signature requires knowledge of the shared\n`secretKey` that was returned upon creation of the webhook. This key is\nknown only to your application and to Up.\n\nThe verification process involves:\n\n1. Taking the raw, unparsed webhook event request body.\n2. Computing the SHA-256 HMAC signature of the request body, using the\n shared `secretKey`.\n3. Comparing the computed HMAC signature with the value of the\n `X-Up-Authenticity-Signature` header.\n\nIf the computed SHA-256 HMAC signature matches the\n`X-Up-Authenticity-Signature` header, the request is valid.\n\nA few language-specific examples follow.\n\n**Ruby**:\n\nThis example uses the Ruby on Rails framework.\n\n```ruby\nrequire 'openssl'\n\ndef handle_webhook_event\n received_signature =\n request.headers['X-Up-Authenticity-Signature']\n\n signature = OpenSSL::HMAC.hexdigest(\n 'SHA256',\n secret_key,\n request.raw_post,\n )\n\n if Rack::Utils.secure_compare(received_signature, signature)\n # Process webhook event\n end\nend\n```\n\n**PHP**:\n\nThis example uses the Laravel framework.\n\n```php\npublic function handleWebhookEvent(Request $request) {\n $received_signature = $request->header(\n 'X-Up-Authenticity-Signature',\n ''\n );\n $raw_body = $request->getContent();\n $signature = hash_hmac('sha256', $raw_body, $this->secretKey);\n\n if (hash_equals($signature, $received_signature)) {\n // Process webhook event\n }\n}\n```\n\n**Go**:\n\nThis example is in plain Go.\n\n```go\nimport (\n \"crypto/hmac\"\n \"crypto/sha256\"\n \"encoding/hex\"\n \"io\"\n \"net/http\"\n)\n\nfunc handleWebhookEvent(w http.ResponseWriter, r *http.Request) {\n receivedSignature, _ := hex.DecodeString(\n r.Header.Get(\"X-Up-Authenticity-Signature\"),\n )\n\n mac := hmac.New(sha256.New, secretKey)\n io.Copy(mac, r.Body)\n signature := mac.Sum(nil)\n\n if hmac.Equal(signature, receivedSignature)\n // Process webhook event\n }\n}\n```\n\nIf the `secretKey` for a webhook is lost, simply create a new webhook\nwith the same URL, capture the returned `secretKey` and delete the\noriginal webhook.\n", 3098 | "parameters": [ 3099 | { 3100 | "name": "X-Up-Authenticity-Signature", 3101 | "in": "header", 3102 | "schema": { 3103 | "type": "string" 3104 | }, 3105 | "required": false, 3106 | "example": "317c0a8ea81df3f53c1d2aef5dcbf60492d0df557197b2990e71daa4a0693364", 3107 | "description": "The SHA-256 HMAC signature of the raw request body, signed using\nthe `secretKey` of the webhook.\n" 3108 | } 3109 | ], 3110 | "requestBody": { 3111 | "content": { 3112 | "application/json": { 3113 | "schema": { 3114 | "$ref": "#/components/schemas/WebhookEventCallback" 3115 | } 3116 | } 3117 | } 3118 | }, 3119 | "responses": { 3120 | "200": { 3121 | "description": "Successful Response" 3122 | } 3123 | }, 3124 | "x-up:example": { 3125 | "type": "examplePayload", 3126 | "payload": { 3127 | "data": { 3128 | "type": "webhook-events", 3129 | "id": "32e730bd-752d-4ae8-a8e2-bab115c72b6d", 3130 | "attributes": { 3131 | "eventType": "TRANSACTION_CREATED", 3132 | "createdAt": "2024-08-06T12:19:02+10:00" 3133 | }, 3134 | "relationships": { 3135 | "webhook": { 3136 | "data": { 3137 | "type": "webhooks", 3138 | "id": "135017b5-2585-4564-ac7d-040043d51667" 3139 | }, 3140 | "links": { 3141 | "related": "https://api.up.com.au/api/v1/webhooks/135017b5-2585-4564-ac7d-040043d51667" 3142 | } 3143 | }, 3144 | "transaction": { 3145 | "data": { 3146 | "type": "transactions", 3147 | "id": "516f5342-2d25-47b1-a46c-40466ddae069" 3148 | }, 3149 | "links": { 3150 | "related": "https://api.up.com.au/api/v1/transactions/516f5342-2d25-47b1-a46c-40466ddae069" 3151 | } 3152 | } 3153 | } 3154 | } 3155 | } 3156 | } 3157 | } 3158 | } 3159 | } 3160 | } 3161 | } 3162 | }, 3163 | "/webhooks/{id}": { 3164 | "get": { 3165 | "tags": ["Webhooks"], 3166 | "summary": "Retrieve webhook", 3167 | "description": "Retrieve a specific webhook by providing its unique identifier.\n", 3168 | "parameters": [ 3169 | { 3170 | "name": "id", 3171 | "in": "path", 3172 | "schema": { 3173 | "type": "string" 3174 | }, 3175 | "required": true, 3176 | "example": "48984142-bb60-4fd9-8db2-ed72cfc2a0ba", 3177 | "description": "The unique identifier for the webhook.\n" 3178 | } 3179 | ], 3180 | "responses": { 3181 | "200": { 3182 | "description": "Successful Response", 3183 | "content": { 3184 | "application/json": { 3185 | "schema": { 3186 | "$ref": "#/components/schemas/GetWebhookResponse" 3187 | } 3188 | } 3189 | }, 3190 | "x-up:example": { 3191 | "type": "exampleRequestResponse", 3192 | "request": { 3193 | "headers": { 3194 | "Authorization": "Bearer up:demo:Jdn3RtGUFDxYfTkp" 3195 | }, 3196 | "pathParameters": { 3197 | "id": "362f41e4-c750-40ed-8bec-73ecca1e65e1" 3198 | }, 3199 | "queryParameters": {}, 3200 | "payload": null 3201 | }, 3202 | "response": { 3203 | "data": { 3204 | "type": "webhooks", 3205 | "id": "362f41e4-c750-40ed-8bec-73ecca1e65e1", 3206 | "attributes": { 3207 | "url": "http://example.com/webhook-2", 3208 | "description": "Webhook number 2", 3209 | "createdAt": "2024-08-05T12:19:03+10:00" 3210 | }, 3211 | "relationships": { 3212 | "logs": { 3213 | "links": { 3214 | "related": "https://api.up.com.au/api/v1/webhooks/362f41e4-c750-40ed-8bec-73ecca1e65e1/logs" 3215 | } 3216 | } 3217 | }, 3218 | "links": { 3219 | "self": "https://api.up.com.au/api/v1/webhooks/362f41e4-c750-40ed-8bec-73ecca1e65e1" 3220 | } 3221 | } 3222 | } 3223 | } 3224 | } 3225 | } 3226 | }, 3227 | "delete": { 3228 | "tags": ["Webhooks"], 3229 | "summary": "Delete webhook", 3230 | "description": "Delete a specific webhook by providing its unique identifier. Once\ndeleted, webhook events will no longer be sent to the configured URL.\n", 3231 | "parameters": [ 3232 | { 3233 | "name": "id", 3234 | "in": "path", 3235 | "schema": { 3236 | "type": "string" 3237 | }, 3238 | "required": true, 3239 | "example": "be530308-60e2-489b-9c73-ab0db6fd132d", 3240 | "description": "The unique identifier for the webhook.\n" 3241 | } 3242 | ], 3243 | "responses": { 3244 | "204": { 3245 | "description": "Deleted", 3246 | "x-up:example": { 3247 | "type": "exampleRequestResponse", 3248 | "request": { 3249 | "headers": { 3250 | "Authorization": "Bearer up:demo:AICm0MfozWEhnfci" 3251 | }, 3252 | "pathParameters": { 3253 | "id": "daf513b4-7c2c-441b-a77c-3b2b63f260f9" 3254 | }, 3255 | "queryParameters": {}, 3256 | "payload": null 3257 | }, 3258 | "response": null 3259 | } 3260 | } 3261 | } 3262 | } 3263 | }, 3264 | "/webhooks/{webhookId}/ping": { 3265 | "post": { 3266 | "tags": ["Webhooks"], 3267 | "summary": "Ping webhook", 3268 | "description": "Send a `PING` event to a webhook by providing its unique identifier.\nThis is useful for testing and debugging purposes. The event is delivered\nasynchronously and its data is returned in the response to this request.\n", 3269 | "parameters": [ 3270 | { 3271 | "name": "webhookId", 3272 | "in": "path", 3273 | "schema": { 3274 | "type": "string" 3275 | }, 3276 | "required": true, 3277 | "example": "ca59a175-79fa-4467-867f-b0cf582ee6bd", 3278 | "description": "The unique identifier for the webhook.\n" 3279 | } 3280 | ], 3281 | "responses": { 3282 | "201": { 3283 | "description": "Successful response", 3284 | "content": { 3285 | "application/json": { 3286 | "schema": { 3287 | "$ref": "#/components/schemas/WebhookEventCallback" 3288 | } 3289 | } 3290 | }, 3291 | "x-up:example": { 3292 | "type": "exampleRequestResponse", 3293 | "request": { 3294 | "headers": { 3295 | "Authorization": "Bearer up:demo:3aQCtgODipPleMHV", 3296 | "Content-Type": "application/json" 3297 | }, 3298 | "pathParameters": { 3299 | "webhookId": "2649c1f0-b03b-4c21-bb85-331d53644305" 3300 | }, 3301 | "queryParameters": {}, 3302 | "payload": "" 3303 | }, 3304 | "response": { 3305 | "data": { 3306 | "type": "webhook-events", 3307 | "id": "973606bb-ad40-426d-9bd8-d76ab70cd038", 3308 | "attributes": { 3309 | "eventType": "PING", 3310 | "createdAt": "2024-08-06T12:19:06+10:00" 3311 | }, 3312 | "relationships": { 3313 | "webhook": { 3314 | "data": { 3315 | "type": "webhooks", 3316 | "id": "2649c1f0-b03b-4c21-bb85-331d53644305" 3317 | }, 3318 | "links": { 3319 | "related": "https://api.up.com.au/api/v1/webhooks/2649c1f0-b03b-4c21-bb85-331d53644305" 3320 | } 3321 | } 3322 | } 3323 | } 3324 | } 3325 | } 3326 | } 3327 | } 3328 | } 3329 | }, 3330 | "/webhooks/{webhookId}/logs": { 3331 | "get": { 3332 | "tags": ["Webhooks"], 3333 | "summary": "List webhook logs", 3334 | "description": "Retrieve a list of delivery logs for a webhook by providing its unique\nidentifier. This is useful for analysis and debugging purposes. The\nreturned list is [paginated](#pagination) and can be scrolled by\nfollowing the `next` and `prev` links where present. Results are ordered\nnewest first to oldest last. Logs may be automatically purged after a\nperiod of time.\n", 3335 | "parameters": [ 3336 | { 3337 | "name": "webhookId", 3338 | "in": "path", 3339 | "schema": { 3340 | "type": "string" 3341 | }, 3342 | "required": true, 3343 | "example": "e579c0fe-62e7-47de-b436-4b1dfe110b35", 3344 | "description": "The unique identifier for the webhook.\n" 3345 | }, 3346 | { 3347 | "name": "page[size]", 3348 | "in": "query", 3349 | "schema": { 3350 | "type": "integer" 3351 | }, 3352 | "required": false, 3353 | "example": 30, 3354 | "description": "The number of records to return in each page.\n" 3355 | } 3356 | ], 3357 | "responses": { 3358 | "200": { 3359 | "description": "Successful response", 3360 | "content": { 3361 | "application/json": { 3362 | "schema": { 3363 | "$ref": "#/components/schemas/ListWebhookDeliveryLogsResponse" 3364 | } 3365 | } 3366 | }, 3367 | "x-up:example": { 3368 | "type": "exampleRequestResponse", 3369 | "request": { 3370 | "headers": { 3371 | "Authorization": "Bearer up:demo:jzQH9GsHMtCmwyr8" 3372 | }, 3373 | "pathParameters": { 3374 | "webhookId": "cce901e8-e10b-4d4d-a615-f1902e4736d4" 3375 | }, 3376 | "queryParameters": { 3377 | "page[size]": 1 3378 | }, 3379 | "payload": null 3380 | }, 3381 | "response": { 3382 | "data": [ 3383 | { 3384 | "type": "webhook-delivery-logs", 3385 | "id": "03743de3-1dc8-4893-b1b0-86ab5d613c5b", 3386 | "attributes": { 3387 | "request": { 3388 | "body": "{\"data\":{\"type\":\"webhook-events\",\"id\":\"011308c1-861c-4d04-ba85-f867eadf202d\",\"attributes\":{\"eventType\":\"TRANSACTION_CREATED\",\"createdAt\":\"2024-08-05T12:20:07+10:00\"},\"relationships\":{\"webhook\":{\"data\":{\"type\":\"webhooks\",\"id\":\"cce901e8-e10b-4d4d-a615-f1902e4736d4\"},\"links\":{\"related\":\"https://api.up.com.au/api/v1/webhooks/cce901e8-e10b-4d4d-a615-f1902e4736d4\"}},\"transaction\":{\"data\":{\"type\":\"transactions\",\"id\":\"169c1684-45c7-41c1-95fa-97082b319e6c\"},\"links\":{\"related\":\"https://api.up.com.au/api/v1/transactions/169c1684-45c7-41c1-95fa-97082b319e6c\"}}}}}" 3389 | }, 3390 | "response": { 3391 | "statusCode": 200, 3392 | "body": "{\"ok\":true}" 3393 | }, 3394 | "deliveryStatus": "DELIVERED", 3395 | "createdAt": "2024-08-05T12:20:07+10:00" 3396 | }, 3397 | "relationships": { 3398 | "webhookEvent": { 3399 | "data": { 3400 | "type": "webhook-events", 3401 | "id": "011308c1-861c-4d04-ba85-f867eadf202d" 3402 | } 3403 | } 3404 | } 3405 | } 3406 | ], 3407 | "links": { 3408 | "prev": null, 3409 | "next": "https://api.up.com.au/api/v1/webhooks/cce901e8-e10b-4d4d-a615-f1902e4736d4/logs?page%5Bafter%5D=WyIyMDI0LTA4LTA1VDAyOjIwOjA3Ljk2MjMzODAwMFoiLCIwMzc0M2RlMy0xZGM4LTQ4OTMtYjFiMC04NmFiNWQ2MTNjNWIiXQ%3D%3D&page%5Bsize%5D=1" 3410 | } 3411 | } 3412 | } 3413 | } 3414 | } 3415 | } 3416 | } 3417 | } 3418 | } 3419 | --------------------------------------------------------------------------------