Documentação API

API Pública Sourced v1

A API Sourced permite que sistemas ERP (como Calipso, SAP, JD Edwards) se integrem diretamente com a plataforma de compras da Sourced. Use-a para:

  • Enviar requisições de compra do seu ERP para o Sourced
  • Obter ordens de compra de volta no seu ERP após adjudicação
  • Verificar quais requisições já foram sincronizadas
  • Monitorar o status das suas requisições

A API segue as convenções REST, utiliza JSON para os corpos de solicitação e resposta, e se autentica via API keys.

Autenticação

Todos os endpoints (exceto health check) requerem uma API key enviada no header .

As API keys são criadas no painel de administração do Sourced em . Cada key é exibida apenas uma vez ao ser criada. Armazene-a com segurança.

Exemplo: Solicitação autenticada
curl -H "X-API-Key: sk_live_abc123..." \
  https://api.gosourced.ai/api/v1/requisitions
Segurança: Trate sua API key como uma senha. Não a exponha em código do lado do cliente, repositórios públicos ou logs. Se comprometida, revogue-a imediatamente no painel de administração e crie uma nova.

URL Base

AmbienteURL Base
Produçãohttps://api.gosourced.ai
Desenvolvimentohttps://api-dev.gosourced.ai

Todos os endpoints são prefixados com .

Limites de taxa

Todos os endpoints são limitados a por endpoint. Exceder este limite retorna uma resposta .

Para operações em massa, use o endpoint de importação em lote () que aceita até 100 requisições por solicitação.

Erros

A API utiliza códigos de status HTTP padrão. Erros retornam um corpo JSON com um campo .

Formato de resposta de erro
{
  "detail": "Invalid or revoked API key."
}
StatusSignificado
200Sucesso
400Solicitação inválida — erro de validação ou corpo malformado
401Não autorizado — API key ausente ou inválida
404Não encontrado — o recurso não existe ou não é acessível
422Entidade não processável — o corpo da solicitação não passou na validação do esquema
429Muitas solicitações — limite de taxa excedido
500Erro interno do servidor — erro inesperado do nosso lado

Exemplos de erros

401 — API key inválida
{
  "detail": "Invalid or revoked API key."
}
422 — Erro de validação (ex: campo obrigatório ausente)
{
  "detail": [
    {
      "loc": ["body", "requisitions", 0, "items", 0, "quantity"],
      "msg": "Input should be greater than 0",
      "type": "greater_than"
    }
  ]
}
200 — Sucesso parcial (algumas requisições falharam)
{
  "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: o endpoint retorna mesmo com falhas parciais. Sempre verifique o campo e o array para detectar problemas por requisição.

Health Check

GET/api/v1/health

Verificar se a API está acessível. Não requer autenticação.

Solicitação
curl https://api.gosourced.ai/api/v1/health
Resposta — 200 OK
{
  "status": "ok",
  "api": "v1"
}

Enviar um arquivo (Presigned)

POST/api/v1/files/presignAPI Key obrigatória

Obtenha uma URL pré-assinada para enviar um arquivo (um manifesto de requisição ou um anexo) diretamente ao S3. Os bytes não passam pela API, então especificações técnicas pesadas de licitações são enviadas sem atingir os limites de tamanho.

Apenas canal de transporte: os arquivos ficam no armazenamento sob o prefixo da sua organização, sem parsing nem processamento. A URL pré-assinada expira em 10 minutos e aceita arquivos de até 500 MB.

Fluxo de duas etapas (por arquivo)

  1. Chame este endpoint com o nome do arquivo para receber um upload_url e os campos do formulário.
  2. Faça um POST do arquivo como multipart/form-data para upload_url, incluindo primeiro todos os campos de fields e depois um campo file com os bytes.

Corpo da requisição

CampoTipoObrigatórioDescrição
filenamestringobrigatórioNome original do arquivo (ex. 'SOL_106177_LINE_001_SEQ010_adjunto.docx'). Componentes de caminho são removidos.
content_typestringopcionalTipo MIME. Se omitido, qualquer tipo é aceito.
1. Solicitação
curl -X POST https://api.gosourced.ai/api/v1/files/presign \
  -H "X-API-Key: sk_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "filename": "SOL_106177_LINE_001_SEQ010_adjunto.docx",
    "content_type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
  }'
Resposta — 200 OK
{
  "upload_url": "https://s3.amazonaws.com/your-bucket",
  "fields": {
    "key": "erp-inbound/42/SOL_106177_LINE_001_SEQ010_adjunto.docx",
    "Content-Type": "application/vnd.openxmlformats-...",
    "policy": "eyJleHBpcmF0aW9uIjoi...",
    "x-amz-signature": "a1b2c3..."
  },
  "key": "erp-inbound/42/SOL_106177_LINE_001_SEQ010_adjunto.docx",
  "max_file_size": 524288000,
  "expires_in": 600
}

Campos da resposta

  • upload_url — a URL do S3 para onde o POST do arquivo é feito.
  • fields — campos do formulário que devem ser incluídos no POST multipart, antes do campo file.
  • key — a chave sob a qual o arquivo será armazenado.
  • max_file_size — tamanho máximo permitido em bytes (aplicado pelo S3).
  • expires_in — segundos até a URL pré-assinada expirar.
