1PIF to CSV Converter
Convert 1Password .1pif export files to CSV format directly in your browser. No upload, no server - fully client-side and private.
Drop your .1pif file here
or click to browse
About
1Password version 4 exports vault data exclusively in the .1pif format - a proprietary, newline-delimited JSON structure separated by *** delimiter lines. This format is not recognized by spreadsheet software, competing password managers, or auditing tools. Manually parsing it risks field misalignment, lost entries, or broken Unicode characters. This converter processes the raw .1pif structure entirely in your browser, extracting title, url, username, password, and notes fields into RFC 4180-compliant CSV. No data leaves your machine. The .1pif file is unencrypted plaintext, and so is the resulting CSV - handle both with appropriate caution.
The parser handles nested secureContents.fields[] arrays where 1Password stores form-fill data, as well as secureContents.URLs[] for site associations. Entries of type webforms.WebForm, passwords.Password, and securenotes.SecureNote are all supported. Malformed JSON lines are skipped with a count reported after conversion. Pro tip: if migrating to another password manager, verify the target application's CSV import column order before sharing the file.
Formulas
The .1pif format is not documented by AgileBits but follows a consistent structure. Each file is a sequence of JSON objects interleaved with separator lines.
parse(file) → split(content, \n) → filter(line ≠ ***...***) → JSON.parse(line) → extract(fields)
CSV encoding follows RFC 4180. Any field containing a comma, double quote, or newline is wrapped in double quotes. Existing double quotes within a field are escaped by doubling them:
escapeCSV(field) = " + replace(field, ", "") + "
Where field is any extracted string value. Timestamps stored as Unix epoch integers are converted via: date = new Date(timestamp × 1000).toISOString(). The multiplication by 1000 converts seconds to milliseconds as required by the JavaScript Date constructor.
Reference Data
| 1PIF Field Path | CSV Column | Entry Types | Notes |
|---|---|---|---|
| title | Title | All | Display name of the entry |
| location | URL | WebForm, Password | Primary URL; fallback from secureContents.URLs[0].url |
| secureContents.fields[].value (designation: username) | Username | WebForm | Field with designation equal to "username" |
| secureContents.fields[].value (designation: password) | Password | WebForm | Field with designation equal to "password" |
| secureContents.password | Password | Password | Direct password field for simple password entries |
| secureContents.notesPlain | Notes | All | Plain-text notes; newlines preserved inside quoted CSV field |
| typeName | Type | All | Entry category: webforms.WebForm, passwords.Password, etc. |
| uuid | UUID | All | Unique identifier from 1Password |
| createdAt | Created | All | Unix timestamp, converted to ISO 8601 in CSV |
| updatedAt | Updated | All | Unix timestamp, converted to ISO 8601 in CSV |
| secureContents.sections[].fields[] | Custom Fields | All | Additional fields stored in sections; flattened as label: value pairs |
| openContents.tags | Tags | All | Comma-separated tag list |
| secureContents.URLs[] | Additional URLs | WebForm | All associated URLs joined by semicolons |
| ***<UUID>*** | (Separator) | N/A | Delimiter line between entries; discarded during parsing |
| trashed | Trashed | All | Boolean; if true, entry was in Trash |