AI Chat Export Normalizer avatar

AI Chat Export Normalizer

Pricing

$0.50 / 1,000 results

Go to Apify Store
AI Chat Export Normalizer

AI Chat Export Normalizer

Turn ChatGPT and Claude conversations.json files or export ZIPs into clean, stable, receipt-bearing JSONL records.

Pricing

$0.50 / 1,000 results

Rating

0.0

(0)

Developer

theCR8Fconclave SYST3MS

theCR8Fconclave SYST3MS

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 days ago

Last modified

Share

Turn ChatGPT and Claude exports into clean, stable, receipt-bearing records for search, migration, analysis, reconstruction, and downstream data workflows.

What it accepts

Provide exactly one source:

  • sourceUrl: a retrievable HTTP(S) URL for conversations.json or an export ZIP
  • fileBase64 plus fileName: a small JSON or ZIP encoded as base64
  • conversations: a small inline ChatGPT or Claude conversations array

Optional controls:

  • providerHint: auto (default), chatgpt, or claude
  • privacyMode: metadata_only (default) or full_text
  • maxInputBytes: decoded/extracted safety limit; 25 MiB by default, 100 MiB maximum

Direct browser-style file upload is not part of this Actor input contract. Large private exports should be normalized locally instead of embedded in Actor input. A signed URL can work for a retrievable file, but its access and retention policy remain the buyer's responsibility.

What it returns

The default Dataset and NORMALIZED_JSONL key contain these record types:

  • conversation: title, timestamps, provider, participants, models, message IDs, stable ID, source hash, and duplicate flags
  • message: conversation link, sequence, parent, role, participant, model, timestamps, normalized content blocks, and stable ID
  • duplicate_group: matching conversation fingerprints and member IDs
  • source_manifest: source type, safe file name, byte counts, SHA-256 hashes, provider, and processed counts
  • run_receipt: status, privacy mode, stable-ID algorithm, counts, source hash, and run timestamp

OUTPUT stays compact. It contains the provider, privacy mode, counts, source manifest, run receipt, Dataset record count, and the NORMALIZED_JSONL key name without repeating every conversation.

Stable IDs use canonical JSON plus SHA-256 (sha256/canonical-json/v1). IDs do not change when the same export is rerun under metadata_only versus full_text.

Privacy behavior

metadata_only — safer default

Message text is omitted. Each content block retains only:

  • normalized block type
  • block index
  • character count
  • SHA-256 hash

Conversation titles and other export metadata remain present.

full_text — explicit opt-in

Normalized content blocks include message text. The text is written to the run's Dataset and NORMALIZED_JSONL record.

The Actor does not print full conversations or credentials to logs. Outputs remain in the Actor run's storage and follow the retention/deletion settings of that Apify account and storage. This package does not claim end-to-end encryption or automatic deletion. Delete run storage manually when the material should no longer be retained.

Do not submit secrets, API keys, customer records, or exports you are not authorized to process.

Provider coverage

ChatGPT

Supports the standard conversations.json mapping shape. All message-bearing mapping nodes are normalized, including branch relationships where present.

Claude

Supports the standard conversations.json shape containing chat_messages. Human senders normalize to the user role.

Attachments and provider-only objects are represented as normalized content-block type/hash/count records. This release does not extract attachment binaries.

Local use

Install and test:

npm install
npm test

Run through the local Apify CLI:

apify validate-schema
apify run --purge --input-file examples/sample-input-chatgpt.json

Local output appears under:

  • storage/key_value_stores/default/OUTPUT.json
  • storage/key_value_stores/default/NORMALIZED_JSONL.jsonl
  • storage/datasets/default/*.json

A plain Node run is also supported with APIFY_INPUT_JSON and APIFY_LOCAL_STORAGE_DIR.

Failure behavior

The Actor exits non-zero with a concise error when:

  • no source or more than one source is supplied
  • provider hint conflicts with the detected export
  • JSON is malformed
  • the export is neither ChatGPT nor Claude
  • a ZIP has no conversations.json or contains more than one
  • input exceeds the configured byte limit
  • a URL uses a private, loopback, or non-HTTP(S) address

Extension contract

Future provider adapters should preserve the current record types and stable-ID rules. Add provider detection and a parser that emits the same intermediate conversation/message shape; do not fork the Dataset contract for each provider.

Synthetic-only examples and fixtures are included. No real user, account, client, or company export content is packaged.