2. Envio para o S3 (multipart/form-data)
# Use upload_url + every key in "fields", then the file (last).
curl -X POST "$UPLOAD_URL" \
  -F "key=erp-inbound/42/SOL_106177_LINE_001_SEQ010_adjunto.docx" \
  -F "Content-Type=application/vnd.openxmlformats-..." \
  -F "policy=eyJleHBpcmF0aW9uIjoi..." \
  -F "x-amz-signature=a1b2c3..." \
  -F "file=@SOL_106177_LINE_001_SEQ010_adjunto.docx"
# HTTP 204 No Content on success

Importar requisições

POST/api/v1/requisitionsAPI Key obrigatória

Importar uma ou mais requisições de compra do seu ERP. Suporta importação em lote de até 100 requisições por solicitação. Usa external_id para deduplicação.

Corpo da solicitação

O corpo deve conter um array com 1 a 100 objetos de requisição.

Objeto Requisição

CampoTipoObrigatórioDescrição
external_idstringobrigatórioID único no seu ERP (chave de deduplicação). Máx 250 caracteres.
itemsarrayobrigatórioItens de linha (1-200 itens). Veja o esquema de Item abaixo.
requester_namestringopcionalNome da pessoa solicitante. Máx 200 caracteres.
requester_emailstringopcionalEmail do solicitante. Máx 200 caracteres.
assigned_buyerstringopcionalComprador atribuído no ERP de origem (texto livre). Exibido e filtrável no triage. Máx 200 caracteres.
descriptionstringopcionalTítulo ou resumo da requisição. Máx 500 caracteres.
commentsstringopcionalInstruções adicionais para compradores (HTML suportado). Máx 15.000 caracteres.
delivery_addressstringopcionalEndereço de entrega em texto livre. Máx 500 caracteres.
delivery_address_codestringopcionalCódigo correspondente a um endereço configurado no Sourced. Máx 50 caracteres.
desired_delivery_lead_time_daysintegeropcionalPrazo de entrega desejado em dias a partir da confirmação da OC. Aplicado como padrão a todos os itens.
created_datedatetimeopcionalData de criação da requisição no seu sistema (ISO 8601). Exibida como "Criação" no triage. Não é data de entrega: a necessidade vai por item em desired_delivery_date.
offer_deadlinedatetimeopcionalData limite para cotações de fornecedores (ISO 8601).
total_estimated_valuefloatopcionalValor total estimado. Calculado automaticamente a partir dos itens se omitido.
currencystringopcionalCódigo da moeda (ex: "ARS", "USD"). Padrão "ARS". Máx 10 caracteres.
department_codestringopcionalCódigo de departamento/centro de custo (comparado com departamentos do Sourced). Máx 50 caracteres.
priority_levelstringopcionalPrioridade: "LOW", "MEDIUM", "HIGH" ou "CRITICAL".
attachmentsarrayopcionalAnexos de arquivo (máx 20). Veja o esquema de Anexo abaixo.
raw_dataobjectopcionalJSON arbitrário do seu ERP, armazenado para rastreabilidade.

Objeto Item

CampoTipoObrigatórioDescrição
descriptionstringobrigatórioNome ou descrição do item. Máx 1.000 caracteres.
quantityfloatobrigatórioQuantidade necessária (deve ser > 0).
external_line_idstringopcionalID de linha no seu ERP (ex: "REQ-001-L10"). Retornado nas OC para rastreabilidade. Máx 100 caracteres.
unit_of_measurestringopcionalCódigo de UOM (ex: "KG", "EA", "LT", "M", "UN"). Comparado com o catálogo da sua org. Máx 50 caracteres.
target_pricefloatopcionalPreço alvo/orçamento por unidade.
estimated_pricefloatopcionalPreço total estimado para esta linha.
currencystringopcionalMoeda para preços (ex: "ARS", "USD"). Máx 10 caracteres.
categorystringopcionalCategoria do seu ERP. Máx 200 caracteres.
material_codestringopcionalCódigo de material/peça no seu ERP (ex: código de material SAP). Máx 100 caracteres.
specificationsobjectopcionalEspecificações técnicas. Veja o esquema de Especificações abaixo.
desired_delivery_datedatetimeopcionalData de entrega desejada para este item (ISO 8601, ex: "2026-05-15T00:00:00Z").
desired_delivery_lead_time_daysintegeropcionalPrazo de entrega desejado em dias para esta linha. Sobrescreve o valor a nível de cabeçalho.
detailstringopcionalNotas adicionais para esta linha. Máx 1.000 caracteres.
raw_dataobjectopcionalJSON arbitrário para este item.

Objeto Especificações

CampoTipoObrigatórioDescrição
manufacturer_codestringopcionalNúmero de peça do fabricante (ex: "6ES7214-1AG40-0XB0"). Máx 100 caracteres.
manufacturer_namestringopcionalNome do fabricante (ex: "Siemens"). Máx 200 caracteres.
manufacturer_descriptionstringopcionalDescrição do fabricante. Máx 500 caracteres.
buyer_codestringopcionalCódigo interno no seu sistema (ex: "MAT-001234"). Máx 100 caracteres.
buyer_code_descriptionstringopcionalDescrição do código interno. Máx 500 caracteres.
buyer_code_systemstringopcionalNome do sistema de origem (ex: "SAP", "Calipso"). Máx 50 caracteres.
technical_specsstringopcionalEspecificações técnicas em texto livre (ex: "220V, 50Hz, IP55"). Máx 2.000 caracteres.
requirementsstringopcionalRequisitos adicionais (ex: "Certificação ISO 9001 obrigatória"). Máx 2.000 caracteres.

