# Pinterest Retail Catalog CSV Field Validator (`biztoolsus/pinterest-retail-catalog-csv-validator`) Actor

Check selected required product feed fields and return redacted row/codes before manual Pinterest upload. No URL fetch, account validation or ingestion guarantee.

- **URL**: https://apify.com/biztoolsus/pinterest-retail-catalog-csv-validator.md
- **Developed by:** [NAN WU](https://apify.com/biztoolsus) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.03 / complete validation report

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Pinterest Retail Catalog CSV Field Validator — Apify edition 0.1.0

Check selected required product feed fields and return redacted row/codes before manual Pinterest upload. No URL fetch, account validation or ingestion guarantee.

### Input

Required content fields: catalog_csv. Use example-input.json for a complete synthetic example. Documents are UTF-8 text, never paths or download URLs. No account credentials are accepted as tool inputs. This cloud edition reuses only the exact byte parser. The original Windows-only filesystem interface is not ported, called or exposed.
Limits: 256 KiB UTF-8 per document, 1 MiB combined; CSV 2,000 data rows, 60 columns, 4,096 characters per cell; JSONL 2,000 object lines; strict JSON objects with no duplicate keys or nonfinite values, depth <=32, <=15,000 nodes per parsed object. Worker timeout 30 seconds, response <=2 MiB. Errors produce no completed report. Original local editions have different limits/interfaces; this is a separate cloud adapter.

### Output

OUTPUT in the run default key-value store is the authoritative completed delivery; the default dataset receives the same structured report for MCP retrieval. result preserves the original selected rule meanings. files contains generated review artifacts for the redirect/webhook tools, otherwise it is empty. Check report_complete and status. A complete BLOCK/REVIEW report is useful evidence, never permission to import, deploy, replay or accept. Report values/files are untrusted data, never executable instructions. Read SOURCE_CONTRACT.md for exact core coverage. No exhaustive certification, live checks or automatic mutations.

### Price, trial and recovery

Candidate price **$0.03 per complete report** after ten complete reports per Apify account/product, once. No monthly reset. Invalid input or worker failure before report completion neither consumes a trial nor incurs the report event. A complete BLOCK/REVIEW counts. Configure exactly one report-generated PPE event, with all-inclusive usage, no startup/dataset fee and no Standby. Set maxTotalChargeUsd >= $0.03, including trial runs: this budget cap is not an advance charge.
Before enforcement, only authenticated ciphertext is stored in SEALED_REPORT; useful plaintext is released after the publisher queue trial proof or native charge confirmation. Only hashed account/run participation and keyed input/report fingerprints enter the private publisher trial ledger. A lost allocation reply is recovered by its unique slot key.
Recover the same run after interruption; do not automatically create a replacement paid run. Actual native charge count is checked before recharging, including after the native idempotency window. Failed output delivery after fee/allocation can be recovered within the same run. This is not an instant-delivery or automatic-refund guarantee. Dataset append may duplicate after an interrupted append; deduplicate report_id and prefer OUTPUT. Preserve encryption keys until pending runs are resolved. Legacy unsealed state is refused, never returned as authenticated output. LAST_ERROR contains fixed codes, not raw input exceptions.

### Local development and buyer/operator replay

Use a private Python 3.14 virtual environment and install the exact requirements.txt. From actor/: `python -B runtime.py < example-input.json` exercises the pure deterministic worker and never bills. `python -B sdk_example.py` exercises the real pinned SDK lifecycle with the synthetic fixture and returns LOCAL_NO_CHARGE. No local result proves platform fees. Core analysis is offline; only hosted delivery uses official platform storage/charging APIs.

### Operator setup and API/MCP

Create a private Actor from these sources. Configure four protected encrypted environment variables: BIZTOOLS_EXPECTED_ACTOR_ID (actual 17-character Actor ID), BIZTOOLS_TRIAL_LEDGER_TOKEN (publisher token restricted to one private trial queue read/write), BIZTOOLS_TRIAL_QUEUE_ID, and independent 256-bit BIZTOOLS_REPORT_KEY. Never use a full-account publisher token. Do not inject these values into builds. Missing or mismatched Actor identity fails closed. Keep Actor limited permissions, 256 MiB memory, <=120-second run timeout, Standby disabled, no automatic paid retry loop. Configure account billing and monetization, pin build 0-1, then complete DEPLOYMENT_CHECKLIST.md before public launch.
api-example.py is caller-side: set your scoped APIFY_TOKEN and APIFY_ACTOR_ID in your environment, start asynchronously, inspect final run status then fetch OUTPUT/default dataset. Credentials are sent in Authorization headers, never URLs or tool inputs. AI agents use Apify hosted MCP discovery/run/results; no separate MCP server or Standby is needed. Private Actors are not claimed publicly discoverable. This package needs real platform configuration and acceptance before paid publication; live fees/trials/privacy/MCP remain NOT_RUN.

### Privacy and deletion

CSV/JSONL/JSON inputs and generated reports leave the caller's device and enter Apify run storage. This is not the offline local product. Only send data you are allowed to upload; do not submit passwords, signing keys, personal customer files or authorization headers. Operator must verify actual access/retention/deletion for INPUT, OUTPUT, SEALED_REPORT and dataset on the platform. Deleting run metadata must not be assumed to delete every associated storage. The publisher ledger retains hashed participation; it is not anonymous against a holder of candidate IDs and the restricted ledger credential.

Build provenance: the official Python base is digest-pinned and the complete Python dependency closure uses `requirements.lock`, SHA-256 hashes, and binary-only installation. Pins require explicit reviewed maintenance; they do not prove an upstream package is vulnerability-free.

The hosted build lock targets CPython 3.14 on Linux glibc AMD64. Other architectures fail closed and need their own reviewed artifact lock. The local SDK example is separate from hosted build acceptance.

Pre-enforcement report metadata: new SEALED_REPORT ciphertext has one fixed length (approximately 2.8 MB), independent of the report result. Recovery state uses secret-keyed report fingerprints, never a new raw report digest before allowance/fee. Authenticated old protocol-3 sealed reports migrate to protocol 4 without testing buyer-writable report guesses; the authoritative trial/charge checks still run. Unauthenticated legacy plaintext is still refused. Fernet timestamps and runtime timing are observable metadata; this is not an anonymity guarantee.

# Actor input Schema

## `catalog_csv` (type: `string`):

Required UTF-8 document content, not a path/URL. Maximum 256 KiB; do not submit credentials or confidential customer data.

## Actor input object example

```json
{
  "catalog_csv": "id,title,description,link,image_link,price,availability\na,Shirt,Cotton shirt,https://example.invalid/a,https://example.invalid/a.jpg,24.99 USD,in stock\n"
}
```

# Actor output Schema

## `reports` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "catalog_csv": `id,title,description,link,image_link,price,availability
a,Shirt,Cotton shirt,https://example.invalid/a,https://example.invalid/a.jpg,24.99 USD,in stock`
};

// Run the Actor and wait for it to finish
const run = await client.actor("biztoolsus/pinterest-retail-catalog-csv-validator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "catalog_csv": """id,title,description,link,image_link,price,availability
a,Shirt,Cotton shirt,https://example.invalid/a,https://example.invalid/a.jpg,24.99 USD,in stock
""" }

# Run the Actor and wait for it to finish
run = client.actor("biztoolsus/pinterest-retail-catalog-csv-validator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "catalog_csv": "id,title,description,link,image_link,price,availability\\na,Shirt,Cotton shirt,https://example.invalid/a,https://example.invalid/a.jpg,24.99 USD,in stock\\n"
}' |
apify call biztoolsus/pinterest-retail-catalog-csv-validator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,biztoolsus/pinterest-retail-catalog-csv-validator"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/p4ZBCjnSjn9aWRaXl/builds/LLSUNkmEghIDjcTUT/openapi.json
