curl --request POST \
--url https://api.v3.mozarth.com/public/v1/portfolios/{id}/imports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"columnMapping": [
{
"sourceColumn": "documento",
"targetField": "debtor_document_number"
},
{
"sourceColumn": "nombre",
"targetField": "debtor_first_name"
},
{
"sourceColumn": "columna_interna",
"targetField": null
}
],
"conflictResolution": "update",
"s3Key": "imports/apikey:org-1/1700000000000_cartera-enero-2026.csv"
}
'import requests
url = "https://api.v3.mozarth.com/public/v1/portfolios/{id}/imports"
payload = {
"columnMapping": [
{
"sourceColumn": "documento",
"targetField": "debtor_document_number"
},
{
"sourceColumn": "nombre",
"targetField": "debtor_first_name"
},
{
"sourceColumn": "columna_interna",
"targetField": None
}
],
"conflictResolution": "update",
"s3Key": "imports/apikey:org-1/1700000000000_cartera-enero-2026.csv"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
columnMapping: [
{sourceColumn: 'documento', targetField: 'debtor_document_number'},
{sourceColumn: 'nombre', targetField: 'debtor_first_name'},
{sourceColumn: 'columna_interna', targetField: null}
],
conflictResolution: 'update',
s3Key: 'imports/apikey:org-1/1700000000000_cartera-enero-2026.csv'
})
};
fetch('https://api.v3.mozarth.com/public/v1/portfolios/{id}/imports', 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.v3.mozarth.com/public/v1/portfolios/{id}/imports",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'columnMapping' => [
[
'sourceColumn' => 'documento',
'targetField' => 'debtor_document_number'
],
[
'sourceColumn' => 'nombre',
'targetField' => 'debtor_first_name'
],
[
'sourceColumn' => 'columna_interna',
'targetField' => null
]
],
'conflictResolution' => 'update',
's3Key' => 'imports/apikey:org-1/1700000000000_cartera-enero-2026.csv'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.v3.mozarth.com/public/v1/portfolios/{id}/imports"
payload := strings.NewReader("{\n \"columnMapping\": [\n {\n \"sourceColumn\": \"documento\",\n \"targetField\": \"debtor_document_number\"\n },\n {\n \"sourceColumn\": \"nombre\",\n \"targetField\": \"debtor_first_name\"\n },\n {\n \"sourceColumn\": \"columna_interna\",\n \"targetField\": null\n }\n ],\n \"conflictResolution\": \"update\",\n \"s3Key\": \"imports/apikey:org-1/1700000000000_cartera-enero-2026.csv\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.post("https://api.v3.mozarth.com/public/v1/portfolios/{id}/imports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"columnMapping\": [\n {\n \"sourceColumn\": \"documento\",\n \"targetField\": \"debtor_document_number\"\n },\n {\n \"sourceColumn\": \"nombre\",\n \"targetField\": \"debtor_first_name\"\n },\n {\n \"sourceColumn\": \"columna_interna\",\n \"targetField\": null\n }\n ],\n \"conflictResolution\": \"update\",\n \"s3Key\": \"imports/apikey:org-1/1700000000000_cartera-enero-2026.csv\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.v3.mozarth.com/public/v1/portfolios/{id}/imports")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"columnMapping\": [\n {\n \"sourceColumn\": \"documento\",\n \"targetField\": \"debtor_document_number\"\n },\n {\n \"sourceColumn\": \"nombre\",\n \"targetField\": \"debtor_first_name\"\n },\n {\n \"sourceColumn\": \"columna_interna\",\n \"targetField\": null\n }\n ],\n \"conflictResolution\": \"update\",\n \"s3Key\": \"imports/apikey:org-1/1700000000000_cartera-enero-2026.csv\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"created": 123,
"createdAt": "2023-11-07T05:31:56Z",
"errorDetails": [
"<string>"
],
"errors": 123,
"id": "<string>",
"portfolioId": "<string>",
"processedRows": 123,
"status": "queued",
"totalRows": 123,
"updated": 123,
"updatedAt": "2023-11-07T05:31:56Z"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>",
"requestId": "<string>",
"issues": [
{
"message": "<string>",
"path": "<string>"
}
]
}
}Encolar la importación de un CSV ya subido a S3
Encola el procesamiento del CSV ya subido en el paso anterior (upload-url). Responde 202: el import corre asíncrono y se consulta con GET /v1/imports/{id}.
debt_external_id se respeta tal cual viene en el archivo — nunca se fabrica un valor.
conflictResolution (opcional, add si se omite):
add: crea siempre, sin matchear (duplica el set completo en cada corrida).update: matchea deudor por documento y cada deuda pordebt_external_id, y actualiza en el lugar.reconcile: comoupdate, y además marcapaidtoda deuda viva conexternal_idque el archivo ya no trae.replace: borra la cartera entera (soft-delete) y la crea de cero — el único modo destructivo.
Idempotencia: la cabecera Idempotency-Key (opcional, 1 a 255 caracteres) protege contra encolar dos veces la misma carga por un reintento. Reintentar la MISMA request con la misma clave devuelve el mismo import, con la cabecera Idempotent-Replayed: true, sin encolar otro. La misma clave usada con otro cuerpo o contra otra cartera responde 409 idempotency_conflict. Sin la cabecera, cada request encola un import nuevo.
Guía completa: /integracion/carga-de-cartera.
curl --request POST \
--url https://api.v3.mozarth.com/public/v1/portfolios/{id}/imports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"columnMapping": [
{
"sourceColumn": "documento",
"targetField": "debtor_document_number"
},
{
"sourceColumn": "nombre",
"targetField": "debtor_first_name"
},
{
"sourceColumn": "columna_interna",
"targetField": null
}
],
"conflictResolution": "update",
"s3Key": "imports/apikey:org-1/1700000000000_cartera-enero-2026.csv"
}
'import requests
url = "https://api.v3.mozarth.com/public/v1/portfolios/{id}/imports"
payload = {
"columnMapping": [
{
"sourceColumn": "documento",
"targetField": "debtor_document_number"
},
{
"sourceColumn": "nombre",
"targetField": "debtor_first_name"
},
{
"sourceColumn": "columna_interna",
"targetField": None
}
],
"conflictResolution": "update",
"s3Key": "imports/apikey:org-1/1700000000000_cartera-enero-2026.csv"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
columnMapping: [
{sourceColumn: 'documento', targetField: 'debtor_document_number'},
{sourceColumn: 'nombre', targetField: 'debtor_first_name'},
{sourceColumn: 'columna_interna', targetField: null}
],
conflictResolution: 'update',
s3Key: 'imports/apikey:org-1/1700000000000_cartera-enero-2026.csv'
})
};
fetch('https://api.v3.mozarth.com/public/v1/portfolios/{id}/imports', 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.v3.mozarth.com/public/v1/portfolios/{id}/imports",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'columnMapping' => [
[
'sourceColumn' => 'documento',
'targetField' => 'debtor_document_number'
],
[
'sourceColumn' => 'nombre',
'targetField' => 'debtor_first_name'
],
[
'sourceColumn' => 'columna_interna',
'targetField' => null
]
],
'conflictResolution' => 'update',
's3Key' => 'imports/apikey:org-1/1700000000000_cartera-enero-2026.csv'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.v3.mozarth.com/public/v1/portfolios/{id}/imports"
payload := strings.NewReader("{\n \"columnMapping\": [\n {\n \"sourceColumn\": \"documento\",\n \"targetField\": \"debtor_document_number\"\n },\n {\n \"sourceColumn\": \"nombre\",\n \"targetField\": \"debtor_first_name\"\n },\n {\n \"sourceColumn\": \"columna_interna\",\n \"targetField\": null\n }\n ],\n \"conflictResolution\": \"update\",\n \"s3Key\": \"imports/apikey:org-1/1700000000000_cartera-enero-2026.csv\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.post("https://api.v3.mozarth.com/public/v1/portfolios/{id}/imports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"columnMapping\": [\n {\n \"sourceColumn\": \"documento\",\n \"targetField\": \"debtor_document_number\"\n },\n {\n \"sourceColumn\": \"nombre\",\n \"targetField\": \"debtor_first_name\"\n },\n {\n \"sourceColumn\": \"columna_interna\",\n \"targetField\": null\n }\n ],\n \"conflictResolution\": \"update\",\n \"s3Key\": \"imports/apikey:org-1/1700000000000_cartera-enero-2026.csv\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.v3.mozarth.com/public/v1/portfolios/{id}/imports")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"columnMapping\": [\n {\n \"sourceColumn\": \"documento\",\n \"targetField\": \"debtor_document_number\"\n },\n {\n \"sourceColumn\": \"nombre\",\n \"targetField\": \"debtor_first_name\"\n },\n {\n \"sourceColumn\": \"columna_interna\",\n \"targetField\": null\n }\n ],\n \"conflictResolution\": \"update\",\n \"s3Key\": \"imports/apikey:org-1/1700000000000_cartera-enero-2026.csv\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"created": 123,
"createdAt": "2023-11-07T05:31:56Z",
"errorDetails": [
"<string>"
],
"errors": 123,
"id": "<string>",
"portfolioId": "<string>",
"processedRows": 123,
"status": "queued",
"totalRows": 123,
"updated": 123,
"updatedAt": "2023-11-07T05:31:56Z"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>",
"requestId": "<string>",
"issues": [
{
"message": "<string>",
"path": "<string>"
}
]
}
}Autorizaciones
Clave de API de tu organización en el header Authorization: Bearer <clave>. Las claves empiezan con moz_ y las emite un superadmin desde el Admin.
Encabezados
Clave de idempotencia de transporte, opcional, hasta 255 caracteres. Reintentar la misma request con la misma clave devuelve la misma respuesta 202 (el mismo import) sin encolar otro, por 24 h.
255Parámetros de ruta
Cuerpo
La misma clave S3 que devolvió upload-url en el paso anterior. No se acepta una clave inventada por el cliente.
1Mapea cada encabezado del CSV (sourceColumn) a un campo canónico del importador (targetField). targetField: null descarta esa columna del archivo.
Show child attributes
Show child attributes
add, replace, update, reconcile Respuesta
Response for status 202
Show child attributes
Show child attributes