Documentación API

API Pública de Sourced v1

La API de Sourced permite que los sistemas ERP (como Calipso, SAP, JD Edwards) se integren directamente con la plataforma de compras de Sourced. Úsala para:

  • Enviar requisiciones de compra desde tu ERP a Sourced
  • Obtener órdenes de compra de vuelta en tu ERP una vez adjudicadas
  • Verificar qué requisiciones ya fueron sincronizadas
  • Monitorear el estado de tus requisiciones

La API sigue las convenciones REST, utiliza JSON para los cuerpos de solicitud y respuesta, y se autentica mediante API keys.

Autenticación

Todos los endpoints (excepto health check) requieren una API key enviada en el header .

Las API keys se crean en el panel de administración de Sourced en . Cada key se muestra solo una vez al crearla. Guardala de forma segura.

Ejemplo: Solicitud autenticada
curl -H "X-API-Key: sk_live_abc123..." \
  https://api.gosourced.ai/api/v1/requisitions
Seguridad: Tratá tu API key como una contraseña. No la expongas en código del lado del cliente, repositorios públicos o logs. Si se compromete, revocala inmediatamente desde el panel de administración y creá una nueva.

URL Base

AmbienteURL Base
Producciónhttps://api.gosourced.ai
Desarrollohttps://api-dev.gosourced.ai

Todos los endpoints tienen el prefijo .

Límites de tasa

Todos los endpoints están limitados a por endpoint. Exceder este límite devuelve una respuesta .

Para operaciones masivas, usá el endpoint de importación por lotes () que acepta hasta 100 requisiciones por solicitud.

Errores

La API utiliza códigos de estado HTTP estándar. Los errores devuelven un cuerpo JSON con un campo .

Formato de respuesta de error
{
  "detail": "Invalid or revoked API key."
}
EstadoSignificado
200Éxito
400Solicitud inválida — error de validación o cuerpo malformado
401No autorizado — API key faltante o inválida
404No encontrado — el recurso no existe o no es accesible
422Entidad no procesable — el cuerpo de la solicitud no pasó la validación del esquema
429Demasiadas solicitudes — límite de tasa excedido
500Error interno del servidor — error inesperado de nuestro lado

Ejemplos de errores

401 — API key inválida
{
  "detail": "Invalid or revoked API key."
}
422 — Error de validación (ej: campo requerido faltante)
{
  "detail": [
    {
      "loc": ["body", "requisitions", 0, "items", 0, "quantity"],
      "msg": "Input should be greater than 0",
      "type": "greater_than"
    }
  ]
}
200 — Éxito parcial (algunas requisiciones fallaron)
{
  "success": false,
  "created_count": 2,
  "updated_count": 0,
  "skipped_count": 0,
  "error_count": 1,
  "errors": [
    {
      "index": 2,
      "external_id": "REQ-2026-0099",
      "error": "Failed to process requisition: duplicate external_line_id within items"
    }
  ],
  "requisition_ids": [1234, 1235]
}

Nota: el endpoint devuelve incluso con fallos parciales. Siempre verificá el campo y el array para detectar problemas por requisición.

Health Check

GET/api/v1/health

Verificar que la API esté accesible. No requiere autenticación.

Solicitud
curl https://api.gosourced.ai/api/v1/health
Respuesta — 200 OK
{
  "status": "ok",
  "api": "v1"
}

Importar requisiciones

POST/api/v1/requisitionsAPI Key requerida

Importar una o más requisiciones de compra desde tu ERP. Soporta importación por lotes de hasta 100 requisiciones por solicitud. Usa external_id para deduplicación.

Cuerpo de la solicitud

El cuerpo debe contener un array con 1 a 100 objetos de requisición.

Objeto Requisición

CampoTipoRequeridoDescripción
external_idstringrequeridoID único en tu ERP (clave de deduplicación). Máx 250 caracteres.
itemsarrayrequeridoItems de línea (1-200 items). Ver esquema de Item abajo.
requester_namestringopcionalNombre de la persona solicitante. Máx 200 caracteres.
requester_emailstringopcionalEmail del solicitante. Máx 200 caracteres.
descriptionstringopcionalTítulo o resumen de la requisición. Máx 500 caracteres.
commentsstringopcionalInstrucciones adicionales para compradores (HTML soportado). Máx 15.000 caracteres.
delivery_addressstringopcionalDirección de entrega en texto libre. Máx 500 caracteres.
delivery_address_codestringopcionalCódigo que coincide con una dirección configurada en Sourced. Máx 50 caracteres.
desired_delivery_lead_time_daysintegeropcionalPlazo de entrega deseado en días desde la confirmación de la OC. Se aplica como default a todos los items.
offer_deadlinedatetimeopcionalFecha límite para cotizaciones de proveedores (ISO 8601).
total_estimated_valuefloatopcionalValor total estimado. Se calcula automáticamente desde los items si se omite.
currencystringopcionalCódigo de moneda (ej: "ARS", "USD"). Por defecto "ARS". Máx 10 caracteres.
department_codestringopcionalCódigo de departamento/centro de costo (se compara con departamentos de Sourced). Máx 50 caracteres.
priority_levelstringopcionalPrioridad: "LOW", "MEDIUM", "HIGH" o "CRITICAL".
attachmentsarrayopcionalArchivos adjuntos (máx 20). Ver esquema de Adjunto abajo.
raw_dataobjectopcionalJSON arbitrario de tu ERP, almacenado para trazabilidad.