Objeto Anexo

CampoTipoObrigatórioDescrição
urlstringobrigatórioURL publicamente acessível para baixar o arquivo. Máx 2.000 caracteres.
filenamestringobrigatórioNome do arquivo original (ex: "plano_motor.pdf"). Máx 255 caracteres.
descriptionstringopcionalDescrição do anexo. Máx 500 caracteres.
file_typestringopcionalTipo MIME (detectado automaticamente se não fornecido). Máx 100 caracteres.

Lógica de deduplicação

Cada requisição é identificada pelo seu (dentro do escopo da sua organização):

  • Nova: Se nenhuma requisição existente for encontrada, uma nova é criada com status .
  • Atualizar: Se uma requisição existente com status for encontrada, ela é atualizada in-place (os itens são totalmente substituídos).
  • Superseder: Se uma requisição existente com status for encontrada, ela é reativada (volta para PENDING) com os novos dados.
  • Lançada: Se a requisição já foi lançada como Solicitação de Compra (), a importação é rejeitada. A PR ativa não pode ser sobrescrita.
  • Descartada: Se a requisição foi descartada anteriormente (), ela é reativada (volta para PENDING) com os novos dados. Útil quando o ERP a cancela e depois a reenvia.
Solicitação — Exemplo 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
          }
        ]
      }
    ]
  }'

Resposta

ERPImportResult

CampoTipoObrigatórioDescrição
successbooleanobrigatóriotrue se error_count for 0.
created_countintegerobrigatórioNúmero de novas requisições criadas.
updated_countintegerobrigatórioNúmero de requisições PENDING existentes atualizadas.
skipped_countintegerobrigatórioNúmero de requisições ignoradas (atualmente sempre 0).
error_countintegerobrigatórioNúmero de requisições que falharam ao importar.
errorsarrayobrigatórioArray de {index, external_id, error} para cada requisição que falhou.
requisition_idsarrayobrigatórioIDs internos do Sourced das requisições criadas/atualizadas.
Resposta — 200 OK
{
  "success": true,
  "created_count": 1,
  "updated_count": 0,
  "skipped_count": 0,
  "error_count": 0,
  "errors": [],
  "requisition_ids": [1234]
}

Listar requisições

GET/api/v1/requisitionsAPI Key obrigatória

Obter uma lista paginada das suas requisições importadas. Retorna apenas requisições criadas via API.

Parâmetros de consulta

CampoTipoObrigatórioDescrição
pageintegeropcionalNúmero da página (padrão: 1).
page_sizeintegeropcionalItens por página, 1-100 (padrão: 20).
statusstringopcionalFiltrar por status: "PENDING", "LAUNCHED", "DISCARDED", "SUPERSEDED".
Solicitação
curl -H "X-API-Key: sk_live_abc123..." \
  "https://api.gosourced.ai/api/v1/requisitions?page=1&page_size=20&status=PENDING"
Resposta — 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
}

Detalhe da requisição

GET/api/v1/requisitions/{requisition_id}API Key obrigatória

Obter uma requisição individual pelo seu ID interno do Sourced, incluindo todos os itens.

Solicitação
curl -H "X-API-Key: sk_live_abc123..." \
  https://api.gosourced.ai/api/v1/requisitions/1234

Retorna o objeto completo da requisição. Retorna se não encontrada ou não pertencente à sua organização.

Verificar requisições existentes

POST/api/v1/requisitions/check-existingAPI Key obrigatória

Verificar quais external_ids já existem no Sourced antes de importar. Útil para evitar chamadas desnecessárias à API.

Corpo da solicitação

CampoTipoObrigatórioDescrição
external_idsarrayobrigatórioLista de strings external_id para verificar (1-100 itens).
Solicitação
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"]
  }'
Resposta — 200 OK
{
  "existing": ["REQ-2026-0042"],
  "not_found": ["REQ-2026-0043", "REQ-2026-0044"]
}

Cancelar requisição

POST/api/v1/requisitions/cancelAPI Key obrigatória

Cancelar uma requisição PENDING enviando o external_id no corpo da requisição.

Apenas requisições com status podem ser canceladas. Se a requisição já foi lançada como Solicitação de Compra, deve ser cancelada dentro do Sourced.

CampoTipoObrigatórioDescrição
external_idstringobrigatórioO ID da requisição no seu sistema externo (o mesmo usado na importação)
reasonstringopcionalMotivo do cancelamento (armazenado para auditoria)
Solicitação
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"
  }'
Resposta — 200 OK
{
  "status": "discarded",
  "external_id": "REQ-2026-0042"
}

Respostas possíveis:

  • discardedA requisição foi descartada com sucesso.
  • already_discardedA requisição já estava descartada (idempotente).
  • already_supersededA requisição já foi substituída por uma versão mais nova.
  • A requisição já foi lançada — retorna com detalhes.
  • Requisição não encontrada — retorna .

Listar ordens de compra

GET/api/v1/purchase-ordersAPI Key obrigatória

Obter ordens de compra da sua organização. Suporta sincronização incremental através do parâmetro 'since'.

