Built to keep customers
transacting
Built to keep customers
transacting
Built to keep customers
transacting
Built to keep customers
transacting
More than a token vault—Basis Theory routes, tokenizes, and optimizes your payments to drive conversion, resilience, and retention.
More than a token vault—Basis Theory routes, tokenizes, and optimizes your payments to drive conversion, resilience, and retention.
More than a token vault—Basis Theory routes, tokenizes, and optimizes your payments to drive conversion, resilience, and retention.
Boost authorization rates
Boost authorization rates
Boost authorization rates
Reduce churn
Reduce churn
Reduce churn
Route to any PSP
Route to any PSP
Route to any PSP































Routing
CARD
****1302



























Routing
CARD
****1302



























Routing
CARD
****1302
Innovative merchants work with
the Basis Theory Payment Vault
Innovative merchants work with
the Basis Theory Payment Vault
Innovative merchants work with the Basis Theory Payment Vault
Never miss a payment
An agnostic payment vault can slide into any payment stack without disrupting business.
An agnostic payment vault can slide into any payment stack without disrupting business.
Whether a customer is renewing a subscription with a credit card or paying with Apple Pay or Google Pay, you can tokenize the data to make it secure and usable—while staying compliant with PCI, SOC 2 Type II, ISO 27001, and HIPAA regulations.
Whether a customer is renewing a subscription with a credit card or paying with Apple Pay or Google Pay, you can tokenize the data to make it secure and usable—while staying compliant with PCI, SOC 2 Type II, ISO 27001, and HIPAA regulations.
Increase basket size and brand loyalty by combining omnichannel data into a single point of view.
Increase basket size and brand loyalty by combining omnichannel data into a single point of view.
Improve the customer experience
Improve the customer experience
Improve the customer experience
Condense the tech stack while adding redundancy
Condense the tech stack while adding redundancy
Condense the tech stack while adding redundancy
Consolidate data from multiple brands or data sources
Consolidate data from multiple brands or data sources
Consolidate data from multiple brands or data sources
import { basistheory } from '@basis-theory/web-elements'; let bt; let cardNumberElement; let cardExpirationDateElement; let cardVerificationCodeElement; async function init() { bt = await basistheory('<API_KEY>'); // Creates Elements instances cardNumberElement = bt.createElement('cardNumber', { targetId: 'myCardNumber' // (custom) used for tracking validation errors }); cardExpirationDateElement = bt.createElement('cardExpirationDate', { targetId: 'myCardExpiration' }); cardVerificationCodeElement = bt.createElement('cardVerificationCode', { targetId: 'myCardVerification' }); // Mounts Elements in the DOM in parallel await Promise.all([ cardNumberElement.mount('#cardNumber'), cardExpirationDateElement.mount('#cardExpirationDate'), cardVerificationCodeElement.mount('#cardVerificationCode'), ]); // Binds card brand to verification code element cardNumberElement.on('change', ({ cardBrand }) => { cardVerificationCodeElement.update({ cardBrand }); }); }




import { basistheory } from '@basis-theory/web-elements'; let bt; let cardNumberElement; let cardExpirationDateElement; let cardVerificationCodeElement; async function init() { bt = await basistheory('<API_KEY>'); // Creates Elements instances cardNumberElement = bt.createElement('cardNumber', { targetId: 'myCardNumber' // (custom) used for tracking validation errors }); cardExpirationDateElement = bt.createElement('cardExpirationDate', { targetId: 'myCardExpiration' }); cardVerificationCodeElement = bt.createElement('cardVerificationCode', { targetId: 'myCardVerification' }); // Mounts Elements in the DOM in parallel await Promise.all([ cardNumberElement.mount('#cardNumber'), cardExpirationDateElement.mount('#cardExpirationDate'), cardVerificationCodeElement.mount('#cardVerificationCode'), ]); // Binds card brand to verification code element cardNumberElement.on('change', ({ cardBrand }) => { cardVerificationCodeElement.update({ cardBrand }); }); }


import { basistheory } from '@basis-theory/web-elements'; let bt; let cardNumberElement; let cardExpirationDateElement; let cardVerificationCodeElement; async function init() { bt = await basistheory('<API_KEY>'); // Creates Elements instances cardNumberElement = bt.createElement('cardNumber', { targetId: 'myCardNumber' // (custom) used for tracking validation errors }); cardExpirationDateElement = bt.createElement('cardExpirationDate', { targetId: 'myCardExpiration' }); cardVerificationCodeElement = bt.createElement('cardVerificationCode', { targetId: 'myCardVerification' }); // Mounts Elements in the DOM in parallel await Promise.all([ cardNumberElement.mount('#cardNumber'), cardExpirationDateElement.mount('#cardExpirationDate'), cardVerificationCodeElement.mount('#cardVerificationCode'), ]); // Binds card brand to verification code element cardNumberElement.on('change', ({ cardBrand }) => { cardVerificationCodeElement.update({ cardBrand }); }); }




import { basistheory } from '@basis-theory/web-elements'; let bt; let cardNumberElement; let cardExpirationDateElement; let cardVerificationCodeElement; async function init() { bt = await basistheory('<API_KEY>'); // Creates Elements instances cardNumberElement = bt.createElement('cardNumber', { targetId: 'myCardNumber' // (custom) used for tracking validation errors }); cardExpirationDateElement = bt.createElement('cardExpirationDate', { targetId: 'myCardExpiration' }); cardVerificationCodeElement = bt.createElement('cardVerificationCode', { targetId: 'myCardVerification' }); // Mounts Elements in the DOM in parallel await Promise.all([ cardNumberElement.mount('#cardNumber'), cardExpirationDateElement.mount('#cardExpirationDate'), cardVerificationCodeElement.mount('#cardVerificationCode'), ]); // Binds card brand to verification code element cardNumberElement.on('change', ({ cardBrand }) => { cardVerificationCodeElement.update({ cardBrand }); }); }


Keep recurring revenue flowing with smart retries, token updates, and backup routing.
Keep recurring revenue flowing with smart retries, token updates, and backup routing.
Increase revenue by improving conversion and authorization rates.
Increase revenue by improving conversion and authorization rates.
Increase revenue by improving conversion and authorization rates.
Smart routing to reduce churn through backup PSP.
Smart routing to reduce churn through backup PSP.
Smart routing to reduce churn through backup PSP.
Tie billing to individual PSP.
Tie billing to individual PSP.
Tie billing to individual PSP.
Future-proof your platform.
Let merchants bring their own PSPs—or become one yourself.
Future-proof your platform.
Let merchants bring their own PSPs—or become one yourself.
Create more revenue without acquiring new customers.
Create more revenue without acquiring new customers.
Create more revenue without acquiring new customers.
Enable a merchant to bring their own PSP.
Enable a merchant to bring their own PSP.
Enable a merchant to bring their own PSP.
Become a Payfac.
Become a Payfac.
Become a Payfac.
import { basistheory } from '@basis-theory/web-elements'; let bt; let cardNumberElement; let cardExpirationDateElement; let cardVerificationCodeElement; async function init() { bt = await basistheory('<API_KEY>'); // Creates Elements instances cardNumberElement = bt.createElement('cardNumber', { targetId: 'myCardNumber' // (custom) used for tracking validation errors }); cardExpirationDateElement = bt.createElement('cardExpirationDate', { targetId: 'myCardExpiration' }); cardVerificationCodeElement = bt.createElement('cardVerificationCode', { targetId: 'myCardVerification' }); // Mounts Elements in the DOM in parallel await Promise.all([ cardNumberElement.mount('#cardNumber'), cardExpirationDateElement.mount('#cardExpirationDate'), cardVerificationCodeElement.mount('#cardVerificationCode'), ]); // Binds card brand to verification code element cardNumberElement.on('change', ({ cardBrand }) => { cardVerificationCodeElement.update({ cardBrand }); }); }




import { basistheory } from '@basis-theory/web-elements'; let bt; let cardNumberElement; let cardExpirationDateElement; let cardVerificationCodeElement; async function init() { bt = await basistheory('<API_KEY>'); // Creates Elements instances cardNumberElement = bt.createElement('cardNumber', { targetId: 'myCardNumber' // (custom) used for tracking validation errors }); cardExpirationDateElement = bt.createElement('cardExpirationDate', { targetId: 'myCardExpiration' }); cardVerificationCodeElement = bt.createElement('cardVerificationCode', { targetId: 'myCardVerification' }); // Mounts Elements in the DOM in parallel await Promise.all([ cardNumberElement.mount('#cardNumber'), cardExpirationDateElement.mount('#cardExpirationDate'), cardVerificationCodeElement.mount('#cardVerificationCode'), ]); // Binds card brand to verification code element cardNumberElement.on('change', ({ cardBrand }) => { cardVerificationCodeElement.update({ cardBrand }); }); }


import { basistheory } from '@basis-theory/web-elements'; let bt; let cardNumberElement; let cardExpirationDateElement; let cardVerificationCodeElement; async function init() { bt = await basistheory('<API_KEY>'); // Creates Elements instances cardNumberElement = bt.createElement('cardNumber', { targetId: 'myCardNumber' // (custom) used for tracking validation errors }); cardExpirationDateElement = bt.createElement('cardExpirationDate', { targetId: 'myCardExpiration' }); cardVerificationCodeElement = bt.createElement('cardVerificationCode', { targetId: 'myCardVerification' }); // Mounts Elements in the DOM in parallel await Promise.all([ cardNumberElement.mount('#cardNumber'), cardExpirationDateElement.mount('#cardExpirationDate'), cardVerificationCodeElement.mount('#cardVerificationCode'), ]); // Binds card brand to verification code element cardNumberElement.on('change', ({ cardBrand }) => { cardVerificationCodeElement.update({ cardBrand }); }); }




import { basistheory } from '@basis-theory/web-elements'; let bt; let cardNumberElement; let cardExpirationDateElement; let cardVerificationCodeElement; async function init() { bt = await basistheory('<API_KEY>'); // Creates Elements instances cardNumberElement = bt.createElement('cardNumber', { targetId: 'myCardNumber' // (custom) used for tracking validation errors }); cardExpirationDateElement = bt.createElement('cardExpirationDate', { targetId: 'myCardExpiration' }); cardVerificationCodeElement = bt.createElement('cardVerificationCode', { targetId: 'myCardVerification' }); // Mounts Elements in the DOM in parallel await Promise.all([ cardNumberElement.mount('#cardNumber'), cardExpirationDateElement.mount('#cardExpirationDate'), cardVerificationCodeElement.mount('#cardVerificationCode'), ]); // Binds card brand to verification code element cardNumberElement.on('change', ({ cardBrand }) => { cardVerificationCodeElement.update({ cardBrand }); }); }


Add redundancy to protect against being shut down by a single PSP.
Add redundancy to protect against being shut down by a single PSP.
Never miss a payment.
Never miss a payment.
Never miss a payment.
Keep conversion rates high.
Keep conversion rates high.
Keep conversion rates high.
Use customer data without the burden of protection.
Use customer data without the burden of protection.
Use customer data without the burden of protection.
“We needed a solution that we could implement quickly and was not super operationally heavy. It was clear to me that Basis Theory was what we needed and I’d be hard-pressed to think there’s something more relevant to what we were trying to solve—which was to maintain PCI compliance.”
“We needed a solution that we could implement quickly and was not super operationally heavy. It was clear to me that Basis Theory was what we needed and I’d be hard-pressed to think there’s something more relevant to what we were trying to solve—which was to maintain PCI compliance.”
Matt Donofrio
Matt Donofrio
Head of Revenue @ Marble
Head of Revenue @ Marble
Implementing a payment vault
Implementing a payment vault
Implementing a payment vault
Explore our APIs, SDKs, and docs to start building in minutes.
Explore our APIs, SDKs, and docs to start building in minutes.


Built for developers, loved by security teams.
Built for developers, loved by security teams.
Security and privacy are built into our DNA
Our platform is engineered with a security-first mindset, ensuring that every transaction is fortified with the highest level of data protection.
Our platform is engineered with a security-first mindset, ensuring that every transaction is fortified with the highest level of data protection.

PCI
LEVEL 1

PCI
LEVEL 1

PCI
LEVEL 1

PCI
LEVEL 1

SOC 2
type II

SOC 2
type II

SOC 2
type II

SOC 2
type II

HIPAA
compliant

HIPAA
compliant

HIPAA
compliant

HIPAA
compliant

ISO
27001

ISO
27001

ISO
27001

ISO
27001
Safely collect card data.
Jump out to an early lead. Explore, iterate, and scale regulated products faster than the competition.

Safely collect card data.
Jump out to an early lead. Explore, iterate, and scale regulated products faster than the competition.

Safely collect card data.
Jump out to an early lead. Explore, iterate, and scale regulated products faster than the competition.

Safely collect card data.
Jump out to an early lead. Explore, iterate, and scale regulated products faster than the competition.

Basis Theory
Basis Theory
Basis Theory