Objeto Item

CampoTipoRequeridoDescripción
descriptionstringrequeridoNombre o descripción del item. Máx 1.000 caracteres.
quantityfloatrequeridoCantidad requerida (debe ser > 0).
external_line_idstringopcionalID de línea en tu ERP (ej: "REQ-001-L10"). Se devuelve en las OC para trazabilidad. Máx 100 caracteres.
unit_of_measurestringopcionalCódigo de UOM (ej: "KG", "EA", "LT", "M", "UN"). Se compara con el catálogo de tu org. Máx 50 caracteres.
target_pricefloatopcionalPrecio objetivo/presupuesto por unidad.
estimated_pricefloatopcionalPrecio total estimado para esta línea.
currencystringopcionalMoneda para precios (ej: "ARS", "USD"). Máx 10 caracteres.
categorystringopcionalCategoría desde tu ERP. Máx 200 caracteres.
material_codestringopcionalCódigo de material/parte en tu ERP (ej: código de material SAP). Máx 100 caracteres.
specificationsobjectopcionalEspecificaciones técnicas. Ver esquema de Especificaciones abajo.
desired_delivery_datedatetimeopcionalFecha de entrega deseada para este item (ISO 8601, ej: "2026-05-15T00:00:00Z").
desired_delivery_lead_time_daysintegeropcionalPlazo de entrega deseado en días para esta línea. Sobreescribe el valor a nivel de cabecera.
detailstringopcionalNotas adicionales para esta línea. Máx 1.000 caracteres.
raw_dataobjectopcionalJSON arbitrario para este item.

Objeto Especificaciones

CampoTipoRequeridoDescripción
manufacturer_codestringopcionalNúmero de parte del fabricante (ej: "6ES7214-1AG40-0XB0"). Máx 100 caracteres.
manufacturer_namestringopcionalNombre del fabricante (ej: "Siemens"). Máx 200 caracteres.
manufacturer_descriptionstringopcionalDescripción del fabricante. Máx 500 caracteres.
buyer_codestringopcionalCódigo interno en tu sistema (ej: "MAT-001234"). Máx 100 caracteres.
buyer_code_descriptionstringopcionalDescripción del código interno. Máx 500 caracteres.
buyer_code_systemstringopcionalNombre del sistema de origen (ej: "SAP", "Calipso"). Máx 50 caracteres.
technical_specsstringopcionalEspecificaciones técnicas en texto libre (ej: "220V, 50Hz, IP55"). Máx 2.000 caracteres.
requirementsstringopcionalRequisitos adicionales (ej: "Certificación ISO 9001 requerida"). Máx 2.000 caracteres.

Objeto Adjunto

CampoTipoRequeridoDescripción
urlstringrequeridoURL públicamente accesible para descargar el archivo. Máx 2.000 caracteres.
filenamestringrequeridoNombre de archivo original (ej: "plano_motor.pdf"). Máx 255 caracteres.
descriptionstringopcionalDescripción del adjunto. Máx 500 caracteres.
file_typestringopcionalTipo MIME (se detecta automáticamente si no se proporciona). Máx 100 caracteres.

Lógica de deduplicación

Cada requisición se identifica por su (dentro del alcance de tu organización):

  • Nueva: Si no se encuentra una requisición existente, se crea una nueva con estado .
  • Actualizar: Si se encuentra una requisición existente con estado , se actualiza in-place (los items se reemplazan completamente).
  • Superseder: Si se encuentra una requisición existente con estado , se reactiva (vuelve a PENDING) con los nuevos datos.
  • Lanzada: Si la requisición ya fue lanzada como Solicitud de Compra (), la importación se rechaza. La PR activa no puede ser sobreescrita.
  • Descartada: Si la requisición fue descartada previamente (), se reactiva (vuelve a PENDING) con los nuevos datos. Útil cuando el ERP la cancela y luego la reenvía.
Solicitud — Ejemplo mínimo
curl -X POST https://api.gosourced.ai/api/v1/requisitions \
  -H "X-API-Key: sk_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "requisitions": [
      {
        "external_id": "REQ-2026-0042",
        "items": [
          {
            "description": "Bearing SKF 6205",
            "quantity": 10
          }
        ]
      }
    ]
  }'

Respuesta

ERPImportResult

CampoTipoRequeridoDescripción
successbooleanrequeridotrue si error_count es 0.
created_countintegerrequeridoCantidad de nuevas requisiciones creadas.
updated_countintegerrequeridoCantidad de requisiciones PENDING existentes actualizadas.
skipped_countintegerrequeridoCantidad de requisiciones omitidas (actualmente siempre 0).
error_countintegerrequeridoCantidad de requisiciones que fallaron al importar.
errorsarrayrequeridoArray de {index, external_id, error} para cada requisición fallida.
requisition_idsarrayrequeridoIDs internos de Sourced de las requisiciones creadas/actualizadas.
Respuesta — 200 OK
{
  "success": true,
  "created_count": 1,
  "updated_count": 0,
  "skipped_count": 0,
  "error_count": 0,
  "errors": [],
  "requisition_ids": [1234]
}

