Personyze Personyze developer docs
Open Personyze
Users

REST privacy objects: find, export and delete a person

Find, export and delete one person's data, as Settings › Data & privacy › Visitor requests does.

Personyze developer documentation Questions: support@personyze.com

For information about how REST API works, see rest main page.

When a person asks what you hold about them, or asks you to delete it, these three objects answer the request from your own systems: a privacy tool (OneTrust, Transcend, DataGrail), Zapier, Make, n8n, or a script. They do exactly what Settings › Data & privacy › Visitor requests does in the panel, and every call is written to the same request log, where it shows as API key followed by the key's fingerprint.

Object What it does
privacy-person Finds the person: every profile that matches, and how much of their data each store holds.
privacy-export Returns everything held about them as one JSON file, the same file the panel's Export downloads.
privacy-delete Deletes them: their profile and everything recorded about them. Returns a receipt.

The URLs are:

app.personyze.com/rest/privacy-person
app.personyze.com/rest/privacy-export
app.personyze.com/rest/privacy-delete

privacy_person, privacy_export and privacy_delete work too.

Which key

Use your account's API key, from Integrations › API in the panel. Zapier, Make and n8n are connected with the same key. Send it as Authorization: Bearer <key>, or as HTTP Basic with the user name api and the key as the password (see API keys).

A key issued for an integration (WordPress, Segment, Shopify or Magento) is refused with 403. Those keys are stored on someone else's server to send data in, and finding or deleting people is not what they were issued for.

Naming the person

Every request names the person with q and says how to look q up with by:

by q matches
any (default) the profile's email address, its CRM ID, or its visitor ID when q is a number
email the profiles whose email address it is, and never a CRM ID that happens to be the same text
user_id that one visitor ID

A visitor ID is a whole number, and about half of all visitor IDs are negative. Send it as it is, minus sign included, as a JSON number or as text.

q can match more than one profile: an address that is one profile's email and another's CRM ID, for example. privacy-person lists each match and what it matched. privacy-export and privacy-delete act on every current match unless you name the profiles with user_ids.

Send the person in a POST body rather than in the URL. URLs are written to access logs along the way, and request bodies are not. Personyze keeps neither the body nor the person's address in its own REST logs for these three objects. The request log keeps them masked (j***@example.com).

privacy-person

curl -H 'Authorization: Bearer FD09908F25BECB09D78EBEA1DADFB618651F612D' --data '{"q": "ann@example.com"}' 'https://app.personyze.com/rest/privacy-person'

The same lookup as a GET, by the address only or by the visitor ID only:

curl -H 'Authorization: Bearer FD09908F25BECB09D78EBEA1DADFB618651F612D' 'https://app.personyze.com/rest/privacy-person/where/email=ann%40example.com'
curl -H 'Authorization: Bearer FD09908F25BECB09D78EBEA1DADFB618651F612D' 'https://app.personyze.com/rest/privacy-person/where/user_id=-1234567890'

The answer lists every profile that matched, what each one matched by, and a count per store. Stores with a kept reason are not deleted by privacy-delete.

{
    "q": "ann@example.com",
    "userIds": [-1234567890, 777990203],
    "profiles": [
        {"userId": -1234567890, "matchedBy": "email", "email": "a***@example.com", "lastSeen": 1791000000},
        {"userId": 777990203, "matchedBy": "crm_id", "crmId": "ann@example.com", "lastSeen": 0}
    ],
    "profile": {"user_id": -1234567890, "email": "ann@example.com", "first_name": "Ann"},
    "stores": [
        {"store": "page_views", "label": "Page views", "count": 12},
        {"store": "lists", "label": "List memberships", "count": 1},
        {"store": "profile", "label": "Profile", "count": 2},
        {"store": "suppressions", "label": "Email suppression list", "count": 0, "kept": "kept so this person is never emailed or texted again"}
    ]
}

(Shortened: stores lists every store that was searched, including those with a count of 0.)

privacy-export

Field Notes
q Required.
by any (default), email or user_id.
user_ids Optional. Only these profiles, from the userIds that privacy-person returned. Each one must still match q.
curl -H 'Authorization: Bearer FD09908F25BECB09D78EBEA1DADFB618651F612D' --data '{"q": "-1234567890", "by": "user_id"}' 'https://app.personyze.com/rest/privacy-export'

The answer is the export file itself, ready to hand to the person:

{
    "exported": "2026-10-04T12:00:00.000Z",
    "account": 1234,
    "identifier": "-1234567890",
    "profiles": [-1234567890],
    "stores": {
        "lists": {"label": "List memberships", "rows": [{"user_list_id": 14, "user_id": -1234567890}]},
        "profile": {"label": "Profile", "rows": [{"user_id": -1234567890, "email": "ann@example.com"}]}
    },
    "notIncluded": ["your own import files and SFTP uploads", "report totals (no personal data)", "copies already sent to connected tools (CRM, email provider, ad platforms)", "form submissions, survey answers and campaign emails of an earlier profile of theirs that was already deleted - nothing links them to this address any more"]
}

(Shortened: a profile row carries every column it has.) Only stores that hold something about the person appear. A store holding more than 1,000 rows for the person includes the first 1,000 and says so with "more".

privacy-delete

Field Notes
q Required. Also serves as the confirmation that the panel asks you to type.
by any (default), email or user_id.
user_ids Optional. Only these profiles, each of which must still match q. Without it, every profile q matches at that moment is deleted.
suppress Default true: the person's address goes on your suppression list, so a later import or CRM sync cannot email them as a stranger. With false it is still added when the person had unsubscribed, because their unsubscribe records are among what is deleted.
curl -H 'Authorization: Bearer FD09908F25BECB09D78EBEA1DADFB618651F612D' --data '{"q": "ann@example.com", "by": "email"}' 'https://app.personyze.com/rest/privacy-delete'
curl -H 'Authorization: Bearer FD09908F25BECB09D78EBEA1DADFB618651F612D' --data '{"q": "-1234567890", "by": "user_id"}' 'https://app.personyze.com/rest/privacy-delete'

The answer is the receipt:

{
    "ok": true,
    "q": "ann@example.com",
    "time": 1791171631,
    "userIds": [-1234567890],
    "deleted": [
        {"store": "page_views", "label": "Page views", "count": 12},
        {"store": "lists", "label": "List memberships", "count": 1},
        {"store": "profile", "label": "Profile", "count": 1}
    ],
    "kept": [
        {"store": "suppressions", "label": "Email suppression list", "count": 1, "kept": "kept on your suppression list so this person is never emailed again"}
    ],
    "notReached": ["files you exported earlier", "your own import files and SFTP uploads", "report totals (no personal data)"],
    "requestId": 123,
    "unfinished": []
}

(Shortened: deleted and notReached list everything, as below.)

What is deleted: AI chat conversations; meeting requests; server actions their visits ran (and the data they sent); page views; events (clicks, goals, values read from pages); campaigns shown to them; sessions; daily activity summary; form submissions; survey answers; survey progress; reviews and feedback they wrote; emails and messages sent to them by campaigns; their replies to your emails; email engagement; best time to email them; email consent records; messages waiting to be sent; campaign sends waiting; alert reports waiting; known-address record (reviews and surveys); coupon redemptions; list memberships; email campaign states (sends and unsubscribes per campaign); interests; products viewed and bought; articles read; browser push subscription; app notification waiting; the profile.

What has the personal details removed rather than being deleted (listed in deleted, with what was removed):

  • Meeting bookings: name, email, phone and answers are removed, and the meeting stays in your reports.
  • Orders: their email and customer ID are removed, and the order stays in your revenue.

What is kept as it is, so that this person is never emailed or texted again: the email suppression list, soft bounces, and SMS opt-outs (STOP).

What is not reached, and is listed in every receipt's notReached:

  • files you exported earlier;
  • your own import files and SFTP uploads;
  • report totals (no personal data);
  • a visit in progress may record a new anonymous profile;
  • copies already sent to connected tools (CRM, email provider, ad platforms);
  • AI logs, deleted automatically: requests to the AI after 7 days, and the record of what an AI assistant did in your account after 400 days;
  • form submissions, survey answers and campaign emails of an earlier profile of theirs that was already deleted. Nothing links them to this address any more.

A deletion has a time budget of about 45 seconds. A person with years of visits may not be finished within it. Then unfinished names the stores that are left, those stores are also marked "unfinished": true, and the first line of notReached says so. What was deleted stays deleted and is logged. Send the same request again to delete the rest. Repeat until unfinished is empty.

A deletion cannot be undone.

Errors

Status When
400 q is missing; by, user_ids or suppress is malformed; by: "user_id" with a q that is not a visitor ID; or a profile named in user_ids no longer matches q. The message says which.
401 The key is wrong or was revoked.
403 The key was issued for an integration (WordPress, Segment, Shopify, Magento), or the request carries no API key.

See errors, limits and retries for the rest.

Not the same as DELETE /rest/users

DELETE /rest/users/where/... (users) deletes the profile row only. A person's visits, events, form answers, chats and the rest stay, and the request is not logged. It is unchanged, so integrations built on it keep working. For a person's request to be forgotten, use privacy-delete.