Repository: stripe/stripe-node
Pull request #1199 (2021-07-26 23:48:57)

Explicitly define basic methods.
### Notify

r? @richardm-stripe 

### Summary

Explicitly defines basic methods rather than specifying `includeBasic` and having them be added at construction time.

This unblocks having all the method URLs be fully specified inline, and removes some magic from resource definition simplifying codegen.

### Test plan

Tests pass. I also ran some local spot checks with the SDK to make sure resource methods still worked as expected.


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0f6abac9..1f560b9b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,15 @@
 # CHANGELOG
 
+## 8.166.0 - 2021-07-28
+* [#1203](https://github.com/stripe/stripe-node/pull/1203) API Updates
+  * Bugfix: add missing autopagination methods to `Quote.listLineItems` and `Quote.listComputedUpfrontLineItems`
+  * Add support for `account_type` on `BankAccount`, `ExternalAccountUpdateParams`, and `TokenCreateParams.bank_account`
+  * Add support for `category_code` on `Issuing.Authorization.merchant_data` and `Issuing.Transaction.merchant_data`
+  * Add support for new value `redacted` on enum `Review.closed_reason`
+  * Remove duplicate type definition for `Account.retrieve`.
+  * Fix some `attributes` fields mistakenly defined as `Stripe.Metadata`
+* [#1097](https://github.com/stripe/stripe-node/pull/1097) fix error arguments
+
 ## 8.165.0 - 2021-07-22
 * [#1197](https://github.com/stripe/stripe-node/pull/1197) API Updates
   * Add support for new values `hr`, `ko`, and `vi` on enums `CheckoutSessionCreateParams.locale` and `Checkout.Session.locale`
diff --git a/VERSION b/VERSION
index 5aae098c..24be86a1 100644
--- a/VERSION
+++ b/VERSION
@@ -1,1 +1,1 @@
-8.165.0
+8.166.0
diff --git a/lib/StripeMethod.basic.js b/lib/StripeMethod.basic.js
index c807ea18..b9be5302 100644
--- a/lib/StripeMethod.basic.js
+++ b/lib/StripeMethod.basic.js
@@ -2,6 +2,8 @@
 
 const stripeMethod = require('./StripeMethod');
 
+// DEPRECATED: These were kept for backwards compatibility in case users were
+// using this, but basic methods are now explicitly defined on a resource.
 module.exports = {
   create: stripeMethod({
     method: 'POST',
diff --git a/lib/StripeMethod.js b/lib/StripeMethod.js
index ace8febf..4c6c544d 100644
--- a/lib/StripeMethod.js
+++ b/lib/StripeMethod.js
@@ -11,6 +11,8 @@ const makeAutoPaginationMethods = require('./autoPagination')
  * @param [spec.method='GET'] Request Method (POST, GET, DELETE, PUT)
  * @param [spec.path=''] Path to be appended to the API BASE_PATH, joined with
  *  the instance's path (e.g. 'charges' or 'customers')
+ * @param [spec.fullPath=''] Fully qualified path to the method (eg. /v1/a/b/c).
+ *  If this is specified, path should not be specified.
  * @param [spec.urlParams=[]] Array of required arguments in the order that they
  *  must be passed by the consumer of the API. Subsequent optional arguments are
  *  optionally passed through a hash (Object) as the penultimate argument
@@ -20,11 +22,16 @@ const makeAutoPaginationMethods = require('./autoPagination')
  * @param [spec.host] Hostname for the request.
  */
 function stripeMethod(spec) {
+  if (spec.path !== undefined && spec.fullPath !== undefined) {
+    throw new Error(
+      `Method spec specified both a 'path' (${spec.path}) and a 'fullPath' (${spec.fullPath}).`
+    );
+  }
   return function(...args) {
     const callback = typeof args[args.length - 1] == 'function' && args.pop();
 
     spec.urlParams = utils.extractUrlParams(
-      this.createResourcePathWithSymbols(spec.path || '')
+      spec.fullPath || this.createResourcePathWithSymbols(spec.path || '')
     );
 
     const requestPromise = utils.callbackifyPromiseWithTimeout(
diff --git a/lib/StripeResource.js b/lib/StripeResource.js
index 51661387..472fca67 100644
--- a/lib/StripeResource.js
+++ b/lib/StripeResource.js
@@ -44,6 +44,8 @@ function StripeResource(stripe, deprecatedUrlData) {
   this.resourcePath = this.path;
   this.path = utils.makeURLInterpolator(this.path);
 
+  // DEPRECATED: This was kept for backwards compatibility in case users were
+  // using this, but basic methods are now explicitly defined on a resource.
   if (this.includeBasic) {
     this.includeBasic.forEach(function(methodName) {
       this[methodName] = StripeResource.BASIC_METHODS[methodName];
diff --git a/lib/autoPagination.js b/lib/autoPagination.js
index caa8f062..067079ef 100644
--- a/lib/autoPagination.js
+++ b/lib/autoPagination.js
@@ -174,7 +174,7 @@ function makeAutoPagingEach(asyncIteratorNext) {
     const onItem = getItemCallback(args);
     const onDone = getDoneCallback(args);
     if (args.length > 2) {
-      throw Error('autoPagingEach takes up to two arguments; received:', args);
+      throw Error(`autoPagingEach takes up to two arguments; received ${args}`);
     }
 
     const autoPagePromise = wrapAsyncIteratorWithCallback(
diff --git a/lib/makeRequest.js b/lib/makeRequest.js
index 8944b30b..89a1c6bd 100644
--- a/lib/makeRequest.js
+++ b/lib/makeRequest.js
@@ -4,11 +4,20 @@ const utils = require('./utils');
 
 function getRequestOpts(self, requestArgs, spec, overrideData) {
   // Extract spec values with defaults.
-  const commandPath = utils.makeURLInterpolator(spec.path || '');
   const requestMethod = (spec.method || 'GET').toUpperCase();
   const urlParams = spec.urlParams || [];
   const encode = spec.encode || ((data) => data);
-  const path = self.createResourcePathWithSymbols(spec.path);
+
+  const isUsingFullPath = !!spec.fullPath;
+  const commandPath = utils.makeURLInterpolator(
+    isUsingFullPath ? spec.fullPath : spec.path || ''
+  );
+
+  // When using fullPath, we ignore the resource path as it should already be
+  // fully qualified.
+  const path = isUsingFullPath
+    ? spec.fullPath
+    : self.createResourcePathWithSymbols(spec.path);
 
   // Don't mutate args externally.
   const args = [].slice.call(requestArgs);
@@ -39,7 +48,11 @@ function getRequestOpts(self, requestArgs, spec, overrideData) {
     );
   }
 
-  const requestPath = self.createFullPath(commandPath, urlData);
+  // When using full path, we can just invoke the URL interpolator directly
+  // as we don't need to use the resource to create a full path.
+  const requestPath = isUsingFullPath
+    ? commandPath(urlData)
+    : self.createFullPath(commandPath, urlData);
   const headers = Object.assign(options.headers, spec.headers);
 
   if (spec.validator) {
diff --git a/lib/resources/AccountLinks.js b/lib/resources/AccountLinks.js
index 4d8769e1..41e02b1e 100644
--- a/lib/resources/AccountLinks.js
+++ b/lib/resources/AccountLinks.js
@@ -3,9 +3,13 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'account_links',
 
-  includeBasic: ['create'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
 });
diff --git a/lib/resources/ApplePayDomains.js b/lib/resources/ApplePayDomains.js
index 86fa7fde..76a8c595 100644
--- a/lib/resources/ApplePayDomains.js
+++ b/lib/resources/ApplePayDomains.js
@@ -3,9 +3,29 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'apple_pay/domains',
 
-  includeBasic: ['create', 'retrieve', 'list', 'del'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{domain}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{domain}',
+  }),
 });
diff --git a/lib/resources/ApplicationFees.js b/lib/resources/ApplicationFees.js
index e7a40a22..ebd6372a 100644
--- a/lib/resources/ApplicationFees.js
+++ b/lib/resources/ApplicationFees.js
@@ -8,7 +8,16 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'application_fees',
 
-  includeBasic: ['retrieve', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{id}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   createRefund: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/BalanceTransactions.js b/lib/resources/BalanceTransactions.js
index 18ae4025..adbe3d41 100644
--- a/lib/resources/BalanceTransactions.js
+++ b/lib/resources/BalanceTransactions.js
@@ -3,9 +3,19 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'balance_transactions',
 
-  includeBasic: ['retrieve', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{id}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/BillingPortal/Configurations.js b/lib/resources/BillingPortal/Configurations.js
index 025410c2..ff320016 100644
--- a/lib/resources/BillingPortal/Configurations.js
+++ b/lib/resources/BillingPortal/Configurations.js
@@ -3,9 +3,29 @@
 'use strict';
 
 const StripeResource = require('../../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'billing_portal/configurations',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{configuration}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{configuration}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/BillingPortal/Sessions.js b/lib/resources/BillingPortal/Sessions.js
index 1d294847..04f0ef68 100644
--- a/lib/resources/BillingPortal/Sessions.js
+++ b/lib/resources/BillingPortal/Sessions.js
@@ -3,9 +3,13 @@
 'use strict';
 
 const StripeResource = require('../../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'billing_portal/sessions',
 
-  includeBasic: ['create'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
 });
diff --git a/lib/resources/Charges.js b/lib/resources/Charges.js
index 901ab1af..99ef97d7 100644
--- a/lib/resources/Charges.js
+++ b/lib/resources/Charges.js
@@ -8,7 +8,26 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'charges',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{charge}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{charge}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   capture: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/Checkout/Sessions.js b/lib/resources/Checkout/Sessions.js
index 46a30898..91192db8 100644
--- a/lib/resources/Checkout/Sessions.js
+++ b/lib/resources/Checkout/Sessions.js
@@ -8,7 +8,21 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'checkout/sessions',
 
-  includeBasic: ['create', 'retrieve', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{session}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   listLineItems: stripeMethod({
     method: 'GET',
diff --git a/lib/resources/CountrySpecs.js b/lib/resources/CountrySpecs.js
index bf541db2..789f9905 100644
--- a/lib/resources/CountrySpecs.js
+++ b/lib/resources/CountrySpecs.js
@@ -3,9 +3,19 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'country_specs',
 
-  includeBasic: ['retrieve', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{country}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/Coupons.js b/lib/resources/Coupons.js
index 4787164c..11bed027 100644
--- a/lib/resources/Coupons.js
+++ b/lib/resources/Coupons.js
@@ -3,9 +3,34 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'coupons',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list', 'del'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{coupon}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{coupon}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{coupon}',
+  }),
 });
diff --git a/lib/resources/CreditNotes.js b/lib/resources/CreditNotes.js
index 735f1746..512e5a7c 100644
--- a/lib/resources/CreditNotes.js
+++ b/lib/resources/CreditNotes.js
@@ -8,7 +8,26 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'credit_notes',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{id}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{id}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   preview: stripeMethod({
     method: 'GET',
diff --git a/lib/resources/Customers.js b/lib/resources/Customers.js
index 6e0cb080..208f4a13 100644
--- a/lib/resources/Customers.js
+++ b/lib/resources/Customers.js
@@ -8,7 +8,31 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'customers',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list', 'del'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{customer}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{customer}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{customer}',
+  }),
 
   deleteDiscount: stripeMethod({
     method: 'DELETE',
diff --git a/lib/resources/Disputes.js b/lib/resources/Disputes.js
index e9ac3b74..13187589 100644
--- a/lib/resources/Disputes.js
+++ b/lib/resources/Disputes.js
@@ -8,7 +8,21 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'disputes',
 
-  includeBasic: ['retrieve', 'update', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{dispute}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{dispute}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   close: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/EphemeralKeys.js b/lib/resources/EphemeralKeys.js
index cfe14083..2f9b0269 100644
--- a/lib/resources/EphemeralKeys.js
+++ b/lib/resources/EphemeralKeys.js
@@ -8,8 +8,6 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'ephemeral_keys',
 
-  includeBasic: ['del'],
-
   create: stripeMethod({
     method: 'POST',
     path: '',
@@ -21,4 +19,9 @@ module.exports = StripeResource.extend({
       }
     },
   }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{key}',
+  }),
 });
diff --git a/lib/resources/Events.js b/lib/resources/Events.js
index 4c31e5f6..79ee31d4 100644
--- a/lib/resources/Events.js
+++ b/lib/resources/Events.js
@@ -3,9 +3,19 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'events',
 
-  includeBasic: ['retrieve', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{id}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/ExchangeRates.js b/lib/resources/ExchangeRates.js
index df3f658a..021e9723 100644
--- a/lib/resources/ExchangeRates.js
+++ b/lib/resources/ExchangeRates.js
@@ -3,9 +3,19 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'exchange_rates',
 
-  includeBasic: ['retrieve', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{rateId}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/FileLinks.js b/lib/resources/FileLinks.js
index 7cdcfec5..7c7a6e11 100644
--- a/lib/resources/FileLinks.js
+++ b/lib/resources/FileLinks.js
@@ -3,9 +3,29 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'file_links',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{link}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{link}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/Files.js b/lib/resources/Files.js
index a407079f..5dee82d1 100644
--- a/lib/resources/Files.js
+++ b/lib/resources/Files.js
@@ -9,8 +9,6 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'files',
 
-  includeBasic: ['retrieve', 'list'],
-
   create: stripeMethod({
     method: 'POST',
     headers: {
@@ -19,5 +17,16 @@ module.exports = StripeResource.extend({
     host: 'files.stripe.com',
   }),
 
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{file}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
   requestDataProcessor: multipartRequestDataProcessor,
 });
diff --git a/lib/resources/Identity/VerificationReports.js b/lib/resources/Identity/VerificationReports.js
index bdd300f9..6d78faa7 100644
--- a/lib/resources/Identity/VerificationReports.js
+++ b/lib/resources/Identity/VerificationReports.js
@@ -3,9 +3,19 @@
 'use strict';
 
 const StripeResource = require('../../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'identity/verification_reports',
 
-  includeBasic: ['retrieve', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{report}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/Identity/VerificationSessions.js b/lib/resources/Identity/VerificationSessions.js
index fc515b88..02345e12 100644
--- a/lib/resources/Identity/VerificationSessions.js
+++ b/lib/resources/Identity/VerificationSessions.js
@@ -8,7 +8,26 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'identity/verification_sessions',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{session}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{session}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   cancel: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/InvoiceItems.js b/lib/resources/InvoiceItems.js
index b6a36e07..c7cb5586 100644
--- a/lib/resources/InvoiceItems.js
+++ b/lib/resources/InvoiceItems.js
@@ -3,9 +3,34 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'invoiceitems',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list', 'del'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{invoiceitem}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{invoiceitem}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{invoiceitem}',
+  }),
 });
diff --git a/lib/resources/Invoices.js b/lib/resources/Invoices.js
index 03bf3f60..489190f8 100644
--- a/lib/resources/Invoices.js
+++ b/lib/resources/Invoices.js
@@ -8,7 +8,31 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'invoices',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list', 'del'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{invoice}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{invoice}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{invoice}',
+  }),
 
   finalizeInvoice: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/IssuerFraudRecords.js b/lib/resources/IssuerFraudRecords.js
index b41669c5..c94ee2ff 100644
--- a/lib/resources/IssuerFraudRecords.js
+++ b/lib/resources/IssuerFraudRecords.js
@@ -3,9 +3,19 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'issuer_fraud_records',
 
-  includeBasic: ['retrieve', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{issuerFraudRecord}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/Issuing/Authorizations.js b/lib/resources/Issuing/Authorizations.js
index d10043ec..5310d0ea 100644
--- a/lib/resources/Issuing/Authorizations.js
+++ b/lib/resources/Issuing/Authorizations.js
@@ -8,7 +8,21 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'issuing/authorizations',
 
-  includeBasic: ['retrieve', 'update', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{authorization}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{authorization}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   approve: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/Issuing/Cardholders.js b/lib/resources/Issuing/Cardholders.js
index 0c4e9682..7b340e69 100644
--- a/lib/resources/Issuing/Cardholders.js
+++ b/lib/resources/Issuing/Cardholders.js
@@ -3,9 +3,29 @@
 'use strict';
 
 const StripeResource = require('../../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'issuing/cardholders',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{cardholder}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{cardholder}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/Issuing/Cards.js b/lib/resources/Issuing/Cards.js
index 92594a2f..b94aeaea 100644
--- a/lib/resources/Issuing/Cards.js
+++ b/lib/resources/Issuing/Cards.js
@@ -8,7 +8,26 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'issuing/cards',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{card}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{card}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   retrieveDetails: stripeMethod({
     method: 'GET',
diff --git a/lib/resources/Issuing/Disputes.js b/lib/resources/Issuing/Disputes.js
index a2f169ec..f62a2be9 100644
--- a/lib/resources/Issuing/Disputes.js
+++ b/lib/resources/Issuing/Disputes.js
@@ -8,7 +8,26 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'issuing/disputes',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{dispute}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{dispute}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   submit: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/Issuing/Transactions.js b/lib/resources/Issuing/Transactions.js
index f7c15b7b..22b43842 100644
--- a/lib/resources/Issuing/Transactions.js
+++ b/lib/resources/Issuing/Transactions.js
@@ -3,9 +3,24 @@
 'use strict';
 
 const StripeResource = require('../../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'issuing/transactions',
 
-  includeBasic: ['retrieve', 'update', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{transaction}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{transaction}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/Mandates.js b/lib/resources/Mandates.js
index 103ebbac..6d9ced9f 100644
--- a/lib/resources/Mandates.js
+++ b/lib/resources/Mandates.js
@@ -3,9 +3,13 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'mandates',
 
-  includeBasic: ['retrieve'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{mandate}',
+  }),
 });
diff --git a/lib/resources/OrderReturns.js b/lib/resources/OrderReturns.js
index b4297f82..4a548183 100644
--- a/lib/resources/OrderReturns.js
+++ b/lib/resources/OrderReturns.js
@@ -3,9 +3,19 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'order_returns',
 
-  includeBasic: ['retrieve', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{id}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/Orders.js b/lib/resources/Orders.js
index 9033abad..df456424 100644
--- a/lib/resources/Orders.js
+++ b/lib/resources/Orders.js
@@ -8,7 +8,26 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'orders',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{id}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{id}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   pay: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/PaymentIntents.js b/lib/resources/PaymentIntents.js
index d99b43b1..42f6cddb 100644
--- a/lib/resources/PaymentIntents.js
+++ b/lib/resources/PaymentIntents.js
@@ -8,7 +8,26 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'payment_intents',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{intent}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{intent}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   cancel: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/PaymentMethods.js b/lib/resources/PaymentMethods.js
index f08d8427..bd74b2ee 100644
--- a/lib/resources/PaymentMethods.js
+++ b/lib/resources/PaymentMethods.js
@@ -8,7 +8,26 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'payment_methods',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{paymentMethod}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{paymentMethod}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   attach: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/Payouts.js b/lib/resources/Payouts.js
index df134c5a..a3b8e0cd 100644
--- a/lib/resources/Payouts.js
+++ b/lib/resources/Payouts.js
@@ -8,7 +8,26 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'payouts',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{payout}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{payout}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   cancel: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/Plans.js b/lib/resources/Plans.js
index 51900780..bd55a157 100644
--- a/lib/resources/Plans.js
+++ b/lib/resources/Plans.js
@@ -3,9 +3,34 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'plans',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list', 'del'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{plan}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{plan}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{plan}',
+  }),
 });
diff --git a/lib/resources/Prices.js b/lib/resources/Prices.js
index 59db3192..862e946d 100644
--- a/lib/resources/Prices.js
+++ b/lib/resources/Prices.js
@@ -3,9 +3,29 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'prices',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{price}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{price}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/Products.js b/lib/resources/Products.js
index f4af5a20..ba46de32 100644
--- a/lib/resources/Products.js
+++ b/lib/resources/Products.js
@@ -3,9 +3,34 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'products',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list', 'del'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{id}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{id}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{id}',
+  }),
 });
diff --git a/lib/resources/PromotionCodes.js b/lib/resources/PromotionCodes.js
index 9fe56a11..c8afa0e4 100644
--- a/lib/resources/PromotionCodes.js
+++ b/lib/resources/PromotionCodes.js
@@ -3,9 +3,29 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'promotion_codes',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{promotionCode}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{promotionCode}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/Quotes.js b/lib/resources/Quotes.js
index 444a01b1..62aebb65 100644
--- a/lib/resources/Quotes.js
+++ b/lib/resources/Quotes.js
@@ -8,7 +8,26 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'quotes',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{quote}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{quote}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   accept: stripeMethod({
     method: 'POST',
@@ -28,11 +47,13 @@ module.exports = StripeResource.extend({
   listComputedUpfrontLineItems: stripeMethod({
     method: 'GET',
     path: '/{quote}/computed_upfront_line_items',
+    methodType: 'list',
   }),
 
   listLineItems: stripeMethod({
     method: 'GET',
     path: '/{quote}/line_items',
+    methodType: 'list',
   }),
 
   pdf: stripeMethod({
diff --git a/lib/resources/Radar/EarlyFraudWarnings.js b/lib/resources/Radar/EarlyFraudWarnings.js
index 33bad28c..9282648d 100644
--- a/lib/resources/Radar/EarlyFraudWarnings.js
+++ b/lib/resources/Radar/EarlyFraudWarnings.js
@@ -3,9 +3,19 @@
 'use strict';
 
 const StripeResource = require('../../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'radar/early_fraud_warnings',
 
-  includeBasic: ['retrieve', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{earlyFraudWarning}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/Radar/ValueListItems.js b/lib/resources/Radar/ValueListItems.js
index 908c760e..75bcb894 100644
--- a/lib/resources/Radar/ValueListItems.js
+++ b/lib/resources/Radar/ValueListItems.js
@@ -3,9 +3,29 @@
 'use strict';
 
 const StripeResource = require('../../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'radar/value_list_items',
 
-  includeBasic: ['create', 'retrieve', 'list', 'del'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{item}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{item}',
+  }),
 });
diff --git a/lib/resources/Radar/ValueLists.js b/lib/resources/Radar/ValueLists.js
index 38192f8b..ace1edaa 100644
--- a/lib/resources/Radar/ValueLists.js
+++ b/lib/resources/Radar/ValueLists.js
@@ -3,9 +3,34 @@
 'use strict';
 
 const StripeResource = require('../../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'radar/value_lists',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list', 'del'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{valueList}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{valueList}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{valueList}',
+  }),
 });
diff --git a/lib/resources/Refunds.js b/lib/resources/Refunds.js
index 2ec7b90a..f1c0c130 100644
--- a/lib/resources/Refunds.js
+++ b/lib/resources/Refunds.js
@@ -3,9 +3,29 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'refunds',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{refund}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{refund}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/Reporting/ReportRuns.js b/lib/resources/Reporting/ReportRuns.js
index 895a5fda..84eb179f 100644
--- a/lib/resources/Reporting/ReportRuns.js
+++ b/lib/resources/Reporting/ReportRuns.js
@@ -3,9 +3,24 @@
 'use strict';
 
 const StripeResource = require('../../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'reporting/report_runs',
 
-  includeBasic: ['create', 'retrieve', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{reportRun}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/Reporting/ReportTypes.js b/lib/resources/Reporting/ReportTypes.js
index bd51d34a..b4b25f80 100644
--- a/lib/resources/Reporting/ReportTypes.js
+++ b/lib/resources/Reporting/ReportTypes.js
@@ -3,9 +3,19 @@
 'use strict';
 
 const StripeResource = require('../../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'reporting/report_types',
 
-  includeBasic: ['retrieve', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{reportType}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/Reviews.js b/lib/resources/Reviews.js
index 003368ba..9400e8b8 100644
--- a/lib/resources/Reviews.js
+++ b/lib/resources/Reviews.js
@@ -8,7 +8,16 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'reviews',
 
-  includeBasic: ['retrieve', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{review}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   approve: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/SKUs.js b/lib/resources/SKUs.js
index 83dd16ac..26812405 100644
--- a/lib/resources/SKUs.js
+++ b/lib/resources/SKUs.js
@@ -3,9 +3,34 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'skus',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list', 'del'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{id}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{id}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{id}',
+  }),
 });
diff --git a/lib/resources/SetupAttempts.js b/lib/resources/SetupAttempts.js
index 3d24d9f3..9bb8c1d3 100644
--- a/lib/resources/SetupAttempts.js
+++ b/lib/resources/SetupAttempts.js
@@ -3,9 +3,14 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'setup_attempts',
 
-  includeBasic: ['list'],
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/SetupIntents.js b/lib/resources/SetupIntents.js
index ff22fe5b..0f5ed8ec 100644
--- a/lib/resources/SetupIntents.js
+++ b/lib/resources/SetupIntents.js
@@ -8,7 +8,26 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'setup_intents',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{intent}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{intent}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   cancel: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/Sigma/ScheduledQueryRuns.js b/lib/resources/Sigma/ScheduledQueryRuns.js
index 4c8a0999..a8cb8e60 100644
--- a/lib/resources/Sigma/ScheduledQueryRuns.js
+++ b/lib/resources/Sigma/ScheduledQueryRuns.js
@@ -3,9 +3,19 @@
 'use strict';
 
 const StripeResource = require('../../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'sigma/scheduled_query_runs',
 
-  includeBasic: ['retrieve', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{scheduledQueryRun}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/Sources.js b/lib/resources/Sources.js
index f1fd8538..5008001c 100644
--- a/lib/resources/Sources.js
+++ b/lib/resources/Sources.js
@@ -8,7 +8,20 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'sources',
 
-  includeBasic: ['create', 'retrieve', 'update'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{source}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{source}',
+  }),
 
   listSourceTransactions: stripeMethod({
     method: 'GET',
diff --git a/lib/resources/SubscriptionItems.js b/lib/resources/SubscriptionItems.js
index 74a90858..62423a22 100644
--- a/lib/resources/SubscriptionItems.js
+++ b/lib/resources/SubscriptionItems.js
@@ -8,7 +8,31 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'subscription_items',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list', 'del'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{item}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{item}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{item}',
+  }),
 
   createUsageRecord: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/SubscriptionSchedules.js b/lib/resources/SubscriptionSchedules.js
index 9eabb142..9c9249e3 100644
--- a/lib/resources/SubscriptionSchedules.js
+++ b/lib/resources/SubscriptionSchedules.js
@@ -8,7 +8,26 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'subscription_schedules',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{schedule}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{schedule}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   cancel: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/Subscriptions.js b/lib/resources/Subscriptions.js
index b701e45a..03dee403 100644
--- a/lib/resources/Subscriptions.js
+++ b/lib/resources/Subscriptions.js
@@ -8,7 +8,31 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'subscriptions',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list', 'del'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{subscriptionExposedId}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{subscriptionExposedId}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{subscriptionExposedId}',
+  }),
 
   deleteDiscount: stripeMethod({
     method: 'DELETE',
diff --git a/lib/resources/TaxCodes.js b/lib/resources/TaxCodes.js
index f63479e2..57bf52ff 100644
--- a/lib/resources/TaxCodes.js
+++ b/lib/resources/TaxCodes.js
@@ -3,9 +3,19 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'tax_codes',
 
-  includeBasic: ['retrieve', 'list'],
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{id}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/TaxRates.js b/lib/resources/TaxRates.js
index 041ac456..e429895f 100644
--- a/lib/resources/TaxRates.js
+++ b/lib/resources/TaxRates.js
@@ -3,9 +3,29 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'tax_rates',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{taxRate}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{taxRate}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 });
diff --git a/lib/resources/Terminal/ConnectionTokens.js b/lib/resources/Terminal/ConnectionTokens.js
index eee06765..2e1a1b51 100644
--- a/lib/resources/Terminal/ConnectionTokens.js
+++ b/lib/resources/Terminal/ConnectionTokens.js
@@ -3,9 +3,13 @@
 'use strict';
 
 const StripeResource = require('../../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'terminal/connection_tokens',
 
-  includeBasic: ['create'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
 });
diff --git a/lib/resources/Terminal/Locations.js b/lib/resources/Terminal/Locations.js
index cb216923..161e0dd0 100644
--- a/lib/resources/Terminal/Locations.js
+++ b/lib/resources/Terminal/Locations.js
@@ -3,9 +3,34 @@
 'use strict';
 
 const StripeResource = require('../../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'terminal/locations',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list', 'del'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{location}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{location}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{location}',
+  }),
 });
diff --git a/lib/resources/Terminal/Readers.js b/lib/resources/Terminal/Readers.js
index be5f1348..e0f9d8f5 100644
--- a/lib/resources/Terminal/Readers.js
+++ b/lib/resources/Terminal/Readers.js
@@ -3,9 +3,34 @@
 'use strict';
 
 const StripeResource = require('../../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'terminal/readers',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list', 'del'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{reader}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{reader}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{reader}',
+  }),
 });
diff --git a/lib/resources/Tokens.js b/lib/resources/Tokens.js
index 35344090..76e4d337 100644
--- a/lib/resources/Tokens.js
+++ b/lib/resources/Tokens.js
@@ -3,9 +3,18 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'tokens',
 
-  includeBasic: ['create', 'retrieve'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{token}',
+  }),
 });
diff --git a/lib/resources/Topups.js b/lib/resources/Topups.js
index f80dc773..e65fe5d1 100644
--- a/lib/resources/Topups.js
+++ b/lib/resources/Topups.js
@@ -8,7 +8,26 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'topups',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{topup}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{topup}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   cancel: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/Transfers.js b/lib/resources/Transfers.js
index e2a810c4..656128c3 100644
--- a/lib/resources/Transfers.js
+++ b/lib/resources/Transfers.js
@@ -8,7 +8,26 @@ const stripeMethod = StripeResource.method;
 module.exports = StripeResource.extend({
   path: 'transfers',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{transfer}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{transfer}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
 
   createReversal: stripeMethod({
     method: 'POST',
diff --git a/lib/resources/WebhookEndpoints.js b/lib/resources/WebhookEndpoints.js
index e026cf13..2f73d650 100644
--- a/lib/resources/WebhookEndpoints.js
+++ b/lib/resources/WebhookEndpoints.js
@@ -3,9 +3,34 @@
 'use strict';
 
 const StripeResource = require('../StripeResource');
+const stripeMethod = StripeResource.method;
 
 module.exports = StripeResource.extend({
   path: 'webhook_endpoints',
 
-  includeBasic: ['create', 'retrieve', 'update', 'list', 'del'],
+  create: stripeMethod({
+    method: 'POST',
+    path: '',
+  }),
+
+  retrieve: stripeMethod({
+    method: 'GET',
+    path: '/{webhookEndpoint}',
+  }),
+
+  update: stripeMethod({
+    method: 'POST',
+    path: '/{webhookEndpoint}',
+  }),
+
+  list: stripeMethod({
+    method: 'GET',
+    path: '',
+    methodType: 'list',
+  }),
+
+  del: stripeMethod({
+    method: 'DELETE',
+    path: '/{webhookEndpoint}',
+  }),
 });
diff --git a/package.json b/package.json
index 9bf438f4..7a696536 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "stripe",
-  "version": "8.165.0",
+  "version": "8.166.0",
   "description": "Stripe API wrapper",
   "keywords": [
     "stripe",
diff --git a/types/2020-08-27/Accounts.d.ts b/types/2020-08-27/Accounts.d.ts
index 13d383e3..9a75bcc5 100644
--- a/types/2020-08-27/Accounts.d.ts
+++ b/types/2020-08-27/Accounts.d.ts
@@ -981,36 +981,8 @@ declare module 'stripe' {
       }
 
       namespace BusinessProfile {
-        interface SupportAddress {
-          /**
-           * City, district, suburb, town, or village.
-           */
-          city?: string;
-
-          /**
-           * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-           */
-          country?: string;
-
-          /**
-           * Address line 1 (e.g., street, PO Box, or company name).
-           */
+        interface SupportAddress extends Omit<Stripe.AddressParam, 'line1'> {
           line1?: string;
-
-          /**
-           * Address line 2 (e.g., apartment, suite, unit, or building).
-           */
-          line2?: string;
-
-          /**
-           * ZIP or postal code.
-           */
-          postal_code?: string;
-
-          /**
-           * State, county, province, or region.
-           */
-          state?: string;
         }
       }
 
@@ -1383,36 +1355,8 @@ declare module 'stripe' {
       }
 
       namespace Company {
-        interface Address {
-          /**
-           * City, district, suburb, town, or village.
-           */
-          city?: string;
-
-          /**
-           * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-           */
-          country?: string;
-
-          /**
-           * Address line 1 (e.g., street, PO Box, or company name).
-           */
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
           line1?: string;
-
-          /**
-           * Address line 2 (e.g., apartment, suite, unit, or building).
-           */
-          line2?: string;
-
-          /**
-           * ZIP or postal code.
-           */
-          postal_code?: string;
-
-          /**
-           * State, county, province, or region.
-           */
-          state?: string;
         }
 
         type Structure =
@@ -1670,36 +1614,8 @@ declare module 'stripe' {
       }
 
       namespace Individual {
-        interface Address {
-          /**
-           * City, district, suburb, town, or village.
-           */
-          city?: string;
-
-          /**
-           * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-           */
-          country?: string;
-
-          /**
-           * Address line 1 (e.g., street, PO Box, or company name).
-           */
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
           line1?: string;
-
-          /**
-           * Address line 2 (e.g., apartment, suite, unit, or building).
-           */
-          line2?: string;
-
-          /**
-           * ZIP or postal code.
-           */
-          postal_code?: string;
-
-          /**
-           * State, county, province, or region.
-           */
-          state?: string;
         }
 
         interface Dob {
@@ -1966,13 +1882,6 @@ declare module 'stripe' {
       expand?: Array<string>;
     }
 
-    interface AccountRetrieveParams {
-      /**
-       * Specifies which fields in the response should be expanded.
-       */
-      expand?: Array<string>;
-    }
-
     interface AccountUpdateParams {
       /**
        * An [account token](https://stripe.com/docs/api#create_account_token), used to securely provide details to the account.
@@ -2091,36 +2000,8 @@ declare module 'stripe' {
       }
 
       namespace BusinessProfile {
-        interface SupportAddress {
-          /**
-           * City, district, suburb, town, or village.
-           */
-          city?: string;
-
-          /**
-           * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-           */
-          country?: string;
-
-          /**
-           * Address line 1 (e.g., street, PO Box, or company name).
-           */
+        interface SupportAddress extends Omit<Stripe.AddressParam, 'line1'> {
           line1?: string;
-
-          /**
-           * Address line 2 (e.g., apartment, suite, unit, or building).
-           */
-          line2?: string;
-
-          /**
-           * ZIP or postal code.
-           */
-          postal_code?: string;
-
-          /**
-           * State, county, province, or region.
-           */
-          state?: string;
         }
       }
 
@@ -2493,36 +2374,8 @@ declare module 'stripe' {
       }
 
       namespace Company {
-        interface Address {
-          /**
-           * City, district, suburb, town, or village.
-           */
-          city?: string;
-
-          /**
-           * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-           */
-          country?: string;
-
-          /**
-           * Address line 1 (e.g., street, PO Box, or company name).
-           */
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
           line1?: string;
-
-          /**
-           * Address line 2 (e.g., apartment, suite, unit, or building).
-           */
-          line2?: string;
-
-          /**
-           * ZIP or postal code.
-           */
-          postal_code?: string;
-
-          /**
-           * State, county, province, or region.
-           */
-          state?: string;
         }
 
         type Structure =
@@ -2743,36 +2596,8 @@ declare module 'stripe' {
       }
 
       namespace Individual {
-        interface Address {
-          /**
-           * City, district, suburb, town, or village.
-           */
-          city?: string;
-
-          /**
-           * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-           */
-          country?: string;
-
-          /**
-           * Address line 1 (e.g., street, PO Box, or company name).
-           */
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
           line1?: string;
-
-          /**
-           * Address line 2 (e.g., apartment, suite, unit, or building).
-           */
-          line2?: string;
-
-          /**
-           * ZIP or postal code.
-           */
-          postal_code?: string;
-
-          /**
-           * State, county, province, or region.
-           */
-          state?: string;
         }
 
         interface Dob {
diff --git a/types/2020-08-27/BankAccounts.d.ts b/types/2020-08-27/BankAccounts.d.ts
index 1d4436c6..b047cb48 100644
--- a/types/2020-08-27/BankAccounts.d.ts
+++ b/types/2020-08-27/BankAccounts.d.ts
@@ -31,6 +31,11 @@ declare module 'stripe' {
        */
       account_holder_type: string | null;
 
+      /**
+       * The bank account type. This can only be `checking` or `savings` in most countries. In Japan, this can only be `futsu` or `toza`.
+       */
+      account_type: string | null;
+
       /**
        * A set of available payout methods for this bank account. Only values from this set should be passed as the `method` when creating a payout.
        */
diff --git a/types/2020-08-27/Charges.d.ts b/types/2020-08-27/Charges.d.ts
index a513e995..0246f5d7 100644
--- a/types/2020-08-27/Charges.d.ts
+++ b/types/2020-08-27/Charges.d.ts
@@ -1729,7 +1729,7 @@ declare module 'stripe' {
         /**
          * Shipping address.
          */
-        address: Stripe.AddressParam;
+        address: Shipping.Address;
 
         /**
          * The delivery service that shipped a physical product, such as Fedex, UPS, USPS, etc.
@@ -1752,6 +1752,12 @@ declare module 'stripe' {
         tracking_number?: string;
       }
 
+      namespace Shipping {
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
+          line1?: string;
+        }
+      }
+
       interface TransferData {
         /**
          * The amount transferred to the destination account, if specified. By default, the entire charge amount is transferred to the destination account.
@@ -1830,7 +1836,7 @@ declare module 'stripe' {
         /**
          * Shipping address.
          */
-        address: Stripe.AddressParam;
+        address: Shipping.Address;
 
         /**
          * The delivery service that shipped a physical product, such as Fedex, UPS, USPS, etc.
@@ -1852,6 +1858,12 @@ declare module 'stripe' {
          */
         tracking_number?: string;
       }
+
+      namespace Shipping {
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
+          line1?: string;
+        }
+      }
     }
 
     interface ChargeListParams extends PaginationParams {
diff --git a/types/2020-08-27/CustomerSources.d.ts b/types/2020-08-27/CustomerSources.d.ts
index 0f88ae96..69052d8c 100644
--- a/types/2020-08-27/CustomerSources.d.ts
+++ b/types/2020-08-27/CustomerSources.d.ts
@@ -121,36 +121,8 @@ declare module 'stripe' {
       }
 
       namespace Owner {
-        interface Address {
-          /**
-           * City, district, suburb, town, or village.
-           */
-          city?: string;
-
-          /**
-           * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-           */
-          country?: string;
-
-          /**
-           * Address line 1 (e.g., street, PO Box, or company name).
-           */
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
           line1?: string;
-
-          /**
-           * Address line 2 (e.g., apartment, suite, unit, or building).
-           */
-          line2?: string;
-
-          /**
-           * ZIP or postal code.
-           */
-          postal_code?: string;
-
-          /**
-           * State, county, province, or region.
-           */
-          state?: string;
         }
       }
     }
diff --git a/types/2020-08-27/Customers.d.ts b/types/2020-08-27/Customers.d.ts
index 5a937ee6..e8abe4b7 100644
--- a/types/2020-08-27/Customers.d.ts
+++ b/types/2020-08-27/Customers.d.ts
@@ -390,7 +390,7 @@ declare module 'stripe' {
         /**
          * Customer shipping address.
          */
-        address: Stripe.AddressParam;
+        address: Shipping.Address;
 
         /**
          * Customer name.
@@ -403,6 +403,12 @@ declare module 'stripe' {
         phone?: string;
       }
 
+      namespace Shipping {
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
+          line1?: string;
+        }
+      }
+
       interface Tax {
         /**
          * A recent IP address of the customer used for tax reporting and tax location inference. Stripe recommends updating the IP address when a new PaymentMethod is attached or the address field on the customer is updated. We recommend against updating this field more frequently since it could result in unexpected tax location/reporting outcomes.
@@ -610,7 +616,7 @@ declare module 'stripe' {
         /**
          * Customer shipping address.
          */
-        address: Stripe.AddressParam;
+        address: Shipping.Address;
 
         /**
          * Customer name.
@@ -623,6 +629,12 @@ declare module 'stripe' {
         phone?: string;
       }
 
+      namespace Shipping {
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
+          line1?: string;
+        }
+      }
+
       interface Tax {
         /**
          * A recent IP address of the customer used for tax reporting and tax location inference. Stripe recommends updating the IP address when a new PaymentMethod is attached or the address field on the customer is updated. We recommend against updating this field more frequently since it could result in unexpected tax location/reporting outcomes.
diff --git a/types/2020-08-27/ExternalAccounts.d.ts b/types/2020-08-27/ExternalAccounts.d.ts
index 2bcca6f0..c8be4f17 100644
--- a/types/2020-08-27/ExternalAccounts.d.ts
+++ b/types/2020-08-27/ExternalAccounts.d.ts
@@ -44,6 +44,11 @@ declare module 'stripe' {
         ExternalAccountUpdateParams.AccountHolderType
       >;
 
+      /**
+       * The bank account type. This can only be `checking` or `savings` in most countries. In Japan, this can only be `futsu` or `toza`.
+       */
+      account_type?: ExternalAccountUpdateParams.AccountType;
+
       /**
        * City/District/Suburb/Town/Village.
        */
@@ -107,6 +112,8 @@ declare module 'stripe' {
 
     namespace ExternalAccountUpdateParams {
       type AccountHolderType = 'company' | 'individual';
+
+      type AccountType = 'checking' | 'futsu' | 'savings' | 'toza';
     }
 
     interface ExternalAccountListParams extends PaginationParams {
diff --git a/types/2020-08-27/InvoiceLineItems.d.ts b/types/2020-08-27/InvoiceLineItems.d.ts
index 9e2dacfc..1dd6ba6c 100644
--- a/types/2020-08-27/InvoiceLineItems.d.ts
+++ b/types/2020-08-27/InvoiceLineItems.d.ts
@@ -309,43 +309,15 @@ declare module 'stripe' {
       }
 
       namespace CustomerDetails {
-        interface Address {
-          /**
-           * City, district, suburb, town, or village.
-           */
-          city?: string;
-
-          /**
-           * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-           */
-          country?: string;
-
-          /**
-           * Address line 1 (e.g., street, PO Box, or company name).
-           */
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
           line1?: string;
-
-          /**
-           * Address line 2 (e.g., apartment, suite, unit, or building).
-           */
-          line2?: string;
-
-          /**
-           * ZIP or postal code.
-           */
-          postal_code?: string;
-
-          /**
-           * State, county, province, or region.
-           */
-          state?: string;
         }
 
         interface Shipping {
           /**
            * Customer shipping address.
            */
-          address: Stripe.AddressParam;
+          address: Shipping.Address;
 
           /**
            * Customer name.
@@ -358,6 +330,12 @@ declare module 'stripe' {
           phone?: string;
         }
 
+        namespace Shipping {
+          interface Address extends Omit<Stripe.AddressParam, 'line1'> {
+            line1?: string;
+          }
+        }
+
         interface Tax {
           /**
            * A recent IP address of the customer used for tax reporting and tax location inference. Stripe recommends updating the IP address when a new PaymentMethod is attached or the address field on the customer is updated. We recommend against updating this field more frequently since it could result in unexpected tax location/reporting outcomes.
@@ -599,7 +577,7 @@ declare module 'stripe' {
         plan?: string;
 
         /**
-         * The ID of the price object.
+         * The ID of the price object. When changing a subscription item's price, `quantity` is set to 1 unless a `quantity` parameter is provided.
          */
         price?: string;
 
diff --git a/types/2020-08-27/Invoices.d.ts b/types/2020-08-27/Invoices.d.ts
index 345048e8..70485a3b 100644
--- a/types/2020-08-27/Invoices.d.ts
+++ b/types/2020-08-27/Invoices.d.ts
@@ -1441,43 +1441,15 @@ declare module 'stripe' {
       }
 
       namespace CustomerDetails {
-        interface Address {
-          /**
-           * City, district, suburb, town, or village.
-           */
-          city?: string;
-
-          /**
-           * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-           */
-          country?: string;
-
-          /**
-           * Address line 1 (e.g., street, PO Box, or company name).
-           */
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
           line1?: string;
-
-          /**
-           * Address line 2 (e.g., apartment, suite, unit, or building).
-           */
-          line2?: string;
-
-          /**
-           * ZIP or postal code.
-           */
-          postal_code?: string;
-
-          /**
-           * State, county, province, or region.
-           */
-          state?: string;
         }
 
         interface Shipping {
           /**
            * Customer shipping address.
            */
-          address: Stripe.AddressParam;
+          address: Shipping.Address;
 
           /**
            * Customer name.
@@ -1490,6 +1462,12 @@ declare module 'stripe' {
           phone?: string;
         }
 
+        namespace Shipping {
+          interface Address extends Omit<Stripe.AddressParam, 'line1'> {
+            line1?: string;
+          }
+        }
+
         interface Tax {
           /**
            * A recent IP address of the customer used for tax reporting and tax location inference. Stripe recommends updating the IP address when a new PaymentMethod is attached or the address field on the customer is updated. We recommend against updating this field more frequently since it could result in unexpected tax location/reporting outcomes.
@@ -1731,7 +1709,7 @@ declare module 'stripe' {
         plan?: string;
 
         /**
-         * The ID of the price object.
+         * The ID of the price object. When changing a subscription item's price, `quantity` is set to 1 unless a `quantity` parameter is provided.
          */
         price?: string;
 
diff --git a/types/2020-08-27/Issuing/Authorizations.d.ts b/types/2020-08-27/Issuing/Authorizations.d.ts
index a9699a0f..f076b198 100644
--- a/types/2020-08-27/Issuing/Authorizations.d.ts
+++ b/types/2020-08-27/Issuing/Authorizations.d.ts
@@ -133,6 +133,11 @@ declare module 'stripe' {
            */
           category: string;
 
+          /**
+           * The merchant category code for the seller's business
+           */
+          category_code: string;
+
           /**
            * City where the seller is located
            */
diff --git a/types/2020-08-27/Issuing/Transactions.d.ts b/types/2020-08-27/Issuing/Transactions.d.ts
index c6ad5c61..9088fc0b 100644
--- a/types/2020-08-27/Issuing/Transactions.d.ts
+++ b/types/2020-08-27/Issuing/Transactions.d.ts
@@ -114,6 +114,11 @@ declare module 'stripe' {
            */
           category: string;
 
+          /**
+           * The merchant category code for the seller's business
+           */
+          category_code: string;
+
           /**
            * City where the seller is located
            */
diff --git a/types/2020-08-27/Orders.d.ts b/types/2020-08-27/Orders.d.ts
index a73342b9..ebbeeb6d 100644
--- a/types/2020-08-27/Orders.d.ts
+++ b/types/2020-08-27/Orders.d.ts
@@ -292,7 +292,7 @@ declare module 'stripe' {
         /**
          * Customer shipping address.
          */
-        address: Stripe.AddressParam;
+        address: Shipping.Address;
 
         /**
          * Customer name.
@@ -304,6 +304,12 @@ declare module 'stripe' {
          */
         phone?: string;
       }
+
+      namespace Shipping {
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
+          line1?: string;
+        }
+      }
     }
 
     interface OrderRetrieveParams {
diff --git a/types/2020-08-27/PaymentIntents.d.ts b/types/2020-08-27/PaymentIntents.d.ts
index 8cba16f9..c56ef1f3 100644
--- a/types/2020-08-27/PaymentIntents.d.ts
+++ b/types/2020-08-27/PaymentIntents.d.ts
@@ -1172,36 +1172,8 @@ declare module 'stripe' {
         }
 
         namespace BillingDetails {
-          interface Address {
-            /**
-             * City, district, suburb, town, or village.
-             */
-            city?: string;
-
-            /**
-             * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-             */
-            country?: string;
-
-            /**
-             * Address line 1 (e.g., street, PO Box, or company name).
-             */
+          interface Address extends Omit<Stripe.AddressParam, 'line1'> {
             line1?: string;
-
-            /**
-             * Address line 2 (e.g., apartment, suite, unit, or building).
-             */
-            line2?: string;
-
-            /**
-             * ZIP or postal code.
-             */
-            postal_code?: string;
-
-            /**
-             * State, county, province, or region.
-             */
-            state?: string;
           }
         }
 
@@ -1692,7 +1664,7 @@ declare module 'stripe' {
         /**
          * Shipping address.
          */
-        address: Stripe.AddressParam;
+        address: Shipping.Address;
 
         /**
          * The delivery service that shipped a physical product, such as Fedex, UPS, USPS, etc.
@@ -1715,6 +1687,12 @@ declare module 'stripe' {
         tracking_number?: string;
       }
 
+      namespace Shipping {
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
+          line1?: string;
+        }
+      }
+
       interface TransferData {
         /**
          * The amount that will be transferred automatically when a charge succeeds.
@@ -2034,36 +2012,8 @@ declare module 'stripe' {
         }
 
         namespace BillingDetails {
-          interface Address {
-            /**
-             * City, district, suburb, town, or village.
-             */
-            city?: string;
-
-            /**
-             * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-             */
-            country?: string;
-
-            /**
-             * Address line 1 (e.g., street, PO Box, or company name).
-             */
+          interface Address extends Omit<Stripe.AddressParam, 'line1'> {
             line1?: string;
-
-            /**
-             * Address line 2 (e.g., apartment, suite, unit, or building).
-             */
-            line2?: string;
-
-            /**
-             * ZIP or postal code.
-             */
-            postal_code?: string;
-
-            /**
-             * State, county, province, or region.
-             */
-            state?: string;
           }
         }
 
@@ -2554,7 +2504,7 @@ declare module 'stripe' {
         /**
          * Shipping address.
          */
-        address: Stripe.AddressParam;
+        address: Shipping.Address;
 
         /**
          * The delivery service that shipped a physical product, such as Fedex, UPS, USPS, etc.
@@ -2577,6 +2527,12 @@ declare module 'stripe' {
         tracking_number?: string;
       }
 
+      namespace Shipping {
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
+          line1?: string;
+        }
+      }
+
       interface TransferData {
         /**
          * The amount that will be transferred automatically when a charge succeeds.
@@ -3010,36 +2966,8 @@ declare module 'stripe' {
         }
 
         namespace BillingDetails {
-          interface Address {
-            /**
-             * City, district, suburb, town, or village.
-             */
-            city?: string;
-
-            /**
-             * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-             */
-            country?: string;
-
-            /**
-             * Address line 1 (e.g., street, PO Box, or company name).
-             */
+          interface Address extends Omit<Stripe.AddressParam, 'line1'> {
             line1?: string;
-
-            /**
-             * Address line 2 (e.g., apartment, suite, unit, or building).
-             */
-            line2?: string;
-
-            /**
-             * ZIP or postal code.
-             */
-            postal_code?: string;
-
-            /**
-             * State, county, province, or region.
-             */
-            state?: string;
           }
         }
 
@@ -3530,7 +3458,7 @@ declare module 'stripe' {
         /**
          * Shipping address.
          */
-        address: Stripe.AddressParam;
+        address: Shipping.Address;
 
         /**
          * The delivery service that shipped a physical product, such as Fedex, UPS, USPS, etc.
@@ -3552,6 +3480,12 @@ declare module 'stripe' {
          */
         tracking_number?: string;
       }
+
+      namespace Shipping {
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
+          line1?: string;
+        }
+      }
     }
 
     class PaymentIntentsResource {
diff --git a/types/2020-08-27/PaymentMethods.d.ts b/types/2020-08-27/PaymentMethods.d.ts
index ab8ed3f0..5a1fb45c 100644
--- a/types/2020-08-27/PaymentMethods.d.ts
+++ b/types/2020-08-27/PaymentMethods.d.ts
@@ -821,36 +821,8 @@ declare module 'stripe' {
       }
 
       namespace BillingDetails {
-        interface Address {
-          /**
-           * City, district, suburb, town, or village.
-           */
-          city?: string;
-
-          /**
-           * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-           */
-          country?: string;
-
-          /**
-           * Address line 1 (e.g., street, PO Box, or company name).
-           */
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
           line1?: string;
-
-          /**
-           * Address line 2 (e.g., apartment, suite, unit, or building).
-           */
-          line2?: string;
-
-          /**
-           * ZIP or postal code.
-           */
-          postal_code?: string;
-
-          /**
-           * State, county, province, or region.
-           */
-          state?: string;
         }
       }
 
@@ -1151,36 +1123,8 @@ declare module 'stripe' {
       }
 
       namespace BillingDetails {
-        interface Address {
-          /**
-           * City, district, suburb, town, or village.
-           */
-          city?: string;
-
-          /**
-           * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-           */
-          country?: string;
-
-          /**
-           * Address line 1 (e.g., street, PO Box, or company name).
-           */
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
           line1?: string;
-
-          /**
-           * Address line 2 (e.g., apartment, suite, unit, or building).
-           */
-          line2?: string;
-
-          /**
-           * ZIP or postal code.
-           */
-          postal_code?: string;
-
-          /**
-           * State, county, province, or region.
-           */
-          state?: string;
         }
       }
 
diff --git a/types/2020-08-27/Persons.d.ts b/types/2020-08-27/Persons.d.ts
index 50ce5ab5..6d829117 100644
--- a/types/2020-08-27/Persons.d.ts
+++ b/types/2020-08-27/Persons.d.ts
@@ -562,36 +562,8 @@ declare module 'stripe' {
     }
 
     namespace PersonCreateParams {
-      interface Address {
-        /**
-         * City, district, suburb, town, or village.
-         */
-        city?: string;
-
-        /**
-         * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-         */
-        country?: string;
-
-        /**
-         * Address line 1 (e.g., street, PO Box, or company name).
-         */
+      interface Address extends Omit<Stripe.AddressParam, 'line1'> {
         line1?: string;
-
-        /**
-         * Address line 2 (e.g., apartment, suite, unit, or building).
-         */
-        line2?: string;
-
-        /**
-         * ZIP or postal code.
-         */
-        postal_code?: string;
-
-        /**
-         * State, county, province, or region.
-         */
-        state?: string;
       }
 
       interface Dob {
@@ -852,36 +824,8 @@ declare module 'stripe' {
     }
 
     namespace PersonUpdateParams {
-      interface Address {
-        /**
-         * City, district, suburb, town, or village.
-         */
-        city?: string;
-
-        /**
-         * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-         */
-        country?: string;
-
-        /**
-         * Address line 1 (e.g., street, PO Box, or company name).
-         */
+      interface Address extends Omit<Stripe.AddressParam, 'line1'> {
         line1?: string;
-
-        /**
-         * Address line 2 (e.g., apartment, suite, unit, or building).
-         */
-        line2?: string;
-
-        /**
-         * ZIP or postal code.
-         */
-        postal_code?: string;
-
-        /**
-         * State, county, province, or region.
-         */
-        state?: string;
       }
 
       interface Dob {
diff --git a/types/2020-08-27/Reviews.d.ts b/types/2020-08-27/Reviews.d.ts
index 33bdec56..a90e91b0 100644
--- a/types/2020-08-27/Reviews.d.ts
+++ b/types/2020-08-27/Reviews.d.ts
@@ -27,7 +27,7 @@ declare module 'stripe' {
       charge: string | Stripe.Charge | null;
 
       /**
-       * The reason the review was closed, or null if it has not yet been closed. One of `approved`, `refunded`, `refunded_as_fraud`, or `disputed`.
+       * The reason the review was closed, or null if it has not yet been closed. One of `approved`, `refunded`, `refunded_as_fraud`, `disputed`, or `redacted`.
        */
       closed_reason: Review.ClosedReason | null;
 
@@ -67,7 +67,7 @@ declare module 'stripe' {
       payment_intent?: string | Stripe.PaymentIntent;
 
       /**
-       * The reason the review is currently open or closed. One of `rule`, `manual`, `approved`, `refunded`, `refunded_as_fraud`, or `disputed`.
+       * The reason the review is currently open or closed. One of `rule`, `manual`, `approved`, `refunded`, `refunded_as_fraud`, `disputed`, or `redacted`.
        */
       reason: string;
 
@@ -81,6 +81,7 @@ declare module 'stripe' {
       type ClosedReason =
         | 'approved'
         | 'disputed'
+        | 'redacted'
         | 'refunded'
         | 'refunded_as_fraud';
 
diff --git a/types/2020-08-27/SKUs.d.ts b/types/2020-08-27/SKUs.d.ts
index 467da5c3..4ba115c9 100644
--- a/types/2020-08-27/SKUs.d.ts
+++ b/types/2020-08-27/SKUs.d.ts
@@ -168,7 +168,9 @@ declare module 'stripe' {
       /**
        * A dictionary of attributes and values for the attributes defined by the product. If, for example, a product's attributes are `["size", "gender"]`, a valid SKU has the following dictionary of attributes: `{"size": "Medium", "gender": "Unisex"}`.
        */
-      attributes?: Stripe.Metadata;
+      attributes?: {
+        [key: string]: string;
+      };
 
       /**
        * Specifies which fields in the response should be expanded.
@@ -259,7 +261,9 @@ declare module 'stripe' {
       /**
        * A dictionary of attributes and values for the attributes defined by the product. When specified, `attributes` will partially update the existing attributes dictionary on the product, with the postcondition that a value must be present for each attribute key on the product.
        */
-      attributes?: Stripe.Metadata;
+      attributes?: {
+        [key: string]: string;
+      };
 
       /**
        * Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).
@@ -358,7 +362,9 @@ declare module 'stripe' {
       /**
        * Only return SKUs that have the specified key-value pairs in this partially constructed dictionary. Can be specified only if `product` is also supplied. For instance, if the associated product has attributes `["color", "size"]`, passing in `attributes[color]=red` returns all the SKUs for this product that have `color` set to `red`.
        */
-      attributes?: Stripe.Metadata;
+      attributes?: {
+        [key: string]: string;
+      };
 
       /**
        * Specifies which fields in the response should be expanded.
diff --git a/types/2020-08-27/Sources.d.ts b/types/2020-08-27/Sources.d.ts
index e45f160f..661f1f1b 100644
--- a/types/2020-08-27/Sources.d.ts
+++ b/types/2020-08-27/Sources.d.ts
@@ -934,36 +934,8 @@ declare module 'stripe' {
       }
 
       namespace Owner {
-        interface Address {
-          /**
-           * City, district, suburb, town, or village.
-           */
-          city?: string;
-
-          /**
-           * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-           */
-          country?: string;
-
-          /**
-           * Address line 1 (e.g., street, PO Box, or company name).
-           */
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
           line1?: string;
-
-          /**
-           * Address line 2 (e.g., apartment, suite, unit, or building).
-           */
-          line2?: string;
-
-          /**
-           * ZIP or postal code.
-           */
-          postal_code?: string;
-
-          /**
-           * State, county, province, or region.
-           */
-          state?: string;
         }
       }
 
@@ -1226,36 +1198,8 @@ declare module 'stripe' {
       }
 
       namespace Owner {
-        interface Address {
-          /**
-           * City, district, suburb, town, or village.
-           */
-          city?: string;
-
-          /**
-           * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-           */
-          country?: string;
-
-          /**
-           * Address line 1 (e.g., street, PO Box, or company name).
-           */
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
           line1?: string;
-
-          /**
-           * Address line 2 (e.g., apartment, suite, unit, or building).
-           */
-          line2?: string;
-
-          /**
-           * ZIP or postal code.
-           */
-          postal_code?: string;
-
-          /**
-           * State, county, province, or region.
-           */
-          state?: string;
         }
       }
 
diff --git a/types/2020-08-27/SubscriptionItems.d.ts b/types/2020-08-27/SubscriptionItems.d.ts
index 5e1880a7..202ccbd3 100644
--- a/types/2020-08-27/SubscriptionItems.d.ts
+++ b/types/2020-08-27/SubscriptionItems.d.ts
@@ -290,7 +290,7 @@ declare module 'stripe' {
       plan?: string;
 
       /**
-       * The ID of the price object.
+       * The ID of the price object. When changing a subscription item's price, `quantity` is set to 1 unless a `quantity` parameter is provided.
        */
       price?: string;
 
diff --git a/types/2020-08-27/Subscriptions.d.ts b/types/2020-08-27/Subscriptions.d.ts
index bc069494..88d1962b 100644
--- a/types/2020-08-27/Subscriptions.d.ts
+++ b/types/2020-08-27/Subscriptions.d.ts
@@ -1066,7 +1066,7 @@ declare module 'stripe' {
         plan?: string;
 
         /**
-         * The ID of the price object.
+         * The ID of the price object. When changing a subscription item's price, `quantity` is set to 1 unless a `quantity` parameter is provided.
          */
         price?: string;
 
diff --git a/types/2020-08-27/Terminal/Locations.d.ts b/types/2020-08-27/Terminal/Locations.d.ts
index a531e99d..f39df88c 100644
--- a/types/2020-08-27/Terminal/Locations.d.ts
+++ b/types/2020-08-27/Terminal/Locations.d.ts
@@ -143,36 +143,8 @@ declare module 'stripe' {
       }
 
       namespace LocationUpdateParams {
-        interface Address {
-          /**
-           * City, district, suburb, town, or village.
-           */
-          city?: string;
-
-          /**
-           * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-           */
-          country?: string;
-
-          /**
-           * Address line 1 (e.g., street, PO Box, or company name).
-           */
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
           line1?: string;
-
-          /**
-           * Address line 2 (e.g., apartment, suite, unit, or building).
-           */
-          line2?: string;
-
-          /**
-           * ZIP or postal code.
-           */
-          postal_code?: string;
-
-          /**
-           * State, county, province, or region.
-           */
-          state?: string;
         }
       }
 
diff --git a/types/2020-08-27/Tokens.d.ts b/types/2020-08-27/Tokens.d.ts
index 6009a32a..539f102b 100644
--- a/types/2020-08-27/Tokens.d.ts
+++ b/types/2020-08-27/Tokens.d.ts
@@ -214,36 +214,8 @@ declare module 'stripe' {
         }
 
         namespace Company {
-          interface Address {
-            /**
-             * City, district, suburb, town, or village.
-             */
-            city?: string;
-
-            /**
-             * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-             */
-            country?: string;
-
-            /**
-             * Address line 1 (e.g., street, PO Box, or company name).
-             */
+          interface Address extends Omit<Stripe.AddressParam, 'line1'> {
             line1?: string;
-
-            /**
-             * Address line 2 (e.g., apartment, suite, unit, or building).
-             */
-            line2?: string;
-
-            /**
-             * ZIP or postal code.
-             */
-            postal_code?: string;
-
-            /**
-             * State, county, province, or region.
-             */
-            state?: string;
           }
 
           type Structure =
@@ -388,36 +360,8 @@ declare module 'stripe' {
         }
 
         namespace Individual {
-          interface Address {
-            /**
-             * City, district, suburb, town, or village.
-             */
-            city?: string;
-
-            /**
-             * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-             */
-            country?: string;
-
-            /**
-             * Address line 1 (e.g., street, PO Box, or company name).
-             */
+          interface Address extends Omit<Stripe.AddressParam, 'line1'> {
             line1?: string;
-
-            /**
-             * Address line 2 (e.g., apartment, suite, unit, or building).
-             */
-            line2?: string;
-
-            /**
-             * ZIP or postal code.
-             */
-            postal_code?: string;
-
-            /**
-             * State, county, province, or region.
-             */
-            state?: string;
           }
 
           interface Dob {
@@ -495,6 +439,11 @@ declare module 'stripe' {
          */
         account_number: string;
 
+        /**
+         * The bank account type. This can only be `checking` or `savings` in most countries. In Japan, this can only be `futsu` or `toza`.
+         */
+        account_type?: BankAccount.AccountType;
+
         /**
          * The country in which the bank account is located.
          */
@@ -513,6 +462,8 @@ declare module 'stripe' {
 
       namespace BankAccount {
         type AccountHolderType = 'company' | 'individual';
+
+        type AccountType = 'checking' | 'futsu' | 'savings' | 'toza';
       }
 
       interface Card {
@@ -661,36 +612,8 @@ declare module 'stripe' {
       }
 
       namespace Person {
-        interface Address {
-          /**
-           * City, district, suburb, town, or village.
-           */
-          city?: string;
-
-          /**
-           * Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).
-           */
-          country?: string;
-
-          /**
-           * Address line 1 (e.g., street, PO Box, or company name).
-           */
+        interface Address extends Omit<Stripe.AddressParam, 'line1'> {
           line1?: string;
-
-          /**
-           * Address line 2 (e.g., apartment, suite, unit, or building).
-           */
-          line2?: string;
-
-          /**
-           * ZIP or postal code.
-           */
-          postal_code?: string;
-
-          /**
-           * State, county, province, or region.
-           */
-          state?: string;
         }
 
         interface Dob {
diff --git a/types/2020-08-27/index.d.ts b/types/2020-08-27/index.d.ts
index 489f2dce..5c7f8f15 100644
--- a/types/2020-08-27/index.d.ts
+++ b/types/2020-08-27/index.d.ts
@@ -173,7 +173,9 @@ declare module 'stripe' {
       configurations: Stripe.BillingPortal.ConfigurationsResource;
       sessions: Stripe.BillingPortal.SessionsResource;
     };
-    checkout: {sessions: Stripe.Checkout.SessionsResource};
+    checkout: {
+      sessions: Stripe.Checkout.SessionsResource;
+    };
     identity: {
       verificationReports: Stripe.Identity.VerificationReportsResource;
       verificationSessions: Stripe.Identity.VerificationSessionsResource;
@@ -194,13 +196,14 @@ declare module 'stripe' {
       reportRuns: Stripe.Reporting.ReportRunsResource;
       reportTypes: Stripe.Reporting.ReportTypesResource;
     };
-    sigma: {scheduledQueryRuns: Stripe.Sigma.ScheduledQueryRunsResource};
+    sigma: {
+      scheduledQueryRuns: Stripe.Sigma.ScheduledQueryRunsResource;
+    };
     terminal: {
       connectionTokens: Stripe.Terminal.ConnectionTokensResource;
       locations: Stripe.Terminal.LocationsResource;
       readers: Stripe.Terminal.ReadersResource;
     };
-
     /**
      * API Errors
      */
diff --git a/types/lib.d.ts b/types/lib.d.ts
index 45d396a0..cb090ab5 100644
--- a/types/lib.d.ts
+++ b/types/lib.d.ts
@@ -16,7 +16,8 @@ declare module 'stripe' {
       >(spec: T): StripeResource & T;
       static method(spec: {
         method: string;
-        path: string;
+        path?: string;
+        fullPath?: string;
         methodType?: 'list';
       }): (...args: any[]) => object; //eslint-disable-line @typescript-eslint/no-explicit-any
       static BASIC_METHODS: {


Test patch:
diff --git a/test/StripeResource.spec.js b/test/StripeResource.spec.js
index 18b1f2a5..2f5ec6cc 100644
--- a/test/StripeResource.spec.js
+++ b/test/StripeResource.spec.js
@@ -642,6 +642,38 @@ describe('StripeResource', () => {
     });
   });
 
+  describe('method with fullPath', () => {
+    it('interpolates in parameters', (callback) => {
+      const handleRequest = (req, res) => {
+        expect(req.url).to.equal('/v1/parent/hello/child/world');
+
+        // Write back JSON to close out the server.
+        res.write('{}');
+        res.end();
+      };
+
+      testUtils.getTestServerStripe(
+        {},
+        handleRequest,
+        (err, stripe, closeServer) => {
+          const resource = new (StripeResource.extend({
+            test: stripeMethod({
+              method: 'GET',
+              fullPath: '/v1/parent/{param1}/child/{param2}',
+            }),
+          }))(stripe);
+
+          return resource.test('hello', 'world', (err, res) => {
+            closeServer();
+            // Spot check that we received a response.
+            expect(res).to.deep.equal({});
+            return callback(err);
+          });
+        }
+      );
+    });
+  });
+
   describe('streaming', () => {
     /**
      * Defines a fake resource with a `pdf` method
diff --git a/test/makeRequest.spec.js b/test/makeRequest.spec.js
index 93fe5e67..c333594d 100644
--- a/test/makeRequest.spec.js
+++ b/test/makeRequest.spec.js
@@ -3,6 +3,7 @@
 require('../testUtils');
 
 const makeRequest = require('../lib/makeRequest');
+const utils = require('../lib/utils');
 const expect = require('chai').expect;
 
 describe('makeRequest', () => {
@@ -26,4 +27,42 @@ describe('makeRequest', () => {
       ]);
     });
   });
+
+  describe('makeRequest with fullPath', () => {
+    it('handles urlData', async () => {
+      const args = ['hello', 'world'];
+
+      const fullPath = '/v1/parent/{param1}/child/{param2}';
+      const spec = {
+        fullPath,
+        urlParams: utils.extractUrlParams(fullPath),
+      };
+
+      let actualPath;
+      const mockSelf = {
+        // These two methods shouldn't be called when using a fullPath, as they
+        // don't rely on the resource path.
+        createResourcePathWithSymbols: () => {
+          throw new Error('Unexpected call to createResourcePathWithSymbols.');
+        },
+        createFullPath: () => {
+          throw new Error('Unexpected call to createFullPath.');
+        },
+        _request: (
+          _method,
+          _host,
+          path,
+          _body,
+          _auth,
+          _headers,
+          requestCallback
+        ) => {
+          actualPath = path;
+          requestCallback(null, 'response');
+        },
+      };
+      await makeRequest(mockSelf, args, spec, {});
+      expect(actualPath).to.equal('/v1/parent/hello/child/world');
+    });
+  });
 });
diff --git a/types/test/typescriptTest.ts b/types/test/typescriptTest.ts
index d93e3bde..9c763be3 100644
--- a/types/test/typescriptTest.ts
+++ b/types/test/typescriptTest.ts
@@ -180,6 +180,10 @@ Stripe.StripeResource.extend({
     method: 'create',
     path: 'foo',
   }),
+  fooFullPath: Stripe.StripeResource.method({
+    method: 'create',
+    fullPath: '/v1/full/path',
+  }),
 });
 
 const maxBufferedRequestMetrics: number =