Listar requisiciones

GET/api/v1/requisitionsAPI Key requerida

Obtener una lista paginada de tus requisiciones importadas. Solo devuelve requisiciones creadas a través de la API.

Parámetros de consulta

CampoTipoRequeridoDescripción
pageintegeropcionalNúmero de página (por defecto: 1).
page_sizeintegeropcionalItems por página, 1-100 (por defecto: 20).
statusstringopcionalFiltrar por estado: "PENDING", "LAUNCHED", "DISCARDED", "SUPERSEDED".
Solicitud
curl -H "X-API-Key: sk_live_abc123..." \
  "https://api.gosourced.ai/api/v1/requisitions?page=1&page_size=20&status=PENDING"
Respuesta — 200 OK
{
  "data": [
    {
      "id": 1234,
      "external_id": "REQ-2026-0042",
      "status": "PENDING",
      "requester_name": "Juan Pérez",
      "description": "Repuestos línea producción",
      "items": [...],
      "imported_at": "2026-03-07T14:30:00Z"
    }
  ],
  "total": 45,
  "page": 1,
  "page_size": 20,
  "has_more": true
}

Detalle de requisición

GET/api/v1/requisitions/{requisition_id}API Key requerida

Obtener una requisición individual por su ID interno de Sourced, incluyendo todos los items.

Solicitud
curl -H "X-API-Key: sk_live_abc123..." \
  https://api.gosourced.ai/api/v1/requisitions/1234

Devuelve el objeto completo de la requisición. Devuelve si no se encuentra o no pertenece a tu organización.

Verificar requisiciones existentes

POST/api/v1/requisitions/check-existingAPI Key requerida

Verificar qué external_ids ya existen en Sourced antes de importar. Útil para evitar llamadas innecesarias a la API.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
external_idsarrayrequeridoLista de strings external_id a verificar (1-100 items).
Solicitud
curl -X POST https://api.gosourced.ai/api/v1/requisitions/check-existing \
  -H "X-API-Key: sk_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "external_ids": ["REQ-2026-0042", "REQ-2026-0043", "REQ-2026-0044"]
  }'
Respuesta — 200 OK
{
  "existing": ["REQ-2026-0042"],
  "not_found": ["REQ-2026-0043", "REQ-2026-0044"]
}

Cancelar requisición

POST/api/v1/requisitions/cancelAPI Key requerida

Cancelar una requisición PENDING enviando el external_id en el cuerpo del request.

Solo se pueden cancelar requisiciones con estado . Si la requisición ya fue lanzada como Solicitud de Compra, debe cancelarse dentro de Sourced.

CampoTipoRequeridoDescripción
external_idstringrequeridoID de la requisición en tu sistema externo (la misma que usaste al importar)
reasonstringopcionalMotivo de la cancelación (se almacena para auditoría)
Solicitud
curl -X POST https://api.gosourced.ai/api/v1/requisitions/cancel \
  -H "X-API-Key: sk_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "external_id": "REQ-2026-0042",
    "reason": "Cancelado desde ERP"
  }'
Respuesta — 200 OK
{
  "status": "discarded",
  "external_id": "REQ-2026-0042"
}

Respuestas posibles:

  • discardedLa requisición fue descartada exitosamente.
  • already_discardedLa requisición ya estaba descartada (idempotente).
  • already_supersededLa requisición ya fue reemplazada por una versión más nueva.
  • La requisición ya fue lanzada — devuelve con detalles.
  • Requisición no encontrada — devuelve .

Listar órdenes de compra

GET/api/v1/purchase-ordersAPI Key requerida

Obtener órdenes de compra de tu organización. Soporta sincronización incremental a través del parámetro 'since'.

Parámetros de consulta

CampoTipoRequeridoDescripción
pageintegeropcionalNúmero de página (por defecto: 1).
page_sizeintegeropcionalItems por página, 1-100 (por defecto: 20).
statusstringopcionalFiltrar por estado: "DRAFT", "CREATED", "SENT", "CONFIRMED", "REJECTED", "CANCELLED".
sincedatetimeopcionalTimestamp ISO 8601. Devuelve solo OC creadas o actualizadas después de esta fecha.
requisition_external_idstringopcionalFiltrar por el external_id de la requisición original en tu ERP. Devuelve las OC que se generaron a partir de esa requisición.
Solicitud — Sincronización incremental
curl -H "X-API-Key: sk_live_abc123..." \
  "https://api.gosourced.ai/api/v1/purchase-orders?since=2026-03-01T00:00:00Z&status=CONFIRMED"
