Address verify
Validate and normalize the recipient address before you quote — fewer failed deliveries, fewer surprises.
Lifted ShipKit is the open shipping toolkit. Import one drop-in widget — or the tiny SDK — and your app compares live multi-carrier rates, buys the label in one call, and takes a card payment authenticated by 3-D Secure, so fraud chargeback liability shifts to the issuer. Self-host it free, or create a free account and go live with a single script tag.
Real carrier functionality on the backend. A clean, accessible widget on the front. One tasteful, secure checkout.
Validate and normalize the recipient address before you quote — fewer failed deliveries, fewer surprises.
Pull real-time rates and delivery estimates across carriers and services. Cheapest first, ranked and readable.
Buy the label and get a printable PDF plus a scannable QR for paperless drop-off — instantly.
The issuer authenticates the cardholder before authorization. Fraud liability shifts. Approvals go up.
Dependency-free, framework-agnostic, themeable with CSS variables. One <script> and you're live.
MIT-licensed Kotlin backend and vanilla-JS front. Read it, fork it, ship it. No lock-in.
Start free and self-hosted, bring our 3-D Secure processing to your own stack, or hand us the whole thing. Every tier is powered by Lifted Payments 3-D Secure — pick your level of control.
Total freedom, heaviest lift. Clone the repo and plug in your own payments and your own EasyPost.
Need a hand? support@liftedholdings.com
Our 3-D Secure processing on your own merchant account. Bring your own EasyPost — you host or we host, both free.
Surcharge the 3.75% + 15¢ to the buyer with a built-in toggle — net-zero processing cost to you.
Apply at liftedholdings.com/payments
No application, no infra — sign up, drop in one script tag, done. Our 3-D Secure account and our EasyPost.
No merchant-account application. Create a free account and get your managed key + JS snippet instantly.
Sign up free at liftedholdings.com/shipkit/start
Want ShipKit woven into your custom framework, or a bespoke build from the ground up? Our team does that — tell us what you need.
3-D Secure is forced by default, and self-host stays that way — it is the fraud and chargeback protection that makes ShipKit safe to ship. Merchants on Lifted Payments (tier 2 or 3) or enterprise custom-dev can opt into a faster path: skip the challenge on low-risk orders and keep cards on file for one-tap repeat charges. It is an account-level, server-side capability — never a client toggle.
3ds:false on low-risk orders — fewer checkout drop-offs.Need frictionless mode or a custom vault flow for your enterprise checkout? Our team wires it to your account.
Talk to us · support@liftedholdings.comOne mount point, one import. The widget renders address entry, live multi-carrier rates and the 3-D Secure card step right inside your app — framework-agnostic, dependency-free, themeable with CSS variables. Point it at your own backend, or at our managed rails. Copy, paste, ship.
Any element — <div id="ship">. ShipKit owns its own subtree inside it and inherits your layout.
Talk to your own backend with endpoint:'/api' + a publishable pk_live_… key, or hand it a managed key for our rails.
Subscribe to onPurchase for the tracking code, label URL and QR. That is the whole integration.
Full React, Vue & plain-HTML examples ship in the repo under /examples.
// Drop the widget straight into your checkout route.
import ShipWidget from './ShipWidget';
export default function Checkout() {
return (
<ShipWidget
endpoint="/api"
apiKey="pk_live_…"
theme="dark"
onPurchase={(label) => router.push(label.trackingUrl)}
onError={(err) => toast.error(err.message)}
/>
);
}
<script setup>
import ShipWidget from './ShipWidget.vue';
</script>
<template>
<ShipWidget
endpoint="/api"
api-key="pk_live_…"
theme="dark"
@purchase="(label) => (window.location = label.labelUrl)"
@error="(err) => notify(err.message)"
/>
</template>
<!-- One mount point -->
<div id="ship"></div>
<script src="/js/shipkit.js"></script>
<script>
ShipKit.init({
mount: '#ship',
endpoint: '/api',
apiKey: 'pk_live_…',
theme: 'dark',
onPurchase: (label) => { window.location = label.labelUrl; },
onError: (err) => console.error(err.stage, err.message)
});
</script>
A machine-readable OpenAPI spec, a rendered API reference, and a ready-to-run Postman collection — every endpoint authenticated with a single ShipKit-Api-Key header.
The full contract for every route — schemas, error shapes, and the tier & surcharge fields. Import into any codegen or client.
GET /openapi.yaml openapi.yamlA self-contained, dependency-free reference page — browse every endpoint, parameter, and example without leaving your network.
GET /docs Open referenceEvery endpoint pre-built with example bodies and {{baseUrl}} / {{apiKey}} variables. Import and send in seconds.
Drop the widget anywhere. Point it at your self-hosted backend, or at Lifted with a managed key. Style it with CSS custom properties.
<!-- Managed: no backend, no keys -->
<div id="ship"></div>
<script
src="https://cdn.liftedholdings.com/shipkit.js"
integrity="sha384-…"
crossorigin="anonymous"
data-managed-key="pk_live_…"
data-mount="#ship"></script>
// Self-host: talks to your own backend
ShipKit.init({
mount: '#ship',
endpoint: '/api',
apiKey: 'pk_live_…', // publishable widget key → ShipKit-Api-Key header
onQuote: rates => console.log(rates),
onPurchase: label => {
window.location = label.labelUrl;
},
onError: err => console.error(err)
});
// Retheme with CSS variables:
// .sk { --sk-primary:#7C3AED; }
Full config table, callback reference, and React / Vue / plain-HTML snippets in docs/integration.md.
ShipKit's payment layer is Secured by Lifted Payments · 3-D Secure. Apply for an account to self-host, or get a managed key to skip the infrastructure entirely.
Apply at liftedholdings.com/payments