curl --request PUT \
--url https://api.tiendadepuntos.com/external/clients/{id} \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"firstName": "Juan Manuel",
"lastName": "Pérez",
"email": "juanma@mailinator.com",
"documentNumber": "40100800",
"documentType": "DNI",
"phone": "+541164593678",
"birthday": "1990-01-01",
"gender": 3,
"affiliateCard": "00012345",
"description": "Alta desde el POS de la sucursal Centro.",
"tagIds": [
4
]
}
'import requests
url = "https://api.tiendadepuntos.com/external/clients/{id}"
payload = {
"firstName": "Juan Manuel",
"lastName": "Pérez",
"email": "juanma@mailinator.com",
"documentNumber": "40100800",
"documentType": "DNI",
"phone": "+541164593678",
"birthday": "1990-01-01",
"gender": 3,
"affiliateCard": "00012345",
"description": "Alta desde el POS de la sucursal Centro.",
"tagIds": [4]
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
firstName: 'Juan Manuel',
lastName: 'Pérez',
email: 'juanma@mailinator.com',
documentNumber: '40100800',
documentType: 'DNI',
phone: '+541164593678',
birthday: '1990-01-01',
gender: 3,
affiliateCard: '00012345',
description: 'Alta desde el POS de la sucursal Centro.',
tagIds: [4]
})
};
fetch('https://api.tiendadepuntos.com/external/clients/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tiendadepuntos.com/external/clients/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'firstName' => 'Juan Manuel',
'lastName' => 'Pérez',
'email' => 'juanma@mailinator.com',
'documentNumber' => '40100800',
'documentType' => 'DNI',
'phone' => '+541164593678',
'birthday' => '1990-01-01',
'gender' => 3,
'affiliateCard' => '00012345',
'description' => 'Alta desde el POS de la sucursal Centro.',
'tagIds' => [
4
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.tiendadepuntos.com/external/clients/{id}"
payload := strings.NewReader("{\n \"firstName\": \"Juan Manuel\",\n \"lastName\": \"Pérez\",\n \"email\": \"juanma@mailinator.com\",\n \"documentNumber\": \"40100800\",\n \"documentType\": \"DNI\",\n \"phone\": \"+541164593678\",\n \"birthday\": \"1990-01-01\",\n \"gender\": 3,\n \"affiliateCard\": \"00012345\",\n \"description\": \"Alta desde el POS de la sucursal Centro.\",\n \"tagIds\": [\n 4\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.tiendadepuntos.com/external/clients/{id}")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"Juan Manuel\",\n \"lastName\": \"Pérez\",\n \"email\": \"juanma@mailinator.com\",\n \"documentNumber\": \"40100800\",\n \"documentType\": \"DNI\",\n \"phone\": \"+541164593678\",\n \"birthday\": \"1990-01-01\",\n \"gender\": 3,\n \"affiliateCard\": \"00012345\",\n \"description\": \"Alta desde el POS de la sucursal Centro.\",\n \"tagIds\": [\n 4\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tiendadepuntos.com/external/clients/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"firstName\": \"Juan Manuel\",\n \"lastName\": \"Pérez\",\n \"email\": \"juanma@mailinator.com\",\n \"documentNumber\": \"40100800\",\n \"documentType\": \"DNI\",\n \"phone\": \"+541164593678\",\n \"birthday\": \"1990-01-01\",\n \"gender\": 3,\n \"affiliateCard\": \"00012345\",\n \"description\": \"Alta desde el POS de la sucursal Centro.\",\n \"tagIds\": [\n 4\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"status": 200,
"message": "Request was successful",
"data": {
"id": 84213,
"name": "Juan Manuel Pérez",
"first_name": "Juan Manuel",
"last_name": "Pérez",
"email": "juanma@mailinator.com",
"dni": "40100800",
"document_number": "40100800",
"document_type": "DNI",
"phone": "+541164593678",
"gender": 0,
"affiliate_card": "00012345",
"score": 1250,
"total_score": 8400,
"description": null,
"birthday": "1990-01-01T00:00:00.000Z",
"status": "ACTIVE",
"created_at": "2026-02-14T12:30:00.000Z",
"last_transaction": "2026-07-28T18:05:00.000Z",
"purchases_counter": 7,
"reads_counter": 32,
"level": {
"id": 3,
"name": "Nivel 2"
}
}
}{
"statusCode": 400,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "Error de validación",
"errors": [
{}
],
"data": {}
}{
"statusCode": 404,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "Api Key is required",
"errors": [
{}
],
"data": {}
}{
"statusCode": 409,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "El email juanma@mailinator.com ya está registrado para este comercio.",
"errors": [
{}
],
"data": {}
}Actualizar un cliente
Actualiza los datos de un cliente. Es incremental: los campos que no mandes quedan como están.
El email no se puede cambiar si el cliente ya ingresó al menos una vez a la plataforma. Cambiar el email o el documento por uno que ya usa otro cliente del comercio devuelve 409.
curl --request PUT \
--url https://api.tiendadepuntos.com/external/clients/{id} \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"firstName": "Juan Manuel",
"lastName": "Pérez",
"email": "juanma@mailinator.com",
"documentNumber": "40100800",
"documentType": "DNI",
"phone": "+541164593678",
"birthday": "1990-01-01",
"gender": 3,
"affiliateCard": "00012345",
"description": "Alta desde el POS de la sucursal Centro.",
"tagIds": [
4
]
}
'import requests
url = "https://api.tiendadepuntos.com/external/clients/{id}"
payload = {
"firstName": "Juan Manuel",
"lastName": "Pérez",
"email": "juanma@mailinator.com",
"documentNumber": "40100800",
"documentType": "DNI",
"phone": "+541164593678",
"birthday": "1990-01-01",
"gender": 3,
"affiliateCard": "00012345",
"description": "Alta desde el POS de la sucursal Centro.",
"tagIds": [4]
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
firstName: 'Juan Manuel',
lastName: 'Pérez',
email: 'juanma@mailinator.com',
documentNumber: '40100800',
documentType: 'DNI',
phone: '+541164593678',
birthday: '1990-01-01',
gender: 3,
affiliateCard: '00012345',
description: 'Alta desde el POS de la sucursal Centro.',
tagIds: [4]
})
};
fetch('https://api.tiendadepuntos.com/external/clients/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tiendadepuntos.com/external/clients/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'firstName' => 'Juan Manuel',
'lastName' => 'Pérez',
'email' => 'juanma@mailinator.com',
'documentNumber' => '40100800',
'documentType' => 'DNI',
'phone' => '+541164593678',
'birthday' => '1990-01-01',
'gender' => 3,
'affiliateCard' => '00012345',
'description' => 'Alta desde el POS de la sucursal Centro.',
'tagIds' => [
4
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.tiendadepuntos.com/external/clients/{id}"
payload := strings.NewReader("{\n \"firstName\": \"Juan Manuel\",\n \"lastName\": \"Pérez\",\n \"email\": \"juanma@mailinator.com\",\n \"documentNumber\": \"40100800\",\n \"documentType\": \"DNI\",\n \"phone\": \"+541164593678\",\n \"birthday\": \"1990-01-01\",\n \"gender\": 3,\n \"affiliateCard\": \"00012345\",\n \"description\": \"Alta desde el POS de la sucursal Centro.\",\n \"tagIds\": [\n 4\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.tiendadepuntos.com/external/clients/{id}")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"Juan Manuel\",\n \"lastName\": \"Pérez\",\n \"email\": \"juanma@mailinator.com\",\n \"documentNumber\": \"40100800\",\n \"documentType\": \"DNI\",\n \"phone\": \"+541164593678\",\n \"birthday\": \"1990-01-01\",\n \"gender\": 3,\n \"affiliateCard\": \"00012345\",\n \"description\": \"Alta desde el POS de la sucursal Centro.\",\n \"tagIds\": [\n 4\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tiendadepuntos.com/external/clients/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"firstName\": \"Juan Manuel\",\n \"lastName\": \"Pérez\",\n \"email\": \"juanma@mailinator.com\",\n \"documentNumber\": \"40100800\",\n \"documentType\": \"DNI\",\n \"phone\": \"+541164593678\",\n \"birthday\": \"1990-01-01\",\n \"gender\": 3,\n \"affiliateCard\": \"00012345\",\n \"description\": \"Alta desde el POS de la sucursal Centro.\",\n \"tagIds\": [\n 4\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"status": 200,
"message": "Request was successful",
"data": {
"id": 84213,
"name": "Juan Manuel Pérez",
"first_name": "Juan Manuel",
"last_name": "Pérez",
"email": "juanma@mailinator.com",
"dni": "40100800",
"document_number": "40100800",
"document_type": "DNI",
"phone": "+541164593678",
"gender": 0,
"affiliate_card": "00012345",
"score": 1250,
"total_score": 8400,
"description": null,
"birthday": "1990-01-01T00:00:00.000Z",
"status": "ACTIVE",
"created_at": "2026-02-14T12:30:00.000Z",
"last_transaction": "2026-07-28T18:05:00.000Z",
"purchases_counter": 7,
"reads_counter": 32,
"level": {
"id": 3,
"name": "Nivel 2"
}
}
}{
"statusCode": 400,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "Error de validación",
"errors": [
{}
],
"data": {}
}{
"statusCode": 404,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "Api Key is required",
"errors": [
{}
],
"data": {}
}{
"statusCode": 409,
"timestamp": "2026-07-31T14:05:12.431Z",
"path": "/external/tags/add",
"method": "POST",
"message": "El email juanma@mailinator.com ya está registrado para este comercio.",
"errors": [
{}
],
"data": {}
}Authorizations
API key del comercio. Se genera desde el panel de Tienda de Puntos, en Configuración → Integraciones.
Path Parameters
ID del cliente en Tienda de Puntos.
84213
Body
Nombre del cliente.
"Juan Manuel"
Apellido del cliente.
"Pérez"
Email del cliente. Obligatorio si no mandás documentNumber.
"juanma@mailinator.com"
Número de documento. Obligatorio si no mandás email.
"40100800"
Tipo de documento. Si se omite, se infiere por el país del comercio. Usá PASSPORT para documentos extranjeros alfanuméricos.
"DNI"
Teléfono del cliente.
"+541164593678"
Fecha de nacimiento en ISO 8601. Si el comercio tiene una edad mínima configurada, se valida contra ella.
"1990-01-01"
Género. 0 = masculino, 1 = femenino, 2 = otro, 3 = sin datos.
0, 1, 2, 3 3
Número de tarjeta de afiliado. Tiene que ser único dentro del comercio.
"00012345"
Observaciones internas del comercio sobre el cliente.
"Alta desde el POS de la sucursal Centro."
IDs de las etiquetas del comercio que se le asignan al cliente.
[4]