Respuesta — 200 OK
{
  "data": [
    {
      "id": 567,
      "code": "PO-2026-0089",
      "status": "CONFIRMED",
      "award_type": "FULL",
      "supplier_name": "Distribuidora Industrial SA",
      "supplier_id": 42,
      "supplier_external_id": "PROV-CAL-00123",
      "supplier_tax_id": "30712345678",
      "supplier_email": "ventas@distribuidora.com",
      "total_price": 285000.00,
      "currency": "ARS",
      "delivery_address": "Av. Corrientes 1234, CABA",
      "delivery_address_code": "001",
      "observations": "Entregar en horario de mañana. Coordinar con depósito.",
      "delivery_lead_time_days": 15,
      "expected_delivery_date": "2026-03-20T16:00:00Z",
      "payment_terms_code": "NET30",
      "awarded_at": "2026-03-05T16:00:00Z",
      "awarded_by_name": "Juan Pérez",
      "awarded_by_email": "juan.perez@empresa.com",
      "created_at": "2026-03-05T16:00:00Z",
      "updated_at": "2026-03-06T10:30:00Z",
      "purchase_request_id": 1234,
      "requisition_external_id": "REQ-2026-00142",
      "exchange_rate_data": {
        "date": "2026-03-05",
        "usdToArs": 1450.0,
        "arsToUsd": 0.00069
      },
      "total_nominal_savings": 15000.00,
      "total_real_savings": 8500.00,
      "savings_currency": "ARS",
      "items": [
        {
          "description": "Bearing SKF 6205",
          "quantity": 10,
          "unit_price": 28500.00,
          "total_price": 285000.00,
          "unit_of_measure": "UN",
          "currency": "ARS",
          "delivery_lead_time_days": 15,
          "expected_delivery_date": "2026-03-20T16:00:00Z",
          "external_line_id": "REQ-2026-0042-L10",
          "manufacturer_code": "6205-2RS"
        }
      ]
    }
  ],
  "total": 12,
  "page": 1,
  "page_size": 20,
  "has_more": false
}

Detalle de orden de compra

GET/api/v1/purchase-orders/{po_id}API Key requerida

Obtener una orden de compra individual por su ID interno de Sourced, incluyendo todos los items con trazabilidad hacia tu ERP via external_line_id.

Solicitud
curl -H "X-API-Key: sk_live_abc123..." \
  https://api.gosourced.ai/api/v1/purchase-orders/567
¿Buscás OCs por el ID de requisición de tu sistema?

Este endpoint requiere el ID interno de Sourced (). Si necesitás buscar órdenes de compra usando el ID de requisición de tu ERP, usá el endpoint con el query parameter :

GET /api/v1/purchase-orders?requisition_external_id=YOUR-REQ-ID

También podés combinarlo con otros filtros: para filtrar por estado de la OC, para sincronización incremental, y / para paginación.

Objeto Orden de Compra

CampoTipoRequeridoDescripción
idintegerrequeridoID interno de OC en Sourced.
codestringrequeridoCódigo de OC legible.
statusstringrequeridoEstado de la OC: "DRAFT", "CREATED", "SENT", "CONFIRMED", "REJECTED", "CANCELLED".
award_typestringopcionalTipo de adjudicación: FULL (proveedor único) o PARTIAL (adjudicación dividida entre múltiples proveedores).
supplier_namestringrequeridoNombre del proveedor.
supplier_idintegeropcionalID interno del proveedor en Sourced.
total_pricefloatopcionalValor total de la OC.
currencystringopcionalCódigo de moneda.
delivery_addressstringopcionalDirección de entrega.
delivery_address_codestringopcionalCódigo de la dirección de entrega de la organización vinculada (ej. "001"). Usalo para mapear el destino contra tu ERP. Null para direcciones de texto libre sin registro vinculado.
observationsstringopcionalComentarios u observaciones en texto libre que el comprador cargó en el paso de revisión pre-adjudicación. Usa las condiciones especiales cotizadas por el proveedor si el comprador no dejó nota. Null cuando no hay ninguna.
delivery_lead_time_daysintegeropcionalPlazo de entrega en días, según lo cotizado por el proveedor a nivel cabecera. Cuando el proveedor cotiza distintos plazos por línea, los items pueden tener valores diferentes — usá items[].delivery_lead_time_days para el valor por línea.
expected_delivery_datedatetimeopcionalFecha de entrega calculada (awarded_at + delivery_lead_time_days). Null si falta cualquiera de los dos. Para fechas por línea usá items[].expected_delivery_date.
payment_terms_codestringopcionalCódigo de condiciones de pago.
awarded_atdatetimeopcionalCuándo se adjudicó la OC (ISO 8601).
awarded_by_namestringopcionalNombre del usuario que adjudicó la OC.
awarded_by_emailstringopcionalEmail del usuario que adjudicó la OC.
created_atdatetimeopcionalTimestamp de creación (ISO 8601).
updated_atdatetimeopcionalTimestamp de última actualización (ISO 8601).
purchase_request_idintegeropcionalID de la solicitud de compra originante.
requisition_external_idstringopcionalID del documento origen en tu ERP (ej. número de requisición en Calipso/SAP/JDE). Se resuelve desde la ERPRequisition de origen cuando existe; si no, cae al external_id de la PR. Puede ser una lista separada por comas cuando una sola PR agrupa varias requisiciones origen.
exchange_rate_dataobjectopcionalTipos de cambio al momento del award. Formato: {"date": "2026-03-05", "usdToArs": 1450.0, "arsToUsd": 0.00069}. Null si no hay datos disponibles.
total_nominal_savingsfloatopcionalAhorro nominal total vs precios históricos (sin ajuste por inflación).
total_real_savingsfloatopcionalAhorro real total vs precios históricos (ajustado por inflación).
savings_currencystringopcionalMoneda de los montos de ahorro.
itemsarrayrequeridoItems de línea de la OC. Ver esquema de Item de OC abajo.

