addrbookFor publishers
← The evidence ledger

Evidence row 577926

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint 36c11ce0-a7f8-4ea5-9fa2-8a91d83314be
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
096fd8deb92de6eb9330fc078b3651f73f5e4c57a8b62de96fd855363c7b83f1
Leaf
0x0cb43d94b37e0fcd3c4544af55f03c6a5ea78590745c6590b117b46ee16d755c

What was observed

{
  "count": 3,
  "tools": [
    {
      "description": "Call this before using any dataset. Returns a deterministic quality verdict (RELIABLE / USABLE_WITH_CLEANING / UNRELIABLE) with exact facts: completeness, nulls, type consistency, impossible values, duplicates, outliers, and (on financial/trading data) cross-source price divergence. 100% deterministic, no LLM. Free -- this MCP endpoint runs the engine directly; POST /api (plain REST, same engine) is x402-gated at $0.01/call instead. Input: rawJson (a JSON array of row objects, or a single object); datasetId is accepted but not resolvable on this deployment -- pass rawJson instead.",
      "inputSchema": {
        "properties": {
          "datasetId": {
            "description": "An Apify dataset id. Not resolvable on this deployment; pass rawJson instead.",
            "type": "string"
          },
          "rawJson": {
            "description": "The dataset: a JSON array of row objects, or a single object."
          }
        },
        "type": "object"
      },
      "name": "check_dataset_quality"
    },
    {
      "description": "PAID TIER, CALLED FROM A FREE ENDPOINT -- READ THIS FIRST: this tool does NOT return your cleaned data, and its response has NO `data` key. It returns {\"status\": \"payment_required\", \"what_we_found_in_your_data\": {...}, \"get_the_repaired_data\": {...}}. Do not treat its output as cleaned data and do not write it back into your dataset.\nWHAT YOU GET HERE, FREE: an exact inventory of the defects in YOUR data -- which repair rules would fire, how many values each would change, and which cases cannot be repaired safely and need your decision.\nHOW TO GET THE REPAIRED DATA: make the one call named in `get_the_repaired_data` -- POST https://www.aidatatools.dev/api/clean, $0.04 via x402, no account, no API key, no signup. That response body IS the cleaned dataset, in the shape you posted it.\nWHY THE SPLIT: detection is free on this endpoint and always has been (check_dataset_quality reports the same defects). The repaired artifact is the paid product, because it is re-bought on every extraction run rather than cached like a verdict.\nWHAT THE PAID CALL DOES: removes leftover HTML tags and entities, decodes mojibake ('Café' -> 'Café'), strips invisible characters (zero-width, BOM, soft hyphen), normalises non-breaking spaces and trims values -- across nested objects and arrays too. 100% deterministic, no LLM: the same input always yields byte-identical output, and cleaning twice equals cleaning once. It repairs how data was ENCODED, never what it SAYS: masked placeholders ('N/A', 'None'), near-duplicate rows and failed extractions ('access denied', 'captcha', which mean that record must be re-scraped) are reported with a proposal, never silently deleted or rewritten. The full boundary -- 7 rules applied automatically, 5 needing an explicit opt-in, 8 only ever reported -- is at GET https://www.aidatatools.dev/api/clean.",
      "inputSchema": {
        "properties": {
          "options": {
            "description": "All optional. Every default is the safe one: with no options, the row count, every value's type, and the schema are all guaranteed unchanged.",
            "properties": {
              "coerce_numeric_text": {
                "description": "Turn 'US $5.59' into 5.59. Per field, all-or-nothing, and only where every value is unambiguous -- a lone ',' or a mixed currency disqualifies the whole field rather than being guessed at.",
                "type": "boolean"
              },
              "detect_duplicates": {
                "description": "Default true. Set false to skip duplicate detection on very large input.",
                "type": "boolean"
              },
              "drop_exact_duplicates": {
                "description": "Remove rows byte-identical to an earlier row, compared AFTER cleaning. Off by default because it changes the row count; duplicates are reported either way.",
                "type": "boolean"
              },
              "placeholder_policy": {
                "description": "What to do with masked-missing strings. 'flag' (default) reports them and changes nothing. 'null_high_confidence' nulls only tokens that cannot be real data ('N/A', 'null', 'undefined') and never the ambiguous ones ('None' is a surname, 'NA' is Namibia, '-' is a real value). 'null_all' nulls the ambiguous ones too -- only choose this if you know the domain.",
                "enum": [
                  "flag",
                  "null_high_confidence",
                  "null_all"
                ],
                "type": "string"
              },
              "repair_keys": {
                "description": "Also repair dict KEYS (the classic '\\ufeffsku' first column of a BOM-prefixed CSV export). Off by default: a key is a contract with everything downstream.",
                "type": "boolean"
              },
              "trim_whitespace": {
                "description": "Default true.",
                "type": "boolean"
              }
            },
            "type": "object"
          },
          "rawJson": {
            "description": "The scraper output: a JSON array of row objects, a single object, or a CSV/plain-text string. The format is detected and the output mirrors the shape you sent."
          }
        },
        "required": [
          "rawJson"
        ],
        "type": "object"
      },
      "name": "clean_scraped_data"
    },
    {
      "description": "PAID TIER, CALLED FROM A FREE ENDPOINT -- READ THIS FIRST: this tool does NOT return your cleaned data, and its response has NO `data` key. It returns {\"status\": \"payment_required\", \"what_we_found_in_your_data\": {...}, \"get_the_repaired_data\": {...}}. Do not treat its output as cleaned data and do not write it back into your dataset.\nWHAT YOU GET HERE, FREE: an exact inventory of the defects in YOUR data -- which repair rules would fire, how many values each would change, and which cases cannot be repaired safely and need your decision.\nHOW TO GET THE REPAIRED DATA: make the one call named in `get_the_repaired_data` -- POST https://www.aidatatools.dev/api/clean/audit, $0.12 via x402, no account, no API key, no signup. That response body IS the cleaned dataset, in the shape you posted it.\nWHY THE SPLIT: detection is free on this endpoint and always has been (check_dataset_quality reports the same defects). The repaired artifact is the paid product, because it is re-bought on every extraction run rather than cached like a verdict.\nWHAT THE PAID CALL DOES: the same repair as clean_scraped_data, plus a complete audit trail: every transformation with its path, rule, before and after value, a replay_id, and input/output SHA-256. The ledger is a full inverse patch -- applying it in reverse reconstructs your original input byte for byte. Use it when you must be able to PROVE later what changed and why.",
      "inputSchema": {
        "properties": {
          "options": {
            "description": "All optional. Every default is the safe one: with no options, the row count, every value's type, and the schema are all guaranteed unchanged.",
            "properties": {
              "coerce_numeric_text": {
                "description": "Turn 'US $5.59' into 5.59. Per field, all-or-nothing, and only where every value is unambiguous -- a lone ',' or a mixed currency disqualifies the whole field rather than being guessed at.",
                "type": "boolean"
              },
              "detect_duplicates": {
                "description": "Default true. Set false to skip duplicate detection on very large input.",
                "type": "boolean"
              },
              "drop_exact_duplicates": {
                "description": "Remove rows byte-identical to an earlier row, compared AFTER cleaning. Off by default because it changes the row count; duplicates are reported either way.",
                "type": "boolean"
              },
              "placeholder_policy": {
                "description": "What to do with masked-missing strings. 'flag' (default) reports them and changes nothing. 'null_high_confidence' nulls only tokens that cannot be real data ('N/A', 'null', 'undefined') and never the ambiguous ones ('None' is a surname, 'NA' is Namibia, '-' is a real value). 'null_all' nulls the ambiguous ones too -- only choose this if you know the domain.",
                "enum": [
                  "flag",
                  "null_high_confidence",
                  "null_all"
                ],
                "type": "string"
              },
              "repair_keys": {
                "description": "Also repair dict KEYS (the classic '\\ufeffsku' first column of a BOM-prefixed CSV export). Off by default: a key is a contract with everything downstream.",
                "type": "boolean"
              },
              "trim_whitespace": {
                "description": "Default true.",
                "type": "boolean"
              }
            },
            "type": "object"
          },
          "rawJson": {
            "description": "The scraper output: a JSON array of row objects, a single object, or a CSV/plain-text string. The format is detected and the output mirrors the shape you sent."
          }
        },
        "required": [
          "rawJson"
        ],
        "type": "object"
      },
      "name": "clean_scraped_data_audited"
    }
  ]
}

