{
"statusCode": 400,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "Los ítems enviados no suman puntos. Revisá la configuración de puntos y montos de los ítems.",
"errors": [
{}
],
"data": {}
}
{
"statusCode": 403,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "Branch with id 1972 does not belong to business with id 42",
"errors": [
{}
],
"data": {}
}
{
"statusCode": 404,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "PointsItem with id 12 not found",
"errors": [
{}
],
"data": {}
}
{
"statusCode": 409,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "Ya existe una operación de puntos con el externalId FAC-A-0001-00012345 para este negocio",
"errors": [
{}
],
"data": {}
}
{
"statusCode": 503,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "No se pudo procesar la suma en este momento. Reintentá en unos segundos.",
"errors": [
{}
],
"data": {}
}
Puntos
Sumar puntos a un cliente por una compra
Acredita puntos de forma inmediata a partir del monto de una compra. Es el endpoint principal para integrar un POS o ERP.
El cliente se identifica por email o dni. Si no existe, se crea automáticamente, salvo que se mande ignoreCreateClient: true.
Idempotencia: mandá siempre external_id con el identificador de la venta en tu sistema (número de factura, id de ticket). Si llega un external_id que ya tiene una operación activa, la API responde 409 en vez de duplicar los puntos. Ese mismo external_id es el que se usa para cancelar la operación después.
Sumar por ítems (pointItems): en vez del monto podés mandar los ids de los ítems de puntos del catálogo del comercio. Repetí el mismo id para cargar más de una unidad del ítem (tope de 100 ids). Si viene pointItems, el amount del body se ignora y el amount de la respuesta es la suma de los montos de los ítems; points.selectedRewardType pasa a items. Las bonificaciones de nivel y las reglas de puntos se siguen aplicando igual que en la suma por monto.
POST
/
external
/
tags
/
add
Sumar puntos a un cliente por una compra
curl --request POST \ --url https://api.tiendadepuntos.com/external/tags/add \ --header 'Content-Type: application/json' \ --header 'x-api-key: <api-key>' \ --data '{ "client": { "email": "juanma@mailinator.com", "dni": "40100800", "first_name": "Juan Manuel", "last_name": "Pérez", "phone": "+541164593678", "birthday": "1990-01-01T00:00:00.000Z", "gender": 0 }, "amount": 50, "pointItems": [ 12, 12, 37 ], "branch_id": 1972, "external_id": "FAC-A-0001-00012345", "reason": "Suma por compra de 2 medialunas y un cafe latte", "giftCards": [ { "clientMail": "exampleMail@tiendadepuntos.com", "points": { "selectedRewardType": "points", "amount": 50, "pointItemsIds": [ 123 ], "pointsToGive": 100, "reason": "Se entregan 500 puntos por comprar un cafe cuyo valor fue de $50" }, "applyBonus": { "applyLevelPointsBonus": true, "applyPointRulesBonus": true } } ], "ignoreCreateClient": false, "origin": "external-integration", "extra_data": "[{\"ArticuloDetalle\":\"Remera negra\",\"Cantidad\":3,\"Talle\":\"M\"}]"}'
{
"statusCode": 400,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "Los ítems enviados no suman puntos. Revisá la configuración de puntos y montos de los ítems.",
"errors": [
{}
],
"data": {}
}
{
"statusCode": 403,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "Branch with id 1972 does not belong to business with id 42",
"errors": [
{}
],
"data": {}
}
{
"statusCode": 404,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "PointsItem with id 12 not found",
"errors": [
{}
],
"data": {}
}
{
"statusCode": 409,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "Ya existe una operación de puntos con el externalId FAC-A-0001-00012345 para este negocio",
"errors": [
{}
],
"data": {}
}
{
"statusCode": 503,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "No se pudo procesar la suma en este momento. Reintentá en unos segundos.",
"errors": [
{}
],
"data": {}
}
Monto de la compra en pesos. La conversión a puntos la define la regla de puntos configurada por el comercio. Se ignora si mandás pointItems. Es obligatorio salvo que vengan pointItems.
IDs de los ítems de puntos ya cargados en el comercio. Si viene, los puntos se calculan a partir de los ítems y amount se ignora: el monto de la operación es la suma de los montos de los ítems. Repetí el mismo id para cargar más de una unidad (máximo 100 ids).
Identificador de la transacción en tu sistema (número de factura, id de ticket). Es la clave de idempotencia: si repetís un external_id que ya tiene una operación activa, la API responde 409 en vez de duplicar los puntos. También es el identificador con el que después se cancela la operación.
Datos crudos de la operación en el sistema de origen, como JSON serializado. Hoy solo se persiste cuando origin es dragonfish (son los renglones de la factura, que el export de movimientos muestra en la columna "Artículos"). Para cualquier otro origen se ignora en silencio.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Tienda de Puntos","description":"Guías y recursos para conectar Tienda de Puntos con tu negocio.","colors":{"primary":"#5b53f0","light":"#5b53f0","dark":"#8b85f5"},"logo":{"light":"https://mintcdn.com/tiendadepuntos/WnSIFgAFSkI7bdnr/logo/light.png?fit=max\u0026auto=format\u0026n=WnSIFgAFSkI7bdnr\u0026q=85\u0026s=8187339b0bc9e96cfb1fede6be7db42f","dark":"https://mintcdn.com/tiendadepuntos/WnSIFgAFSkI7bdnr/logo/dark.png?fit=max\u0026auto=format\u0026n=WnSIFgAFSkI7bdnr\u0026q=85\u0026s=81c582f44eeca4f00583f870e53ab395"},"favicon":"https://mintcdn.com/tiendadepuntos/WnSIFgAFSkI7bdnr/favicon.png?fit=max\u0026auto=format\u0026n=WnSIFgAFSkI7bdnr\u0026q=85\u0026s=6e6c345757dc587a976308ee43c1a0a5","appearance":{"default":"light"},"navbar":{"links":[{"href":"mailto:hola@tiendadepuntos.com","label":"Soporte"}],"primary":{"type":"button","label":"Buscar mi Tienda de Puntos","href":"https://mi.tiendadepuntos.com/auth/my-business"}},"footer":{"socials":{"website":"https://www.tiendadepuntos.com","linkedin":"https://www.linkedin.com/company/tienda-de-puntos"},"links":[{"header":"Plataforma","items":[{"label":"Sitio web","href":"https://www.tiendadepuntos.com"},{"label":"Ingresá a tu tienda","href":"https://mi.tiendadepuntos.com/auth/my-business"}]},{"header":"Recursos","items":[{"label":"Blog","href":"https://www.tiendadepuntos.com/blog"},{"label":"Contacto","href":"mailto:hola@tiendadepuntos.com"}]}]},"fonts":{"family":"Inter"},"icons":{"library":"lucide"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"tiendadepuntos","hasAudioNarration":false,"actualSubdomain":"tiendadepuntos","customDomains":["developers.tiendadepuntos.com"],"gitSource":{"type":"github","owner":"tiendadepuntos","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"entitlements":{},"buildId":"6ac1d0a6cd821381e02d7458","clientVersion":"0.0.4124","searchFilterCounts":[{"language":"default","tag":"Documentación","count":49},{"language":"default","tag":"API · Endpoints","count":41},{"language":"default","tag":"Clientes","count":6},{"language":"default","tag":"API · Empezar","count":5},{"language":"default","tag":"Canjes","count":5},{"language":"default","tag":"Ítems de puntos","count":5},{"language":"default","tag":"Niveles","count":5},{"language":"default","tag":"Operadores","count":5},{"language":"default","tag":"Premios","count":5},{"language":"default","tag":"Puntos","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":":root{--tdp-page-bg: #ffffff;--tdp-primary: #5b53f0;--tdp-primary-hover: #4a42d9;--tdp-accent-text: #5b53f0;--tdp-ink: #17171b;--tdp-muted: #686872;--tdp-border: #e7e7eb;--tdp-surface: #f7f7f8;--tdp-card-bg: #ffffff;--tdp-card-border: #e9e9ee;--tdp-card-hover-border: #d8d6e8;--tdp-card-shadow: 0 14px 38px rgba(25, 22, 55, 0.06);--tdp-icon-bg: #ffffff;--tdp-icon-border: #dfddef;--tdp-arrow: #a3a3aa;--tdp-hero-button-bg: #17171b;--tdp-hero-button-text: #ffffff;--tdp-visual-points-bg:\n radial-gradient(circle at 80% 18%, rgba(255, 255, 255, 0.8), transparent 23%),\n linear-gradient(145deg, #eeecff, #c9c4ff);--tdp-visual-ring: rgba(91, 83, 240, 0.15);--tdp-purchase-bg: rgba(255, 255, 255, 0.85);--tdp-purchase-border: rgba(255, 255, 255, 0.75);--tdp-purchase-shadow: 0 30px 70px rgba(59, 49, 145, 0.2);--tdp-purchase-divider: #e9e7f5;--tdp-purchase-title: #24232b;--tdp-purchase-muted: #777482}html.dark,body.dark,[data-theme=\"dark\"],[data-mode=\"dark\"],.dark{--tdp-page-bg: #0f1014;--tdp-primary: #5b53f0;--tdp-primary-hover: #4a42d9;--tdp-accent-text: #a8a3ff;--tdp-ink: #f4f4f6;--tdp-muted: #b5b5bf;--tdp-border: #2c2d36;--tdp-surface: #191a21;--tdp-card-bg: #15161d;--tdp-card-border: #2a2b35;--tdp-card-hover-border: #49465f;--tdp-card-shadow: 0 18px 42px rgba(0, 0, 0, 0.28);--tdp-icon-bg: #1d1e27;--tdp-icon-border: #373449;--tdp-arrow: #858796;--tdp-hero-button-bg: #f4f4f6;--tdp-hero-button-text: #101116;--tdp-visual-points-bg:\n radial-gradient(circle at 80% 18%, rgba(255, 255, 255, 0.12), transparent 23%),\n linear-gradient(145deg, #1e1c38, #3f3974);--tdp-visual-ring: rgba(168, 163, 255, 0.18);--tdp-purchase-bg: rgba(20, 21, 29, 0.88);--tdp-purchase-border: rgba(255, 255, 255, 0.12);--tdp-purchase-shadow: 0 30px 70px rgba(0, 0, 0, 0.34);--tdp-purchase-divider: #333247;--tdp-purchase-title: #f4f4f6;--tdp-purchase-muted: #b6b4c4}html,#background-color,body{background:var(--tdp-page-bg)}#topbar-cta-button{border:0;background:transparent;box-shadow:none}#topbar-cta-button>a{min-height:38px;padding:0 11px 0 16px;border:0;border-radius:999px;background:var(--tdp-primary);box-shadow:0 2px 8px rgba(91, 83, 240, 0.22);color:#fff;font-size:13px;font-weight:600;transition:background-color 160ms ease, box-shadow 160ms ease}#topbar-cta-button>a:hover{background:var(--tdp-primary-hover);color:#fff;box-shadow:0 3px 10px rgba(91, 83, 240, 0.3)}#topbar-cta-button *{color:#fff}#topbar-cta-button svg{width:18px;height:18px;margin-left:3px}.tdp-landing{max-width:1080px;min-height:calc(100vh - 4rem);margin:0 auto;padding:0 28px 96px;background:var(--tdp-page-bg);color:var(--tdp-ink)}.tdp-landing *{box-sizing:border-box}.tdp-landing a{text-decoration:none}.tdp-hero{max-width:780px;margin:0 auto;padding:112px 0 76px;text-align:center}.tdp-kicker,.tdp-eyebrow{display:block;color:var(--tdp-accent-text);font-size:11px;font-weight:700;letter-spacing:0.12em;line-height:1.4}.tdp-hero-title{margin:18px 0 0;color:var(--tdp-ink);font-size:60px;font-weight:560;letter-spacing:0;line-height:1.02}.tdp-hero-subtitle{max-width:650px;margin:26px auto 0;color:var(--tdp-muted);font-size:18px;line-height:1.65}.tdp-hero-actions{display:flex;align-items:center;justify-content:center;gap:12px;margin-top:34px}.tdp-btn-primary,.tdp-btn-secondary,.tdp-btn-light{display:inline-flex;align-items:center;justify-content:center;gap:9px;min-height:44px;padding:0 18px;border-radius:999px;font-size:14px;font-weight:600;transition:transform 160ms ease, background-color 160ms ease}.tdp-btn-primary{background:var(--tdp-hero-button-bg);color:var(--tdp-hero-button-text)}.tdp-btn-primary:hover,.tdp-btn-light:hover{transform:translateY(-1px)}.tdp-btn-secondary{border:1px solid var(--tdp-border);color:var(--tdp-ink)}.tdp-btn-secondary:hover{background:var(--tdp-surface)}.tdp-topics{display:grid;grid-template-columns:repeat(3, 1fr);gap:14px;scroll-margin-top:90px}.tdp-topic-card{position:relative;display:flex;min-height:258px;flex-direction:column;padding:26px;border:1px solid var(--tdp-card-border);border-radius:18px;background:var(--tdp-card-bg);color:inherit;transition:border-color 180ms ease, transform 180ms ease, box-shadow 180ms ease}.tdp-topic-card:hover{border-color:var(--tdp-card-hover-border);box-shadow:var(--tdp-card-shadow);transform:translateY(-3px)}.tdp-topic-icon{display:grid;width:42px;height:42px;place-items:center;border:1px solid var(--tdp-icon-border);border-radius:12px;background:var(--tdp-icon-bg);color:var(--tdp-accent-text)}.tdp-topic-copy{margin-top:auto}.tdp-topic-copy h2{margin:9px 0 7px;color:var(--tdp-ink);font-size:19px;font-weight:620;letter-spacing:0;line-height:1.25}.tdp-topic-copy p{margin:0;color:var(--tdp-muted);font-size:14px;line-height:1.55}.tdp-card-arrow{position:absolute;top:28px;right:28px;color:var(--tdp-arrow);font-size:18px;transition:color 160ms ease, transform 160ms ease}.tdp-topic-card:hover .tdp-card-arrow{color:var(--tdp-accent-text);transform:translateX(3px)}.tdp-feature-row{display:grid;grid-template-columns:minmax(0, 0.9fr) minmax(0, 1.1fr);align-items:center;gap:70px;padding:120px 0 24px;scroll-margin-top:80px}.tdp-feature-row-reverse{grid-template-columns:minmax(0, 1.1fr) minmax(0, 0.9fr)}.tdp-feature-copy h2,.tdp-api-banner h2{margin:14px 0 16px;color:var(--tdp-ink);font-size:32px;font-weight:580;letter-spacing:0;line-height:1.15}.tdp-feature-copy p,.tdp-api-banner p{margin:0;color:var(--tdp-muted);font-size:16px;line-height:1.7}.tdp-text-link{display:inline-flex;gap:8px;margin-top:25px;color:var(--tdp-ink);font-size:14px;font-weight:650}.tdp-text-link span{transition:transform 160ms ease}.tdp-text-link:hover span{transform:translateX(4px)}.tdp-visual{position:relative;display:grid;min-height:390px;place-items:center;overflow:hidden;border-radius:28px}.tdp-visual-points{background:var(--tdp-visual-points-bg)}.tdp-visual-points::before,.tdp-visual-points::after{position:absolute;width:210px;height:210px;border:1px solid var(--tdp-visual-ring);border-radius:50%;content:\"\"}.tdp-visual-points::before{top:-80px;left:-45px}.tdp-visual-points::after{right:-70px;bottom:-100px}.tdp-purchase-card{position:relative;z-index:1;width:min(78%, 340px);padding:22px;border:1px solid var(--tdp-purchase-border);border-radius:18px;background:var(--tdp-purchase-bg);box-shadow:var(--tdp-purchase-shadow);backdrop-filter:blur(12px);transform:rotate(-2deg)}.tdp-purchase-header{display:flex;align-items:center;gap:12px;padding-bottom:18px;border-bottom:1px solid var(--tdp-purchase-divider)}.tdp-purchase-header span:last-child{display:flex;flex-direction:column}.tdp-purchase-header strong{color:var(--tdp-purchase-title);font-size:14px}.tdp-purchase-header small,.tdp-points-row small{color:var(--tdp-purchase-muted);font-size:11px}.tdp-avatar{display:grid;width:40px;height:40px;place-items:center;border-radius:50%;background:var(--tdp-primary);color:#fff;font-size:12px;font-weight:700}.tdp-points-row{display:flex;align-items:baseline;justify-content:space-between;padding-top:20px}.tdp-points-row>span{color:var(--tdp-accent-text);font-size:28px;font-weight:700;letter-spacing:0}.tdp-visual-integrations{background:linear-gradient(rgba(255, 255, 255, 0.055) 1px, transparent 1px),\n linear-gradient(90deg, rgba(255, 255, 255, 0.055) 1px, transparent 1px),\n #17171b;background-size:32px 32px}.tdp-integration-node{position:absolute;z-index:2;display:grid;width:74px;height:74px;place-items:center;border:1px solid rgba(255, 255, 255, 0.16);border-radius:20px;background:#27262e;color:#fff;box-shadow:0 15px 35px rgba(0, 0, 0, 0.24);font-size:12px;font-weight:700;letter-spacing:0.06em}.tdp-node-center{width:92px;height:92px;border-color:rgba(139, 133, 245, 0.55);background:#5b53f0}.tdp-node-left{left:13%;bottom:17%}.tdp-node-right{top:16%;right:13%}.tdp-connector{position:absolute;z-index:1;width:150px;height:1px;background:linear-gradient(90deg, transparent, #7770ee);transform-origin:right}.tdp-connector-left{transform:translate(-58px, 60px) rotate(-34deg)}.tdp-connector-right{background:linear-gradient(90deg, #7770ee, transparent);transform:translate(58px, -60px) rotate(-34deg);transform-origin:left}.tdp-api-banner{display:flex;align-items:center;justify-content:space-between;gap:48px;margin-top:120px;padding:46px 50px;border-radius:26px;background:var(--tdp-primary)}.tdp-api-banner .tdp-eyebrow{color:#cbc8ff}.tdp-api-banner h2{margin-top:10px;color:#fff}.tdp-api-banner p{max-width:600px;color:#dedcff}.tdp-btn-light{flex:0 0 auto;background:#fff;color:#262331}.tdp-integration-logo{display:block;width:min(190px, 60%);max-height:74px;object-fit:contain;margin:10px 0 22px;padding:12px 16px;border:1px solid var(--tdp-card-border);border-radius:12px;background:var(--tdp-card-bg)}@media (max-width: 820px){.tdp-hero-title{font-size:48px}.tdp-topics{grid-template-columns:1fr}.tdp-topic-card{min-height:220px}.tdp-feature-row,.tdp-feature-row-reverse{grid-template-columns:1fr;gap:36px;padding-top:88px}.tdp-feature-row-reverse .tdp-visual{order:2}.tdp-api-banner{align-items:flex-start;flex-direction:column}}@media (max-width: 560px){.tdp-landing{padding:0 18px 64px}.tdp-hero{padding:76px 0 56px}.tdp-hero-title{font-size:38px}.tdp-hero-subtitle{font-size:16px}.tdp-hero-actions{align-items:stretch;flex-direction:column}.tdp-visual{min-height:320px;border-radius:22px}.tdp-api-banner{margin-top:88px;padding:32px 26px}}"}],"page":{"pagePath":"api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra","slug":"/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra","pageMetadata":{"title":"Sumar puntos a un cliente por una compra","description":"Acredita puntos de forma inmediata a partir del monto de una compra. Es el endpoint principal para integrar un POS o ERP.\n\nEl cliente se identifica por `email` o `dni`. Si no existe, se crea automáticamente, salvo que se mande `ignoreCreateClient: true`.\n\n**Idempotencia**: mandá siempre `external_id` con el identificador de la venta en tu sistema (número de factura, id de ticket). Si llega un `external_id` que ya tiene una operación activa, la API responde 409 en vez de duplicar los puntos. Ese mismo `external_id` es el que se usa para cancelar la operación después.\n\n**Sumar por ítems (`pointItems`)**: en vez del monto podés mandar los ids de los ítems de puntos del catálogo del comercio. Repetí el mismo id para cargar más de una unidad del ítem (tope de 100 ids). Si viene `pointItems`, el `amount` del body se ignora y el `amount` de la respuesta es la suma de los montos de los ítems; `points.selectedRewardType` pasa a `items`. Las bonificaciones de nivel y las reglas de puntos se siguen aplicando igual que en la suma por monto.","deprecated":null,"version":null,"sidebarTitle":"Sumar puntos a un cliente por una compra","openapi":"/api-reference/openapi.json post /external/tags/add","href":"/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Acredita puntos de forma inmediata a partir del monto de una compra. Es el endpoint principal para integrar un POS o ERP.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"El cliente se identifica por \", _jsx(_components.code, {\n children: \"email\"\n }), \" o \", _jsx(_components.code, {\n children: \"dni\"\n }), \". Si no existe, se crea automáticamente, salvo que se mande \", _jsx(_components.code, {\n children: \"ignoreCreateClient: true\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Idempotencia\"\n }), \": mandá siempre \", _jsx(_components.code, {\n children: \"external_id\"\n }), \" con el identificador de la venta en tu sistema (número de factura, id de ticket). Si llega un \", _jsx(_components.code, {\n children: \"external_id\"\n }), \" que ya tiene una operación activa, la API responde 409 en vez de duplicar los puntos. Ese mismo \", _jsx(_components.code, {\n children: \"external_id\"\n }), \" es el que se usa para cancelar la operación después.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsxs(_components.strong, {\n children: [\"Sumar por ítems (\", _jsx(_components.code, {\n children: \"pointItems\"\n }), \")\"]\n }), \": en vez del monto podés mandar los ids de los ítems de puntos del catálogo del comercio. Repetí el mismo id para cargar más de una unidad del ítem (tope de 100 ids). Si viene \", _jsx(_components.code, {\n children: \"pointItems\"\n }), \", el \", _jsx(_components.code, {\n children: \"amount\"\n }), \" del body se ignora y el \", _jsx(_components.code, {\n children: \"amount\"\n }), \" de la respuesta es la suma de los montos de los ítems; \", _jsx(_components.code, {\n children: \"points.selectedRewardType\"\n }), \" pasa a \", _jsx(_components.code, {\n children: \"items\"\n }), \". Las bonificaciones de nivel y las reglas de puntos se siguen aplicando igual que en la suma por monto.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Sumar puntos a un cliente por una compra","description":"Acredita puntos de forma inmediata a partir del monto de una compra. Es el endpoint principal para integrar un POS o ERP.\n\nEl cliente se identifica por `email` o `dni`. Si no existe, se crea automáticamente, salvo que se mande `ignoreCreateClient: true`.\n\n**Idempotencia**: mandá siempre `external_id` con el identificador de la venta en tu sistema (número de factura, id de ticket). Si llega un `external_id` que ya tiene una operación activa, la API responde 409 en vez de duplicar los puntos. Ese mismo `external_id` es el que se usa para cancelar la operación después.\n\n**Sumar por ítems (`pointItems`)**: en vez del monto podés mandar los ids de los ítems de puntos del catálogo del comercio. Repetí el mismo id para cargar más de una unidad del ítem (tope de 100 ids). Si viene `pointItems`, el `amount` del body se ignora y el `amount` de la respuesta es la suma de los montos de los ítems; `points.selectedRewardType` pasa a `items`. Las bonificaciones de nivel y las reglas de puntos se siguen aplicando igual que en la suma por monto.","deprecated":null,"version":null,"sidebarTitle":"Sumar puntos a un cliente por una compra","openapi":"/api-reference/openapi.json post /external/tags/add","href":"/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"Acredita puntos de forma inmediata a partir del monto de una compra. Es el endpoint principal para integrar un POS o ERP.\n\nEl cliente se identifica por `email` o `dni`. Si no existe, se crea automáticamente, salvo que se mande `ignoreCreateClient: true`.\n\n**Idempotencia**: mandá siempre `external_id` con el identificador de la venta en tu sistema (número de factura, id de ticket). Si llega un `external_id` que ya tiene una operación activa, la API responde 409 en vez de duplicar los puntos. Ese mismo `external_id` es el que se usa para cancelar la operación después.\n\n**Sumar por ítems (`pointItems`)**: en vez del monto podés mandar los ids de los ítems de puntos del catálogo del comercio. Repetí el mismo id para cargar más de una unidad del ítem (tope de 100 ids). Si viene `pointItems`, el `amount` del body se ignora y el `amount` de la respuesta es la suma de los montos de los ítems; `points.selectedRewardType` pasa a `items`. Las bonificaciones de nivel y las reglas de puntos se siguen aplicando igual que en la suma por monto.","operationId":"ExternalTagsController_createPointOperation","parameters":[],"requestBody":"80537557-dbae-49d5-93ab-f61108fe6ebb","responses":{"201":"0d342aba-ad43-4671-bccd-fd2b1d000c4d","400":"612af216-2ea6-44ea-8ebf-0f6ad34d4f46","401":"e67dd718-2d76-42b8-8596-77be26421160","403":"b1fc2b86-9909-4575-a1b7-c7819fdb67a5","404":"32a706cd-f4f0-451e-95f3-e7ada9d41f8d","409":"b76db007-fdf7-49b7-8901-d456947bb6f6","503":"f56bb689-0f94-464b-b3a9-c186d6728aa1"},"security":["253d9cc2-fd14-408f-af33-db7a08bcd4b1"],"summary":"Sumar puntos a un cliente por una compra","tags":["Puntos"],"x-mint":{"href":"/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra","metadata":{"title":"Sumar puntos a un cliente por una compra","sidebarTitle":"Sumar puntos a un cliente por una compra"}},"method":"post","type":"path","servers":["b3a69718-a9fe-4116-a340-620ea57d373e","b1c4d4f7-1090-47b8-b751-e9830f418b25"],"path":"/external/tags/add","baseUrlOptions":["https://api.tiendadepuntos.com","https://api-qa.tiendadepuntos.com"],"title":"Sumar puntos a un cliente por una compra","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client":{"type":"object","description":"Datos del cliente que hizo la compra.","required":["email","dni"],"properties":{"email":{"type":"string","description":"Email del cliente. Obligatorio si no se envía `dni`: hace falta al menos uno de los dos para identificar o dar de alta al cliente.","example":"juanma@mailinator.com","isRequired":true,"uniqueKey":"client.email","typeLabel":"string"},"dni":{"type":"string","description":"Número de documento del cliente. Obligatorio si no se envía `email`.","example":"40100800","isRequired":true,"uniqueKey":"client.dni","typeLabel":"string"},"first_name":{"type":"string","description":"Nombre del cliente. Se usa al darlo de alta automáticamente.","example":"Juan Manuel","uniqueKey":"client.first_name","typeLabel":"string"},"last_name":{"type":"string","description":"Apellido del cliente. Se usa al darlo de alta automáticamente.","example":"Pérez","uniqueKey":"client.last_name","typeLabel":"string"},"phone":{"type":"string","description":"Número de teléfono del cliente, con código de país.","example":"+541164593678","uniqueKey":"client.phone","typeLabel":"string"},"birthday":{"type":"string","description":"Fecha de nacimiento del cliente","example":"1990-01-01T00:00:00.000Z","uniqueKey":"client.birthday","typeLabel":"string"},"gender":{"type":"number","description":"Género del cliente. 0 = masculino, 1 = femenino, 2 = otro, 3 = sin datos.","enum":[0,1,2,3],"example":0,"uniqueKey":"client.gender","typeLabel":"enum\u003cnumber>"}},"isRequired":true,"uniqueKey":"client","typeLabel":"object"},"amount":{"type":"number","description":"Monto de la compra en pesos. La conversión a puntos la define la regla de puntos configurada por el comercio. Se ignora si mandás `pointItems`. Es obligatorio salvo que vengan `pointItems`.","example":50,"uniqueKey":"amount","typeLabel":"number"},"pointItems":{"description":"IDs de los ítems de puntos ya cargados en el comercio. Si viene, los puntos se calculan a partir de los ítems y `amount` se ignora: el monto de la operación es la suma de los montos de los ítems. Repetí el mismo id para cargar más de una unidad (máximo 100 ids).","example":[12,12,37],"type":"array","items":{"type":"number","uniqueKey":"pointItems.items.[INDEX]","typeLabel":"number"},"uniqueKey":"pointItems","typeLabel":"number[]"},"operator":{"type":"object","description":"Datos del operador o cajero que registró la venta.","required":["email","dni"],"properties":{"email":{"type":"string","description":"Email del operador que registró la venta. Obligatorio si no se envía `dni`.","example":"cajero.centro@micomercio.com","isRequired":true,"uniqueKey":"operator.email","typeLabel":"string"},"dni":{"type":"string","description":"Número de documento del operador. Obligatorio si no se envía `email`.","example":"28455901","isRequired":true,"uniqueKey":"operator.dni","typeLabel":"string"},"first_name":{"type":"string","description":"Nombre del operador","example":"Carla","uniqueKey":"operator.first_name","typeLabel":"string"},"last_name":{"type":"string","description":"Apellido del operador","example":"Gómez","uniqueKey":"operator.last_name","typeLabel":"string"},"phone":{"type":"string","description":"Número de teléfono del operador, con código de país.","example":"+541164593678","uniqueKey":"operator.phone","typeLabel":"string"}},"uniqueKey":"operator","typeLabel":"object"},"branch_id":{"type":"number","description":"ID de la sucursal donde se hizo la compra. Se obtiene de `GET /external/branch`. Debe pertenecer al comercio de la API key.","example":1972,"uniqueKey":"branch_id","typeLabel":"number"},"external_id":{"type":"string","description":"Identificador de la transacción en tu sistema (número de factura, id de ticket). Es la clave de idempotencia: si repetís un `external_id` que ya tiene una operación activa, la API responde 409 en vez de duplicar los puntos. También es el identificador con el que después se cancela la operación.","example":"FAC-A-0001-00012345","uniqueKey":"external_id","typeLabel":"string"},"reason":{"type":"string","description":"Observaciones de la suma de puntos.","example":"Suma por compra de 2 medialunas y un cafe latte","uniqueKey":"reason","typeLabel":"string"},"applyBonus":{"type":"object","description":"Bonificaciones a aplicar sobre los puntos base. Si se omite, no se aplica ninguna.","required":["applyLevelPointsBonus","applyPointRulesBonus"],"properties":{"applyLevelPointsBonus":{"type":"boolean","description":"Aplicar bonificación de puntos por nivel","example":true,"isRequired":true,"uniqueKey":"applyBonus.applyLevelPointsBonus","typeLabel":"boolean"},"applyPointRulesBonus":{"type":"boolean","description":"Aplicar bonificación de puntos por reglas de puntos","example":true,"isRequired":true,"uniqueKey":"applyBonus.applyPointRulesBonus","typeLabel":"boolean"}},"uniqueKey":"applyBonus","typeLabel":"object"},"giftCards":{"description":"Gift cards de regalo para otro cliente.","type":"array","items":{"type":"object","properties":{"clientMail":{"type":"string","description":"Correo electrónico del cliente","example":"exampleMail@tiendadepuntos.com","isRequired":true,"uniqueKey":"giftCards.items.[INDEX].clientMail","typeLabel":"string"},"points":{"type":"object","description":"Puntos a entregar","required":["selectedRewardType","amount","pointItemsIds","pointsToGive"],"properties":{"selectedRewardType":{"type":"string","description":"Tipo de recompensa seleccionada por el operador","enum":["points","money","items","none"],"example":"points","isRequired":true,"uniqueKey":"giftCards.items.[INDEX].points.selectedRewardType","typeLabel":"enum\u003cstring>"},"amount":{"type":"number","description":"Cantidad de dinero que se ingreso para convertir a puntos","example":50,"isRequired":true,"uniqueKey":"giftCards.items.[INDEX].points.amount","typeLabel":"number"},"pointItemsIds":{"description":"id de los items de puntos","type":"array","items":{"type":"number","uniqueKey":"giftCards.items.[INDEX].points.pointItemsIds.items.[INDEX]","typeLabel":"number"},"isRequired":true,"uniqueKey":"giftCards.items.[INDEX].points.pointItemsIds","typeLabel":"number[]"},"pointsToGive":{"type":"number","description":"Cantidad de puntos a otorgar como recompensa","example":100,"isRequired":true,"uniqueKey":"giftCards.items.[INDEX].points.pointsToGive","typeLabel":"number"},"reason":{"type":"string","description":"Razón o motivo de la recompensa","example":"Se entregan 500 puntos por comprar un cafe cuyo valor fue de $50","uniqueKey":"giftCards.items.[INDEX].points.reason","typeLabel":"string"}},"isRequired":true,"uniqueKey":"giftCards.items.[INDEX].points","typeLabel":"object"},"applyBonus":{"type":"object","description":"Aplicar bonificaciones de puntos","required":["applyLevelPointsBonus","applyPointRulesBonus"],"properties":{"applyLevelPointsBonus":{"type":"boolean","description":"Aplicar bonificación de puntos por nivel","example":true,"isRequired":true,"uniqueKey":"giftCards.items.[INDEX].applyBonus.applyLevelPointsBonus","typeLabel":"boolean"},"applyPointRulesBonus":{"type":"boolean","description":"Aplicar bonificación de puntos por reglas de puntos","example":true,"isRequired":true,"uniqueKey":"giftCards.items.[INDEX].applyBonus.applyPointRulesBonus","typeLabel":"boolean"}},"isRequired":true,"uniqueKey":"giftCards.items.[INDEX].applyBonus","typeLabel":"object"}},"required":["clientMail","points","applyBonus"],"uniqueKey":"giftCards.items.[INDEX]","typeLabel":"object"},"uniqueKey":"giftCards","typeLabel":"object[]"},"ignoreCreateClient":{"type":"boolean","description":"Si llega en `true` y el cliente no existe, la operación falla en vez de darlo de alta automáticamente.","example":false,"uniqueKey":"ignoreCreateClient","typeLabel":"boolean"},"origin":{"type":"string","description":"Sistema desde el que se originó la operación. Se usa para trazabilidad en los reportes. Si integrás un sistema propio, usá `external-integration`.","example":"external-integration","enum":["external-integration","dragonfish","fudo","centum","contabilium","tiendanube","woocommerce","shopify","desktop-app","dux"],"uniqueKey":"origin","typeLabel":"enum\u003cstring>"},"extra_data":{"type":"string","description":"Datos crudos de la operación en el sistema de origen, como JSON serializado. Hoy solo se persiste cuando `origin` es `dragonfish` (son los renglones de la factura, que el export de movimientos muestra en la columna \"Artículos\"). Para cualquier otro origen se ignora en silencio.","example":"[{\"ArticuloDetalle\":\"Remera negra\",\"Cantidad\":3,\"Talle\":\"M\"}]","uniqueKey":"extra_data","typeLabel":"string"}},"required":["client"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"client":{"email":"juanma@mailinator.com","dni":"40100800","first_name":"Juan Manuel","last_name":"Pérez","phone":"+541164593678","birthday":"1990-01-01T00:00:00.000Z","gender":0},"amount":50,"pointItems":[12,12,37],"branch_id":1972,"external_id":"FAC-A-0001-00012345","reason":"Suma por compra de 2 medialunas y un cafe latte","giftCards":[{"clientMail":"exampleMail@tiendadepuntos.com","points":{"selectedRewardType":"points","amount":50,"pointItemsIds":[123],"pointsToGive":100,"reason":"Se entregan 500 puntos por comprar un cafe cuyo valor fue de $50"},"applyBonus":{"applyLevelPointsBonus":true,"applyPointRulesBonus":true}}],"ignoreCreateClient":false,"origin":"external-integration","extra_data":"[{\"ArticuloDetalle\":\"Remera negra\",\"Cantidad\":3,\"Talle\":\"M\"}]"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"0d342aba-ad43-4671-bccd-fd2b1d000c4d":{"description":"Puntos acreditados.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"status":{"type":"integer","example":201,"isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"message":{"type":"string","example":"Request was successful","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"data":{"type":"object","properties":{"pointOperationId":{"type":"integer","example":998877,"uniqueKey":"data.pointOperationId","typeLabel":"integer"},"clientId":{"type":"integer","example":84213,"uniqueKey":"data.clientId","typeLabel":"integer"},"points":{"type":"object","properties":{"amount":{"type":"number","example":50,"uniqueKey":"data.points.amount","typeLabel":"number"},"totalPointsToGive":{"type":"integer","example":55,"uniqueKey":"data.points.totalPointsToGive","typeLabel":"integer"},"initialPointsToGive":{"type":"integer","example":50,"uniqueKey":"data.points.initialPointsToGive","typeLabel":"integer"}},"uniqueKey":"data.points","typeLabel":"object"}},"uniqueKey":"data","typeLabel":"object"}},"required":["success","status","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"success":true,"status":201,"message":"Request was successful","data":{"pointOperationId":998877,"clientId":84213,"points":{"amount":50,"totalPointsToGive":55,"initialPointsToGive":50}}}}},"exampleType":"generated"}},"exampleType":"generated"},"612af216-2ea6-44ea-8ebf-0f6ad34d4f46":{"description":"Los `pointItems` enviados no generan puntos: ni por sus puntos propios ni por la conversión de sus montos.","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"integer","example":400,"uniqueKey":"statusCode","typeLabel":"integer"},"timestamp":{"type":"string","format":"date-time","example":"2026-07-31T14:05:12.431Z","uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"},"path":{"type":"string","example":"/external/tags/add","uniqueKey":"path","typeLabel":"string"},"method":{"type":"string","example":"POST","uniqueKey":"method","typeLabel":"string"},"message":{"type":"string","example":"Los ítems enviados no suman puntos. Revisá la configuración de puntos y montos de los ítems.","uniqueKey":"message","typeLabel":"string"},"errors":{"oneOf":[{"type":"array","items":{"type":"object","uniqueKey":"errors.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object"},"uniqueKey":"errors.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors","typeLabel":"object[] | null"},"data":{"oneOf":[{"type":"object","uniqueKey":"data.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data","typeLabel":"object | null"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":400,"timestamp":"2026-07-31T14:05:12.431Z","path":"/external/tags/add","method":"POST","message":"Los ítems enviados no suman puntos. Revisá la configuración de puntos y montos de los ítems.","errors":[{}],"data":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"e67dd718-2d76-42b8-8596-77be26421160":{"description":"Falta el header `x-api-key` (`Api Key is required`), o está presente pero no corresponde a ningún comercio (`Api key is invalid`).","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"integer","example":401,"uniqueKey":"statusCode","typeLabel":"integer"},"timestamp":{"type":"string","format":"date-time","example":"2026-07-31T14:05:12.431Z","uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"},"path":{"type":"string","example":"/external/tags/add","uniqueKey":"path","typeLabel":"string"},"method":{"type":"string","example":"POST","uniqueKey":"method","typeLabel":"string"},"message":{"type":"string","example":"Api key is invalid","uniqueKey":"message","typeLabel":"string"},"errors":{"oneOf":[{"type":"array","items":{"type":"object","uniqueKey":"errors.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object"},"uniqueKey":"errors.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors","typeLabel":"object[] | null"},"data":{"oneOf":[{"type":"object","uniqueKey":"data.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data","typeLabel":"object | null"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":401,"timestamp":"2026-07-31T14:05:12.431Z","path":"/external/tags/add","method":"POST","message":"Api key is invalid","errors":[{}],"data":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"b1fc2b86-9909-4575-a1b7-c7819fdb67a5":{"description":"El `branch_id` enviado no pertenece al comercio de la API key.","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"integer","example":403,"uniqueKey":"statusCode","typeLabel":"integer"},"timestamp":{"type":"string","format":"date-time","example":"2026-07-31T14:05:12.431Z","uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"},"path":{"type":"string","example":"/external/tags/add","uniqueKey":"path","typeLabel":"string"},"method":{"type":"string","example":"POST","uniqueKey":"method","typeLabel":"string"},"message":{"type":"string","example":"Branch with id 1972 does not belong to business with id 42","uniqueKey":"message","typeLabel":"string"},"errors":{"oneOf":[{"type":"array","items":{"type":"object","uniqueKey":"errors.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object"},"uniqueKey":"errors.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors","typeLabel":"object[] | null"},"data":{"oneOf":[{"type":"object","uniqueKey":"data.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data","typeLabel":"object | null"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":403,"timestamp":"2026-07-31T14:05:12.431Z","path":"/external/tags/add","method":"POST","message":"Branch with id 1972 does not belong to business with id 42","errors":[{}],"data":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"32a706cd-f4f0-451e-95f3-e7ada9d41f8d":{"description":"Alguno de los ids de `pointItems` no existe, fue eliminado o no pertenece al comercio de la API key.","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"integer","example":404,"uniqueKey":"statusCode","typeLabel":"integer"},"timestamp":{"type":"string","format":"date-time","example":"2026-07-31T14:05:12.431Z","uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"},"path":{"type":"string","example":"/external/tags/add","uniqueKey":"path","typeLabel":"string"},"method":{"type":"string","example":"POST","uniqueKey":"method","typeLabel":"string"},"message":{"type":"string","example":"PointsItem with id 12 not found","uniqueKey":"message","typeLabel":"string"},"errors":{"oneOf":[{"type":"array","items":{"type":"object","uniqueKey":"errors.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object"},"uniqueKey":"errors.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors","typeLabel":"object[] | null"},"data":{"oneOf":[{"type":"object","uniqueKey":"data.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data","typeLabel":"object | null"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":404,"timestamp":"2026-07-31T14:05:12.431Z","path":"/external/tags/add","method":"POST","message":"PointsItem with id 12 not found","errors":[{}],"data":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"b76db007-fdf7-49b7-8901-d456947bb6f6":{"description":"Ya existe una operación activa con ese `external_id` para este comercio.","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"integer","example":409,"uniqueKey":"statusCode","typeLabel":"integer"},"timestamp":{"type":"string","format":"date-time","example":"2026-07-31T14:05:12.431Z","uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"},"path":{"type":"string","example":"/external/tags/add","uniqueKey":"path","typeLabel":"string"},"method":{"type":"string","example":"POST","uniqueKey":"method","typeLabel":"string"},"message":{"type":"string","example":"Ya existe una operación de puntos con el externalId FAC-A-0001-00012345 para este negocio","uniqueKey":"message","typeLabel":"string"},"errors":{"oneOf":[{"type":"array","items":{"type":"object","uniqueKey":"errors.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object"},"uniqueKey":"errors.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors","typeLabel":"object[] | null"},"data":{"oneOf":[{"type":"object","uniqueKey":"data.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data","typeLabel":"object | null"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":409,"timestamp":"2026-07-31T14:05:12.431Z","path":"/external/tags/add","method":"POST","message":"Ya existe una operación de puntos con el externalId FAC-A-0001-00012345 para este negocio","errors":[{}],"data":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"f56bb689-0f94-464b-b3a9-c186d6728aa1":{"description":"Hay otra operación en curso con el mismo `external_id` y no se pudo obtener el acceso exclusivo. **Es seguro reintentar**: si la otra terminó, el reintento devuelve 409; si no llegó a procesarse, acredita normalmente.","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"integer","example":503,"uniqueKey":"statusCode","typeLabel":"integer"},"timestamp":{"type":"string","format":"date-time","example":"2026-07-31T14:05:12.431Z","uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"},"path":{"type":"string","example":"/external/tags/add","uniqueKey":"path","typeLabel":"string"},"method":{"type":"string","example":"POST","uniqueKey":"method","typeLabel":"string"},"message":{"type":"string","example":"No se pudo procesar la suma en este momento. Reintentá en unos segundos.","uniqueKey":"message","typeLabel":"string"},"errors":{"oneOf":[{"type":"array","items":{"type":"object","uniqueKey":"errors.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object"},"uniqueKey":"errors.oneOf.1","typeLabel":"null"}],"uniqueKey":"errors","typeLabel":"object[] | null"},"data":{"oneOf":[{"type":"object","uniqueKey":"data.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data","typeLabel":"object | null"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":503,"timestamp":"2026-07-31T14:05:12.431Z","path":"/external/tags/add","method":"POST","message":"No se pudo procesar la suma en este momento. Reintentá en unos segundos.","errors":[{}],"data":{}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"253d9cc2-fd14-408f-af33-db7a08bcd4b1":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key del comercio. Se genera desde el panel de Tienda de Puntos, en Configuración → Integraciones.","scopes":[]}}},"servers":{"b3a69718-a9fe-4116-a340-620ea57d373e":{"url":"https://api.tiendadepuntos.com","description":"Producción"},"b1c4d4f7-1090-47b8-b751-e9830f418b25":{"url":"https://api-qa.tiendadepuntos.com","description":"QA"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key del comercio. Se genera desde el panel de Tienda de Puntos, en Configuración → Integraciones.","scopes":[]},"schema":{"title":"x-api-key","type":"string","description":"API key del comercio. Se genera desde el panel de Tienda de Puntos, en Configuración → Integraciones.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"ApiKeyAuth","name":"x-api-key"}],"title":"ApiKeyAuth"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"tiendadepuntos","siteName":"Tienda de Puntos","title":"Sumar puntos a un cliente por una compra - Tienda de Puntos","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-04T04:06:03.844Z","originalFileLocation":"api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Acredita puntos de forma inmediata a partir del monto de una compra. Es el endpoint principal para integrar un POS o ERP. El cliente se identifica por email o dni. Si no existe, se crea automáticamente, salvo que se mande ignoreCreateClient: true. Idempotencia: mandá siempre external_id con el identificador de la venta en tu sistema (número de factura, id de ticket). Si llega un external_id que ya tiene una operación activa, la API responde 409 en vez de duplicar los puntos. Ese mismo external_id es el que se usa para cancelar la operación después. Sumar por ítems (pointItems): en vez del monto podés mandar los ids de los ítems de puntos del catálogo del comercio. Repetí el mismo id para cargar más de una unidad del ítem (tope de 100 ids). Si viene pointItems, el amount del body se ignora y el amount de la respuesta es la suma de los montos de los ítems; points.selectedRewardType pasa a items. Las bonificaciones de nivel y las reglas de puntos se siguen aplicando igual que en la suma por monto.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Tienda de Puntos\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/tiendadepuntos/ZKpZ9fYtIWUbQCtI/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/tiendadepuntos/ZKpZ9fYtIWUbQCtI/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/tiendadepuntos/ZKpZ9fYtIWUbQCtI/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/tiendadepuntos/ZKpZ9fYtIWUbQCtI/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/tiendadepuntos/ZKpZ9fYtIWUbQCtI/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/tiendadepuntos/ZKpZ9fYtIWUbQCtI/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/tiendadepuntos/ZKpZ9fYtIWUbQCtI/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/tiendadepuntos/ZKpZ9fYtIWUbQCtI/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/tiendadepuntos/ZKpZ9fYtIWUbQCtI/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Sumar puntos a un cliente por una compra - Tienda de Puntos\">\u003cmeta data-mint-head property=\"og:description\" content=\"Acredita puntos de forma inmediata a partir del monto de una compra. Es el endpoint principal para integrar un POS o ERP. El cliente se identifica por email o dni. Si no existe, se crea automáticamente, salvo que se mande ignoreCreateClient: true. Idempotencia: mandá siempre external_id con el identificador de la venta en tu sistema (número de factura, id de ticket). Si llega un external_id que ya tiene una operación activa, la API responde 409 en vez de duplicar los puntos. Ese mismo external_id es el que se usa para cancelar la operación después. Sumar por ítems (pointItems): en vez del monto podés mandar los ids de los ítems de puntos del catálogo del comercio. Repetí el mismo id para cargar más de una unidad del ítem (tope de 100 ids). Si viene pointItems, el amount del body se ignora y el amount de la respuesta es la suma de los montos de los ítems; points.selectedRewardType pasa a items. Las bonificaciones de nivel y las reglas de puntos se siguen aplicando igual que en la suma por monto.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Tienda de Puntos\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://developers.tiendadepuntos.com/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://tiendadepuntos.mintlify.site/_mintlify/api/og/v2?division=Puntos\u0026amp;title=Sumar+puntos+a+un+cliente+por+una+compra\u0026amp;description=Acredita+puntos+de+forma+inmediata+a+partir+del+monto+de+una+compra.+Es+el+endpoint+principal+para+integrar+un+POS+o+ERP.%0A%0AEl+cliente+se+identifica+por+%60email%60+\u0026amp;theme=39cc81ab97eb342751d1dec0\u0026amp;signature=beb9ab092eff96b2b261361d4636a69058121fe2f2d6f917cf5ef2df789792bf\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Sumar puntos a un cliente por una compra - Tienda de Puntos\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Acredita puntos de forma inmediata a partir del monto de una compra. Es el endpoint principal para integrar un POS o ERP. El cliente se identifica por email o dni. Si no existe, se crea automáticamente, salvo que se mande ignoreCreateClient: true. Idempotencia: mandá siempre external_id con el identificador de la venta en tu sistema (número de factura, id de ticket). Si llega un external_id que ya tiene una operación activa, la API responde 409 en vez de duplicar los puntos. Ese mismo external_id es el que se usa para cancelar la operación después. Sumar por ítems (pointItems): en vez del monto podés mandar los ids de los ítems de puntos del catálogo del comercio. Repetí el mismo id para cargar más de una unidad del ítem (tope de 100 ids). Si viene pointItems, el amount del body se ignora y el amount de la respuesta es la suma de los montos de los ítems; points.selectedRewardType pasa a items. Las bonificaciones de nivel y las reglas de puntos se siguen aplicando igual que en la suma por monto.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://tiendadepuntos.mintlify.site/_mintlify/api/og/v2?division=Puntos\u0026amp;title=Sumar+puntos+a+un+cliente+por+una+compra\u0026amp;description=Acredita+puntos+de+forma+inmediata+a+partir+del+monto+de+una+compra.+Es+el+endpoint+principal+para+integrar+un+POS+o+ERP.%0A%0AEl+cliente+se+identifica+por+%60email%60+\u0026amp;theme=39cc81ab97eb342751d1dec0\u0026amp;signature=beb9ab092eff96b2b261361d4636a69058121fe2f2d6f917cf5ef2df789792bf\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/tiendadepuntos/ZKpZ9fYtIWUbQCtI/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Tienda de Puntos\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#5b53f0\">\u003clink data-mint-head rel=\"canonical\" href=\"https://developers.tiendadepuntos.com/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://developers.tiendadepuntos.com/#organization\",\"name\":\"Tienda de Puntos\",\"url\":\"https://developers.tiendadepuntos.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/tiendadepuntos/WnSIFgAFSkI7bdnr/logo/light.png?fit=max\u0026auto=format\u0026n=WnSIFgAFSkI7bdnr\u0026q=85\u0026s=8187339b0bc9e96cfb1fede6be7db42f\"}},{\"@type\":\"WebSite\",\"@id\":\"https://developers.tiendadepuntos.com#website\",\"name\":\"Tienda de Puntos\",\"url\":\"https://developers.tiendadepuntos.com\",\"publisher\":{\"@id\":\"https://developers.tiendadepuntos.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://developers.tiendadepuntos.com/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra#webpage\",\"url\":\"https://developers.tiendadepuntos.com/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra\",\"name\":\"Sumar puntos a un cliente por una compra\",\"description\":\"Acredita puntos de forma inmediata a partir del monto de una compra. Es el endpoint principal para integrar un POS o ERP. El cliente se identifica por email o dni. Si no existe, se crea automáticamente, salvo que se mande ignoreCreateClient: true. Idempotencia: mandá siempre external_id con el identificador de la venta en tu sistema (número de factura, id de ticket). Si llega un external_id que ya tiene una operación activa, la API responde 409 en vez de duplicar los puntos. Ese mismo external_id es el que se usa para cancelar la operación después. Sumar por ítems (pointItems): en vez del monto podés mandar los ids de los ítems de puntos del catálogo del comercio. Repetí el mismo id para cargar más de una unidad del ítem (tope de 100 ids). Si viene pointItems, el amount del body se ignora y el amount de la respuesta es la suma de los montos de los ítems; points.selectedRewardType pasa a items. Las bonificaciones de nivel y las reglas de puntos se siguen aplicando igual que en la suma por monto.\",\"dateModified\":\"2026-10-04T04:06:03.844Z\",\"isPartOf\":{\"@id\":\"https://developers.tiendadepuntos.com#website\"},\"breadcrumb\":{\"@id\":\"https://developers.tiendadepuntos.com/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://developers.tiendadepuntos.com/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API · Endpoints\",\"item\":\"https://developers.tiendadepuntos.com/api-reference/endpoints/operadores/listar-operadores\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Puntos\",\"item\":\"https://developers.tiendadepuntos.com/api-reference/endpoints/puntos/crear-una-oferta-de-puntos-qr-o-email\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Sumar puntos a un cliente por una compra\",\"item\":\"https://developers.tiendadepuntos.com/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://developers.tiendadepuntos.com/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra#apireference\",\"headline\":\"Sumar puntos a un cliente por una compra\",\"name\":\"Sumar puntos a un cliente por una compra\",\"description\":\"Acredita puntos de forma inmediata a partir del monto de una compra. Es el endpoint principal para integrar un POS o ERP. El cliente se identifica por email o dni. Si no existe, se crea automáticamente, salvo que se mande ignoreCreateClient: true. Idempotencia: mandá siempre external_id con el identificador de la venta en tu sistema (número de factura, id de ticket). Si llega un external_id que ya tiene una operación activa, la API responde 409 en vez de duplicar los puntos. Ese mismo external_id es el que se usa para cancelar la operación después. Sumar por ítems (pointItems): en vez del monto podés mandar los ids de los ítems de puntos del catálogo del comercio. Repetí el mismo id para cargar más de una unidad del ítem (tope de 100 ids). Si viene pointItems, el amount del body se ignora y el amount de la respuesta es la suma de los montos de los ítems; points.selectedRewardType pasa a items. Las bonificaciones de nivel y las reglas de puntos se siguen aplicando igual que en la suma por monto.\",\"url\":\"https://developers.tiendadepuntos.com/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra\",\"mainEntityOfPage\":{\"@id\":\"https://developers.tiendadepuntos.com/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra#webpage\"},\"dateModified\":\"2026-10-04T04:06:03.844Z\",\"publisher\":{\"@id\":\"https://developers.tiendadepuntos.com/#organization\"},\"isPartOf\":{\"@id\":\"https://developers.tiendadepuntos.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Tienda de Puntos\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Tienda de Puntos\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra.md","siteName":"Tienda de Puntos","nav":{"global":null,"tabs":[{"tab":"Ayuda","pages":[{"title":"Ayuda","href":""}]},{"tab":"Documentación","groups":[{"group":"Guías del panel","pages":[{"title":"Documentación","href":"/documentacion"},{"title":"Primeros pasos","href":"/primeros-pasos"},{"title":"Pantallas principales","href":"/pantallas-principales"}]},{"group":"API · Empezar","pages":[{"title":"Introducción a la API","href":"/api-reference/introduccion"},{"title":"Autenticación","href":"/api-reference/autenticacion"},{"title":"Integrar tu punto de venta","href":"/api-reference/quickstart"},{"title":"Administrar el programa","href":"/api-reference/administracion"},{"title":"Errores y límites","href":"/api-reference/errores"}]},{"group":"API · Endpoints","pages":[{"group":"Operadores","pages":[{"title":"Listar operadores","deprecated":null,"version":null,"sidebarTitle":"Listar operadores","openapi":"/api-reference/openapi.json get /external/operators","href":"/api-reference/endpoints/operadores/listar-operadores"},{"title":"Crear un operador","deprecated":null,"version":null,"sidebarTitle":"Crear un operador","openapi":"/api-reference/openapi.json post /external/operators","href":"/api-reference/endpoints/operadores/crear-un-operador"},{"title":"Obtener un operador","deprecated":null,"version":null,"sidebarTitle":"Obtener un operador","openapi":"/api-reference/openapi.json get /external/operators/{id}","href":"/api-reference/endpoints/operadores/obtener-un-operador"},{"title":"Actualizar un operador","deprecated":null,"version":null,"sidebarTitle":"Actualizar un operador","openapi":"/api-reference/openapi.json put /external/operators/{id}","href":"/api-reference/endpoints/operadores/actualizar-un-operador"},{"title":"Eliminar un operador","deprecated":null,"version":null,"sidebarTitle":"Eliminar un operador","openapi":"/api-reference/openapi.json delete /external/operators/{id}","href":"/api-reference/endpoints/operadores/eliminar-un-operador"}]},{"group":"Clientes","pages":[{"title":"Listar clientes","deprecated":null,"version":null,"sidebarTitle":"Listar clientes","openapi":"/api-reference/openapi.json get /external/clients","href":"/api-reference/endpoints/clientes/listar-clientes"},{"title":"Crear un cliente","deprecated":null,"version":null,"sidebarTitle":"Crear un cliente","openapi":"/api-reference/openapi.json post /external/clients","href":"/api-reference/endpoints/clientes/crear-un-cliente"},{"title":"Buscar un cliente por email o documento","deprecated":null,"version":null,"sidebarTitle":"Buscar un cliente por email o documento","openapi":"/api-reference/openapi.json get /external/clients/search","href":"/api-reference/endpoints/clientes/buscar-un-cliente-por-email-o-documento"},{"title":"Actualizar un cliente","deprecated":null,"version":null,"sidebarTitle":"Actualizar un cliente","openapi":"/api-reference/openapi.json put /external/clients/{id}","href":"/api-reference/endpoints/clientes/actualizar-un-cliente"},{"title":"Eliminar un cliente","deprecated":null,"version":null,"sidebarTitle":"Eliminar un cliente","openapi":"/api-reference/openapi.json delete /external/clients/{id}","href":"/api-reference/endpoints/clientes/eliminar-un-cliente"},{"title":"Cambiar el estado de un cliente","deprecated":null,"version":null,"sidebarTitle":"Cambiar el estado de un cliente","openapi":"/api-reference/openapi.json put /external/clients/{id}/status","href":"/api-reference/endpoints/clientes/cambiar-el-estado-de-un-cliente"}]},{"group":"Sucursales","pages":[{"title":"Listar sucursales","deprecated":null,"version":null,"sidebarTitle":"Listar sucursales","openapi":"/api-reference/openapi.json get /external/branch","href":"/api-reference/endpoints/sucursales/listar-sucursales"},{"title":"Obtener una sucursal","deprecated":null,"version":null,"sidebarTitle":"Obtener una sucursal","openapi":"/api-reference/openapi.json get /external/branch/{id}","href":"/api-reference/endpoints/sucursales/obtener-una-sucursal"}]},{"group":"Premios","pages":[{"title":"Listar premios","deprecated":null,"version":null,"sidebarTitle":"Listar premios","openapi":"/api-reference/openapi.json get /external/products","href":"/api-reference/endpoints/premios/listar-premios"},{"title":"Crear un premio","deprecated":null,"version":null,"sidebarTitle":"Crear un premio","openapi":"/api-reference/openapi.json post /external/products","href":"/api-reference/endpoints/premios/crear-un-premio"},{"title":"Obtener un premio","deprecated":null,"version":null,"sidebarTitle":"Obtener un premio","openapi":"/api-reference/openapi.json get /external/products/{id}","href":"/api-reference/endpoints/premios/obtener-un-premio"},{"title":"Actualizar un premio","deprecated":null,"version":null,"sidebarTitle":"Actualizar un premio","openapi":"/api-reference/openapi.json put /external/products/{id}","href":"/api-reference/endpoints/premios/actualizar-un-premio"},{"title":"Eliminar un premio","deprecated":null,"version":null,"sidebarTitle":"Eliminar un premio","openapi":"/api-reference/openapi.json delete /external/products/{id}","href":"/api-reference/endpoints/premios/eliminar-un-premio"}]},{"group":"Niveles","pages":[{"title":"Listar niveles","deprecated":null,"version":null,"sidebarTitle":"Listar niveles","openapi":"/api-reference/openapi.json get /external/levels","href":"/api-reference/endpoints/niveles/listar-niveles"},{"title":"Crear un nivel","deprecated":null,"version":null,"sidebarTitle":"Crear un nivel","openapi":"/api-reference/openapi.json post /external/levels","href":"/api-reference/endpoints/niveles/crear-un-nivel"},{"title":"Obtener un nivel","deprecated":null,"version":null,"sidebarTitle":"Obtener un nivel","openapi":"/api-reference/openapi.json get /external/levels/{id}","href":"/api-reference/endpoints/niveles/obtener-un-nivel"},{"title":"Actualizar un nivel","deprecated":null,"version":null,"sidebarTitle":"Actualizar un nivel","openapi":"/api-reference/openapi.json put /external/levels/{id}","href":"/api-reference/endpoints/niveles/actualizar-un-nivel"},{"title":"Eliminar un nivel","deprecated":null,"version":null,"sidebarTitle":"Eliminar un nivel","openapi":"/api-reference/openapi.json delete /external/levels/{id}","href":"/api-reference/endpoints/niveles/eliminar-un-nivel"}]},{"group":"Puntos","pages":[{"title":"Crear una oferta de puntos (QR o email)","deprecated":null,"version":null,"sidebarTitle":"Crear una oferta de puntos (QR o email)","openapi":"/api-reference/openapi.json post /external/tags","href":"/api-reference/endpoints/puntos/crear-una-oferta-de-puntos-qr-o-email"},{"title":"Actualizar el monto de una oferta QR","description":"Cambia el monto en pesos de una oferta QR ya creada y la deja en estado activo. Se usa típicamente en QR variables de caja, donde el mismo QR se reutiliza y se le actualiza el importe en cada venta.","deprecated":null,"version":null,"sidebarTitle":"Actualizar el monto de una oferta QR","openapi":"/api-reference/openapi.json put /external/tags/{id}","href":"/api-reference/endpoints/puntos/actualizar-el-monto-de-una-oferta-qr"},{"title":"Sumar puntos a un cliente por una compra","deprecated":null,"version":null,"sidebarTitle":"Sumar puntos a un cliente por una compra","openapi":"/api-reference/openapi.json post /external/tags/add","href":"/api-reference/endpoints/puntos/sumar-puntos-a-un-cliente-por-una-compra"},{"title":"Simular una suma de puntos","description":"Devuelve cuántos puntos se acreditarían, con el desglose, **sin acreditar nada**. Sirve para mostrarle al cliente lo que va a sumar antes de cerrar la venta.\n\nMandá **uno** de estos tres: `amount` (monto de la compra), `initialPointsToGive` (puntos directos) o `pointItems` (ítems de puntos con sus cantidades, cuyos IDs salen de `GET /external/point-items`).\n\nA diferencia de `POST /external/tags/add`, el cliente se identifica por `clientId` y tiene que existir: previsualizar no da de alta a nadie.\n\n**No reserva nada.** El resultado es el de este momento: si cambian las bonificaciones, el nivel del cliente o el catálogo de ítems, la suma real puede dar distinto. Mandá el mismo `branch_id` que vas a usar después, porque hay bonificaciones por sucursal.\n\n**Cómo pasar de la simulación a la suma real**: `POST /external/tags/add` acepta `amount` o `pointItems`, pero con otro formato: allá `pointItems` es un array de ids donde la cantidad se expresa repitiendo el id (`[{ \"id\": 12, \"quantity\": 2 }]` acá equivale a `[12, 12]` allá). La suma real no acepta `initialPointsToGive`: si simulás por ese modo, no hay una acreditación equivalente por esta API.","deprecated":null,"version":null,"sidebarTitle":"Simular una suma de puntos","openapi":"/api-reference/openapi.json post /external/tags/add/preview","href":"/api-reference/endpoints/puntos/simular-una-suma-de-puntos"},{"title":"Cancelar una suma de puntos","deprecated":null,"version":null,"sidebarTitle":"Cancelar una suma de puntos","openapi":"/api-reference/openapi.json put /external/tags/cancel/{externalId}","href":"/api-reference/endpoints/puntos/cancelar-una-suma-de-puntos"}]},{"group":"Códigos de validación","pages":[{"title":"Listar QRs con código de validación","deprecated":null,"version":null,"sidebarTitle":"Listar QRs con código de validación","openapi":"/api-reference/openapi.json get /external/validation-code/qrs","href":"/api-reference/endpoints/codigos-de-validacion/listar-qrs-con-codigo-de-validacion"},{"title":"Obtener el código vigente de un QR","deprecated":null,"version":null,"sidebarTitle":"Obtener el código vigente de un QR","openapi":"/api-reference/openapi.json get /external/validation-code/{qrId}/current","href":"/api-reference/endpoints/codigos-de-validacion/obtener-el-codigo-vigente-de-un-qr"},{"title":"Validar el código ingresado por el cliente","deprecated":null,"version":null,"sidebarTitle":"Validar el código ingresado por el cliente","openapi":"/api-reference/openapi.json post /external/validation-code/{qrId}/validate","href":"/api-reference/endpoints/codigos-de-validacion/validar-el-codigo-ingresado-por-el-cliente"}]},{"group":"Ítems de puntos","pages":[{"title":"Listar ítems de puntos","deprecated":null,"version":null,"sidebarTitle":"Listar ítems de puntos","openapi":"/api-reference/openapi.json get /external/point-items","href":"/api-reference/endpoints/items-de-puntos/listar-items-de-puntos"},{"title":"Crear un ítem de puntos","deprecated":null,"version":null,"sidebarTitle":"Crear un ítem de puntos","openapi":"/api-reference/openapi.json post /external/point-items","href":"/api-reference/endpoints/items-de-puntos/crear-un-item-de-puntos"},{"title":"Obtener un ítem de puntos","deprecated":null,"version":null,"sidebarTitle":"Obtener un ítem de puntos","openapi":"/api-reference/openapi.json get /external/point-items/{id}","href":"/api-reference/endpoints/items-de-puntos/obtener-un-item-de-puntos"},{"title":"Actualizar un ítem de puntos","deprecated":null,"version":null,"sidebarTitle":"Actualizar un ítem de puntos","openapi":"/api-reference/openapi.json put /external/point-items/{id}","href":"/api-reference/endpoints/items-de-puntos/actualizar-un-item-de-puntos"},{"title":"Eliminar un ítem de puntos","deprecated":null,"version":null,"sidebarTitle":"Eliminar un ítem de puntos","openapi":"/api-reference/openapi.json delete /external/point-items/{id}","href":"/api-reference/endpoints/items-de-puntos/eliminar-un-item-de-puntos"}]},{"group":"Canjes","pages":[{"title":"Listar canjes","deprecated":null,"version":null,"sidebarTitle":"Listar canjes","openapi":"/api-reference/openapi.json get /external/purchase","href":"/api-reference/endpoints/canjes/listar-canjes"},{"title":"Entregar un canje","deprecated":null,"version":null,"sidebarTitle":"Entregar un canje","openapi":"/api-reference/openapi.json post /external/purchase/redeem/{code}","href":"/api-reference/endpoints/canjes/entregar-un-canje"},{"title":"Consultar un canje por código","deprecated":null,"version":null,"sidebarTitle":"Consultar un canje por código","openapi":"/api-reference/openapi.json get /external/purchase/code/{code}","href":"/api-reference/endpoints/canjes/consultar-un-canje-por-codigo"},{"title":"Canjear un premio","deprecated":null,"version":null,"sidebarTitle":"Canjear un premio","openapi":"/api-reference/openapi.json post /external/exchange/product","href":"/api-reference/endpoints/canjes/canjear-un-premio"},{"title":"Canjear puntos por dinero","deprecated":null,"version":null,"sidebarTitle":"Canjear puntos por dinero","openapi":"/api-reference/openapi.json post /external/exchange/money","href":"/api-reference/endpoints/canjes/canjear-puntos-por-dinero"}]}]}]},{"tab":"Integraciones","pages":[{"title":"Integraciones","href":"/integraciones"}]},{"tab":"Blog","href":"https://www.tiendadepuntos.com/blog"}]},"basePath":"","title":"Sumar puntos a un cliente por una compra - Tienda de Puntos","buildId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","deploymentId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CDiBsYGW.js","utils-KF9rPlmF.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-C26urKTX.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BdjmJAC1.js","snippetPresets-3IpDBjt3.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-D4x_2vvo.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BIWdc5Pa.js","shallow-LQqfiMNd.js","getApiPlaygroundDisplay-DryzlOZG.js","CodeSnippet-tcJujU4r.js","CodeSnippets-BHp0nVLL.js","Page-1CZdsdAn.js","getPastedJson-DU-1ayUv.js","icon-CZK2hPr4.js","MethodPill-DOaqmTFC.js","DuplicateIcon-B5-nUxxl.js","createIcon-CDP_U77G.js","DynamicMarkdown-GHvayGOn.js","SectionHeading-BYvpkmUD.js","axios-vUo_bRtp.js","Markdown-uxhlayGT.js","clsx-B35qUV0p.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BvrGG8gU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-CAf0yVYe.js"]}