Objeto Item de OC

CampoTipoRequeridoDescripción
descriptionstringrequeridoDescripción del item.
quantityfloatopcionalCantidad ordenada.
unit_pricefloatopcionalPrecio por unidad.
total_pricefloatopcionalPrecio total de la línea (cantidad x precio unitario).
unit_of_measurestringopcionalUnidad de medida.
currencystringopcionalCódigo de moneda.
delivery_lead_time_daysintegeropcionalPlazo de entrega en días para esta línea, según lo cotizado por el proveedor. Items distintos de una misma OC pueden tener plazos diferentes.
expected_delivery_datedatetimeopcionalFecha de entrega calculada para esta línea (PO.awarded_at + delivery_lead_time_days del item). Null si falta cualquiera de los dos.
external_line_idstringopcionalID de línea original de tu ERP — usalo para vincular items de la OC con tus líneas de requisición.
manufacturer_codestringopcionalNúmero de parte del fabricante.
Sobre fechas y plazos de entrega
  • El plazo de entrega existe a dos niveles: a nivel cabecera (refleja el plazo general que cotizó el proveedor) y a nivel línea (preciso por item). Cuando el proveedor cotiza distintos plazos por línea, conviene usar el valor por línea.
  • es un campo calculado: . Lo computa Sourced; no es un dato que el proveedor envíe directamente.
  • Si viene null, también lo hará . Esto suele significar que el proveedor no incluyó el plazo en su cotización.

Actualizar estado de orden de compra

POST/api/v1/purchase-orders/{po_id}/statusAPI Key requerida

Actualizar el estado de una orden de compra para reflejar su progreso en tu sistema externo (ERP).

Transiciones de estado permitidas:

DesdeHaciaSignificado
DRAFTCREATEDLa OC fue creada en tu ERP.
CREATEDCONFIRMEDLa OC fue aprobada completamente en tu ERP.
DRAFTCONFIRMEDAtajo cuando no necesitás el paso intermedio.
DRAFTREJECTEDLa OC fue rechazada en tu ERP. La PR se reabre en Sourced.
CREATEDREJECTEDLa OC fue rechazada en tu ERP después de haber sido creada. La PR se reabre en Sourced.
DRAFT / CREATED / SENT / CONFIRMEDCANCELLEDLa compra se cayó. La OC se cancela y la PR también — no se reabre nada. Usá REJECTED si la necesidad sigue vigente y querés re-adjudicar.
CampoTipoRequeridoDescripción
statusstringrequeridoEstado destino: CREATED (OC creada en tu ERP), CONFIRMED (OC aprobada en tu ERP), REJECTED (OC rechazada, reabre la PR) o CANCELLED (compra caída, cancela la OC y la PR).
external_idstringopcionalNúmero o código de la OC en tu ERP (ej: OC-CAL-00045678). Se guarda para trazabilidad.
notesstringopcionalNotas opcionales sobre el cambio de estado.
Solicitud
curl -X POST https://api.gosourced.ai/api/v1/purchase-orders/567/status \
  -H "X-API-Key: sk_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "status": "CREATED",
    "external_id": "OC-CAL-00045678",
    "notes": "Creada en Calipso"
  }'
Respuesta — 200 OK
{
  "status": "created",
  "po_id": 567,
  "code": "PO-A1B2C3D4"
}

Listar proveedores

GET/api/v1/suppliersAPI Key requerida

Listar los proveedores de tu organización. Usa ?has_erp_code=false para encontrar proveedores sin mapear al ERP. Usa ?detail=full para obtener contactos, categorías y cobertura.

Parámetros de consulta

CampoTipoRequeridoDescripción
pageintegeropcionalNúmero de página (default: 1).
page_sizeintegeropcionalResultados por página (1-200, default: 50).
searchstringopcionalBuscar por nombre, nombre personalizado, email, CUIT/CNPJ o código ERP.
erp_codestringopcionalFiltrar por código ERP exacto.
has_erp_codebooleanopcionaltrue = solo mapeados al ERP, false = solo sin mapear.
detailstringopcionalUsar 'full' para incluir contactos, categorías y cobertura.
Solicitud
# Light (default)
curl -H "X-API-Key: sk_live_abc123..." \
  "https://api.gosourced.ai/api/v1/suppliers?has_erp_code=false"

# Full detail
curl -H "X-API-Key: sk_live_abc123..." \
  "https://api.gosourced.ai/api/v1/suppliers?search=30712345678&detail=full"
Respuesta — 200 OK
// Light response
{
  "data": [
    {
      "id": 42,
      "name": "Distribuidora Industrial SA",
      "email": "ventas@distribuidora.com",
      "tax_id": "30712345678",
      "country_code": "AR",
      "city": "Buenos Aires",
      "is_active": true,
      "is_preferred": true,
      "erp_code": "PROV-CAL-00123",
      "erp_type": "SAP_B1"
    }
  ],
  "total": 85,
  "page": 1,
  "page_size": 50,
  "has_more": true
}

