{
  "data": {
    "id": "fu978jaBsGjwaKeUE",
    "userId": "tSqHK9xwQDTkwg3jm",
    "name": "tender-feed-normalizer",
    "username": "ultrathink-labs",
    "description": "Normalize CSV/JSON tender records, flag ambiguous values and duplicates, preserve source data, and sort clean rows by deadline.",
    "isPublic": true,
    "createdAt": "2026-09-20T22:05:15.158Z",
    "modifiedAt": "2026-09-23T17:24:09.754Z",
    "taggedBuilds": {
      "latest": {
        "buildId": "urHDwEfwJA4TUSvQR",
        "finishedAt": "2026-09-23T11:22:07.662Z",
        "buildNumberInt": 200010,
        "buildNumber": "0.2.10"
      },
      "astra-candidate": {
        "buildId": "urHDwEfwJA4TUSvQR",
        "finishedAt": "2026-09-23T11:22:07.662Z",
        "buildNumberInt": 200010,
        "buildNumber": "0.2.10"
      },
      "astra-mission6": {
        "buildId": "bnC2ddJV8DtuLaUzh",
        "finishedAt": "2026-09-23T17:24:09.754Z",
        "buildNumberInt": 200012,
        "buildNumber": "0.2.12"
      }
    },
    "stats": {
      "totalBuilds": 16,
      "totalRuns": 80,
      "totalUsers": 2,
      "totalUsers7Days": 1,
      "totalUsers30Days": 1,
      "totalUsers90Days": 1,
      "lastRunStartedAt": "2026-10-12T09:58:42.218Z",
      "actorReviewCount": 0,
      "actorReviewRating": 0,
      "bookmarkCount": 0,
      "publicActorRunStats30Days": {
        "ABORTED": 0,
        "FAILED": 0,
        "SUCCEEDED": 19,
        "TIMED-OUT": 0,
        "TOTAL": 19
      }
    },
    "versions": [
      {
        "versionNumber": "0.1",
        "sourceType": "SOURCE_FILES",
        "buildTag": "latest"
      },
      {
        "versionNumber": "0.2",
        "sourceType": "SOURCE_FILES",
        "buildTag": "astra-mission6"
      }
    ],
    "defaultRunOptions": {
      "build": "latest",
      "timeoutSecs": 120,
      "memoryMbytes": 128
    },
    "exampleRunInput": {
      "body": "{\"records\": [{\"title\": \"Example tender A (fictional)\", \"deadline\": \"2027-12-31\", \"buyer\": \"Example buyer\", \"reference\": \"EX-A\", \"value\": \"USD 12000\"}, {\"title\": \"Example tender B (fictional)\", \"deadline\": \"20270120\", \"buyer\": \"Other buyer\", \"reference\": \"EX-B\", \"value\": 5000, \"currency\": \"EUR\"}], \"currency\": \"USD\"}",
      "contentType": "application/json; charset=utf-8"
    },
    "categories": [
      "BUSINESS",
      "LEAD_GENERATION",
      "DEVELOPER_TOOLS"
    ],
    "isDeprecated": false,
    "title": "Tender & Procurement Feed Normalizer",
    "seoTitle": "Tender Feed Normalizer & Procurement Data Audit",
    "seoDescription": "Clean supplied tender CSV/JSON or Apify datasets. Flag date/value errors, duplicates and non-tender stages; retain source fields and SHA-256 receipts. No scraping.",
    "pricingInfos": [
      {
        "minimalMaxTotalChargeUsd": 0.00105,
        "pricingModel": "PAY_PER_EVENT",
        "isPriceChangeNotificationSuppressed": false,
        "pricingPerEvent": {
          "actorChargeEvents": {
            "apify-actor-start": {
              "eventTitle": "Actor Start",
              "eventDescription": "Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event).",
              "isOneTimeEvent": true,
              "eventPriceUsd": 0.00005
            },
            "normalized-tender": {
              "eventTitle": "Normalized tender",
              "eventDescription": "One clean tender row delivered to the dataset. Invalid and withheld rows are not charged.",
              "isOneTimeEvent": false,
              "eventPriceUsd": 0.001,
              "isPrimaryEvent": true
            }
          }
        },
        "startedAt": "2026-09-21T00:05:25.030Z",
        "createdAt": "2026-09-21T00:05:25.183Z",
        "apifyMarginPercentage": 0.2
      }
    ],
    "notice": "NONE",
    "isCritical": false,
    "isGeneric": false,
    "hasNoDataset": false,
    "isSourceCodeHidden": true,
    "standbyUrl": null,
    "actorPermissionLevel": "LIMITED_PERMISSIONS",
    "readmeSummary": "## Tender & Procurement Feed Normalizer\n\nNormalizes and audits procurement/tender feed rows by parsing and canonicalizing deadlines and monetary amounts, validating and checking currencies, flagging duplicates and conflicts, rejecting ambiguous or malformed records, and retaining original source provenance alongside normalized fields. Core processing includes strict date parsing (ISO plus specific human formats; compact YYYYMMDD and Unix-second/millisecond rules; ambiguous slash dates rejected), robust money parsing (unsigned decimals up to two fraction digits, grouped thousands handling, European grouping rules), currency detection from codes or symbols with a fixed supported-code list and canonicalization, and schema alias/mapping handshake to map arbitrary column names to standard semantic fields. The Actor performs within-run deduplication based on normalized identity (title + deadline + buyer + reference), reports conflicts when identity matches but amounts/currencies differ, supports an optional stage-gate to filter non-tender stages, and emits a validation summary with counts, per-row issue codes, duplicates/conflicts indices, and preserved original input rows. It also produces a reproducibility receipt using SHA-256 checksums over the selected input, effective settings, and delivered output to certify processing reproducibility.\n\n## Use cases\n\n- Audit and normalize scraper or upstream dataset output before importing tenders into a bid tracker or procurement system.  \n- Validate and canonicalize deadlines and monetary amounts for downstream ingestion and comparison.  \n- Detect and flag in-run duplicates and conflicts to prevent silent merges of differing amounts or currencies.  \n- Separate or batch feeds by expected currency and surface currency-mismatch issues for review.  \n- Apply an optional tender-stage gate to exclude non-tender (award/planning) rows from delivery.  \n- Preserve provenance and original source fields for review queues and manual reconciliation.  \n- Produce reproducibility receipts (SHA-256) for audit trails covering input, settings, and delivered normalized output.  \n- Map heterogeneous upstream schemas via an alias-and-mapping handshake to standard semantic fields before normalization.",
    "deploymentKey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCb+29d8l9mZ3RaV7u5Dch33QwelLPtCm0sK/yR8PmeD+V7cJq4hlCT8SDKFigHfifRcAf7/7Hf38zgxmx4oSMC9UXY4w/C7YCMoeymJTTY/mkZleNmHHkZ9Mgg9Jcr3paEG0APWJXiBkMZ+cC6AG5SdnftH7QRRAly+MAnSELW4bVINSZXQ0IC5WQdd6ac7CAx8k17SXXQyaIi2f4brwk+waH4fd1+DZsS1bI/jaatHab7XKdJ/lR3Tawk7Veipkonj8ows7KCQQuohYEI7yJ/62u1kf6nL65HnkkJppDKywZcbVh3ldyyHIPvFIsybFWb8dMFw9CD8kOHb1EA+lEF \n"
  }
}