Parâmetros de consulta

CampoTipoObrigatórioDescrição
pageintegeropcionalNúmero da página (padrão: 1).
page_sizeintegeropcionalItens por página, 1-100 (padrão: 20).
statusstringopcionalFiltrar por status: "DRAFT", "CREATED", "SENT", "CONFIRMED", "REJECTED", "CANCELLED".
sincedatetimeopcionalTimestamp ISO 8601. Retorna apenas OC criadas ou atualizadas após esta data.
requisition_external_idstringopcionalFiltrar pelo external_id da requisição original no seu ERP. Retorna as OC geradas a partir dessa requisição.
Solicitação — Sincronização 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"
Resposta — 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",
          "buyer_code": "MAT-001234",
          "buyer_code_system": "SAP",
          "manufacturer_code": "6205-2RS",
          "technical_specs": "220V, 50Hz, IP55"
        }
      ]
    }
  ],
  "total": 12,
  "page": 1,
  "page_size": 20,
  "has_more": false
}

Detalhe da ordem de compra

GET/api/v1/purchase-orders/{po_id}API Key obrigatória

Obter uma ordem de compra individual pelo seu ID interno do Sourced, incluindo todos os itens de linha com rastreabilidade de volta ao seu ERP via external_line_id.

Solicitação
curl -H "X-API-Key: sk_live_abc123..." \
  https://api.gosourced.ai/api/v1/purchase-orders/567
Procurando OCs pelo ID da requisição do seu sistema?

Este endpoint requer o ID interno do Sourced (). Se você precisa buscar ordens de compra usando o ID de requisição do seu ERP, use o endpoint com o query parameter :

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

Você também pode combinar com outros filtros: para filtrar por status da OC, para sincronização incremental, e / para paginação.

Objeto Ordem de Compra

CampoTipoObrigatórioDescrição
idintegerobrigatórioID interno da OC no Sourced.
codestringobrigatórioCódigo legível da OC.
statusstringobrigatórioStatus da OC: "DRAFT", "CREATED", "SENT", "CONFIRMED", "REJECTED", "CANCELLED".
award_typestringopcionalTipo de adjudicação: FULL (fornecedor único) ou PARTIAL (adjudicação dividida entre múltiplos fornecedores).
supplier_namestringobrigatórioNome do fornecedor.
supplier_idintegeropcionalID interno do fornecedor no Sourced.
total_pricefloatopcionalValor total da OC.
currencystringopcionalCódigo da moeda.
delivery_addressstringopcionalEndereço de entrega.
delivery_address_codestringopcionalCódigo do endereço de entrega da organização vinculado (ex. "001"). Use-o para mapear o destino no seu ERP. Null para endereços de texto livre sem registro vinculado.
observationsstringopcionalComentários ou observações em texto livre inseridos pelo comprador na etapa de revisão pré-adjudicação. Usa as condições especiais cotadas pelo fornecedor quando o comprador não deixou nota. Null quando não há nenhuma.
delivery_lead_time_daysintegeropcionalPrazo de entrega em dias, conforme cotado pelo fornecedor a nível de cabeçalho. Quando o fornecedor cota prazos diferentes por linha, os itens podem ter valores distintos — use items[].delivery_lead_time_days para o valor por linha.
expected_delivery_datedatetimeopcionalData de entrega calculada (awarded_at + delivery_lead_time_days). Null se faltar qualquer um dos dois. Para datas por linha use items[].expected_delivery_date.
payment_terms_codestringopcionalCódigo das condições de pagamento.
awarded_atdatetimeopcionalQuando a OC foi adjudicada (ISO 8601).
awarded_by_namestringopcionalNome do usuário que adjudicou a OC.
awarded_by_emailstringopcionalEmail do usuário que adjudicou a OC.
created_atdatetimeopcionalTimestamp de criação (ISO 8601).
updated_atdatetimeopcionalTimestamp da última atualização (ISO 8601).
purchase_request_idintegeropcionalID da solicitação de compra originária.
requisition_external_idstringopcionalID do documento de origem no seu ERP (ex. número de requisição em Calipso/SAP/JDE). Resolvido a partir da ERPRequisition de origem quando disponível; caso contrário, recorre ao external_id da PR. Pode ser uma lista separada por vírgulas quando uma única PR agrega múltiplas requisições de origem.
exchange_rate_dataobjectopcionalTaxas de câmbio no momento do award. Formato: {"date": "2026-03-05", "usdToArs": 1450.0, "arsToUsd": 0.00069}. Null se não houver dados disponíveis.
total_nominal_savingsfloatopcionalEconomia nominal total vs preços históricos (sem ajuste por inflação).
total_real_savingsfloatopcionalEconomia real total vs preços históricos (ajustada por inflação).
savings_currencystringopcionalMoeda dos valores de economia.
itemsarrayobrigatórioItens de linha da OC. Veja o esquema de Item de OC abaixo.

Objeto Item de OC