// Full response (?detail=full)
{
  "data": [
    {
      "id": 42,
      "name": "Distribuidora Industrial SA",
      "email": "ventas@distribuidora.com",
      "tax_id": "30712345678",
      "country_code": "AR",
      "city": "Buenos Aires",
      "is_active": true,
      "is_preferred": true,
      "erp_code": "PROV-CAL-00123",
      "erp_type": "SAP_B1",
      "address": "Av. Corrientes 1234",
      "state_code": "CABA",
      "website": "https://distribuidora.com",
      "description": "Distribuidor de insumos industriales",
      "tax_regime": null,
      "employee_count": "50+",
      "years_in_business": "5+",
      "performance_score": 4.2,
      "reliability_score": 4.5,
      "quality_score": 4.0,
      "contacts": [
        {
          "name": "Juan Pérez",
          "email": "juan@distribuidora.com",
          "phone": "+54 11 5555-1234",
          "role": "SALES",
          "is_primary": true
        }
      ],
      "categories": [
        { "id": 15, "code": "IND-001", "name": "Insumos Industriales", "level": "LEVEL_1" }
      ],
      "coverage": [
        { "country": "Argentina", "province": null, "is_nationwide": true }
      ]
    }
  ],
  "total": 1,
  "page": 1,
  "page_size": 50,
  "has_more": false
}

Crear proveedor

POST/api/v1/suppliersAPI Key requerida

Crear un proveedor para tu organización. Al menos uno de tax_id o erp_code es obligatorio. Se requiere al menos un contacto con rol 'sales'. Si ya existe un proveedor global con el mismo CUIT, se reutiliza y se vincula a tu organización.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
namestringrequeridoNombre del proveedor para tu organización.
tax_idstringopcionalCUIT, CNPJ, RUT, etc. Al menos uno de tax_id o erp_code es obligatorio.
erp_codestringopcionalCódigo del proveedor en tu ERP. Al menos uno de tax_id o erp_code es obligatorio.
erp_typestringopcionalTipo de ERP (SAP_B1, JDE, ORACLE_CLOUD, etc.).
country_codestringopcionalCódigo de país ISO 3166-1 (ej: AR, BR, US).
citystringopcionalCiudad del proveedor.
addressstringopcionalDirección completa.
state_codestringopcionalEstado/provincia (ej: CABA, SP).
websitestringopcionalSitio web del proveedor.
contactsarrayrequeridoLista de contactos. Al menos uno con rol 'sales' es obligatorio.
contacts[].namestringrequeridoNombre del contacto.
contacts[].emailstringrequeridoEmail del contacto.
contacts[].phonestringopcionalTeléfono (opcional).
contacts[].rolestringrequeridoRol: SALES o LOGISTICS.
contacts[].is_primarybooleanopcionaltrue si es el contacto principal (default: false).
Solicitud
curl -X POST https://api.gosourced.ai/api/v1/suppliers \
  -H "X-API-Key: sk_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Distribuidora Industrial SA",
    "tax_id": "30712345678",
    "erp_code": "PROV-CAL-00123",
    "erp_type": "SAP_B1",
    "country_code": "AR",
    "city": "Buenos Aires",
    "address": "Av. Corrientes 1234",
    "contacts": [
      {
        "name": "Juan Pérez",
        "email": "juan@distribuidora.com",
        "phone": "+54 11 5555-1234",
        "role": "SALES",
        "is_primary": true
      },
      {
        "name": "María García",
        "email": "maria@distribuidora.com",
        "role": "LOGISTICS"
      }
    ]
  }'
Respuesta — 200 OK
// 201 Created
{
  "id": 42,
  "name": "Distribuidora Industrial SA",
  "email": null,
  "tax_id": "30712345678",
  "country_code": "AR",
  "city": "Buenos Aires",
  "is_active": true,
  "is_preferred": false,
  "erp_code": "PROV-CAL-00123",
  "erp_type": "SAP_B1",
  "address": "Av. Corrientes 1234",
  "state_code": null,
  "website": null,
  "description": null,
  "tax_regime": null,
  "employee_count": null,
  "years_in_business": null,
  "performance_score": null,
  "reliability_score": null,
  "quality_score": null,
  "contacts": [
    {
      "name": "Juan Pérez",
      "email": "juan@distribuidora.com",
      "phone": "+54 11 5555-1234",
      "role": "SALES",
      "is_primary": true
    },
    {
      "name": "María García",
      "email": "maria@distribuidora.com",
      "phone": null,
      "role": "LOGISTICS",
      "is_primary": false
    }
  ],
  "categories": [],
  "coverage": []
}

Referencia de esquemas

Referencia rápida de todos los esquemas de solicitud/respuesta usados en los endpoints.

Estados de requisición

EstadoDescripción
PENDINGImportada, esperando revisión de un comprador en Sourced.
LAUNCHEDEl comprador lanzó la requisición como Solicitud de Compra.
DISCARDEDLa requisición fue descartada manualmente.
SUPERSEDEDSe importó una versión más nueva con el mismo external_id.

Estados de orden de compra

EstadoDescripción
DRAFTOC creada en Sourced, pendiente de sincronización al ERP.
CREATEDOC creada en el ERP externo, pendiente de aprobación.
CONFIRMEDOC aprobada completamente en el ERP externo.
REJECTEDOC rechazada en el ERP externo. La PR asociada se reabre automáticamente.
CANCELLEDCompra caída. La OC se cancela y la PR asociada también — nada se reabre.
Próximamente se agregarán estados adicionales como RECEIVED (mercadería recepcionada), INVOICED (facturada), entre otros, para reflejar el ciclo de vida completo de la orden de compra.

