├── 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 |

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 |
--------------------------------------------------------------------------------