CampoTipoObrigatórioDescrição
descriptionstringobrigatórioDescrição do item.
quantityfloatopcionalQuantidade pedida.
unit_pricefloatopcionalPreço por unidade.
total_pricefloatopcionalPreço total da linha (quantidade x preço unitário).
unit_of_measurestringopcionalUnidade de medida.
currencystringopcionalCódigo da moeda.
delivery_lead_time_daysintegeropcionalPrazo de entrega em dias para esta linha, conforme cotado pelo fornecedor. Itens diferentes da mesma OC podem ter prazos distintos.
expected_delivery_datedatetimeopcionalData de entrega calculada para esta linha (PO.awarded_at + delivery_lead_time_days do item). Null se faltar qualquer um dos dois.
external_line_idstringopcionalID de linha original do seu ERP — use para vincular itens da OC às suas linhas de requisição.
buyer_codestringopcionalCódigo interno no seu sistema, exatamente como enviado ao importar a requisição (ex: "MAT-001234").
buyer_code_systemstringopcionalSistema de origem do código interno (ex: "SAP", "JDE", "Calipso").
buyer_code_descriptionstringopcionalDescrição do código interno.
manufacturer_codestringopcionalNúmero de peça do fabricante.
manufacturer_namestringopcionalNome do fabricante (ex: "Siemens").
manufacturer_descriptionstringopcionalDescrição do fabricante para a peça.
technical_specsstringopcionalEspecificações técnicas em texto livre (ex: "220V, 50Hz, IP55").
requirementsstringopcionalRequisitos adicionais (ex: "Certificação ISO 9001 exigida").
Sobre datas e prazos de entrega
  • O prazo de entrega existe em dois níveis: a nível de cabeçalho (reflete o prazo geral cotado pelo fornecedor) e a nível de linha (preciso por item). Quando o fornecedor cota prazos diferentes por linha, prefira o valor por linha.
  • é um campo calculado: . O Sourced calcula; o fornecedor não envia uma data diretamente.
  • Se for null, também será null. Isso normalmente significa que o fornecedor não incluiu o prazo na cotação.

Baixar o legajo da OC (dossiê)

GET/api/v1/purchase-orders/{po_id}/legajoAPI Key obrigatória

Obtenha um link temporário para baixar o legajo — um ZIP com a trilha de auditoria completa da adjudicação: PDF/XLSX comparativo, histórico de e-mails e os anexos de todos os fornecedores participantes.

Solicitação
curl -H "X-API-Key: sk_live_abc123..." \
  https://api.gosourced.ai/api/v1/purchase-orders/567/legajo

Objeto de resposta

CampoTipoObrigatórioDescrição
download_urlstringobrigatórioURL pré-assinada temporária para baixar o ZIP do legajo.
filenamestringobrigatórioNome sugerido para o arquivo ZIP.
expires_inintegerobrigatórioSegundos até a URL de download expirar.
size_bytesintegerobrigatórioTamanho do ZIP do legajo em bytes.
Como funciona o legajo
  • A resposta é uma URL pré-assinada temporária (válida ~10 minutos). Baixe o ZIP diretamente dela — essa URL não requer API key.
  • O legajo corresponde à requisição (PR) por trás da OC. Em uma adjudicação dividida (várias OCs de uma mesma requisição), as OCs irmãs retornam o mesmo dossiê.

Comparativo de cotações da OC

GET/api/v1/purchase-orders/{po_id}/quotationsAPI Key obrigatória

Obtenha o comparativo completo de cotações que originou esta adjudicação: todas as linhas cotadas por cada fornecedor para a solicitação (PR) por trás da OC, adjudicadas e não adjudicadas — não apenas as que terminaram nesta OC.

Solicitação
curl -H "X-API-Key: sk_live_abc123..." \
  https://api.gosourced.ai/api/v1/purchase-orders/567/quotations
Resposta — 200 OK
{
  "purchase_order_id": 567,
  "purchase_order_code": "PO-4F2A91C3",
  "requisition_external_id": "REQ-2026-0042",
  "items": [
    {
      "material_code": "MAT-000123",
      "external_line_id": "10",
      "description": "Guantes de nitrilo talle L",
      "quantity": 500.0,
      "quotes": [
        {
          "supplier_name": "Proveedor A S.A.",
          "supplier_tax_id": "30516242775",
          "supplier_erp_code": "PROV-001",
          "unit_price": 12.5,
          "currency": "ARS",
          "quantity": 500,
          "awarded": true,
          "awarded_po_code": "PO-4F2A91C3",
          "lead_time_days": 7,
          "payment_term_code": "NET30",
          "response_status": "PARTIAL",
          "received_at": "2026-07-10T14:32:00"
        },
        {
          "supplier_name": "Proveedor B S.R.L.",
          "supplier_tax_id": "30709876541",
          "supplier_erp_code": null,
          "unit_price": 13.9,
          "currency": "ARS",
          "quantity": 500,
          "awarded": false,
          "awarded_po_code": null,
          "lead_time_days": 15,
          "payment_term_code": null,
          "response_status": "INCOMPLETE",
          "received_at": "2026-07-11T09:05:00"
        }
      ]
    }
  ]
}

Objeto de resposta

CampoTipoObrigatórioDescrição
purchase_order_idintegerobrigatórioID da OC consultada.
purchase_order_codestringobrigatórioCódigo da OC consultada (ex.: PO-4F2A91C3).
requisition_external_idstringopcionalID externo da requisição de origem (sistema ERP), se houver.
itemsarrayobrigatórioLinhas da solicitação por trás da OC, cada uma com suas cotações.

Objeto item (items[])