What the leaf hashes

{"body":"096fd8deb92de6eb9330fc078b3651f73f5e4c57a8b62de96fd855363c7b83f1","id":577926,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793142795916088,"prev":null,"subject":"36c11ce0-a7f8-4ea5-9fa2-8a91d83314be","subject_kind":"endpoint"}

Proof

Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (273461 rows).

  1. 0x0cb485ecf80e02226cc58b374a31add22f59c285c643d2345108341db84cc401
  2. 0xac361ae58f90e800921607a5060de2ac0034ebc0309f3f45d41032a550ed0148
  3. 0x892c03b2618900c3ae3e1f5dcbdc5417f5c949649e6b85a1c290b8bb4a12aca5
  4. 0xc5a2fc5795e806f42d49a0643ff0edcee2cb7d7955b4c651f189a41ea1a789a9
  5. 0xad64735beaf81fecc3147301308b2e0dc1a432123cca97fe6b6552a4a20a5b5e
  6. 0xfb9de0ca92043e7d4302f22a9c8cdf7091e307720847276d022bf0a30703fcf3
  7. 0xd575d1d472fcd925aa8804896f39c5e5a421b676e386f8c6a780ace48d9e40aa
  8. 0x0681643740fb35d402a722a9849c72881bce2d9c6c740eb453b8e1bb14979381
  9. 0xc8c3507d7df6defaf7a4b03e3470c9a3b230a168ddfcaa8f524d9252074e2806
  10. 0x40832a45560c5ee93b4be87c5e6cdc288752ff9669572deda76eb82682ef2fa2
  11. 0x8ac7b6b9bf64392f96f8256d1e4c2ec0bc2f51d3c881619121a67aa022ebcb14
  12. 0x6e5a3640cff3f4cd1cd4f97ccb0c01e8a7f3fa240d9ef5f12ed8901892cd252e
  13. 0xa5d3d95b495ae2191612e64fe151fe065497e5ecb73bb111e1fabb6b3628f3de
  14. 0x3e0ec8a2a8a954695a9b53a4a48a7656d7e3fd6a8795c73b49e2ef05b201ec3f
  15. 0x2cf27e8a181d60d0dd27c186c2eddfcbb4e8fa71cf66feeb55a4d730e15ee8c4
  16. 0x518b93854db03dc9fc938883abf30da6eaae5ae0d4336903968fd32a7df8c71b
  17. 0x22c1fb9487ee0b9732fa017a0cc321eb27a60c08450d112f755089796e12cb1c
  18. 0xa20d48798a34aba12eb9c7297722982d910f06c148f5e27ac59307422964a585
  19. 0x9fc354c0ea3efc3f1b6548bb77ea902a50f2c9647647ea61592efce2bd795699
Day root
0xdd77e5e99da32c3f154180d63e3c3e6fe11e896a2c6896412ef6b5c4bcf7e795
Chained
0x23bb4dfd09f55c15ac3962f53578e02c6114d5bfd9bb451cf8794fb6e2817ef4
Published
On Arc Testnet, block 69414147: 0xb2ebd83aafeb765a0ce66e76aefb133ed06606c98038fd56191e2bcd1dcb77b4

How to check it · This row as JSON