Códigos de referencia

Catálogos de monedas y tipos de pago aceptados por la API. Usalos para mapear estos valores con los códigos equivalentes en tu ERP.

Monedas

Sourced no usa un enum cerrado de monedas: cualquier código ISO 4217 válido de 3 letras es aceptado. Las monedas más utilizadas por nuestros clientes son:

CódigoMoneda
ARSPeso argentino
USDDólar estadounidense
EUREuro
BRLReal brasileño
Mandá el código ISO 4217 directamente en el campo currency (ej: "currency": "EUR"). Sourced lo persiste tal cual y lo devuelve igual en las respuestas.

Tipos de pago (payment_terms_code)

Catálogo global de condiciones de pago disponibles en Sourced. Usá el código (columna Code) en el campo payment_terms_code de la PO. El campo type indica la naturaleza del pago: IMMEDIATE (al recibir), ADVANCE (anticipado), NET_DAYS (a X días de la factura).

CódigoNombreTipoDíasDescripción
CODCash On DeliveryIMMEDIATE0Pago contra entrega
IMMImmediate PaymentIMMEDIATE0Pago inmediato / Contado
ADV100Advance PaymentADVANCE0Pago por adelantado 100%
ADV50Advance 50%ADVANCE0Pago por adelantado del 50%
NET7Net 7 DaysNET_DAYS7Pago a 7 días de la fecha de factura
NET10Net 10 DaysNET_DAYS10Pago a 10 días de la fecha de factura
NET15Net 15 DaysNET_DAYS15Pago a 15 días de la fecha de factura
NET20Net 20 DaysNET_DAYS20Pago a 20 días de la fecha de factura
NET21Net 21 DaysNET_DAYS21Pago a 21 días de la fecha de factura
NET30Net 30 DaysNET_DAYS30Pago a 30 días de la fecha de factura
EOM30End of Month + 30NET_DAYS30Pago a fin de mes más 30 días
NET35Net 35 DaysNET_DAYS35Pago a 35 días de la fecha de factura
NET40Net 40 DaysNET_DAYS40Pago a 40 días de la fecha de factura
NET45Net 45 DaysNET_DAYS45Pago a 45 días de la fecha de factura
NET60Net 60 DaysNET_DAYS60Pago a 60 días de la fecha de factura
NET75Net 75 DaysNET_DAYS75Pago a 75 días de la fecha de factura
NET90Net 90 DaysNET_DAYS90Pago a 90 días de la fecha de factura
El catálogo es global a toda la plataforma y rara vez cambia. Si necesitás un código adicional para tu integración, contactanos.

Unidades de medida

Códigos de unidad de medida aceptados en items de requisiciones. Se envían en el campo unit_of_measure.

CódigoUnidad
EAUnidad
PCSPiezas
KGKilogramo
GGramo
LBLibra
OZOnza
MMetro
CMCentímetro
MMMilímetro
INPulgada
FTPie
YDYarda
LLitro
MLMililitro
GALGalón
QTCuarto de galón
PTPinta
FL_OZOnza líquida
M2Metro cuadrado
CM2Centímetro cuadrado
FT2Pie cuadrado
IN2Pulgada cuadrada
YD2Yarda cuadrada
M3Metro cúbico
CM3Centímetro cúbico
FT3Pie cúbico
IN3Pulgada cúbica
YD3Yarda cúbica
BOXCaja
CASECaja/Estuche
PACKPaquete
SETJuego
KITKit
BUNDLEManojo
ROLLRollo
SHEETHoja/Lámina
PALLETPaleta
DRUMTambor/Bidón
BAGBolsa
BOTTLEBotella
CENCentena
Si enviás una unidad no reconocida, se almacena tal cual. Recomendamos usar los códigos estándar para que la IA pueda normalizar correctamente las cotizaciones de proveedores.

Flujo de integración

Patrón de integración típico para una sincronización ERP programada (ej: cron job cada 15 minutos):

1

Recopilar nuevas requisiciones del ERP

Consultar tu ERP por requisiciones aprobadas que aún no fueron sincronizadas con Sourced.

2

Verificar existentes (opcional)

Llamar a POST /requisitions/check-existing con external_ids para filtrar requisiciones ya sincronizadas.

3

Importar requisiciones

Llamar a POST /requisitions con el lote de requisiciones nuevas/actualizadas. Guardar los requisition_ids devueltos.

4

Consultar órdenes de compra nuevas

Llamar a GET /purchase-orders?since={last_sync_timestamp}&status=DRAFT para obtener OC nuevas. Crear la OC en tu ERP y llamar a POST /purchase-orders/{id}/status con {"status": "CREATED"}.

5

Confirmar OC aprobadas

Cuando la OC se apruebe en tu ERP, llamar a POST /purchase-orders/{id}/status con {"status": "CONFIRMED"} para cerrar el ciclo.

Pseudocódigo — Cron job de sincronización
# Step 1: Get pending requisitions from ERP
ERP_REQS=$(query_erp_pending_requisitions)