CampoTipoObrigatórioDescrição
material_codestringopcionalCódigo de material do comprador, se a linha tiver um.
external_line_idstringopcionalID da linha no sistema de origem (ERP), se houver.
descriptionstringobrigatórioDescrição do item solicitado.
quantityfloatopcionalQuantidade solicitada.
quotesarrayobrigatórioCotações recebidas para esta linha, uma por fornecedor que cotou com preço.

Objeto cotação (items[].quotes[])

CampoTipoObrigatórioDescrição
supplier_namestringopcionalNome do fornecedor que cotou.
supplier_tax_idstringopcionalIdentificador fiscal do fornecedor (CNPJ no Brasil, CUIT na Argentina, RUT no Chile/Uruguai).
supplier_erp_codestringopcionalCódigo ERP do fornecedor na sua organização, se configurado.
unit_pricefloatopcionalPreço unitário cotado, na moeda original do fornecedor.
currencystringopcionalMoeda da cotação (código ISO, ex.: BRL, USD).
quantityfloatopcionalQuantidade cotada pelo fornecedor.
awardedbooleanobrigatóriotrue se esta linha foi adjudicada a este fornecedor em alguma OC ativa da solicitação.
awarded_po_codestringopcionalCódigo da OC onde a linha foi adjudicada (pode ser uma OC irmã em adjudicação dividida). null se não foi adjudicada.
lead_time_daysintegeropcionalPrazo de entrega ofertado, em dias.
payment_term_codestringopcionalCódigo da condição de pagamento ofertada pelo fornecedor.
response_statusstringopcionalClassificação da análise de IA da resposta do fornecedor. Valores como INCOMPLETE, PARTIAL, NEEDS_HUMAN_REVIEW, EXPLICIT_REJECTION.
received_atdatetimeopcionalData e hora de recebimento da cotação (ISO 8601).
Como ler o comparativo
  • O comparativo corresponde à solicitação (PR) por trás da OC: inclui as cotações de todos os fornecedores participantes, mesmo os que não venceram. Uma linha cotada sem preço não gera entrada em quotes; uma OC de catálogo (sem processo de cotação) retorna quotes vazios.
  • é no nível da solicitação: em uma adjudicação dividida, uma linha pode ter sido adjudicada em uma OC irmã diferente da consultada — sempre indica o código da OC vencedora daquela linha.
  • Os preços são retornados brutos, na moeda cotada por cada fornecedor — nenhuma conversão de moeda é aplicada.
  • Todas as chaves estão sempre presentes; se um dado faltar, o valor é null (o formato da resposta nunca muda).

Atualizar status da ordem de compra

POST/api/v1/purchase-orders/{po_id}/statusAPI Key obrigatória

Atualizar o status de uma ordem de compra para refletir seu progresso no seu sistema externo (ERP).

Transições de status permitidas:

DeParaSignificado
DRAFTCREATEDA OC foi criada no seu ERP.
CREATEDCONFIRMEDA OC foi totalmente aprovada no seu ERP.
DRAFTCONFIRMEDAtalho quando não é necessário o passo intermediário.
DRAFTREJECTEDA OC foi rejeitada no seu ERP. A PR é reaberta no Sourced.
CREATEDREJECTEDA OC foi rejeitada no seu ERP após ter sido criada. A PR é reaberta no Sourced.
DRAFT / CREATED / SENT / CONFIRMEDCANCELLEDA compra não vai acontecer. A OC é cancelada e a PR também — nada é reaberto. Use REJECTED se a necessidade ainda existir e você quiser readjudicar.

e também funcionam quando a OC foi uma adjudicação parcial, desde que seja a única OC ativa da sua PR. Se a PR tiver várias OCs ativas (split entre fornecedores), o endpoint retorna e a reversão deve ser gerenciada dentro do Sourced.

CampoTipoObrigatórioDescrição
statusstringobrigatórioStatus destino: CREATED (OC criada no seu ERP), CONFIRMED (OC aprovada no seu ERP), REJECTED (OC rejeitada, reabre a PR) ou CANCELLED (compra cancelada, cancela a OC e a PR).
external_idstringopcionalNúmero ou código da OC no seu ERP (ex: OC-CAL-00045678). Armazenado para rastreabilidade.
notesstringopcionalNotas opcionais sobre a mudança de status.
Solicitação
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"
  }'
Resposta — 200 OK
{
  "status": "created",
  "po_id": 567,
  "code": "PO-A1B2C3D4"
}

Editar uma OC

PATCH/api/v1/purchase-orders/{po_id}API Key obrigatória

Atualiza os campos editáveis de uma ordem de compra. Apenas os campos presentes no body são alterados: número da OC no seu ERP, condição de pagamento, prazo de entrega, observações e status (mesma máquina de transições do POST /status).

Corpo da solicitação

