Developers
Your catalog in your code. Itaja gets you paid.
An SDK for Node, Python or Laravel, one command to push what you sell, one route to receive signed webhooks. The full reference opens to beta merchants.
- Node.js
- Python
- Laravel
import { itaja } from "@/itaja.config"; const { checkoutUrl } = await itaja.checkout.create({ homeUrl: "https://shop.example/cart", currency: "XOF", lineItems: [ { name: "Shirt", quantity: 2, unitPrice: 5000 }, ], }); return Response.redirect(checkoutUrl);Up and running in five steps
01Install the SDK
npm i @itaja/node# pnpm add @itaja/node# bun add @itaja/node02Put your keys in .env
.env # itjs_: sandbox · itjp_: productionITAJA_API_KEY=itjs_…ITAJA_WEBHOOK_SECRET=whsec_…03Declare what you sell
itaja.config.ts import { createItaja, plan } from "@itaja/node"; const pro = plan({ name: "Pro", group: "My App", price: { amount: 5000, currency: "XOF", interval: "month", },}); export const itaja = createItaja({ catalog: [pro],});04Push your catalog
npx itaja push# npx itaja status# npx itaja push --yes (CI)05Mount the webhook route
app/itaja/webhook/route.ts import { itaja } from "@/itaja.config"; export const POST = itaja.handler;
Server only: the SDK holds your secret key. Never in a browser or a mobile app.
A plan, a licence, credits, a checkout.
You declare what you sell in your code. One command sends it to Itaja.
- 01A subscription plan5 000 XOF a month.
- 02A licenceA key valid for a year, activated on up to three devices.
- 03A credit pack100 credits for 1 000 XOF, spent as they are used.
- 04A direct checkoutAn e-commerce cart, nothing to declare: two shirts at 5 000 XOF.
import { createItaja, creditPack, credits, license, plan,} from "@itaja/node";// A subscription planconst pro = plan({ name: "Pro", group: "My App", price: { amount: 5000, currency: "XOF", interval: "month" },});// A licenceconst desktop = license({ name: "Desktop app", devices: 3, duration: "days-365", price: { amount: 25000, currency: "XOF" },});// A credit packconst small = creditPack({ name: "100 tokens", of: credits({ name: "AI tokens" }), credits: 100, price: { amount: 1000, currency: "XOF" },});export const itaja = createItaja({ catalog: [pro, desktop, small],});// A direct checkout · src/cart.tsconst { checkoutUrl } = await itaja.checkout.create({ homeUrl: "https://shop.example/cart", currency: "XOF", lineItems: [{ name: "Shirt", quantity: 2, unitPrice: 5000 }],});npx itaja push# sends the catalogue
from itaja import ( create_itaja, credit_pack, credits, license, plan,)# A subscription planpro = plan("Pro", "My App", price={ "amount": 5000, "currency": "XOF", "interval": "month"})# A licencedesktop = license("Desktop app", devices=3, duration="days-365", price={"amount": 25000, "currency": "XOF"})# A credit packsmall = credit_pack("100 tokens", credits("AI tokens"), 100, {"amount": 1000, "currency": "XOF"})itaja = create_itaja(catalog=[pro, desktop, small])# A direct checkout · cart.pyshirt = {"name": "Shirt", "quantity": 2, "unitPrice": 5000}checkout = itaja.checkout.create( homeUrl="https://shop.example/cart", currency="XOF", lineItems=[shirt])itaja push# sends the catalogue
<?phpuse Itaja\Laravel\Catalog\{CreditPack, Credits, License, Plan};return [ // A subscription plan Plan::make('Pro', 'My App', price: ['amount' => 5000, 'currency' => 'XOF', 'interval' => 'month']), // A licence License::make('Desktop app', price: ['amount' => 25000, 'currency' => 'XOF'], devices: 3, duration: 'days-365'), // A credit pack CreditPack::make('100 tokens', Credits::make('AI tokens'), 100, ['amount' => 1000, 'currency' => 'XOF']),];// A direct checkout · CartController.php$checkout = Itaja::checkout()->create([ 'homeUrl' => url('/cart'), 'currency' => 'XOF', 'lineItems' => [['name' => 'Shirt', 'quantity' => 2, 'unitPrice' => 5000]],]);php artisan itaja:push# sends the catalogue
Illustrative amounts. The SDK runs on your server: it holds your secret key.
One event, one function.
The route checks the signature, skips a delivery it already handled and answers 500 when your code throws, so Itaja delivers again. Every event arrives typed.
Events
- checkout.paid
- invoice.paid
- invoice.payment_failed
- subscription.past_due
- subscription.canceled
export const itaja = createItaja({ catalog: [pro], on: { "checkout.paid": ({ data }) => fulfil(data.checkoutId), "subscription.past_due": ({ data }) => warnCustomer(data), "subscription.canceled": ({ data }) => downgrade(data), },});# Test a handler locally with a signed samplenpx itaja trigger checkout.paid \ --url localhost:3000/itaja/webhookWhat’s behind it
Quickstart
Three published packages: @itaja/node (npm), itaja (PyPI) and itaja/itaja-laravel (Composer). You declare your catalogue in your language, push it, and one route receives the webhooks.
npx itaja pushAPI reference
Products, customers, payments, subscriptions, credits and license keys behind a single API, described by an OpenAPI specification your coding agent reads directly.
OpenAPIWebhooks
Signed events: payment confirmed, credits granted or consumed, license key issued or revoked. The SDK checks the signature and never runs the same delivery twice.
itaja.handlerCoding agents
Nine public skills (itaja/skills) for the agent you already use: it reads the API and writes the integration for you.
npx skills add itaja/skills
Itaja is in private beta: the full reference is available to beta merchants. Talk to sales
Integration
One command. Your agent does the rest.
Node, Python and Laravel SDKs, a readable API, and skills ready for the coding agent you already use.
For your coding agent
npx skills add itaja/skills
The SDKs, with your package manager
- npm install @itaja/node
- pnpm add @itaja/node
- bun add @itaja/node
- yarn add @itaja/node
- pip install itaja
- composer require itaja/itaja-laravel
Skills, SDKs and packages
- TypeScript
- Node.js
- Python
- Dart (Soon)
- Laravel
The Node, Python and Laravel SDKs are published; Dart is announced. They hold your secret key: they run on your server, never in a browser or a mobile app. The first command installs the skills in your agent, the next ones add the SDK for your language.