What is actually in the file
An exported workflow is a JSON document with three interesting parts. Knowing which is which is most of the job:
nodes[].parameters— everything you typed into a node. URLs, queries, expressions, JavaScript in Code nodes, and any key you pasted into a header field. This is where inline secrets hide.nodes[].credentials— a reference, not a secret: an id and the display name of the credential. It tells a reader that this node authenticates asAcme Prod Stripe; it does not give them the key.pinData— sample output captured when you pinned a node during testing. This is the one people forget, and it is frequently a real API response with real customer records in it.
Checking a file before you send it
Two greps get you most of the way. The first tells you whether pinned data is present at all; the second looks for the field names that typically hold a pasted key.
# is there pinned execution data?
jq 'has("pinData")' workflow.json
# which nodes have it, and how big
jq '.pinData | keys' workflow.json
# obvious inline secrets in node parameters
grep -Eio '"(authorization|api[-_]?key|token|secret|password)"[^,]*' workflow.jsonIf you drop the workflow into the Pixtex editor and create a share link, the same scan runs for you: pinned data is stripped before anything is hosted, and parameters that look like a bearer token, an sk_/ghp_-style key, a JWT or a PEM private key are flagged so you can decide. Nothing is auto-redacted — a silently mangled workflow that imports broken is worse than a warning you can act on.
The safest answer is usually a picture
Most of the time the person asking does not need your workflow, they need to see it. A rendered diagram carries the node types, the names, the connection topology and the branch structure — enough to debug a routing problem or review an architecture — and carries none of the parameters, none of the pinned data and none of the credential references.
That is the whole argument for posting an image on the community forum instead of a JSON blob, and it is why the forum answer you get back tends to be faster: the reader can see the shape immediately instead of importing a file to look at it.
When you do have to send the JSON
- Strip
pinDatafirst —jq 'del(.pinData)' workflow.json. - Replace inline keys with a placeholder before sending, and rotate anything that has already been in a file you shared. A key that reached someone else's disk is a key you no longer control.
- Send a subset. Selecting a few nodes on the n8n canvas and copying them produces valid workflow JSON for just that fragment — usually all a support thread needs.
- Prefer a link that expires over an attachment that does not. A Pixtex share link lasts 24 hours; an email attachment lasts as long as the mailbox.