CampoTipoObrigatórioDescrição
external_idstringopcionalNúmero ou código da OC no seu ERP. Sobrescreve o valor armazenado.
payment_terms_codestringopcionalCódigo da condição de pagamento do catálogo (ex.: NET30). Não diferencia maiúsculas; validado contra os códigos ativos — um código desconhecido retorna 400 com a lista permitida.
delivery_lead_time_daysintegeropcionalPrazo de entrega em dias a partir da confirmação da OC. expected_delivery_date deriva deste valor.
observationsstringopcionalTexto livre exibido na OC. Uma string vazia o limpa.
statusstringopcionalStatus de destino: CREATED, CONFIRMED, REJECTED ou CANCELLED — mesmas transições do POST /status. Enviar o status atual é um no-op. REJECTED/CANCELLED retornam o contrato desses fluxos (pr_reopened / pr_code) mais updated_fields.
notesstringopcionalNotas sobre a mudança de status. Válido apenas junto com status.
Solicitação
curl -X PATCH https://api.gosourced.ai/api/v1/purchase-orders/567 \
  -H "X-API-Key: sk_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "external_id": "OC-CAL-00045678",
    "payment_terms_code": "NET30",
    "status": "CONFIRMED"
  }'
Resposta — 200 OK
{
  "status": "updated",
  "po_id": 567,
  "code": "PO-A1B2C3D4",
  "updated_fields": ["external_id", "payment_terms_code", "status"]
}
Semântica do PATCH
  • Partial update real: apenas os campos presentes no body são aplicados. null explícito é um erro (400) — para deixar um campo como está, omita-o.
  • Toda a validação roda antes de aplicar qualquer coisa: em uma resposta 400 ou 409, nenhum campo do body foi modificado.
  • A mudança de status usa a mesma máquina de transições do (que continua disponível). Uma transição inválida retorna 409. Editar uma OC CANCELLED ou REJECTED retorna 409.
  • Alterar a condição de pagamento ou o prazo de entrega não regenera o PDF que o fornecedor já recebeu: o dado é atualizado no Sourced, mas o documento enviado não muda.
  • O conteúdo da adjudicação (preços, itens, moeda, fornecedor) não é editável: para corrigi-lo, rejeite a OC (status REJECTED) e adjudique novamente.

Listar fornecedores

GET/api/v1/suppliersAPI Key obrigatória

Listar os fornecedores da sua organização. Use ?has_erp_code=false para encontrar fornecedores sem mapear. Use ?detail=full para contatos, categorias e cobertura.

Parâmetros de consulta

CampoTipoObrigatórioDescrição
pageintegeropcionalNúmero da página (padrão: 1).
page_sizeintegeropcionalResultados por página (1-200, padrão: 50).
searchstringopcionalBuscar por nome, nome personalizado, email, CNPJ/CUIT ou código ERP.
erp_codestringopcionalFiltrar por código ERP exato.
has_erp_codebooleanopcionaltrue = apenas mapeados ao ERP, false = apenas sem mapear.
detailstringopcionalUse 'full' para incluir contatos, categorias e cobertura.
Solicitação
# 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"
Resposta — 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
}

Criar fornecedor

POST/api/v1/suppliersAPI Key obrigatória

Criar um fornecedor para sua organização. Pelo menos um de tax_id ou erp_code é obrigatório. Pelo menos um contato com papel 'sales' é obrigatório. Se já existir um fornecedor global com o mesmo CNPJ/CUIT, ele é reutilizado e vinculado à sua organização.

Corpo da solicitação

CampoTipoObrigatórioDescrição
namestringobrigatórioNome do fornecedor para sua organização.
tax_idstringopcionalCNPJ, CUIT, RUT, etc. Pelo menos um de tax_id ou erp_code é obrigatório.
erp_codestringopcionalCódigo do fornecedor no seu ERP. Pelo menos um de tax_id ou erp_code é obrigatório.
erp_typestringopcionalTipo de ERP (SAP_B1, JDE, ORACLE_CLOUD, etc.).
country_codestringopcionalCódigo de país ISO 3166-1 (ex: AR, BR, US).
citystringopcionalCidade do fornecedor.
addressstringopcionalEndereço completo.
state_codestringopcionalEstado/província (ex: SP, RJ).
websitestringopcionalSite do fornecedor.
contactsarrayobrigatórioLista de contatos. Pelo menos um com papel 'sales' é obrigatório.
contacts[].namestringobrigatórioNome do contato.
contacts[].emailstringobrigatórioEmail do contato.
contacts[].phonestringopcionalTelefone (opcional).
contacts[].rolestringobrigatórioPapel: SALES ou LOGISTICS.
contacts[].is_primarybooleanopcionaltrue se for o contato principal (padrão: false).
Solicitação
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"
      }
    ]
  }'
Resposta — 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": []
}

Referência de esquemas

Referência rápida de todos os esquemas de solicitação/resposta usados nos endpoints.

Status de requisição

StatusDescrição
PENDINGImportada, aguardando revisão de um comprador no Sourced.
LAUNCHEDO comprador lançou a requisição como Solicitação de Compra.
DISCARDEDA requisição foi descartada manualmente.
SUPERSEDEDUma versão mais nova foi importada com o mesmo external_id.

Status de ordem de compra

StatusDescrição
DRAFTOC criada no Sourced, pendente de sincronização com o ERP externo.
CREATEDOC criada no ERP externo, pendente de aprovação.
CONFIRMEDOC totalmente aprovada no ERP externo.
REJECTEDOC rejeitada no ERP externo. A PR associada é reaberta automaticamente.
CANCELLEDCompra cancelada. A OC é cancelada e a PR associada também — nada é reaberto.
Em breve serão adicionados estados adicionais como RECEIVED (mercadoria recebida), INVOICED (faturada), entre outros, para refletir o ciclo de vida completo da ordem de compra.