# Step 2: Check which ones already exist in Sourced
EXISTING=$(curl -s -X POST \
  -H "X-API-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  -d "{"external_ids": $ERP_REQ_IDS}" \
  https://api.gosourced.ai/api/v1/requisitions/check-existing)

# Step 3: Import only new requisitions
NEW_REQS=$(filter_not_found $ERP_REQS $EXISTING)
curl -s -X POST \
  -H "X-API-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  -d "{"requisitions": $NEW_REQS}" \
  https://api.gosourced.ai/api/v1/requisitions

# Step 4: Pull new POs since last sync
POS=$(curl -s \
  -H "X-API-Key: $API_KEY" \
  "https://api.gosourced.ai/api/v1/purchase-orders?since=$LAST_SYNC&status=DRAFT")

# Step 5: Create POs in ERP and update status
for PO in $POS; do
  create_po_in_erp $PO
  curl -s -X POST \
    -H "X-API-Key: $API_KEY" \
    -H "Content-Type: application/json" \
    -d "{"status": "CREATED", "external_id": "$ERP_PO_NUMBER"}" \
    "https://api.gosourced.ai/api/v1/purchase-orders/$PO_ID/status"
done

# Step 6: When PO is approved in ERP, confirm it
curl -s -X POST \
  -H "X-API-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status": "CONFIRMED"}' \
  "https://api.gosourced.ai/api/v1/purchase-orders/$PO_ID/status"

Ejemplo completo

Una solicitud de importación realista con todos los campos disponibles:

Solicitud de importación completa
curl -X POST https://api.gosourced.ai/api/v1/requisitions \
  -H "X-API-Key: sk_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "requisitions": [
      {
        "external_id": "CAL-REQ-2026-0042",
        "description": "Repuestos bomba centrífuga Planta Norte",
        "requester_name": "Carlos Rodríguez",
        "requester_email": "carlos.rodriguez@empresa.com",
        "comments": "Urgente: bomba fuera de servicio desde 03/03. <b>Necesitamos entrega express.</b>",
        "delivery_address": "Av. Industrial 4500, Parque Industrial Pilar, Buenos Aires",
        "delivery_address_code": "PLANTA-NORTE",
        "desired_delivery_lead_time_days": 7,
        "offer_deadline": "2026-03-10T18:00:00Z",
        "total_estimated_value": 1250000.00,
        "currency": "ARS",
        "department_code": "MANT-001",
        "priority_level": "HIGH",
        "items": [
          {
            "external_line_id": "CAL-REQ-2026-0042-L10",
            "description": "Sello mecánico para bomba centrífuga KSB ETA 50-200",
            "quantity": 2,
            "unit_of_measure": "UN",
            "target_price": 185000.00,
            "estimated_price": 370000.00,
            "currency": "ARS",
            "category": "Repuestos Bombas",
            "material_code": "MAT-BOM-0234",
            "desired_delivery_lead_time_days": 10,
            "detail": "Sello tipo cartucho, material: carburo de silicio / carburo de silicio",
            "specifications": {
              "manufacturer_code": "KSB-SEAL-50200",
              "manufacturer_name": "KSB",
              "manufacturer_description": "Mechanical seal for ETA 50-200 centrifugal pump",
              "buyer_code": "MAT-BOM-0234",
              "buyer_code_description": "Sello mecánico bomba KSB ETA 50-200",
              "buyer_code_system": "Calipso",
              "technical_specs": "Diámetro eje: 35mm, Material caras: SiC/SiC, Elastómeros: Viton",
              "requirements": "Debe incluir certificado de calidad. Preferencia por repuesto original KSB."
            }
          },
          {
            "external_line_id": "CAL-REQ-2026-0042-L20",
            "description": "Rodamiento SKF 6310-2RS",
            "quantity": 4,
            "unit_of_measure": "UN",
            "target_price": 45000.00,
            "currency": "ARS",
            "category": "Rodamientos",
            "material_code": "MAT-ROD-0089",
            "specifications": {
              "manufacturer_code": "6310-2RS1",
              "manufacturer_name": "SKF",
              "technical_specs": "50x110x27mm, sellado ambos lados, grasa estándar"
            }
          },
          {
            "external_line_id": "CAL-REQ-2026-0042-L30",
            "description": "Aceite lubricante ISO VG 68",
            "quantity": 20,
            "unit_of_measure": "LT",
            "target_price": 5500.00,
            "currency": "ARS",
            "category": "Lubricantes",
            "specifications": {
              "technical_specs": "Aceite mineral ISO VG 68, índice de viscosidad > 95"
            }
          }
        ],
        "attachments": [
          {
            "url": "https://erp.empresa.com/files/plano-bomba-eta-50-200.pdf",
            "filename": "plano_bomba_KSB_ETA_50-200.pdf",
            "description": "Plano de despiece bomba KSB ETA 50-200",
            "file_type": "application/pdf"
          }
        ],
        "raw_data": {
          "calipso_doc_type": "SOL",
          "calipso_doc_number": "0042",
          "calipso_branch": "001",
          "approved_by": "María González",
          "cost_center": "CC-MANT-NORTE"
        }
      }
    ]
  }'
Respuesta — 200 OK
{
  "success": true,
  "created_count": 1,
  "updated_count": 0,
  "skipped_count": 0,
  "error_count": 0,
  "errors": [],
  "requisition_ids": [1234]
}