Start a profile import
Either a file (CSV with a header row, comma, semicolon or tab separated, or JSON Lines; UTF-8; up to 100 MB): the answer says how to split it into parts for `upload-part`, then `complete-upload`. Or up to 10,000 rows as JSON objects, read right away. Then map the columns (`update`), `check` and `start`.
Either a file (CSV with a header row, comma, semicolon or tab separated, or JSON Lines; UTF-8; up to 100 MB): the answer says how to split it into parts for upload-part, then complete-upload. Or up to 10,000 rows as JSON objects, read right away. Then map the columns (update), check and start.
apiKey writeAuthorizationBearer <token>A workspace API key (pf_…), created under Developers → API keys.
Scope: write
idempotency-key?stringRun this write once: a retry with the same key gets the first answer (24 hours).
1 <= length <= 255application/json- body
file?name?stringWhat to call JSON rows in Postforge (default “API import”)
1 <= length <= 200rows?array<>1 <= items <= 10000mapping?array<>items <= 500options?consent?|Needed to subscribe anyone: the proof each subscribe carries, declared by whoever sends it. Null withdraws it.
Created
application/json- response
id*stringuuidname*stringstatus*string"uploading""ready""checking""importing""completed""failed""cancelled"format*|"csv""json"nulldelimiter*string|nullbytes*integer|nullcolumns*array<>previewRows*array<>mapping*array<>items <= 500options*consent*|nullcheck*|nullcheckedAt*|date-timecounts*|nullerror*|"unreadable""not_utf8""row_too_long""too_large""no_rows""too_many_columns""file_missing""timed_out""import_failed"nullcreatedBy*createdAt*stringdate-timestartedAt*|date-timecompletedAt*|date-timeupload*|nullcurl -X POST 'https://api.postforge.dev/v1/profile-imports' \ -H 'Content-Type: application/json' \ -d '{}'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string", "status": "uploading", "format": "csv", "delimiter": "string", "bytes": 0, "columns": [ { "name": "string", "samples": [ "string" ], "suggested": { "kind": "email" }, "suggestedType": "text", "refusedByType": { "text": 0, "number": 0, "boolean": 0, "date": 0, "list": 0, "json": 0 }, "sampled": 0 } ], "previewRows": [ { "property1": "string", "property2": "string" } ], "mapping": [ { "column": "string", "target": { "kind": "email" } } ], "options": { "matchOn": "email", "mode": "create_and_update", "blanks": "keep", "startAutomations": true }, "consent": { "method": "string", "declaredBy": { "kind": "user", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string" }, "declaredAt": "2019-08-24T14:15:22Z" }, "check": { "rows": 0, "created": 0, "updated": 0, "unchanged": 0, "skipped": 0, "skipReasons": { "no_match_value": 0, "invalid_email": 0, "invalid_phone": 0, "invalid_external_id": 0, "not_found": 0, "exists": 0, "two_profiles": 0, "other_id": 0, "not_utf8": 0, "unreadable": 0 }, "refused": [ { "column": "string", "count": 0, "reason": "string" } ], "subscribed": 0, "unsubscribed": 0, "consentKept": { "unsubscribed": 0, "suppressed": 0, "no_declaration": 0, "no_email": 0, "invalid": 0, "invalid_date": 0 } }, "checkedAt": "2019-08-24T14:15:22Z", "counts": { "rows": 0, "created": 0, "updated": 0, "unchanged": 0, "skipped": 0, "skipReasons": { "no_match_value": 0, "invalid_email": 0, "invalid_phone": 0, "invalid_external_id": 0, "not_found": 0, "exists": 0, "two_profiles": 0, "other_id": 0, "not_utf8": 0, "unreadable": 0 }, "refused": [ { "column": "string", "count": 0, "reason": "string" } ], "subscribed": 0, "unsubscribed": 0, "consentKept": { "unsubscribed": 0, "suppressed": 0, "no_declaration": 0, "no_email": 0, "invalid": 0, "invalid_date": 0 } }, "error": "unreadable", "createdBy": { "user": { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string" }, "apiKey": { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string" } }, "createdAt": "2019-08-24T14:15:22Z", "startedAt": "2019-08-24T14:15:22Z", "completedAt": "2019-08-24T14:15:22Z", "upload": { "partBytes": 0, "partCount": 0 }}