Create orders. Send invoices. Get paid.
Our Partner API lets you generate invoices for personalized apparel and leather on behalf of your customers. POST an order, get back a hosted pay link on monogram.shop — your customer pays through our secure checkout, and we handle production and shipping end-to-end. You set the amount, you set the customization — the invoice mirrors what you're billing.
Send your API key in the Authorization header.
Pass items, customer details, your reference, and (optionally) your own amount.
We return a hosted payment page on our site.
Take payments on your own site in two lines
Onboard once, then drop our widget onto any page your clients use. Your customer pays on a secure hosted page, you receive a signed webhook the moment it clears, and they're sent back to your success URL. No PCI scope, no card data ever touching your servers.
Sign in to the admin portal for your publishable + secret keys.
Map a product id to a price and currency.
Paste the snippet; any [data-xpay] button opens checkout.
We POST signed payment.* events to your webhook URL.
Add the script once. Every [data-xpay] element on the page opens the payment modal.
<script src="https://your-domain.com/widget.js" data-publishable-key="pk_live_xxx" data-product="starter-pack"></script> <button data-xpay>Pay now</button>
Override per button with data-product, data-success-url, data-cancel-url.
Already know the buyer's email? Pass it and skip the form. Hook onSuccess to update your UI.
XPay.open({
product: "starter-pack",
email: "customer@example.com", // optional
country: "LK", // optional
successUrl: "/thank-you", // optional
onSuccess(txn) {
console.log("paid", txn.transactionId);
}
});Create the payment from your backend and redirect the customer to the returned paymentUrl. The amount is priced from your catalogue, so it can't be tampered with client-side.
curl -X POST https://your-domain.com/api/widget/checkout \
-H 'Content-Type: application/json' \
-d '{
"publishableKey": "pk_live_xxx",
"product": "starter-pack",
"email": "customer@example.com",
"phone": "0771234567",
"country": "LK",
"state": "Western"
}'
# → { "transactionId": "Ab3...", "paymentUrl": "https://pay…",
# "amount": "3.00", "currency": "USD", "status": "pending" }Poll GET /api/widget/status/<transactionId> for settlement, or rely on your webhook. Both are CORS-enabled.
Set your webhook + redirect URLs in Settings. We POST payment.paid / payment.failed / payment.cancelled, signed with HMAC-SHA256 in the x-signature header (verify against your webhook secret).
POST https://your-domain.com/your-webhook
x-signature: sha256=<hmac>
Content-Type: application/json
{
"id": "evt_…",
"type": "payment.paid",
"created_at": "2026-06-12T10:21:44.000Z",
"data": {
"transaction_id": "Ab3xYz9Qm2",
"product_id": "starter-pack",
"status": "paid",
"amount": "3.00",
"currency": "USD",
"customer": { "email": "customer@example.com", "country": "LK" }
}
}Create a key + product in the admin portal, paste them above, and watch the exact flow your partners' customers see.
All four endpoints at a glance
Every endpoint takes the same Bearer authentication. Anchor links jump to the section with full request/response details.
| Method | Path | What it does | Details |
|---|---|---|---|
| POST | /api/v1/partner/orders | Create an invoice. Returns a hosted pay link. | jump ↓ |
| GET | /api/v1/partner/orders | List your invoices. Filter by status or reference, paginate with cursor. | jump ↓ |
| GET | /api/v1/partner/orders/{id} | Fetch one invoice in full — items, personalization, breakdown. | jump ↓ |
| GET | /api/products | Live product catalog. Same data as the section below. | jump ↓ |
| POST | your webhook URL | We POST payment events to you — success, decline, pending. | jump ↓ |
Common gotcha: the path is /orders (plural), not /order.
What the fields mean
Every order body has the same five concepts. Get these right and the rest follows — examples below.
A short, URL-safe identifier for a product family. Lowercase, hyphenated, stable forever.
monogram-tee
Pick from the catalog below.
The specific size/colour/material option within a product. Globally unique.
tee-blk-m
Must belong to the productSlug you've chosen.
Customization keys vary per product (monogram, thread, placement…).
{ "monogram": "J.D.", "thread": "Gold" }Required fields are marked on each product card.
Optional. Your own unit price in integer cents — overrides catalog price.
7500 // $75.00
Up to $100,000 per line item. Omit to use the catalog price.
Optional. Your invoice ID. We store and echo it back on the order and webhooks.
INV-2026-00891
Max 120 chars. Useful for reconciliation.
How many of this variant. Integer between 1 and 50 per line item.
2
Subtotal = (amountCents or catalog price) × quantity.
Add an amountCents field to any line item to bill at the price you've quoted, instead of the catalog price. The hosted pay link will charge that exact total — ideal for wholesale, bespoke runs, gift orders, or contracted rates.
- · amountCents is the unit price in cents — subtotal = amountCents × quantity.
- · Up to $100,000 per line item. Omit to fall back to the catalog price shown below.
- · Personalization length limits are relaxed on partner orders — submit the monogram, message or engraving as quoted.
- · Required personalization fields are still enforced — partners must send all keys marked required.
Every product, every variant
Use the productSlug and variantSku values below in your order body. Personalization keys differ per product — each card lists exactly what to send.
Tees
4 productsproductSlug: pocket-teeHeavyweight cotton with an embroidered pocket.
| variantSku | Option | Price |
|---|---|---|
| pk-tee-blk-s | Black · S | $38 |
| pk-tee-blk-m | Black · M | $38 |
| pk-tee-blk-l | Black · L | $38 |
| pk-tee-ecr-m | Ecru · M | $38 |
| pk-tee-ecr-l | Ecru · L | $38 |
initialstextrequiredmax 3 chars (web only — relaxed for partners)threadselectrequiredIvoryBlackTanGold
productSlug: henleyLong-sleeve henley with embroidered placket.
| variantSku | Option | Price |
|---|---|---|
| hn-ecr-m | Ecru · M | $42 |
| hn-ecr-l | Ecru · L | $42 |
| hn-cha-m | Charcoal · M | $42 |
| hn-cha-l | Charcoal · L | $42 |
monogramtextrequiredmax 3 chars (web only — relaxed for partners)threadselectrequiredIvoryBlackTan
productSlug: long-sleeve-teeGarment-washed cotton, embroidered sleeve.
| variantSku | Option | Price |
|---|---|---|
| ls-blk-m | Black · M | $45 |
| ls-blk-l | Black · L | $45 |
| ls-ecr-m | Ecru · M | $45 |
| ls-ecr-l | Ecru · L | $45 |
monogramtextrequiredmax 3 chars (web only — relaxed for partners)
productSlug: monogram-teeHeavyweight cotton, embroidered with your initials.
| variantSku | Option | Price |
|---|---|---|
| tee-blk-s | Black · S | $35 |
| tee-blk-m | Black · M | $35 |
| tee-blk-l | Black · L | $35 |
| tee-ecr-m | Ecru · M | $35 |
| tee-ecr-l | Ecru · L | $35 |
monogramtextrequiredmax 3 chars (web only — relaxed for partners)threadselectrequiredIvoryBlackTanGold
Hoodies
3 productsproductSlug: zip-hoodieHeavyweight French terry with custom embroidery.
| variantSku | Option | Price |
|---|---|---|
| zh-cha-s | Charcoal · S | $82 |
| zh-cha-m | Charcoal · M | $82 |
| zh-cha-l | Charcoal · L | $82 |
| zh-cha-xl | Charcoal · XL | $82 |
| zh-olv-m | Olive · M | $82 |
| zh-olv-l | Olive · L | $82 |
texttextrequiredmax 18 chars (web only — relaxed for partners)placementselectrequiredLeft chestRight sleeve
productSlug: cropped-hoodieBoxy crop, midweight terry, embroidered.
| variantSku | Option | Price |
|---|---|---|
| ch-ecr-s | Ecru · S | $68 |
| ch-ecr-m | Ecru · M | $68 |
| ch-blk-s | Black · S | $68 |
| ch-blk-m | Black · M | $68 |
texttextrequiredmax 12 chars (web only — relaxed for partners)
productSlug: atelier-hoodieHeavyweight French terry, custom embroidery.
| variantSku | Option | Price |
|---|---|---|
| hd-cha-s | Charcoal · S | $72 |
| hd-cha-m | Charcoal · M | $72 |
| hd-cha-l | Charcoal · L | $72 |
| hd-cha-xl | Charcoal · XL | $72 |
texttextrequiredmax 18 chars (web only — relaxed for partners)placementselectrequiredLeft chestRight sleeveBack nape
Caps & hats
5 productsproductSlug: trucker-cap5-panel mesh-back, embroidered crest.
| variantSku | Option | Price |
|---|---|---|
| trk-blk | Black/White mesh | $28 |
| trk-nvy | Navy/White mesh | $28 |
| trk-olv | Olive/Tan mesh | $28 |
texttextrequiredmax 10 chars (web only — relaxed for partners)
productSlug: bucket-hatWashed canvas, embroidered side tab.
| variantSku | Option | Price |
|---|---|---|
| bkt-stn | Stone | $34 |
| bkt-olv | Olive | $34 |
| bkt-blk | Black | $34 |
initialstextrequiredmax 3 chars (web only — relaxed for partners)
productSlug: washed-dad-capSoft-crown twill, unstructured, embroidered.
| variantSku | Option | Price |
|---|---|---|
| dad-blk | Washed Black | $30 |
| dad-stn | Washed Stone | $30 |
| dad-olv | Washed Olive | $30 |
| dad-nvy | Washed Navy | $30 |
texttextrequiredmax 10 chars (web only — relaxed for partners)
productSlug: cable-beanieChunky cable knit, embroidered cuff.
| variantSku | Option | Price |
|---|---|---|
| bn-cha | Charcoal | $26 |
| bn-ecr | Ecru | $26 |
| bn-rst | Rust | $26 |
initialstextrequiredmax 3 chars (web only — relaxed for partners)threadselectrequiredIvoryBlackTanGold
productSlug: field-cap6-panel washed canvas with embroidered detail.
| variantSku | Option | Price |
|---|---|---|
| cap-stn | Stone | $32 |
| cap-olv | Olive | $32 |
| cap-blk | Black | $32 |
emblemtextrequiredmax 8 chars (web only — relaxed for partners)
Jackets
4 productsproductSlug: chore-coatCotton drill, four pockets, embroidered.
| variantSku | Option | Price |
|---|---|---|
| cc-ind-m | Indigo · M | $138 |
| cc-ind-l | Indigo · L | $138 |
| cc-blk-m | Black · M | $138 |
| cc-blk-l | Black · L | $138 |
| cc-stn-m | Stone · M | $138 |
nametextrequiredmax 14 chars (web only — relaxed for partners)
productSlug: bomber-jacketCotton/nylon shell, embroidered chest.
| variantSku | Option | Price |
|---|---|---|
| bm-blk-s | Black · S | $165 |
| bm-blk-m | Black · M | $165 |
| bm-blk-l | Black · L | $165 |
| bm-olv-m | Olive · M | $165 |
| bm-olv-l | Olive · L | $165 |
texttextrequiredmax 16 chars (web only — relaxed for partners)
productSlug: varsity-jacketMelton wool body, leather sleeves, chenille letter.
| variantSku | Option | Price |
|---|---|---|
| vs-blk-m | Black wool · Black leather · M | $185 |
| vs-blk-l | Black wool · Black leather · L | $185 |
| vs-nvy-m | Navy wool · Cream leather · M | $185 |
| vs-nvy-l | Navy wool · Cream leather · L | $185 |
lettertextrequiredmax 1 chars (web only — relaxed for partners)
productSlug: selvedge-denim-jacket13.5oz Japanese selvedge, embroidered to order.
| variantSku | Option | Price |
|---|---|---|
| dj-ind-s | Indigo · S | $145 |
| dj-ind-m | Indigo · M | $145 |
| dj-ind-l | Indigo · L | $145 |
designtextrequiredmax 24 chars (web only — relaxed for partners)placementselectrequiredChestBack yoke
Leather
11 productsproductSlug: card-holderItalian full-grain leather, four slots.
| variantSku | Option | Price |
|---|---|---|
| ch-tan | Tan | $48 |
| ch-brn | Walnut | $48 |
| ch-blk | Black | $52 |
initialstextrequiredmax 3 chars (web only — relaxed for partners)
productSlug: airpods-caseSnap-on leather sleeve, debossed initials.
| variantSku | Option | Price |
|---|---|---|
| ap-pro-tan | Pro · Tan | $42 |
| ap-pro-blk | Pro · Black | $42 |
| ap-std-tan | Standard · Tan | $42 |
| ap-std-blk | Standard · Black | $42 |
initialstextrequiredmax 3 chars (web only — relaxed for partners)
productSlug: watch-strapHand-stitched bridle leather, custom sized.
| variantSku | Option | Price |
|---|---|---|
| ws-tan | Tan · 20mm | $58 |
| ws-brn | Walnut · 20mm | $58 |
| ws-blk | Black · 20mm | $58 |
| ws-ox | Oxblood · 20mm | $58 |
stamptextrequiredmax 12 chars (web only — relaxed for partners)
productSlug: passport-holderFull-grain leather, debossed crest.
| variantSku | Option | Price |
|---|---|---|
| ph-tan | Tan | $78 |
| ph-brn | Walnut | $78 |
| ph-blk | Black | $84 |
initialstextrequiredmax 3 chars (web only — relaxed for partners)
productSlug: money-clipLeather-wrapped spring steel, engraved.
| variantSku | Option | Price |
|---|---|---|
| mc-tan | Tan | $36 |
| mc-brn | Walnut | $36 |
| mc-blk | Black | $36 |
engravingtextrequiredmax 12 chars (web only — relaxed for partners)
productSlug: leather-notebookA6 refillable cover, blind-debossed.
| variantSku | Option | Price |
|---|---|---|
| nb-tan | Tan | $95 |
| nb-brn | Walnut | $95 |
| nb-blk | Black | $95 |
nametextrequiredmax 18 chars (web only — relaxed for partners)
productSlug: leather-coastersVegetable-tanned, engraved initials.
| variantSku | Option | Price |
|---|---|---|
| lc-nat | Natural | $32 |
| lc-brn | Walnut | $32 |
| lc-blk | Black | $32 |
initialstextrequiredmax 3 chars (web only — relaxed for partners)
productSlug: leather-desk-matFull-grain workspace mat, hot-stamped corner.
| variantSku | Option | Price |
|---|---|---|
| dm-tan | Tan | $125 |
| dm-brn | Walnut | $125 |
| dm-blk | Black | $125 |
stamptextrequiredmax 18 chars (web only — relaxed for partners)
productSlug: engraved-walletItalian full-grain leather, engraved interior.
| variantSku | Option | Price |
|---|---|---|
| wlt-tan | Tan | $88 |
| wlt-brn | Walnut | $88 |
| wlt-blk | Black | $94 |
nametextrequiredmax 24 chars (web only — relaxed for partners)datedateoptional
productSlug: engraved-beltSolid brass buckle, full-grain leather strap.
| variantSku | Option | Price |
|---|---|---|
| bl-32 | 32" | $95 |
| bl-34 | 34" | $95 |
| bl-36 | 36" | $95 |
| bl-38 | 38" | $95 |
stamptextrequiredmax 20 chars (web only — relaxed for partners)
productSlug: weekend-dufflePebbled leather, monogrammed luggage tag.
| variantSku | Option | Price |
|---|---|---|
| duf-cog | Cognac | $385 |
| duf-blk | Black | $385 |
tagtextrequiredmax 3 chars (web only — relaxed for partners)
Accessories
12 productsproductSlug: iron-on-patchWoven twill, merrowed edge, custom text.
| variantSku | Option | Price |
|---|---|---|
| ptc-blk | Black/Ivory | $6 |
| ptc-olv | Olive/Tan | $6 |
| ptc-nvy | Navy/Gold | $7 |
texttextrequiredmax 12 chars (web only — relaxed for partners)
productSlug: key-fobA small piece of leather you actually use every day.
| variantSku | Option | Price |
|---|---|---|
| kf-nat | Natural | $24 |
| kf-brn | Brown | $24 |
texttextrequiredmax 14 chars (web only — relaxed for partners)
productSlug: monogram-sticker-packA starter set of die-cut vinyl stickers.
| variantSku | Option | Price |
|---|---|---|
| stk-wht | White ink | $3 |
| stk-blk | Black ink | $3 |
| stk-gld | Gold foil | $4.50 |
initialstextrequiredmax 3 chars (web only — relaxed for partners)
productSlug: enamel-pinHard enamel, custom initials, butterfly clutch.
| variantSku | Option | Price |
|---|---|---|
| pin-brs | Brass | $5 |
| pin-slv | Silver | $6 |
| pin-gld | Gold-plated | $8 |
initialstextrequiredmax 3 chars (web only — relaxed for partners)
productSlug: leather-bookmarkVegetable-tanned strip, hot-stamped initials.
| variantSku | Option | Price |
|---|---|---|
| bkm-nat | Natural | $8 |
| bkm-brn | Brown | $8 |
| bkm-blk | Black | $9 |
stamptextrequiredmax 4 chars (web only — relaxed for partners)
productSlug: woven-lanyardJacquard-woven cotton with your name.
| variantSku | Option | Price |
|---|---|---|
| lyd-blk | Black/Ivory | $9 |
| lyd-nvy | Navy/Cream | $9 |
| lyd-olv | Olive/Tan | $9 |
texttextrequiredmax 16 chars (web only — relaxed for partners)
productSlug: phone-strapBraided cord, leather tab, embossed initials.
| variantSku | Option | Price |
|---|---|---|
| phs-blk | Black cord · Black tab | $12 |
| phs-tan | Sand cord · Tan tab | $12 |
| phs-olv | Olive cord · Walnut tab | $12 |
initialstextrequiredmax 3 chars (web only — relaxed for partners)
productSlug: cotton-bandanaHand-printed cotton, embroidered corner.
| variantSku | Option | Price |
|---|---|---|
| bnd-ind | Indigo | $14 |
| bnd-rst | Rust | $14 |
| bnd-blk | Black | $14 |
initialstextrequiredmax 3 chars (web only — relaxed for partners)
productSlug: monogram-socksCombed cotton crew, embroidered cuff.
| variantSku | Option | Price |
|---|---|---|
| sck-blk | Black | $16 |
| sck-ecr | Ecru | $16 |
| sck-olv | Olive | $16 |
| sck-nvy | Navy | $16 |
monogramtextrequiredmax 3 chars (web only — relaxed for partners)
productSlug: canvas-tote14oz heavy canvas, custom screen print.
| variantSku | Option | Price |
|---|---|---|
| tot-nat | Natural · Black ink | $18 |
| tot-blk | Black · White ink | $18 |
| tot-olv | Olive · Ivory ink | $18 |
texttextrequiredmax 18 chars (web only — relaxed for partners)
productSlug: knit-glovesLambswool, embroidered cuff.
| variantSku | Option | Price |
|---|---|---|
| glv-cha | Charcoal | $24 |
| glv-cml | Camel | $24 |
| glv-blk | Black | $24 |
monogramtextrequiredmax 3 chars (web only — relaxed for partners)
productSlug: wool-scarfLambswool, fringed edge, embroidered initials.
| variantSku | Option | Price |
|---|---|---|
| scf-cha | Charcoal | $32 |
| scf-cml | Camel | $32 |
| scf-nvy | Navy | $32 |
initialstextrequiredmax 3 chars (web only — relaxed for partners)
POST /api/v1/partner/orders HTTP/1.1
Host: monogram.shop
Authorization: Bearer YOUR_PARTNER_KEY
Content-Type: application/json
{
"reference": "INV-2026-00891",
"customer": {
"name": "Jane Doe",
"email": "jane@example.com",
"address": {
"line1": "12 Hudson Yards",
"city": "New York",
"region": "NY",
"postalCode": "10001",
"country": "US"
}
},
"items": [
{
"productSlug": "monogram-tee",
"variantSku": "tee-blk-m",
"quantity": 2,
"amountCents": 7500,
"personalization": { "monogram": "J.D.", "date": "2026-05-24", "thread": "Gold" }
}
],
"notes": "Gift wrap"
}HTTP/1.1 201 Created
Content-Type: application/json
{
"id": "K4n7XQpA",
"status": "pending",
"reference": "INV-2026-00891",
"subtotalCents": 15000,
"shippingCents": 0,
"taxCents": 0,
"totalCents": 15000,
"currency": "USD",
"payUrl": "https://monogram.shop/pay/K4n7XQpA",
"createdAt": "2026-05-24T13:11:02.341Z"
}Fetching invoices
You can list every invoice you've created, or fetch one by id. Authentication is the same Bearer key you used to create the order — we'll only return invoices created with your key.
/api/v1/partner/ordersList your invoices, newest first. Returns a summary row per invoice plus a nextCursor for pagination.
status· pending | paid | fulfilled | cancelledreference· your invoice ID, exact matchcursor· ISO timestamp from previous responselimit· 1–100, default 25
GET /api/v1/partner/orders?status=paid&limit=10 Authorization: Bearer YOUR_PARTNER_KEY
{
"orders": [
{
"id": "K4n7XQpA",
"status": "paid",
"reference": "INV-2026-00891",
"customer": { "name": "Jane Doe", "email": "jane@example.com" },
"subtotalCents": 15000,
"shippingCents": 0,
"taxCents": 0,
"totalCents": 15000,
"currency": "USD",
"payUrl": "https://monogram.shop/pay/K4n7XQpA",
"itemCount": 2,
"createdAt": "2026-05-24T13:11:02.341Z",
"paidAt": "2026-05-24T13:18:44.001Z"
}
],
"nextCursor": "2026-05-24T13:11:02.341Z"
}/api/v1/partner/orders/{id}Full invoice payload — items, personalization, customer, pricing breakdown, and dates. Returns 404 if the invoice wasn't created with your API key.
GET /api/v1/partner/orders/K4n7XQpA Authorization: Bearer YOUR_PARTNER_KEY
{
"id": "K4n7XQpA",
"status": "paid",
"reference": "INV-2026-00891",
"customer": {
"name": "Jane Doe",
"email": "jane@example.com",
"address": { "line1": "12 Hudson Yards", "city": "New York", ... }
},
"items": [
{
"productSlug": "monogram-tee",
"productName": "Monogram Tee",
"variantSku": "tee-blk-m",
"variantLabel": "Black · M",
"quantity": 2,
"unitPriceCents": 7500,
"lineTotalCents": 15000,
"personalization": { "monogram": "J.D.", "thread": "Gold" }
}
],
"subtotalCents": 15000,
"shippingCents": 0,
"taxCents": 0,
"totalCents": 15000,
"currency": "USD",
"payUrl": "https://monogram.shop/pay/K4n7XQpA",
"notes": "Gift wrap",
"createdAt": "2026-05-24T13:11:02.341Z",
"paidAt": "2026-05-24T13:18:44.001Z",
"updatedAt": "2026-05-24T13:18:44.001Z"
}On every list response, if nextCursor is non-null, pass it back as ?cursor=<value> to get the next page. When nextCursor comes back as null, you've reached the end.
Payment events, pushed to you
Give us a public HTTPS URL and we'll POST a JSON payload every time a payment moves — success, failed, pending, created. One envelope (event: "payment.notify"), all the detail inside data: status, message, amount, customer info, masked card, and both transaction ids so reconciliation is a single field match.
success— charge cleared, order marked paid on our side.failed— decline or processor error.messagecarries the reason.pending— awaiting confirmation (e.g. async payment methods).created— customer initiated checkout; not yet captured.
- · POST with
Content-Type: application/json. - · Respond 2xx within a few seconds. Non-2xx is retried on the next upstream redelivery.
- · The same payment may notify more than once — dedupe on
data.transaction_id+data.status. - · Timestamps are UTC, format
YYYY-MM-DD HH:MM:SS.
transaction_id· our payment transaction idmerchant_transaction_id· order publicId — matches theidreturned at create timestatus·success·failed·pending·createdamount· string with 2 decimals, e.g."50.00"currency· uppercase ISO, e.g."USD"message· human-readable; onfailedthis carries the processor's decline reasoncustomer_info· name, email, phone, line1, city, state, postal_code, countrycreated_at/processed_at· UTCYYYY-MM-DD HH:MM:SS
POST https://your-domain.com/webhook
Content-Type: application/json
{
"event": "payment.notify",
"data": {
"transaction_id": "pay_Cf7Gr7PgqIObMAcM",
"merchant_transaction_id": "K4n7XQpA",
"status": "success",
"amount": "150.00",
"currency": "USD",
"message": "Payment completed.",
"customer_info": {
"phone": "+19876543210",
"line1": "12 Hudson Yards",
"postal_code": "10001",
"city": "New York",
"state": "NY",
"name": "Jane Doe",
"email": "jane@example.com",
"country": "US"
},
"created_at": "2026-05-24 13:11:02",
"processed_at": "2026-05-24 13:18:44"
}
}POST https://your-domain.com/webhook
Content-Type: application/json
{
"event": "payment.notify",
"data": {
"transaction_id": "pay_Cf7Gr7PgqIObMAcN",
"merchant_transaction_id": "K4n7XQpA",
"status": "failed",
"amount": "150.00",
"currency": "USD",
"message": "Your card was declined.",
"customer_info": {
"phone": "+19876543210",
"line1": "12 Hudson Yards",
"postal_code": "10001",
"city": "New York",
"state": "NY",
"name": "Jane Doe",
"email": "jane@example.com",
"country": "US"
},
"created_at": "2026-05-24 13:11:02",
"processed_at": "2026-05-24 13:19:02"
}
}Email partners@monogram.online with the HTTPS endpoint you want events delivered to. We'll wire it up against your API key — sandbox and live can point to different URLs if you want to keep test traffic separate.
Common errors
| Message | Cause | Fix |
|---|---|---|
| Unauthorized | Missing or invalid Bearer token. | Re-check the Authorization header. |
| Validation failed (422) | Body doesn't match our schema. Response includes an issues map. | Match field names and types to the anatomy block above. |
| Unknown product: <slug> | productSlug isn't in the catalog or has been deactivated. | Use a slug shown in the catalog below. |
| Unknown variant <sku> for product <slug> | The SKU doesn't belong to that product. | Check the variant rows of the product card. |
| Missing required personalization "<key>" | A required customization key is absent or empty. | Send every key marked required on the product card. |
Personalization maxLength errors never apply to partner orders — those limits are relaxed for you.