Códigos de referência

Catálogos de moedas e tipos de pagamento aceitos pela API. Use-os para mapear esses valores com os códigos equivalentes no seu ERP.

Moedas

O Sourced não usa um enum fechado de moedas: qualquer código ISO 4217 válido de 3 letras é aceito. As moedas mais utilizadas pelos nossos clientes são:

CódigoMoeda
ARSPeso argentino
USDDólar americano
EUREuro
BRLReal brasileiro
Envie o código ISO 4217 diretamente no campo currency (ex: "currency": "EUR"). O Sourced o persiste como está e o devolve igual nas respostas.

Tipos de pagamento (payment_terms_code)

Catálogo global de condições de pagamento disponíveis no Sourced. Use o código (coluna Code) no campo payment_terms_code da PO. O campo type indica a natureza do pagamento: IMMEDIATE (no recebimento), ADVANCE (antecipado), NET_DAYS (a X dias da fatura).

CódigoNomeTipoDiasDescrição
CODCash On DeliveryIMMEDIATE0Pagamento contra entrega
IMMImmediate PaymentIMMEDIATE0Pagamento imediato / À vista
ADV100Advance PaymentADVANCE0Pagamento antecipado 100%
ADV50Advance 50%ADVANCE0Pagamento antecipado de 50%
NET7Net 7 DaysNET_DAYS7Pagamento em 7 dias da data da fatura
NET10Net 10 DaysNET_DAYS10Pagamento em 10 dias da data da fatura
NET15Net 15 DaysNET_DAYS15Pagamento em 15 dias da data da fatura
NET20Net 20 DaysNET_DAYS20Pagamento em 20 dias da data da fatura
NET21Net 21 DaysNET_DAYS21Pagamento em 21 dias da data da fatura
NET30Net 30 DaysNET_DAYS30Pagamento em 30 dias da data da fatura
EOM30End of Month + 30NET_DAYS30Pagamento no fim do mês mais 30 dias
NET35Net 35 DaysNET_DAYS35Pagamento em 35 dias da data da fatura
NET40Net 40 DaysNET_DAYS40Pagamento em 40 dias da data da fatura
NET45Net 45 DaysNET_DAYS45Pagamento em 45 dias da data da fatura
NET60Net 60 DaysNET_DAYS60Pagamento em 60 dias da data da fatura
NET75Net 75 DaysNET_DAYS75Pagamento em 75 dias da data da fatura
NET90Net 90 DaysNET_DAYS90Pagamento em 90 dias da data da fatura
O catálogo é global em toda a plataforma e raramente muda. Se você precisar de um código adicional para sua integração, entre em contato.

Unidades de medida

Códigos de unidade de medida aceitos em itens de requisições. Enviados no campo unit_of_measure.

CódigoUnidade
EAUnidade
PCSPeças
KGQuilograma
GGrama
LBLibra
OZOnça
MMetro
CMCentímetro
MMMilímetro
INPolegada
FT
YDJarda
LLitro
MLMililitro
GALGalão
QTQuarto de galão
PTPinta
FL_OZOnça líquida
M2Metro quadrado
CM2Centímetro quadrado
FT2Pé quadrado
IN2Polegada quadrada
YD2Jarda quadrada
M3Metro cúbico
CM3Centímetro cúbico
FT3Pé cúbico
IN3Polegada cúbica
YD3Jarda cúbica
BOXCaixa
CASECaixa/Estojo
PACKPacote
SETJogo
KITKit
BUNDLEFardo
ROLLRolo
SHEETFolha/Lâmina
PALLETPalete
DRUMTambor/Barril
BAGSaco
BOTTLEGarrafa
CENCentena
Se você enviar uma unidade não reconhecida, ela é armazenada como está. Recomendamos usar os códigos padrão para que a IA possa normalizar corretamente as cotações dos fornecedores.

Fluxo de integração

Padrão de integração típico para uma sincronização ERP agendada (ex: cron job a cada 15 minutos):

1

Coletar novas requisições do ERP

Consultar seu ERP por requisições aprovadas que ainda não foram sincronizadas com o Sourced.

2

Verificar existentes (opcional)

Chamar POST /requisitions/check-existing com external_ids para filtrar requisições já sincronizadas.

3

Importar requisições

Chamar POST /requisitions com o lote de requisições novas/atualizadas. Armazenar os requisition_ids retornados.

4

Consultar novas ordens de compra

Chamar GET /purchase-orders?since={last_sync_timestamp}&status=DRAFT para obter OC novas. Criar a OC no seu ERP e chamar POST /purchase-orders/{id}/status com {"status": "CREATED"}.

5

Confirmar OCs aprovadas

Quando a OC for aprovada no seu ERP, chamar POST /purchase-orders/{id}/status com {"status": "CONFIRMED"} para fechar o ciclo.

Pseudocódigo — Cron job de sincronização
# 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"

Exemplo completo

Uma solicitação de importação realista com todos os campos disponíveis preenchidos:

Solicitação de importação 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,
        "created_date": "2026-03-04T09:15:00Z",
        "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"
        }
      }
    ]
  }'
Resposta — 200 OK
{
  "success": true,
  "created_count": 1,
  "updated_count": 0,
  "skipped_count": 0,
  "error_count": 0,
  "errors": [],
  "requisition_ids": [1234]
}