diff --git a/independent-publisher-connectors/You Need A Budget/apiDefinition.swagger.json b/independent-publisher-connectors/You Need A Budget/apiDefinition.swagger.json
new file mode 100644
index 000000000..398fcde66
--- /dev/null
+++ b/independent-publisher-connectors/You Need A Budget/apiDefinition.swagger.json
@@ -0,0 +1,4121 @@
+{
+ "swagger": "2.0",
+ "info": {
+ "version": "1.0.0",
+ "title": "You Need A Budget",
+ "description": "You Need A Budget (YNAB) allows you to build a personal application to interact with your own budget or build an application that any other YNABer can authorize and use.",
+ "contact": {
+ "name": "Troy Taylor",
+ "url": "https://www.hitachisolutions.com",
+ "email": "ttaylor@hitachisolutions.com"
+ }
+ },
+ "host": "api.youneedabudget.com",
+ "basePath": "/v1",
+ "securityDefinitions": {
+ "API Key": {
+ "type": "apiKey",
+ "in": "header",
+ "name": "Authorization"
+ }
+ },
+ "schemes": [
+ "https"
+ ],
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "paths": {
+ "/user": {
+ "get": {
+ "description": "Returns authenticated user information.",
+ "summary": "Get user",
+ "tags": [
+ "User"
+ ],
+ "operationId": "GetUser",
+ "parameters": [],
+ "responses": {
+ "200": {
+ "description": "The user info.",
+ "schema": {
+ "$ref": "#/definitions/UserResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets": {
+ "get": {
+ "description": "Returns budgets list with summary information.",
+ "summary": "Get budgets",
+ "tags": [
+ "Budgets"
+ ],
+ "operationId": "GetBudgets",
+ "parameters": [
+ {
+ "name": "include_accounts",
+ "in": "query",
+ "x-ms-summary": "Include Accounts",
+ "required": false,
+ "type": "boolean",
+ "description": "Whether to include the list of budget accounts."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The list of budgets.",
+ "schema": {
+ "$ref": "#/definitions/BudgetSummaryResponse"
+ }
+ },
+ "404": {
+ "description": "No budgets were found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}": {
+ "get": {
+ "description": "Returns a single budget with all related entities. This resource is effectively a full budget export.",
+ "summary": "Get budget by ID",
+ "tags": [
+ "Budgets"
+ ],
+ "operationId": "GetBudgetById",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget."
+ },
+ {
+ "name": "last_knowledge_of_server",
+ "in": "query",
+ "x-ms-summary": "Last Knowledge of Server",
+ "required": false,
+ "type": "integer",
+ "format": "int64",
+ "description": "The starting server knowledge. If provided, only entities that have changed since `last_knowledge_of_server` will be included."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The requested budget.",
+ "schema": {
+ "$ref": "#/definitions/BudgetDetailResponse"
+ }
+ },
+ "404": {
+ "description": "The specified budget was not found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/settings": {
+ "get": {
+ "description": "Returns settings for a budget",
+ "summary": "Get budget settings by ID",
+ "tags": [
+ "Budgets"
+ ],
+ "operationId": "GetBudgetSettingsById",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The requested budget settings.",
+ "schema": {
+ "$ref": "#/definitions/BudgetSettingsResponse"
+ }
+ },
+ "404": {
+ "description": "The specified Budget was not found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/accounts": {
+ "get": {
+ "description": "Returns all accounts.",
+ "summary": "Get accounts",
+ "tags": [
+ "Accounts"
+ ],
+ "operationId": "GetAccounts",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "last_knowledge_of_server",
+ "in": "query",
+ "x-ms-summary": "Last Knowledge of Server",
+ "required": false,
+ "type": "integer",
+ "format": "int64",
+ "description": "The starting server knowledge. If provided, only entities that have changed since `last_knowledge_of_server` will be included."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The list of requested accounts.",
+ "schema": {
+ "$ref": "#/definitions/AccountsResponse"
+ }
+ },
+ "404": {
+ "description": "No accounts were found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ },
+ "post": {
+ "description": "Creates a new account.",
+ "summary": "Create account",
+ "tags": [
+ "Accounts"
+ ],
+ "operationId": "CreateAccount",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget (\"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)"
+ },
+ {
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "description": "The account to create.",
+ "schema": {
+ "$ref": "#/definitions/SaveAccountWrapper"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "The account was successfully created.",
+ "schema": {
+ "$ref": "#/definitions/AccountResponse"
+ }
+ },
+ "400": {
+ "description": "The request could not be understood due to malformed syntax or validation error(s).",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/accounts/{account_id}": {
+ "get": {
+ "description": "Returns a single account.",
+ "summary": "Get account by ID",
+ "tags": [
+ "Accounts"
+ ],
+ "operationId": "GetAccountById",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "account_id",
+ "in": "path",
+ "x-ms-summary": "Account ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "format": "uuid",
+ "description": "The identifier of the account."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The requested account.",
+ "schema": {
+ "$ref": "#/definitions/AccountResponse"
+ }
+ },
+ "404": {
+ "description": "The requested account was not found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/categories": {
+ "get": {
+ "description": "Returns all categories grouped by category group. Amounts (budgeted, activity, balance, etc.) are specific to the current budget month (UTC).",
+ "summary": "Get categories",
+ "tags": [
+ "Categories"
+ ],
+ "operationId": "GetCategories",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "last_knowledge_of_server",
+ "in": "query",
+ "x-ms-summary": "Last Knowledge of Server",
+ "required": false,
+ "type": "integer",
+ "format": "int64",
+ "description": "The starting server knowledge. If provided, only entities that have changed since `last_knowledge_of_server` will be included."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The categories grouped by category group.",
+ "schema": {
+ "$ref": "#/definitions/CategoriesResponse"
+ }
+ },
+ "404": {
+ "description": "No categories were found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/categories/{category_id}": {
+ "get": {
+ "description": "Returns a single category. Amounts (budgeted, activity, balance, etc.) are specific to the current budget month (UTC).",
+ "summary": "Get Category by ID",
+ "tags": [
+ "Categories"
+ ],
+ "operationId": "GetCategoryById",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "category_id",
+ "in": "path",
+ "x-ms-summary": "Category ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the category."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The requested category.",
+ "schema": {
+ "$ref": "#/definitions/CategoryResponse"
+ }
+ },
+ "404": {
+ "description": "The category not was found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/months/{month}/categories/{category_id}": {
+ "get": {
+ "description": "Returns a single category for a specific budget month. Amounts (budgeted, activity, balance, etc.) are specific to the current budget month (UTC).",
+ "summary": "Get month category by ID",
+ "tags": [
+ "Categories"
+ ],
+ "operationId": "GetMonthCategoryById",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "month",
+ "in": "path",
+ "x-ms-summary": "Month",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "format": "date",
+ "description": "The budget month in ISO format (e.g. 2016-12-01). (\"current\" can also be used to specify the current calendar month (UTC))"
+ },
+ {
+ "name": "category_id",
+ "in": "path",
+ "x-ms-summary": "Category ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the category."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The requested month category.",
+ "schema": {
+ "$ref": "#/definitions/CategoryResponse"
+ }
+ },
+ "404": {
+ "description": "The month category was not was found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ },
+ "patch": {
+ "description": "Update a category for a specific month. Only `budgeted` amount can be updated.",
+ "summary": "Update month category",
+ "tags": [
+ "Categories"
+ ],
+ "operationId": "UpdateMonthCategory",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "month",
+ "in": "path",
+ "x-ms-summary": "Month",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "format": "date",
+ "description": "The budget month in ISO format (e.g. 2016-12-01). (\"current\" can also be used to specify the current calendar month (UTC))"
+ },
+ {
+ "name": "category_id",
+ "in": "path",
+ "x-ms-summary": "Category ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the category."
+ },
+ {
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "description": "The category to update. Only `budgeted` amount can be updated and any other fields specified will be ignored.",
+ "schema": {
+ "$ref": "#/definitions/SaveMonthCategoryWrapper"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The month category was successfully updated.",
+ "schema": {
+ "$ref": "#/definitions/SaveCategoryResponse"
+ }
+ },
+ "400": {
+ "description": "The request could not be understood due to malformed syntax or validation error(s).",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/payees": {
+ "get": {
+ "description": "Returns all payees.",
+ "summary": "Get payees",
+ "tags": [
+ "Payees"
+ ],
+ "operationId": "GetPayees",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "last_knowledge_of_server",
+ "in": "query",
+ "x-ms-summary": "Last Knowledge of Server",
+ "required": false,
+ "type": "integer",
+ "format": "int64",
+ "description": "The starting server knowledge. If provided, only entities that have changed since `last_knowledge_of_server` will be included."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The requested list of payees.",
+ "schema": {
+ "$ref": "#/definitions/PayeesResponse"
+ }
+ },
+ "404": {
+ "description": "No payees were found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/payees/{payee_id}": {
+ "get": {
+ "description": "Returns a single payee.",
+ "summary": "Get payee by ID",
+ "tags": [
+ "Payees"
+ ],
+ "operationId": "GetPayeeById",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "payee_id",
+ "in": "path",
+ "x-ms-summary": "Payee ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the payee."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The requested payee.",
+ "schema": {
+ "$ref": "#/definitions/PayeeResponse"
+ }
+ },
+ "404": {
+ "description": "The payee was not found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/payee_locations": {
+ "get": {
+ "description": "Returns all payee locations.",
+ "summary": "Get payee locations",
+ "tags": [
+ "Payee Locations"
+ ],
+ "operationId": "GetPayeeLocations",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The list of payee locations.",
+ "schema": {
+ "$ref": "#/definitions/PayeeLocationsResponse"
+ }
+ },
+ "404": {
+ "description": "No payees locations were found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/payee_locations/{payee_location_id}": {
+ "get": {
+ "description": "Returns a single payee location.",
+ "summary": "Get payee location by ID",
+ "tags": [
+ "Payee Locations"
+ ],
+ "operationId": "GetPayeeLocationById",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "payee_location_id",
+ "in": "path",
+ "x-ms-summary": "Payee Location ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "Identifier of payee location."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The payee location.",
+ "schema": {
+ "$ref": "#/definitions/PayeeLocationResponse"
+ }
+ },
+ "404": {
+ "description": "The payee location was not found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/payees/{payee_id}/payee_locations": {
+ "get": {
+ "description": "Returns all payee locations for a specified payee.",
+ "summary": "Get payee locations by payee",
+ "tags": [
+ "Payee Locations"
+ ],
+ "operationId": "GetPayeeLocationsByPayee",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "payee_id",
+ "in": "path",
+ "x-ms-summary": "Payee ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of payee."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The list of requested payee locations.",
+ "schema": {
+ "$ref": "#/definitions/PayeeLocationsResponse"
+ }
+ },
+ "404": {
+ "description": "No payees locations were found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/months": {
+ "get": {
+ "description": "Returns all budget months.",
+ "summary": "Get budget months",
+ "tags": [
+ "Months"
+ ],
+ "operationId": "GetBudgetMonths",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "last_knowledge_of_server",
+ "in": "query",
+ "x-ms-summary": "Last Knowledge of Server",
+ "required": false,
+ "type": "integer",
+ "format": "int64",
+ "description": "The starting server knowledge. If provided, only entities that have changed since `last_knowledge_of_server` will be included."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The list of budget months.",
+ "schema": {
+ "$ref": "#/definitions/MonthSummariesResponse"
+ }
+ },
+ "404": {
+ "description": "No budget months were found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/months/{month}": {
+ "get": {
+ "description": "Returns a single budget month.",
+ "summary": "Get budget month",
+ "tags": [
+ "Months"
+ ],
+ "operationId": "GetBudgetMonth",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "month",
+ "in": "path",
+ "x-ms-summary": "Month",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "format": "date",
+ "description": "The budget month in ISO format (e.g. 2016-12-01). (\"current\" can also be used to specify the current calendar month (UTC))"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The budget month detail.",
+ "schema": {
+ "$ref": "#/definitions/MonthDetailResponse"
+ }
+ },
+ "404": {
+ "description": "The budget month was not found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/transactions": {
+ "get": {
+ "description": "Returns budget transactions.",
+ "summary": "Get transactions",
+ "tags": [
+ "Transactions"
+ ],
+ "operationId": "GetTransactions",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "since_date",
+ "in": "query",
+ "x-ms-summary": "Since Date",
+ "required": false,
+ "type": "string",
+ "format": "date",
+ "description": "If specified, only transactions on or after this date will be included. The date should be ISO formatted (e.g. 2016-12-30)."
+ },
+ {
+ "name": "type",
+ "in": "query",
+ "x-ms-summary": "Type",
+ "required": false,
+ "enum": [
+ "uncategorized",
+ "unapproved"
+ ],
+ "type": "string",
+ "description": "If specified, only transactions of the specified type will be included. \"uncategorized\" and \"unapproved\" are currently supported."
+ },
+ {
+ "name": "last_knowledge_of_server",
+ "in": "query",
+ "x-ms-summary": "Last Knowledge of Server",
+ "required": false,
+ "type": "integer",
+ "format": "int64",
+ "description": "The starting server knowledge. If provided, only entities that have changed since `last_knowledge_of_server` will be included."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The list of requested transactions.",
+ "schema": {
+ "$ref": "#/definitions/TransactionsResponse"
+ }
+ },
+ "400": {
+ "description": "An error occurred.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ },
+ "404": {
+ "description": "No transactions were found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ },
+ "post": {
+ "description": "Creates a single transaction or multiple transactions. If you provide a body containing a `transaction` object, a single transaction will be created and if you provide a body containing a `transactions` array, multiple transactions will be created. Scheduled transactions cannot be created on this endpoint.",
+ "summary": "Create transaction",
+ "tags": [
+ "Transactions"
+ ],
+ "operationId": "CreateTransaction",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "description": "The transaction or transactions to create. To create a single transaction you can specify a value for the `transaction` object and to create multiple transactions you can specify an array of `transactions`. It is expected that you will only provide a value for one of these objects.",
+ "schema": {
+ "$ref": "#/definitions/SaveTransactionsWrapper"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "The transaction or transactions were successfully created.",
+ "schema": {
+ "$ref": "#/definitions/SaveTransactionsResponse"
+ }
+ },
+ "400": {
+ "description": "The request could not be understood due to malformed syntax or validation error(s).",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ },
+ "409": {
+ "description": "A transaction on the same account with the same `import_id` already exists.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ },
+ "patch": {
+ "description": "Updates multiple transactions, by `id` or `import_id`.",
+ "summary": "Update transactions",
+ "tags": [
+ "Transactions"
+ ],
+ "operationId": "UpdateTransactions",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "description": "The transactions to update. Each transaction must have either an `id` or `import_id` specified. If `id` is specified as null an `import_id` value can be provided which will allow transaction(s) to be updated by their `import_id`. If an `id` is specified, it will always be used for lookup.",
+ "schema": {
+ "$ref": "#/definitions/UpdateTransactionsWrapper"
+ }
+ }
+ ],
+ "responses": {
+ "209": {
+ "description": "The transactions were successfully updated.",
+ "schema": {
+ "$ref": "#/definitions/SaveTransactionsResponse"
+ }
+ },
+ "400": {
+ "description": "The request could not be understood due to malformed syntax or validation error(s).",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/transactions/import": {
+ "post": {
+ "description": "Imports available transactions on all linked accounts for the given budget. Linked accounts allow transactions to be imported directly from a specified financial institution and this endpoint initiates that import. Sending a request to this endpoint is the equivalent of clicking \"Import\" on each account in the web application or tapping the \"New Transactions\" banner in the mobile applications. The response for this endpoint contains the transaction ids that have been imported.",
+ "summary": "Import transactions",
+ "tags": [
+ "Transactions"
+ ],
+ "operationId": "ImportTransactions",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The request was successful but there were no transactions to import.",
+ "schema": {
+ "$ref": "#/definitions/TransactionsImportResponse"
+ }
+ },
+ "201": {
+ "description": "One or more transactions were imported successfully.",
+ "schema": {
+ "$ref": "#/definitions/TransactionsImportResponse"
+ }
+ },
+ "400": {
+ "description": "The request could not be understood due to malformed syntax or validation error(s).",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/transactions/{transaction_id}": {
+ "get": {
+ "description": "Returns a single transaction.",
+ "summary": "Get transaction by ID",
+ "tags": [
+ "Transactions"
+ ],
+ "operationId": "GetTransactionById",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "transaction_id",
+ "in": "path",
+ "x-ms-summary": "Transaction ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the transaction."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The requested transaction.",
+ "schema": {
+ "$ref": "#/definitions/TransactionResponse"
+ }
+ },
+ "404": {
+ "description": "The transaction was not found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ },
+ "put": {
+ "description": "Updates a single transaction.",
+ "summary": "Update transaction",
+ "tags": [
+ "Transactions"
+ ],
+ "operationId": "UpdateTransaction",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "transaction_id",
+ "in": "path",
+ "x-ms-summary": "Transaction ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the transaction."
+ },
+ {
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "description": "The transaction to update.",
+ "schema": {
+ "$ref": "#/definitions/SaveTransactionWrapper"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The transaction was successfully updated.",
+ "schema": {
+ "$ref": "#/definitions/TransactionResponse"
+ }
+ },
+ "400": {
+ "description": "The request could not be understood due to malformed syntax or validation error(s).",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/accounts/{account_id}/transactions": {
+ "get": {
+ "description": "Returns all transactions for a specified account.",
+ "summary": "Get transactions by account",
+ "tags": [
+ "Transactions"
+ ],
+ "operationId": "GetTransactionsByAccount",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "account_id",
+ "in": "path",
+ "x-ms-summary": "Account ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the account."
+ },
+ {
+ "name": "since_date",
+ "in": "query",
+ "x-ms-summary": "Since Date",
+ "required": false,
+ "type": "string",
+ "format": "date",
+ "description": "If specified, only transactions on or after this date will be included. The date should be ISO formatted (e.g. 2016-12-30)."
+ },
+ {
+ "name": "type",
+ "in": "query",
+ "x-ms-summary": "Type",
+ "required": false,
+ "enum": [
+ "uncategorized",
+ "unapproved"
+ ],
+ "type": "string",
+ "description": "If specified, only transactions of the specified type will be included. \"uncategorized\" and \"unapproved\" are currently supported."
+ },
+ {
+ "name": "last_knowledge_of_server",
+ "in": "query",
+ "x-ms-summary": "Last Knowledge of Server",
+ "required": false,
+ "type": "integer",
+ "format": "int64",
+ "description": "The starting server knowledge. If provided, only entities that have changed since `last_knowledge_of_server` will be included."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The list of requested transactions.",
+ "schema": {
+ "$ref": "#/definitions/TransactionsResponse"
+ }
+ },
+ "404": {
+ "description": "No transactions were found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/categories/{category_id}/transactions": {
+ "get": {
+ "description": "Returns all transactions for a specified category.",
+ "summary": "Get transactions by category",
+ "tags": [
+ "Transactions"
+ ],
+ "operationId": "GetTransactionsByCategory",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "category_id",
+ "in": "path",
+ "x-ms-summary": "Category ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the category."
+ },
+ {
+ "name": "since_date",
+ "in": "query",
+ "x-ms-summary": "Since Date",
+ "required": false,
+ "type": "string",
+ "format": "date",
+ "description": "If specified, only transactions on or after this date will be included. The date should be ISO formatted (e.g. 2016-12-30)."
+ },
+ {
+ "name": "type",
+ "in": "query",
+ "x-ms-summary": "Type",
+ "required": false,
+ "enum": [
+ "uncategorized",
+ "unapproved"
+ ],
+ "type": "string",
+ "description": "If specified, only transactions of the specified type will be included. \"uncategorized\" and \"unapproved\" are currently supported."
+ },
+ {
+ "name": "last_knowledge_of_server",
+ "in": "query",
+ "x-ms-summary": "Last Knowledge of Server",
+ "required": false,
+ "type": "integer",
+ "format": "int64",
+ "description": "The starting server knowledge. If provided, only entities that have changed since `last_knowledge_of_server` will be included."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The list of requested transactions.",
+ "schema": {
+ "$ref": "#/definitions/HybridTransactionsResponse"
+ }
+ },
+ "404": {
+ "description": "No transactions were found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/payees/{payee_id}/transactions": {
+ "get": {
+ "description": "Returns all transactions for a specified payee.",
+ "summary": "Get transactions by payee",
+ "tags": [
+ "Transactions"
+ ],
+ "operationId": "GetTransactionsByPayee",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "payee_id",
+ "in": "path",
+ "x-ms-summary": "Payee ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the payee."
+ },
+ {
+ "name": "since_date",
+ "in": "query",
+ "x-ms-summary": "Since Date",
+ "required": false,
+ "type": "string",
+ "format": "date",
+ "description": "If specified, only transactions on or after this date will be included. The date should be ISO formatted (e.g. 2016-12-30)."
+ },
+ {
+ "name": "type",
+ "in": "query",
+ "x-ms-summary": "Type",
+ "required": false,
+ "enum": [
+ "uncategorized",
+ "unapproved"
+ ],
+ "type": "string",
+ "description": "If specified, only transactions of the specified type will be included. \"uncategorized\" and \"unapproved\" are currently supported."
+ },
+ {
+ "name": "last_knowledge_of_server",
+ "in": "query",
+ "x-ms-summary": "Last Knowledge of Server",
+ "required": false,
+ "type": "integer",
+ "format": "int64",
+ "description": "The starting server knowledge. If provided, only entities that have changed since `last_knowledge_of_server` will be included."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The list of requested transactions.",
+ "schema": {
+ "$ref": "#/definitions/HybridTransactionsResponse"
+ }
+ },
+ "404": {
+ "description": "No transactions were found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/scheduled_transactions": {
+ "get": {
+ "description": "Returns all scheduled transactions.",
+ "summary": "Get scheduled transactions",
+ "tags": [
+ "Scheduled transactions."
+ ],
+ "operationId": "GetScheduledTransactions",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "last_knowledge_of_server",
+ "in": "query",
+ "x-ms-summary": "Last Knowledge of Server",
+ "required": false,
+ "type": "integer",
+ "format": "int64",
+ "description": "The starting server knowledge. If provided, only entities that have changed since `last_knowledge_of_server` will be included."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The list of requested scheduled transactions.",
+ "schema": {
+ "$ref": "#/definitions/ScheduledTransactionsResponse"
+ }
+ },
+ "404": {
+ "description": "No scheduled transactions were found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/scheduled_transactions/{scheduled_transaction_id}": {
+ "get": {
+ "description": "Returns a single scheduled transaction.",
+ "summary": "Get scheduled transaction by ID",
+ "tags": [
+ "Scheduled transactions."
+ ],
+ "operationId": "GetScheduledTransactionById",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "scheduled_transaction_id",
+ "in": "path",
+ "x-ms-summary": "Scheduled Transaction ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the scheduled transaction."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The requested Scheduled transaction.",
+ "schema": {
+ "$ref": "#/definitions/ScheduledTransactionResponse"
+ }
+ },
+ "404": {
+ "description": "The scheduled transaction was not found.",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/budgets/{budget_id}/transactions/bulk": {
+ "post": {
+ "description": "Creates multiple transactions. Although this endpoint is still supported, it is recommended to use 'POST /budgets/{budget_id}/transactions' to create multiple transactions.",
+ "summary": "Bulk create transactions",
+ "tags": [
+ "Deprecated"
+ ],
+ "operationId": "BulkCreateTransactions",
+ "parameters": [
+ {
+ "name": "budget_id",
+ "in": "path",
+ "x-ms-summary": "Budget ID",
+ "x-ms-url-encoding": "single",
+ "required": true,
+ "type": "string",
+ "description": "The identifier of the budget. \"last-used\" can be used to specify the last used budget and \"default\" can be used if default budget selection is enabled (see: https://api.youneedabudget.com/#oauth-default-budget)."
+ },
+ {
+ "name": "transactions",
+ "in": "body",
+ "required": true,
+ "description": "The list of transactions to create.",
+ "schema": {
+ "$ref": "#/definitions/BulkTransactions"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "The bulk request was processed successfully.",
+ "schema": {
+ "$ref": "#/definitions/BulkResponse"
+ }
+ },
+ "400": {
+ "description": "The request could not be understood due to malformed syntax or validation error(s).",
+ "schema": {
+ "$ref": "#/definitions/ErrorResponse"
+ }
+ }
+ }
+ }
+ }
+ },
+ "definitions": {
+ "ErrorResponse": {
+ "title": "Error Response",
+ "type": "object",
+ "properties": {
+ "error": {
+ "$ref": "#/definitions/ErrorDetail"
+ }
+ },
+ "required": [
+ "error"
+ ]
+ },
+ "ErrorDetail": {
+ "title": "Error Detail",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "name":{
+ "type": "string",
+ "description": "The name.",
+ "title": "Name"
+ },
+ "detail":{
+ "type": "string",
+ "description": "The detail.",
+ "title": "Detail"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "detail"
+ ]
+ },
+ "UserResponse": {
+ "title": "User Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "User": {
+ "title": "User",
+ "type": "object",
+ "properties": {
+ "id":{
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ }
+ },
+ "required": [
+ "id"
+ ]
+ },
+ "DateFormat": {
+ "title": "Date Format",
+ "description": "The date format setting for the budget. In some cases the format will not be available and will be specified as null.",
+ "type": "object",
+ "properties": {
+ "format":{
+ "type": "string",
+ "description": "The format.",
+ "title": "Format"
+ }
+ },
+ "required": [
+ "format"
+ ]
+ },
+ "CurrencyFormat": {
+ "title": "Currency Format",
+ "description": "The currency format setting for the budget. In some cases the format will not be available and will be specified as null.",
+ "type": "object",
+ "properties": {
+ "iso_code":{
+ "type": "string",
+ "description": "The ISO code.",
+ "title": "ISO Code"
+ },
+ "example_format":{
+ "type": "string",
+ "description": "The example format.",
+ "title": "Example Format"
+ },
+ "decimal_digits": {
+ "type": "integer",
+ "format": "int32",
+ "description": "The decimal digits.",
+ "title": "Decimal Digits"
+ },
+ "decimal_separator":{
+ "type": "string",
+ "description": "The decimal separator.",
+ "title": "Decimal Separator"
+ },
+ "symbol_first": {
+ "type": "boolean",
+ "description": "Whether symbol is first.",
+ "title": "Symbol First"
+ },
+ "group_separator":{
+ "type": "string",
+ "description": "The group separator.",
+ "title": "Group Separator"
+ },
+ "currency_symbol":{
+ "type": "string",
+ "description": "The currency symbol.",
+ "title": "Currency Symbol"
+ },
+ "display_symbol": {
+ "type": "boolean",
+ "description": "Whether symbol is displayed.",
+ "title": "Symbol Displayed"
+ }
+ },
+ "required": [
+ "iso_code",
+ "example_format",
+ "decimal_digits",
+ "decimal_separator",
+ "symbol_first",
+ "group_separator",
+ "currency_symbol",
+ "display_symbol"
+ ]
+ },
+ "BudgetSummaryResponse": {
+ "title": "Budget Summary Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data1"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "BudgetSummary": {
+ "title": "Budget Summary",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "name":{
+ "type": "string",
+ "description": "The name.",
+ "title": "Name"
+ },
+ "last_modified_on": {
+ "description": "The last time any changes were made to the budget from either a web or mobile client.",
+ "type": "string",
+ "format": "date-time",
+ "title": "Last Modified On"
+ },
+ "first_month": {
+ "description": "The earliest budget month.",
+ "type": "string",
+ "format": "date",
+ "title": "First Month"
+ },
+ "last_month": {
+ "description": "The latest budget month.",
+ "type": "string",
+ "format": "date",
+ "title": "Last Month"
+ },
+ "date_format": {
+ "type": "object",
+ "$ref": "#/definitions/DateFormat",
+ "description": "The date format setting for the budget. In some cases the format will not be available and will be specified as null.",
+ "title": "Date Format"
+ },
+ "currency_format": {
+ "type": "object",
+ "$ref": "#/definitions/CurrencyFormat",
+ "description": "The currency format setting for the budget. In some cases the format will not be available and will be specified as null.",
+ "title": "Currency Format"
+ },
+ "accounts": {
+ "description": "The budget accounts (only included if `include_accounts=true` specified as query parameter).",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Account"
+ },
+ "title": "Accounts"
+ }
+ },
+ "required": [
+ "id",
+ "name"
+ ]
+ },
+ "BudgetDetailResponse": {
+ "title": "Budget Detail Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data2"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "BudgetDetail": {
+ "title": "Budget Detail",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "name":{
+ "type": "string",
+ "description": "The name.",
+ "title": "Name"
+ },
+ "last_modified_on": {
+ "description": "The last time any changes were made to the budget from either a web or mobile client.",
+ "type": "string",
+ "format": "date-time",
+ "title": "Last Modified On"
+ },
+ "first_month": {
+ "description": "The earliest budget month.",
+ "type": "string",
+ "format": "date",
+ "title": "First Month"
+ },
+ "last_month": {
+ "description": "The latest budget month.",
+ "type": "string",
+ "format": "date",
+ "title": "Last Month"
+ },
+ "date_format": {
+ "type": "object",
+ "$ref": "#/definitions/DateFormat",
+ "description": "The date format setting for the budget. In some cases the format will not be available and will be specified as null.",
+ "title": "Date Format"
+ },
+ "currency_format": {
+ "type": "object",
+ "$ref": "#/definitions/CurrencyFormat",
+ "description": "The currency format setting for the budget. In some cases the format will not be available and will be specified as null.",
+ "title": "Currency Format"
+ },
+ "accounts": {
+ "description": "The budget accounts (only included if `include_accounts=true` specified as query parameter).",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Account"
+ },
+ "title": "Accounts"
+ },
+ "payees": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Payee"
+ },
+ "title": "Payees"
+ },
+ "payee_locations": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/PayeeLocation"
+ },
+ "title": "Payee Locations"
+ },
+ "category_groups": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/CategoryGroup"
+ },
+ "title": "Category Groups"
+ },
+ "categories": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Category"
+ },
+ "title": "Categories"
+ },
+ "months": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/MonthDetail"
+ },
+ "title": "Months"
+ },
+ "transactions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TransactionSummary"
+ },
+ "title": "Transactions"
+ },
+ "subtransactions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/SubTransaction"
+ },
+ "title": "Subtransactions"
+ },
+ "scheduled_transactions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ScheduledTransactionSummary"
+ },
+ "title": "Scheduled Transactions"
+ },
+ "scheduled_subtransactions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ScheduledSubTransaction"
+ },
+ "title": "Scheduled Subtransactions"
+ }
+ },
+ "required": [
+ "id",
+ "name"
+ ]
+ },
+ "BudgetSettingsResponse": {
+ "title": "Budget Settings Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data3"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "BudgetSettings": {
+ "title": "Budget Settings",
+ "type": "object",
+ "properties": {
+ "date_format": {
+ "type": "object",
+ "$ref": "#/definitions/DateFormat",
+ "description": "The date format setting for the budget. In some cases the format will not be available and will be specified as null.",
+ "title": "Date Format"
+ },
+ "currency_format": {
+ "type": "object",
+ "$ref": "#/definitions/CurrencyFormat",
+ "description": "The currency format setting for the budget. In some cases the format will not be available and will be specified as null.",
+ "title": "Currency Format"
+ }
+ },
+ "required": [
+ "date_format",
+ "currency_format"
+ ]
+ },
+ "AccountsResponse": {
+ "title": "Accounts Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data4"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "AccountResponse": {
+ "title": "Account Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data5"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "Account": {
+ "title": "Account",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "name":{
+ "type": "string",
+ "description": "The name.",
+ "title": "Name"
+ },
+ "type": {
+ "type": "object",
+ "$ref": "#/definitions/Type",
+ "description": "The type of account. Note: payPal, merchantAccount, investmentAccount, and mortgage types have been deprecated and will be removed in the future.",
+ "title": "Type"
+ },
+ "on_budget": {
+ "description": "Whether this account is on budget or not",
+ "type": "boolean",
+ "title": "On Budget"
+ },
+ "closed": {
+ "description": "Whether this account is closed or not",
+ "type": "boolean",
+ "title": "Closed"
+ },
+ "note":{
+ "type": "string",
+ "description": "The note.",
+ "title": "Note"
+ },
+ "balance": {
+ "description": "The current balance of the account in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Balance"
+ },
+ "cleared_balance": {
+ "description": "The current cleared balance of the account in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Cleared Balance"
+ },
+ "uncleared_balance": {
+ "description": "The current uncleared balance of the account in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Uncleared Balance"
+ },
+ "transfer_payee_id": {
+ "description": "The payee identifier which should be used when transferring to this account.",
+ "type": "string",
+ "title": "Transfer Payee ID"
+ },
+ "direct_import_linked": {
+ "description": "Whether or not the account is linked to a financial institution for automatic transaction import.",
+ "type": "boolean",
+ "title": "Direct Import Linked"
+ },
+ "direct_import_in_error": {
+ "description": "If an account linked to a financial institution (direct_import_linked=true) and the linked connection is not in a healthy state, this will be true.",
+ "type": "boolean",
+ "title": "Direct Import In Error"
+ },
+ "deleted": {
+ "description": "Whether or not the account has been deleted. Deleted accounts will only be included in delta requests.",
+ "type": "boolean",
+ "title": "Deleted"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "type",
+ "on_budget",
+ "closed",
+ "balance",
+ "cleared_balance",
+ "uncleared_balance",
+ "transfer_payee_id",
+ "deleted"
+ ]
+ },
+ "SaveAccountWrapper": {
+ "title": "Save Account Wrapper",
+ "type": "object",
+ "properties": {
+ "account": {
+ "$ref": "#/definitions/SaveAccount"
+ }
+ },
+ "required": [
+ "account"
+ ]
+ },
+ "SaveAccount": {
+ "title": "Save Account",
+ "type": "object",
+ "properties": {
+ "name": {
+ "description": "The name of the account.",
+ "type": "string",
+ "title": "Name"
+ },
+ "type": {
+ "type": "object",
+ "$ref": "#/definitions/Type2",
+ "description": "The account type",
+ "title": "Type"
+ },
+ "balance": {
+ "description": "The current balance of the account in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Balance"
+ }
+ },
+ "required": [
+ "name",
+ "type",
+ "balance"
+ ]
+ },
+ "CategoriesResponse": {
+ "title": "Categories Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data6"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "CategoryResponse": {
+ "title": "Category Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data7"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "CategoryGroupWithCategories": {
+ "title": "Category Group With Categories",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "name":{
+ "type": "string",
+ "description": "The name.",
+ "title": "Name"
+ },
+ "hidden": {
+ "description": "Whether or not the category group is hidden.",
+ "type": "boolean",
+ "title": "Hidden"
+ },
+ "deleted": {
+ "description": "Whether or not the category group has been deleted. Deleted category groups will only be included in delta requests.",
+ "type": "boolean",
+ "title": "Deleted"
+ },
+ "categories": {
+ "description": "Category group categories. Amounts (budgeted, activity, balance, etc.) are specific to the current budget month (UTC).",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Category"
+ },
+ "title": "Catagories"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "hidden",
+ "deleted",
+ "categories"
+ ]
+ },
+ "CategoryGroup": {
+ "title": "Category Group",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "name":{
+ "type": "string",
+ "description": "The name.",
+ "title": "Name"
+ },
+ "hidden": {
+ "description": "Whether or not the category group is hidden.",
+ "type": "boolean",
+ "title": "Hidden"
+ },
+ "deleted": {
+ "description": "Whether or not the category group has been deleted. Deleted category groups will only be included in delta requests.",
+ "type": "boolean",
+ "title": "Deleted"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "hidden",
+ "deleted"
+ ]
+ },
+ "Category": {
+ "title": "Category",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "category_group_id": {
+ "type": "string",
+ "description": "The category group identifier.",
+ "title": "Category Group ID"
+ },
+ "name":{
+ "type": "string",
+ "description": "The name.",
+ "title": "Name"
+ },
+ "hidden": {
+ "description": "Whether or not the category is hidden.",
+ "type": "boolean",
+ "title": "Hidden"
+ },
+ "original_category_group_id": {
+ "description": "If category is hidden this is the identifier of the category group it originally belonged to before it was hidden.",
+ "type": "string",
+ "format": "uuid",
+ "title": "Original Category Group ID"
+ },
+ "note":{
+ "type": "string",
+ "description": "The note.",
+ "title": "Note"
+ },
+ "budgeted": {
+ "description": "Budgeted amount in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Budgeted"
+ },
+ "activity": {
+ "description": "Activity amount in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Activity"
+ },
+ "balance": {
+ "description": "Balance in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Balance"
+ },
+ "goal_type": {
+ "type": "object",
+ "$ref": "#/definitions/GoalType",
+ "description": "The type of goal, if the category has a goal. (TB='Target Category Balance', TBD='Target Category Balance by Date', MF='Monthly Funding', NEED='Plan Your Spending')",
+ "title": "Goal Type"
+ },
+ "goal_creation_month": {
+ "description": "The month a goal was created.",
+ "type": "string",
+ "format": "date",
+ "title": "Goal Creation Month"
+ },
+ "goal_target": {
+ "description": "The goal target amount in milliunits.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Goal Target"
+ },
+ "goal_target_month": {
+ "description": "The original target month for the goal to be completed. Only some goal types specify this date.",
+ "type": "string",
+ "format": "date",
+ "title": "Goal Target Month"
+ },
+ "goal_percentage_complete": {
+ "description": "The percentage completion of the goal.",
+ "type": "integer",
+ "format": "int32",
+ "title": "Goal Percentage Complete"
+ },
+ "goal_months_to_budget": {
+ "description": "The number of months, including the current month, left in the current goal period.",
+ "type": "integer",
+ "format": "int32",
+ "title": "Goal Months to Budget"
+ },
+ "goal_under_funded": {
+ "description": "The amount of funding still needed in the current month to stay on track towards completing the goal within the current goal period. This amount will generally correspond to the 'Underfunded' amount in the web and mobile clients except when viewing a category with a Needed for Spending Goal in a future month. The web and mobile clients will ignore any funding from a prior goal period when viewing category with a Needed for Spending Goal in a future month.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Goal Under Funded"
+ },
+ "goal_overall_funded": {
+ "description": "The total amount funded towards the goal within the current goal period.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Goal Overall Funded"
+ },
+ "goal_overall_left": {
+ "description": "The amount of funding still needed to complete the goal within the current goal period.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Goal Overall Left"
+ },
+ "deleted": {
+ "description": "Whether or not the category has been deleted. Deleted categories will only be included in delta requests.",
+ "type": "boolean",
+ "title": "Deleted"
+ }
+ },
+ "required": [
+ "id",
+ "category_group_id",
+ "name",
+ "hidden",
+ "budgeted",
+ "activity",
+ "balance",
+ "deleted"
+ ]
+ },
+ "SaveCategoryResponse": {
+ "title": "Save Category Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data8"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "PayeesResponse": {
+ "title": "Payees Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data9"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "PayeeResponse": {
+ "title": "Payee Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data10"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "Payee": {
+ "title": "Payee",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "name":{
+ "type": "string",
+ "description": "The name.",
+ "title": "Name"
+ },
+ "transfer_account_id": {
+ "description": "If a transfer payee, the `account_id` to which this payee transfers to.",
+ "type": "string",
+ "title": "Transfer Account ID"
+ },
+ "deleted": {
+ "description": "Whether or not the payee has been deleted. Deleted payees will only be included in delta requests.",
+ "type": "boolean",
+ "title": "Deleted"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "deleted"
+ ]
+ },
+ "PayeeLocationsResponse": {
+ "title": "Payee Locations Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data11"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "PayeeLocationResponse": {
+ "title": "Payee Location Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data12"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "PayeeLocation": {
+ "title": "Payee Location",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "payee_id": {
+ "type": "string",
+ "description": "The payee identifier.",
+ "title": "Payee ID"
+ },
+ "latitude":{
+ "type": "string",
+ "description": "The latitude.",
+ "title": "Latitude"
+ },
+ "longitude":{
+ "type": "string",
+ "description": "The longitude.",
+ "title": "Longitude"
+ },
+ "deleted": {
+ "description": "Whether or not the payee location has been deleted. Deleted payee locations will only be included in delta requests.",
+ "type": "boolean",
+ "title": "Deleted"
+ }
+ },
+ "required": [
+ "id",
+ "payee_id",
+ "latitude",
+ "longitude",
+ "deleted"
+ ]
+ },
+ "TransactionsResponse": {
+ "title": "Transactions Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data13"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "HybridTransactionsResponse": {
+ "title": "Hybrid Transactions Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data14"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "SaveTransactionWrapper": {
+ "title": "Save Transaction Wrapper",
+ "type": "object",
+ "properties": {
+ "transaction": {
+ "$ref": "#/definitions/SaveTransaction"
+ }
+ },
+ "required": [
+ "transaction"
+ ]
+ },
+ "SaveTransactionsWrapper": {
+ "title": "Save Transactions Wrapper",
+ "type": "object",
+ "properties": {
+ "transaction": {
+ "$ref": "#/definitions/SaveTransaction"
+ },
+ "transactions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/SaveTransaction"
+ }
+ }
+ }
+ },
+ "UpdateTransactionsWrapper": {
+ "title": "Update Transactions Wrapper",
+ "type": "object",
+ "properties": {
+ "transactions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/UpdateTransaction"
+ }
+ }
+ },
+ "required": [
+ "transactions"
+ ]
+ },
+ "UpdateTransaction": {
+ "title": "Update Transaction",
+ "type": "object",
+ "properties": {
+ "id":{
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "account_id": {
+ "type": "string",
+ "description": "The account identifier.",
+ "title": "Account ID"
+ },
+ "date": {
+ "description": "The transaction date in ISO format (e.g. 2016-12-01). Future dates (scheduled transactions) are not permitted. Split transaction dates cannot be changed and if a different date is supplied it will be ignored.",
+ "type": "string",
+ "format": "date",
+ "title": "Date"
+ },
+ "amount": {
+ "description": "The transaction amount in milliunits format. Split transaction amounts cannot be changed and if a different amount is supplied it will be ignored.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Amount"
+ },
+ "payee_id": {
+ "description": "The payee for the transaction. To create a transfer between two accounts, use the account transfer payee pointing to the target account. Account transfer payees are specified as `transfer_payee_id` on the account resource.",
+ "type": "string",
+ "format": "uuid",
+ "title": "Payee ID"
+ },
+ "payee_name": {
+ "description": "The payee name. If a `payee_name` value is provided and `payee_id` has a null value, the `payee_name` value will be used to resolve the payee by either (1) a matching payee rename rule (only if `import_id` is also specified) or (2) a payee with the same name or (3) creation of a new payee.",
+ "type": "string",
+ "maxLength": 50,
+ "title": "Payee"
+ },
+ "category_id": {
+ "description": "The category for the transaction. To configure a split transaction, you can specify null for `category_id` and provide a `subtransactions` array as part of the transaction object. If an existing transaction is a split, the `category_id` cannot be changed. Credit Card Payment categories are not permitted and will be ignored if supplied.",
+ "type": "string",
+ "format": "uuid",
+ "title": "Category ID"
+ },
+ "memo": {
+ "type": "string",
+ "maxLength": 200,
+ "description": "The memo.",
+ "title": "Memo"
+ },
+ "cleared": {
+ "type": "object",
+ "$ref": "#/definitions/Cleared",
+ "description": "The cleared status of the transaction.",
+ "title": "Cleared"
+ },
+ "approved": {
+ "description": "Whether or not the transaction is approved. If not supplied, transaction will be unapproved by default.",
+ "type": "boolean",
+ "title": "Approved"
+ },
+ "flag_color": {
+ "type": "object",
+ "$ref": "#/definitions/FlagColor",
+ "description": "The transaction flag.",
+ "title": "Flag Color"
+ },
+ "import_id": {
+ "description": "If specified, the new transaction will be assigned this `import_id` and considered \"imported\". We will also attempt to match this imported transaction to an existing \"user-entered\" transaction on the same account, with the same amount, and with a date +/-10 days from the imported transaction date.
Transactions imported through File Based Import or Direct Import (not through the API) are assigned an import_id in the format: 'YNAB:[milliunit_amount]:[iso_date]:[occurrence]'. For example, a transaction dated 2015-12-30 in the amount of -$294.23 USD would have an import_id of 'YNAB:-294230:2015-12-30:1'. If a second transaction on the same account was imported and had the same date and same amount, its import_id would be 'YNAB:-294230:2015-12-30:2'. Using a consistent format will prevent duplicates through Direct Import and File Based Import.
If import_id is omitted or specified as null, the transaction will be treated as a \"user-entered\" transaction. As such, it will be eligible to be matched against transactions later being imported (via DI, FBI, or API).",
+ "type": "string",
+ "maxLength": 36,
+ "title": "Import ID"
+ },
+ "subtransactions": {
+ "description": "An array of subtransactions to configure a transaction as a split. Updating `subtransactions` on an existing split transaction is not supported.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/SaveSubTransaction"
+ },
+ "title": "Subtransaction"
+ }
+ },
+ "required": [
+ "id",
+ "account_id",
+ "date",
+ "amount"
+ ]
+ },
+ "SaveTransaction": {
+ "title": "Save Transaction",
+ "type": "object",
+ "properties": {
+ "account_id": {
+ "type": "string",
+ "description": "The account identifier.",
+ "title": "Account ID"
+ },
+ "date": {
+ "description": "The transaction date in ISO format (e.g. 2016-12-01). Future dates (scheduled transactions) are not permitted. Split transaction dates cannot be changed and if a different date is supplied it will be ignored.",
+ "type": "string",
+ "format": "date",
+ "title": "Date"
+ },
+ "amount": {
+ "description": "The transaction amount in milliunits format. Split transaction amounts cannot be changed and if a different amount is supplied it will be ignored.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Amount"
+ },
+ "payee_id": {
+ "description": "The payee for the transaction. To create a transfer between two accounts, use the account transfer payee pointing to the target account. Account transfer payees are specified as `transfer_payee_id` on the account resource.",
+ "type": "string",
+ "format": "uuid",
+ "title": "Payee ID"
+ },
+ "payee_name": {
+ "description": "The payee name. If a `payee_name` value is provided and `payee_id` has a null value, the `payee_name` value will be used to resolve the payee by either (1) a matching payee rename rule (only if `import_id` is also specified) or (2) a payee with the same name or (3) creation of a new payee.",
+ "type": "string",
+ "maxLength": 50,
+ "title": "Payee"
+ },
+ "category_id": {
+ "description": "The category for the transaction. To configure a split transaction, you can specify null for `category_id` and provide a `subtransactions` array as part of the transaction object. If an existing transaction is a split, the `category_id` cannot be changed. Credit Card Payment categories are not permitted and will be ignored if supplied.",
+ "type": "string",
+ "format": "uuid",
+ "title": "Category ID"
+ },
+ "memo": {
+ "type": "string",
+ "maxLength": 200,
+ "description": "The memo.",
+ "title": "Memo"
+ },
+ "cleared": {
+ "type": "object",
+ "$ref": "#/definitions/Cleared",
+ "description": "The cleared status of the transaction.",
+ "title": "Cleared"
+ },
+ "approved": {
+ "description": "Whether or not the transaction is approved. If not supplied, transaction will be unapproved by default.",
+ "type": "boolean",
+ "title": "Approved"
+ },
+ "flag_color": {
+ "type": "object",
+ "$ref": "#/definitions/FlagColor",
+ "description": "The transaction flag.",
+ "title": "Flag Color"
+ },
+ "import_id": {
+ "description": "If specified, the new transaction will be assigned this `import_id` and considered \"imported\". We will also attempt to match this imported transaction to an existing \"user-entered\" transaction on the same account, with the same amount, and with a date +/-10 days from the imported transaction date.
Transactions imported through File Based Import or Direct Import (not through the API) are assigned an import_id in the format: 'YNAB:[milliunit_amount]:[iso_date]:[occurrence]'. For example, a transaction dated 2015-12-30 in the amount of -$294.23 USD would have an import_id of 'YNAB:-294230:2015-12-30:1'. If a second transaction on the same account was imported and had the same date and same amount, its import_id would be 'YNAB:-294230:2015-12-30:2'. Using a consistent format will prevent duplicates through Direct Import and File Based Import.
If import_id is omitted or specified as null, the transaction will be treated as a \"user-entered\" transaction. As such, it will be eligible to be matched against transactions later being imported (via DI, FBI, or API).",
+ "type": "string",
+ "maxLength": 36,
+ "title": "Import ID"
+ },
+ "subtransactions": {
+ "description": "An array of subtransactions to configure a transaction as a split. Updating `subtransactions` on an existing split transaction is not supported.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/SaveSubTransaction"
+ },
+ "title": "Subtransaction"
+ }
+ },
+ "required": [
+ "account_id",
+ "date",
+ "amount"
+ ]
+ },
+ "SaveSubTransaction": {
+ "title": "Save Sub Transaction",
+ "type": "object",
+ "properties": {
+ "amount": {
+ "description": "The subtransaction amount in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Amount"
+ },
+ "payee_id": {
+ "description": "The payee for the subtransaction.",
+ "type": "string",
+ "format": "uuid",
+ "title": "Payee ID"
+ },
+ "payee_name": {
+ "description": "The payee name. If a `payee_name` value is provided and `payee_id` has a null value, the `payee_name` value will be used to resolve the payee by either (1) a matching payee rename rule (only if import_id is also specified on parent transaction) or (2) a payee with the same name or (3) creation of a new payee.",
+ "type": "string",
+ "maxLength": 50,
+ "title": "Payee"
+ },
+ "category_id": {
+ "description": "The category for the subtransaction. Credit Card Payment categories are not permitted and will be ignored if supplied.",
+ "type": "string",
+ "format": "uuid",
+ "title": "Category ID"
+ },
+ "memo": {
+ "type": "string",
+ "maxLength": 200,
+ "description": "The memo.",
+ "title": "Memo"
+ }
+ },
+ "required": [
+ "amount"
+ ]
+ },
+ "SaveTransactionsResponse": {
+ "title": "Save Transactions Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data15"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "TransactionResponse": {
+ "title": "Transaction Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data16"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "TransactionSummary": {
+ "title": "Transaction Summary",
+ "type": "object",
+ "properties": {
+ "id":{
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "date": {
+ "description": "The transaction date in ISO format (e.g. 2016-12-01).",
+ "type": "string",
+ "format": "date",
+ "title": "Date"
+ },
+ "amount": {
+ "description": "The transaction amount in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Amount"
+ },
+ "memo":{
+ "type": "string",
+ "description": "The memo.",
+ "title": "Memo"
+ },
+ "cleared": {
+ "type": "object",
+ "$ref": "#/definitions/Cleared",
+ "description": "The cleared status of the transaction."
+ },
+ "approved": {
+ "description": "Whether or not the transaction is approved.",
+ "type": "boolean",
+ "title": "Approved"
+ },
+ "flag_color": {
+ "type": "object",
+ "$ref": "#/definitions/FlagColor",
+ "description": "The transaction flag.",
+ "title": "Flag Color"
+ },
+ "account_id": {
+ "type": "string",
+ "description": "The account identifier.",
+ "title": "Account ID"
+ },
+ "payee_id": {
+ "type": "string",
+ "description": "The payee identifier.",
+ "title": "Payee ID"
+ },
+ "category_id": {
+ "type": "string",
+ "description": "The category identifier.",
+ "title": "Category ID"
+ },
+ "transfer_account_id": {
+ "description": "If a transfer transaction, the account to which it transfers.",
+ "type": "string",
+ "format": "uuid",
+ "title": "Transfer Account ID"
+ },
+ "transfer_transaction_id": {
+ "description": "If a transfer transaction, the identifier of transaction on the other side of the transfer.",
+ "type": "string",
+ "title": "Transfer Transaction ID"
+ },
+ "matched_transaction_id": {
+ "description": "If transaction is matched, the identifier of the matched transaction.",
+ "type": "string",
+ "title": "Matched Transaction ID"
+ },
+ "import_id": {
+ "description": "If the Transaction was imported, this field is a unique (by account) import identifier. If this transaction was imported through File Based Import or Direct Import and not through the API, the import_id will have the format: 'YNAB:[milliunit_amount]:[iso_date]:[occurrence]'. For example, a transaction dated 2015-12-30 in the amount of -$294.23 USD would have an import_id of 'YNAB:-294230:2015-12-30:1'. If a second transaction on the same account was imported and had the same date and same amount, its import_id would be 'YNAB:-294230:2015-12-30:2'.",
+ "type": "string",
+ "title": "Import ID"
+ },
+ "deleted": {
+ "description": "Whether or not the transaction has been deleted. Deleted transactions will only be included in delta requests.",
+ "type": "boolean",
+ "title": "Deleted"
+ }
+ },
+ "required": [
+ "id",
+ "date",
+ "amount",
+ "cleared",
+ "approved",
+ "account_id",
+ "deleted"
+ ]
+ },
+ "TransactionDetail": {
+ "title": "Transaction Detail",
+ "type": "object",
+ "properties": {
+ "id":{
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "date": {
+ "description": "The transaction date in ISO format (e.g. 2016-12-01).",
+ "type": "string",
+ "format": "date",
+ "title": "Date"
+ },
+ "amount": {
+ "description": "The transaction amount in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Amount"
+ },
+ "memo":{
+ "type": "string",
+ "description": "The memo.",
+ "title": "Memo"
+ },
+ "cleared": {
+ "type": "object",
+ "$ref": "#/definitions/Cleared",
+ "description": "The cleared status of the transaction."
+ },
+ "approved": {
+ "description": "Whether or not the transaction is approved.",
+ "type": "boolean",
+ "title": "Approved"
+ },
+ "flag_color": {
+ "type": "object",
+ "$ref": "#/definitions/FlagColor",
+ "description": "The transaction flag.",
+ "title": "Flag Color"
+ },
+ "account_id": {
+ "type": "string",
+ "description": "The account identifier.",
+ "title": "Account ID"
+ },
+ "payee_id": {
+ "type": "string",
+ "description": "The payee identifier.",
+ "title": "Payee ID"
+ },
+ "category_id": {
+ "type": "string",
+ "description": "The category identifier.",
+ "title": "Category ID"
+ },
+ "transfer_account_id": {
+ "description": "If a transfer transaction, the account to which it transfers.",
+ "type": "string",
+ "format": "uuid",
+ "title": "Transfer Account ID"
+ },
+ "transfer_transaction_id": {
+ "description": "If a transfer transaction, the identifier of transaction on the other side of the transfer.",
+ "type": "string",
+ "title": "Transfer Transaction ID"
+ },
+ "matched_transaction_id": {
+ "description": "If transaction is matched, the identifier of the matched transaction.",
+ "type": "string",
+ "title": "Matched Transaction ID"
+ },
+ "import_id": {
+ "description": "If the Transaction was imported, this field is a unique (by account) import identifier. If this transaction was imported through File Based Import or Direct Import and not through the API, the import_id will have the format: 'YNAB:[milliunit_amount]:[iso_date]:[occurrence]'. For example, a transaction dated 2015-12-30 in the amount of -$294.23 USD would have an import_id of 'YNAB:-294230:2015-12-30:1'. If a second transaction on the same account was imported and had the same date and same amount, its import_id would be 'YNAB:-294230:2015-12-30:2'.",
+ "type": "string",
+ "title": "Import ID"
+ },
+ "deleted": {
+ "description": "Whether or not the transaction has been deleted. Deleted transactions will only be included in delta requests.",
+ "type": "boolean",
+ "title": "Deleted"
+ },
+ "account_name":{
+ "type": "string",
+ "description": "The account name.",
+ "title": "Account Name"
+ },
+ "payee_name":{
+ "type": "string",
+ "description": "The payee name.",
+ "title": "Payee"
+ },
+ "category_name":{
+ "type": "string",
+ "description": "The category name.",
+ "title": "Category"
+ },
+ "subtransactions": {
+ "description": "If a split transaction, the subtransactions.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/SubTransaction"
+ },
+ "title": "Subtransactions"
+ }
+ },
+ "required": [
+ "id",
+ "date",
+ "amount",
+ "cleared",
+ "approved",
+ "account_id",
+ "deleted",
+ "account_name",
+ "subtransactions"
+ ]
+ },
+ "HybridTransaction": {
+ "title": "Hybrid Transaction",
+ "type": "object",
+ "properties": {
+ "id":{
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "date": {
+ "description": "The transaction date in ISO format (e.g. 2016-12-01).",
+ "type": "string",
+ "format": "date",
+ "title": "Date"
+ },
+ "amount": {
+ "description": "The transaction amount in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Amount"
+ },
+ "memo":{
+ "type": "string",
+ "description": "The memo.",
+ "title": "Memo"
+ },
+ "cleared": {
+ "type": "object",
+ "$ref": "#/definitions/Cleared",
+ "description": "The cleared status of the transaction.",
+ "title": "Cleared"
+ },
+ "approved": {
+ "description": "Whether or not the transaction is approved.",
+ "type": "boolean",
+ "title": "Approved"
+ },
+ "flag_color": {
+ "type": "object",
+ "$ref": "#/definitions/FlagColor",
+ "description": "The transaction flag.",
+ "title": "Flag Color"
+ },
+ "account_id": {
+ "type": "string",
+ "description": "The account identifier.",
+ "title": "Account ID"
+ },
+ "payee_id": {
+ "type": "string",
+ "description": "The payee identifier.",
+ "title": "Payee ID"
+ },
+ "category_id": {
+ "type": "string",
+ "description": "The category identifier.",
+ "title": "Category ID"
+ },
+ "transfer_account_id": {
+ "description": "If a transfer transaction, the account to which it transfers.",
+ "type": "string",
+ "format": "uuid",
+ "title": "Transfer Account ID"
+ },
+ "transfer_transaction_id": {
+ "description": "If a transfer transaction, the identifier of transaction on the other side of the transfer.",
+ "type": "string",
+ "title": "Transfer Transaction ID"
+ },
+ "matched_transaction_id": {
+ "description": "If transaction is matched, the identifier of the matched transaction.",
+ "type": "string",
+ "title": "Matched Transaction ID"
+ },
+ "import_id": {
+ "description": "If the Transaction was imported, this field is a unique (by account) import identifier. If this transaction was imported through File Based Import or Direct Import and not through the API, the import_id will have the format: 'YNAB:[milliunit_amount]:[iso_date]:[occurrence]'. For example, a transaction dated 2015-12-30 in the amount of -$294.23 USD would have an import_id of 'YNAB:-294230:2015-12-30:1'. If a second transaction on the same account was imported and had the same date and same amount, its import_id would be 'YNAB:-294230:2015-12-30:2'.",
+ "type": "string",
+ "title": "Import ID"
+ },
+ "deleted": {
+ "description": "Whether or not the transaction has been deleted. Deleted transactions will only be included in delta requests.",
+ "type": "boolean",
+ "title": "Deleted"
+ },
+ "type": {
+ "type": "object",
+ "$ref": "#/definitions/Type3",
+ "description": "Whether the hybrid transaction represents a regular transaction or a subtransaction.",
+ "title": "Type"
+ },
+ "parent_transaction_id": {
+ "description": "For subtransaction types, this is the identifier of the parent transaction. For transaction types, this identifier will be always be null.",
+ "type": "string",
+ "title": "Parent Transaction ID"
+ },
+ "account_name":{
+ "type": "string",
+ "description": "The account name.",
+ "title": "Account Name"
+ },
+ "payee_name":{
+ "type": "string",
+ "description": "The payee name.",
+ "title": "Payee"
+ },
+ "category_name":{
+ "type": "string",
+ "description": "The category name.",
+ "title": "Category"
+ }
+ },
+ "required": [
+ "id",
+ "date",
+ "amount",
+ "cleared",
+ "approved",
+ "account_id",
+ "deleted",
+ "type",
+ "account_name"
+ ]
+ },
+ "SaveMonthCategoryWrapper": {
+ "title": "Save Month Category Wrapper",
+ "type": "object",
+ "properties": {
+ "category": {
+ "$ref": "#/definitions/SaveMonthCategory"
+ }
+ },
+ "required": [
+ "category"
+ ]
+ },
+ "SaveMonthCategory": {
+ "title": "Save Month Category",
+ "type": "object",
+ "properties": {
+ "budgeted": {
+ "description": "Budgeted amount in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Budgeted"
+ }
+ },
+ "required": [
+ "budgeted"
+ ]
+ },
+ "TransactionsImportResponse": {
+ "title": "Transactions Import Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data17"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "BulkResponse": {
+ "title": "Bulk Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data18"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "BulkTransactions": {
+ "title": "Bulk Transactions",
+ "type": "object",
+ "properties": {
+ "transactions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/SaveTransaction"
+ }
+ }
+ },
+ "required": [
+ "transactions"
+ ]
+ },
+ "SubTransaction": {
+ "title": "Sub Transaction",
+ "type": "object",
+ "properties": {
+ "id":{
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "transaction_id":{
+ "type": "string",
+ "description": "The transaction.",
+ "title": "Transaction ID"
+ },
+ "amount": {
+ "description": "The subtransaction amount in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Amount"
+ },
+ "memo":{
+ "type": "string",
+ "description": "The memo.",
+ "title": "Memo"
+ },
+ "payee_id": {
+ "type": "string",
+ "description": "The payee identifier.",
+ "title": "Payee ID"
+ },
+ "payee_name":{
+ "type": "string",
+ "description": "The payee name.",
+ "title": "Payee"
+ },
+ "category_id": {
+ "type": "string",
+ "description": "The category identifier.",
+ "title": "Category ID"
+ },
+ "category_name":{
+ "type": "string",
+ "description": "The category name.",
+ "title": "Category"
+ },
+ "transfer_account_id": {
+ "description": "If a transfer, the account_id which the subtransaction transfers to.",
+ "type": "string",
+ "format": "uuid",
+ "title": "Transfer Account ID"
+ },
+ "transfer_transaction_id": {
+ "description": "If a transfer, the identifier of transaction on the other side of the transfer.",
+ "type": "string",
+ "title": "Transfer Transaction ID"
+ },
+ "deleted": {
+ "description": "Whether or not the subtransaction has been deleted. Deleted subtransactions will only be included in delta requests.",
+ "type": "boolean",
+ "title": "Deleted"
+ }
+ },
+ "required": [
+ "id",
+ "transaction_id",
+ "amount",
+ "deleted"
+ ]
+ },
+ "ScheduledTransactionsResponse": {
+ "title": "Scheduled Transactions Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data19"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "ScheduledTransactionResponse": {
+ "title": "Scheduled Transaction Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data20"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "ScheduledTransactionSummary": {
+ "title": "Scheduled Transaction Summary",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "date_first": {
+ "description": "The first date for which the Scheduled Transaction was scheduled.",
+ "type": "string",
+ "format": "date",
+ "title": "First Date"
+ },
+ "date_next": {
+ "description": "The next date for which the Scheduled Transaction is scheduled.",
+ "type": "string",
+ "format": "date",
+ "title": "Next Date"
+ },
+ "frequency": {
+ "$ref": "#/definitions/Frequency"
+ },
+ "amount": {
+ "description": "The scheduled transaction amount in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Amount"
+ },
+ "memo":{
+ "type": "string",
+ "description": "The memo.",
+ "title": "Memo"
+ },
+ "flag_color": {
+ "type": "object",
+ "$ref": "#/definitions/FlagColor1",
+ "description": "The scheduled transaction flag.",
+ "title": "Flag Color"
+ },
+ "account_id": {
+ "type": "string",
+ "description": "The account identifier.",
+ "title": "Account ID"
+ },
+ "payee_id": {
+ "type": "string",
+ "description": "The payee identifier.",
+ "title": "Payee ID"
+ },
+ "category_id": {
+ "type": "string",
+ "description": "The category identifier.",
+ "title": "Category ID"
+ },
+ "transfer_account_id": {
+ "description": "If a transfer, the account_id which the scheduled transaction transfers to.",
+ "type": "string",
+ "format": "uuid",
+ "title": "Transfer Account ID"
+ },
+ "deleted": {
+ "description": "Whether or not the scheduled transaction has been deleted. Deleted scheduled transactions will only be included in delta requests.",
+ "type": "boolean",
+ "title": "Deleted"
+ }
+ },
+ "required": [
+ "id",
+ "date_first",
+ "date_next",
+ "frequency",
+ "amount",
+ "account_id",
+ "deleted"
+ ]
+ },
+ "ScheduledTransactionDetail": {
+ "title": "Scheduled Transaction Detail",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "date_first": {
+ "description": "The first date for which the Scheduled Transaction was scheduled.",
+ "type": "string",
+ "format": "date",
+ "title": "First Date"
+ },
+ "date_next": {
+ "description": "The next date for which the Scheduled Transaction is scheduled.",
+ "type": "string",
+ "format": "date",
+ "title": "Next Date"
+ },
+ "frequency": {
+ "$ref": "#/definitions/Frequency"
+ },
+ "amount": {
+ "description": "The scheduled transaction amount in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Amount"
+ },
+ "memo":{
+ "type": "string",
+ "description": "The memo.",
+ "title": "Memo"
+ },
+ "flag_color": {
+ "type": "object",
+ "$ref": "#/definitions/FlagColor1",
+ "description": "The scheduled transaction flag.",
+ "title": "Flag Color"
+ },
+ "account_id": {
+ "type": "string",
+ "description": "The account identifier.",
+ "title": "Account ID"
+ },
+ "payee_id": {
+ "type": "string",
+ "description": "The payee identifier.",
+ "title": "Payee ID"
+ },
+ "category_id": {
+ "type": "string",
+ "description": "The category identifier.",
+ "title": "Category ID"
+ },
+ "transfer_account_id": {
+ "description": "If a transfer, the account_id which the scheduled transaction transfers to.",
+ "type": "string",
+ "format": "uuid",
+ "title": "Transfer Account ID"
+ },
+ "deleted": {
+ "description": "Whether or not the scheduled transaction has been deleted. Deleted scheduled transactions will only be included in delta requests.",
+ "type": "boolean",
+ "title": "Deleted"
+ },
+ "account_name":{
+ "type": "string",
+ "description": "The account name.",
+ "title": "Account Name"
+ },
+ "payee_name":{
+ "type": "string",
+ "description": "The payee name.",
+ "title": "Payee"
+ },
+ "category_name":{
+ "type": "string",
+ "description": "The category name.",
+ "title": "Category"
+ },
+ "subtransactions": {
+ "description": "If a split scheduled transaction, the subtransactions.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ScheduledSubTransaction"
+ }
+ }
+ },
+ "required": [
+ "id",
+ "date_first",
+ "date_next",
+ "frequency",
+ "amount",
+ "account_id",
+ "deleted",
+ "account_name",
+ "subtransactions"
+ ]
+ },
+ "ScheduledSubTransaction": {
+ "title": "Scheduled Sub Transaction",
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier.",
+ "title": "ID"
+ },
+ "scheduled_transaction_id": {
+ "type": "string",
+ "description": "The scheduled transaction identifier.",
+ "title": "Scheduled Transaction ID"
+ },
+ "amount": {
+ "description": "The scheduled subtransaction amount in milliunits format.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Amount"
+ },
+ "memo":{
+ "type": "string",
+ "description": "The memo.",
+ "title": "Memo"
+ },
+ "payee_id": {
+ "type": "string",
+ "description": "The payee identifier.",
+ "title": "Payee ID"
+ },
+ "category_id": {
+ "type": "string",
+ "description": "The category identifier.",
+ "title": "Category ID"
+ },
+ "transfer_account_id": {
+ "description": "If a transfer, the account_id which the scheduled subtransaction transfers to.",
+ "type": "string",
+ "format": "uuid",
+ "title": "Transfer Account ID"
+ },
+ "deleted": {
+ "description": "Whether or not the scheduled subtransaction has been deleted. Deleted scheduled subtransactions will only be included in delta requests.",
+ "type": "boolean",
+ "title": "Deleted"
+ }
+ },
+ "required": [
+ "id",
+ "scheduled_transaction_id",
+ "amount",
+ "deleted"
+ ]
+ },
+ "MonthSummariesResponse": {
+ "title": "Month Summaries Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data21"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "MonthDetailResponse": {
+ "title": "Month Detail Response",
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/definitions/Data22"
+ }
+ },
+ "required": [
+ "data"
+ ]
+ },
+ "MonthSummary": {
+ "title": "Month Summary",
+ "type": "object",
+ "properties": {
+ "month": {
+ "type": "string",
+ "format": "date",
+ "description": "The month.",
+ "title": "Month"
+ },
+ "note":{
+ "type": "string",
+ "description": "The note.",
+ "title": "Note"
+ },
+ "income": {
+ "description": "The total amount of transactions categorized to 'Inflow: Ready to Assign' in the month.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Income"
+ },
+ "budgeted": {
+ "description": "The total amount budgeted in the month.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Budgeted"
+ },
+ "activity": {
+ "description": "The total amount of transactions in the month, excluding those categorized to 'Inflow: Ready to Assign'.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Activity"
+ },
+ "to_be_budgeted": {
+ "description": "The available amount for 'Ready to Assign'.",
+ "type": "integer",
+ "format": "int64",
+ "title": "To Be Budgeted"
+ },
+ "age_of_money": {
+ "description": "The Age of Money as of the month.",
+ "type": "integer",
+ "format": "int32",
+ "title": "Age of Money"
+ },
+ "deleted": {
+ "description": "Whether or not the month has been deleted. Deleted months will only be included in delta requests.",
+ "type": "boolean",
+ "title": "Deleted"
+ }
+ },
+ "required": [
+ "month",
+ "income",
+ "budgeted",
+ "activity",
+ "to_be_budgeted",
+ "deleted"
+ ]
+ },
+ "MonthDetail": {
+ "title": "Month Detail",
+ "type": "object",
+ "properties": {
+ "month": {
+ "type": "string",
+ "format": "date",
+ "description": "The month.",
+ "title": "Month"
+ },
+ "note":{
+ "type": "string",
+ "description": "The note.",
+ "title": "Note"
+ },
+ "income": {
+ "description": "The total amount of transactions categorized to 'Inflow: Ready to Assign' in the month.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Income"
+ },
+ "budgeted": {
+ "description": "The total amount budgeted in the month.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Budgeted"
+ },
+ "activity": {
+ "description": "The total amount of transactions in the month, excluding those categorized to 'Inflow: Ready to Assign'.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Activity"
+ },
+ "to_be_budgeted": {
+ "description": "The available amount for 'Ready to Assign'.",
+ "type": "integer",
+ "format": "int64",
+ "title": "To Be Budgeted"
+ },
+ "age_of_money": {
+ "description": "The Age of Money as of the month.",
+ "type": "integer",
+ "format": "int32",
+ "title": "Age of Money"
+ },
+ "deleted": {
+ "description": "Whether or not the month has been deleted. Deleted months will only be included in delta requests.",
+ "type": "boolean",
+ "title": "Deleted"
+ },
+ "categories": {
+ "description": "The budget month categories. Amounts (budgeted, activity, balance, etc.) are specific to the {month} parameter specified.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Category"
+ },
+ "title": "Categories"
+ }
+ },
+ "required": [
+ "month",
+ "income",
+ "budgeted",
+ "activity",
+ "to_be_budgeted",
+ "deleted",
+ "categories"
+ ]
+ },
+ "Bulk": {
+ "title": "Bulk",
+ "type": "object",
+ "properties": {
+ "transaction_ids": {
+ "description": "The list of Transaction ids that were created.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "title": "Transaction IDs"
+ },
+ "duplicate_import_ids": {
+ "description": "If any Transactions were not created because they had an `import_id` matching a transaction already on the same account, the specified import_id(s) will be included in this list.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "title": "Duplicate Import IDs"
+ }
+ },
+ "required": [
+ "transaction_ids",
+ "duplicate_import_ids"
+ ]
+ },
+ "Cleared": {
+ "title": "Cleared",
+ "description": "The cleared status of the transaction.",
+ "type": "string",
+ "enum": [
+ "cleared",
+ "uncleared",
+ "reconciled"
+ ]
+ },
+ "Data": {
+ "title": "Data",
+ "type": "object",
+ "properties": {
+ "user": {
+ "$ref": "#/definitions/User"
+ }
+ },
+ "required": [
+ "user"
+ ]
+ },
+ "Data1": {
+ "title": "Data1",
+ "type": "object",
+ "properties": {
+ "budgets": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/BudgetSummary"
+ },
+ "title": "Budgets"
+ },
+ "default_budget": {
+ "$ref": "#/definitions/BudgetSummary"
+ }
+ },
+ "required": [
+ "budgets"
+ ]
+ },
+ "Data2": {
+ "title": "Data2",
+ "type": "object",
+ "properties": {
+ "budget": {
+ "$ref": "#/definitions/BudgetDetail"
+ },
+ "server_knowledge": {
+ "description": "The knowledge of the server.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Server Knowledge"
+ }
+ },
+ "required": [
+ "budget",
+ "server_knowledge"
+ ]
+ },
+ "Data3": {
+ "title": "Data3",
+ "type": "object",
+ "properties": {
+ "settings": {
+ "$ref": "#/definitions/BudgetSettings"
+ }
+ },
+ "required": [
+ "settings"
+ ]
+ },
+ "Data4": {
+ "title": "Data4",
+ "type": "object",
+ "properties": {
+ "accounts": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Account"
+ },
+ "title": "Accounts"
+ },
+ "server_knowledge": {
+ "description": "The knowledge of the server.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Server Knowledge"
+ }
+ },
+ "required": [
+ "accounts",
+ "server_knowledge"
+ ]
+ },
+ "Data5": {
+ "title": "Data5",
+ "type": "object",
+ "properties": {
+ "account": {
+ "$ref": "#/definitions/Account"
+ }
+ },
+ "required": [
+ "account"
+ ]
+ },
+ "Data6": {
+ "title": "Data6",
+ "type": "object",
+ "properties": {
+ "category_groups": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/CategoryGroupWithCategories"
+ },
+ "description": "The category groups.",
+ "title": "Category Groups"
+ },
+ "server_knowledge": {
+ "description": "The knowledge of the server.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Server Knowledge"
+ }
+ },
+ "required": [
+ "category_groups",
+ "server_knowledge"
+ ]
+ },
+ "Data7": {
+ "title": "Data7",
+ "type": "object",
+ "properties": {
+ "category": {
+ "$ref": "#/definitions/Category"
+ }
+ },
+ "required": [
+ "category"
+ ]
+ },
+ "Data8": {
+ "title": "Data8",
+ "type": "object",
+ "properties": {
+ "category": {
+ "$ref": "#/definitions/Category"
+ },
+ "server_knowledge": {
+ "description": "The knowledge of the server.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Server Knowledge"
+ }
+ },
+ "required": [
+ "category",
+ "server_knowledge"
+ ]
+ },
+ "Data9": {
+ "title": "Data9",
+ "type": "object",
+ "properties": {
+ "payees": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Payee"
+ },
+ "description": "The payees.",
+ "title": "Payees"
+ },
+ "server_knowledge": {
+ "description": "The knowledge of the server.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Server Knowledge"
+ }
+ },
+ "required": [
+ "payees",
+ "server_knowledge"
+ ]
+ },
+ "Data10": {
+ "title": "Data10",
+ "type": "object",
+ "properties": {
+ "payee": {
+ "$ref": "#/definitions/Payee"
+ }
+ },
+ "required": [
+ "payee"
+ ]
+ },
+ "Data11": {
+ "title": "Data11",
+ "type": "object",
+ "properties": {
+ "payee_locations": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/PayeeLocation"
+ },
+ "description": "The payee locations.",
+ "title": "Payee Locations"
+ }
+ },
+ "required": [
+ "payee_locations"
+ ]
+ },
+ "Data12": {
+ "title": "Data12",
+ "type": "object",
+ "properties": {
+ "payee_location": {
+ "$ref": "#/definitions/PayeeLocation"
+ }
+ },
+ "required": [
+ "payee_location"
+ ]
+ },
+ "Data13": {
+ "title": "Data13",
+ "type": "object",
+ "properties": {
+ "transactions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TransactionDetail"
+ },
+ "description": "The transactions.",
+ "title": "Transactions"
+ },
+ "server_knowledge": {
+ "description": "The knowledge of the server.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Server Knowledge"
+ }
+ },
+ "required": [
+ "transactions",
+ "server_knowledge"
+ ]
+ },
+ "Data14": {
+ "title": "Data14",
+ "type": "object",
+ "properties": {
+ "transactions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/HybridTransaction"
+ },
+ "description": "The transactions.",
+ "title": "Transactions"
+ }
+ },
+ "required": [
+ "transactions"
+ ]
+ },
+ "Data15": {
+ "title": "Data15",
+ "type": "object",
+ "properties": {
+ "transaction_ids": {
+ "description": "The transaction ids that were saved.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "title": "Transaction IDs"
+ },
+ "transaction": {
+ "$ref": "#/definitions/TransactionDetail"
+ },
+ "transactions": {
+ "description": "If multiple transactions were specified, the transactions that were saved.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TransactionDetail"
+ }
+ },
+ "duplicate_import_ids": {
+ "description": "If multiple transactions were specified, a list of import_ids that were not created because of an existing `import_id` found on the same account.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "title": "Duplicate Import IDs"
+ },
+ "server_knowledge": {
+ "description": "The knowledge of the server.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Server Knowledge"
+ }
+ },
+ "required": [
+ "transaction_ids",
+ "server_knowledge"
+ ]
+ },
+ "Data16": {
+ "title": "Data16",
+ "type": "object",
+ "properties": {
+ "transaction": {
+ "$ref": "#/definitions/TransactionDetail"
+ }
+ },
+ "required": [
+ "transaction"
+ ]
+ },
+ "Data17": {
+ "title": "Data17",
+ "type": "object",
+ "properties": {
+ "transaction_ids": {
+ "description": "The list of transaction ids that were imported.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "title": "Transaction IDs"
+ }
+ },
+ "required": [
+ "transaction_ids"
+ ]
+ },
+ "Data18": {
+ "title": "Data18",
+ "type": "object",
+ "properties": {
+ "bulk": {
+ "$ref": "#/definitions/Bulk"
+ }
+ },
+ "required": [
+ "bulk"
+ ]
+ },
+ "Data19": {
+ "title": "Data19",
+ "type": "object",
+ "properties": {
+ "scheduled_transactions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ScheduledTransactionDetail"
+ }
+ },
+ "server_knowledge": {
+ "description": "The knowledge of the server.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Server Knowledge"
+ }
+ },
+ "required": [
+ "scheduled_transactions",
+ "server_knowledge"
+ ]
+ },
+ "Data20": {
+ "title": "Data20",
+ "type": "object",
+ "properties": {
+ "scheduled_transaction": {
+ "$ref": "#/definitions/ScheduledTransactionDetail"
+ }
+ },
+ "required": [
+ "scheduled_transaction"
+ ]
+ },
+ "Data21": {
+ "title": "Data21",
+ "type": "object",
+ "properties": {
+ "months": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/MonthSummary"
+ }
+ },
+ "server_knowledge": {
+ "description": "The knowledge of the server.",
+ "type": "integer",
+ "format": "int64",
+ "title": "Server Knowledge"
+ }
+ },
+ "required": [
+ "months",
+ "server_knowledge"
+ ]
+ },
+ "Data22": {
+ "title": "Data22",
+ "type": "object",
+ "properties": {
+ "month": {
+ "$ref": "#/definitions/MonthDetail"
+ }
+ },
+ "required": [
+ "month"
+ ]
+ },
+ "FlagColor": {
+ "title": "Flag Color",
+ "description": "The transaction flag.",
+ "type": "string",
+ "enum": [
+ "red",
+ "orange",
+ "yellow",
+ "green",
+ "blue",
+ "purple"
+ ]
+ },
+ "FlagColor1": {
+ "title": "FlagColor1",
+ "description": "The scheduled transaction flag.",
+ "type": "string",
+ "enum": [
+ "red",
+ "orange",
+ "yellow",
+ "green",
+ "blue",
+ "purple"
+ ]
+ },
+ "Frequency": {
+ "title": "Frequency",
+ "description": "The frequency.",
+ "type": "string",
+ "enum": [
+ "never",
+ "daily",
+ "weekly",
+ "everyOtherWeek",
+ "twiceAMonth",
+ "every4Weeks",
+ "monthly",
+ "everyOtherMonth",
+ "every3Months",
+ "every4Months",
+ "twiceAYear",
+ "yearly",
+ "everyOtherYear"
+ ]
+ },
+ "GoalType": {
+ "title": "Goal Type",
+ "description": "The type of goal, if the category has a goal (TB='Target Category Balance', TBD='Target Category Balance by Date', MF='Monthly Funding', NEED='Plan Your Spending')",
+ "type": "string",
+ "enum": [
+ "TB",
+ "TBD",
+ "MF",
+ "NEED",
+ "DEBT"
+ ]
+ },
+ "Type": {
+ "title": "Type",
+ "description": "The type of account. Note: payPal, merchantAccount, investmentAccount, and mortgage types have been deprecated and will be removed in the future.",
+ "type": "string",
+ "enum": [
+ "checking",
+ "savings",
+ "cash",
+ "creditCard",
+ "lineOfCredit",
+ "otherAsset",
+ "otherLiability",
+ "payPal",
+ "merchantAccount",
+ "investmentAccount",
+ "mortgage"
+ ]
+ },
+ "Type2": {
+ "title": "Type2",
+ "description": "The account type",
+ "type": "string",
+ "enum": [
+ "checking",
+ "savings",
+ "creditCard",
+ "cash",
+ "lineOfCredit",
+ "otherAsset",
+ "otherLiability"
+ ]
+ },
+ "Type3": {
+ "title": "Type3",
+ "description": "Whether the hybrid transaction represents a regular transaction or a subtransaction",
+ "type": "string",
+ "enum": [
+ "transaction",
+ "subtransaction"
+ ]
+ },
+ "type4": {
+ "title": "type4",
+ "type": "string",
+ "enum": [
+ "uncategorized",
+ "unapproved"
+ ]
+ }
+ },
+ "security": [
+ {
+ "API Key": []
+ }
+ ],
+ "tags": [
+ {
+ "name": "User"
+ },
+ {
+ "name": "Budgets"
+ },
+ {
+ "name": "Accounts",
+ "description": "The accounts for a budget"
+ },
+ {
+ "name": "Categories",
+ "description": "The categories for a budget"
+ },
+ {
+ "name": "Payees",
+ "description": "The payees for a budget"
+ },
+ {
+ "name": "Payee Locations",
+ "description": "When you enter a transaction and specify a payee on the YNAB mobile apps, the GPS coordinates for that location are stored, with your permission, so that the next time you are in the same place (like the Grocery store) we can pre-populate nearby payees for you! It\u2019s handy and saves you time. This resource makes these locations available. Locations will not be available for all payees."
+ },
+ {
+ "name": "Months",
+ "description": "Each budget contains one or more months, which is where Ready to Assign, Age of Money and category (budgeted / activity / balances) amounts are available."
+ },
+ {
+ "name": "Transactions",
+ "description": "The transactions for a budget"
+ },
+ {
+ "name": "Scheduled transactions.",
+ "description": "The scheduled transactions for a budget"
+ },
+ {
+ "name": "Deprecated",
+ "description": "If deprecated."
+ }
+ ],
+ "x-ms-connector-metadata": [
+ {
+ "propertyName": "Website",
+ "propertyValue": "https://www.youneedabudget.com/"
+ },
+ {
+ "propertyName": "Privacy policy",
+ "propertyValue": "https://www.youneedabudget.com/privacy-policy/"
+ },
+ {
+ "propertyName": "Categories",
+ "propertyValue": "Finance"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/independent-publisher-connectors/You Need A Budget/apiProperties.json b/independent-publisher-connectors/You Need A Budget/apiProperties.json
new file mode 100644
index 000000000..69bc39182
--- /dev/null
+++ b/independent-publisher-connectors/You Need A Budget/apiProperties.json
@@ -0,0 +1,23 @@
+{
+ "properties": {
+ "connectionParameters": {
+ "api_key": {
+ "type": "securestring",
+ "uiDefinition": {
+ "displayName": "Access Token (in the form 'Bearer AccessToken)",
+ "description": "The Access Token (in the form 'Bearer AccessToken) for this api",
+ "tooltip": "Provide your Access Token (in the form 'Bearer AccessToken)",
+ "constraints": {
+ "tabIndex": 2,
+ "clearText": false,
+ "required": "true"
+ }
+ }
+ }
+ },
+ "iconBrandColor": "#da3b01",
+ "capabilities": [],
+ "publisher": "Troy Taylor",
+ "stackOwner": "You Need A Budget"
+ }
+}
\ No newline at end of file
diff --git a/independent-publisher-connectors/You Need A Budget/readme.md b/independent-publisher-connectors/You Need A Budget/readme.md
new file mode 100644
index 000000000..a0699c17f
--- /dev/null
+++ b/independent-publisher-connectors/You Need A Budget/readme.md
@@ -0,0 +1,75 @@
+# You Need A Budget
+You Need A Budget (YNAB) allows you to build a personal application to interact with your own budget.
+
+## Publisher: Troy Taylor, Hitachi Solutions
+
+## Prerequisites
+You will need to sign up for an account with You Need A Budget. There is a free trial for the first month.
+
+## Obtaining Credentials
+From your Account Settings page, find Developer Settings and create a new personal access token.
+
+## Supported Operations
+### Get user
+Returns authenticated user information.
+### Get budgets
+Returns budgets list with summary information.
+### Get budget by ID
+Returns a single budget with all related entities. This resource is effectively a full budget export.
+### Get budget settings by ID
+Returns settings for a budget
+### Get accounts
+Returns all accounts.
+### Create account
+Creates a new account.
+### Get account by ID
+Returns a single account.
+### Get categories
+Returns all categories grouped by category group. Amounts (budgeted, activity, balance, etc.) are specific to the current budget month (UTC).
+### Get Category by ID
+Returns a single category. Amounts (budgeted, activity, balance, etc.) are specific to the current budget month (UTC).
+### Get month category by ID
+Returns a single category for a specific budget month. Amounts (budgeted, activity, balance, etc.) are specific to the current budget month (UTC).
+### Update month category
+Update a category for a specific month. Only `budgeted` amount can be updated.
+### Get payees
+Returns all payees.
+### Get payee by ID
+Returns a single payee.
+### Get payee locations
+Returns all payee locations.
+### Get payee location by ID
+Returns a single payee location.
+### Get payee locations by payee
+Returns all payee locations for a specified payee.
+### Get budget months
+Returns all budget months.
+### Get budget month
+Returns a single budget month.
+### Get transactions
+Returns budget transactions.
+### Create transaction
+Creates a single transaction or multiple transactions. If you provide a body containing a `transaction` object, a single transaction will be created and if you provide a body containing a `transactions` array, multiple transactions will be created. Scheduled transactions cannot be created on this endpoint.
+### Update transactions
+Updates multiple transactions, by `id` or `import_id`.
+### Import transactions
+Imports available transactions on all linked accounts for the given budget. Linked accounts allow transactions to be imported directly from a specified financial institution and this endpoint initiates that import. Sending a request to this endpoint is the equivalent of clicking "Import" on each account in the web application or tapping the "New Transactions" banner in the mobile applications. The response for this endpoint contains the transaction ids that have been imported.
+### Get transaction by ID
+Returns a single transaction.
+### Update transaction
+Updates a single transaction.
+### Get transactions by account
+Returns all transactions for a specified account.
+### Get transactions by category
+Returns all transactions for a specified category.
+### Get transactions by payee
+Returns all transactions for a specified payee.
+### Get scheduled transactions
+Returns all scheduled transactions.
+### Get scheduled transaction by ID
+Returns a single scheduled transaction.
+### Bulk create transactions
+Creates multiple transactions.
+
+## Known Issues and Limitations
+There are no known issues at this time.