AI Chat Export Normalizer
Pricing
$0.50 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 days ago
Last modified
Categories
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 forconversations.jsonor an export ZIPfileBase64plusfileName: a small JSON or ZIP encoded as base64conversations: a small inline ChatGPT or Claude conversations array
Optional controls:
providerHint:auto(default),chatgpt, orclaudeprivacyMode:metadata_only(default) orfull_textmaxInputBytes: 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 flagsmessage: conversation link, sequence, parent, role, participant, model, timestamps, normalized content blocks, and stable IDduplicate_group: matching conversation fingerprints and member IDssource_manifest: source type, safe file name, byte counts, SHA-256 hashes, provider, and processed countsrun_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 installnpm test
Run through the local Apify CLI:
apify validate-schemaapify run --purge --input-file examples/sample-input-chatgpt.json
Local output appears under:
storage/key_value_stores/default/OUTPUT.jsonstorage/key_value_stores/default/NORMALIZED_JSONL.jsonlstorage/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.jsonor 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.