Privacy Policy
Last updated 16 August 2026
Crosspost is a product of CROSSPOST AI LLC ("we", "us"). This policy explains what data we collect when you connect a social account, what we do with it, how long we keep it, and how you can have all of it deleted. It applies to the Crosspost web app at this domain.
We only access data you explicitly authorise by connecting an account, and only for the permissions you grant. The table below lists every permission Crosspost requests, one row per permission, so you can check it against the consent screen you were shown.
What each permission collects
| Scope | What it collects | Why we need it | How long we keep it | Where it is stored |
|---|---|---|---|---|
instagram_business_basicInstagram | Your Instagram username, name, profile picture and follower count, and the list of your own recent media with its captions, thumbnails and view, like and comment counts. | Draws your dashboard, the Content grid, the merged feed and the crosspost source picker, and grounds the caption engine in how you actually write. | Cached and overwritten on every refresh; deleted outright when you disconnect the account or delete your account. | public.platform_data |
instagram_business_manage_insightsInstagram | Reach, views, likes, comments, shares and saves for your account and for each of your posts, plus the age, gender and country bands your audience falls into as a group. | The Analytics tab, your daily snapshots, and the per-post figures behind "which platform did it actually work on". | One row per account per day, kept for as long as your account exists — it is the history the charts are drawn from. | public.snapshots, public.repurpose_target_metrics |
instagram_business_content_publishInstagram | The video, caption and cover frame you choose to publish, and the id and public URL of the Reel that results. | Publishes the Reel to your Instagram account — including automatically, if you switch auto-pilot on. | The video file until you delete the crosspost or your account; the post id and URL for as long as your account exists. | repurpose-src bucket, public.repurpose_posts, public.repurpose_targets |
user.info.basicTikTok | Your TikTok account id and avatar. | Identifies which TikTok account is connected and shows it wherever an account is named. | Until you disconnect the account or delete your account. | public.connected_accounts |
user.info.profileTikTok | Your TikTok handle, display name and the rest of your public profile fields. | Labels the account everywhere it appears, including the account a crosspost will publish to. | Until you disconnect the account or delete your account. | public.connected_accounts, public.platform_data |
user.info.statsTikTok | Your TikTok follower count and total like count. | The dashboard card and the daily snapshot behind your follower chart. | One row per day, kept for as long as your account exists. | public.snapshots |
video.listTikTok | Your own TikTok videos with their captions, thumbnails and view, like and comment counts. | The Content grid, the merged feed, and the picker you choose a video to reuse from. | Cached and overwritten on every refresh. | public.platform_data |
video.publishTikTok | The video and caption you choose, the privacy and comment settings you pick, the moment you consented to publish, and the id of the resulting post. | Direct-posts your video to TikTok when you ask for it. | The video file until you delete the crosspost or your account; the post record for as long as your account exists. | repurpose-src bucket, public.repurpose_targets |
video.uploadTikTok | The video and caption you choose, and the id TikTok returns for the draft. | Sends the video to your TikTok drafts so you can review and post it yourself. | The video file until you delete the crosspost or your account; the draft record for as long as your account exists. | repurpose-src bucket, public.repurpose_targets |
youtube.readonlyYouTube | Your channel, your uploads, and each video's title, description, thumbnail and view, like and comment counts. | The Content grid, the merged feed, and the source picker. | Cached and overwritten on every refresh. | public.platform_data |
yt-analytics.readonlyYouTube | Views and estimated watch time for your channel, plus the age, gender and country bands your audience falls into as a group. | The Analytics tab and your daily snapshots. | One row per day, kept for as long as your account exists. | public.snapshots |
youtube.uploadYouTube | The video, title and description you choose, and the id and public URL of the Short that results. | Uploads the Short to your own YouTube channel when you ask for it. We never request the broader YouTube scope. | The video file until you delete the crosspost or your account; the post id and URL for as long as your account exists. | repurpose-src bucket, public.repurpose_targets |
Everything named in the last column lives in our database or private file storage in the European Union (Frankfurt). Nothing in that column is publicly readable.
Your Crosspost account
Separately from the platforms you connect, creating a Crosspost account stores your first name, your email address and a one-way hash of your password — never the password itself. While Crosspost is invite-only, your email address is also held on an invite list before any account exists for it; deleting your account removes it from that list too.
How we use it
We use this data to show you analytics about your own content — "what's working for you" — to let you manage the comments on your own posts (reply, hide, delete) from within the app, and to publish videos you choose to your connected accounts, including publishing them automatically if you switch auto-pilot on. We do not sell your data, use it for advertising, or share it with third parties for their own purposes.
Video analysis, and the AI we send it to
When you ask us to analyse one of your videos, we download the video file, extract still frames and a thumbnail from it, and transcribe the spoken audio. The frames and the transcript are sent to Anthropic (Claude), our AI sub-processor, purely to produce your analysis. They are not used to train anyone's model, and Anthropic acts only on our instructions. We keep the transcript, the caption, the style, hook and score fields we derive, and the extracted thumbnail, until you delete the analysis or your account.
Where a reused video came from
When you reuse a video from a platform you connected rather than uploading a new file, we record its provenance alongside the crosspost: which of your accounts it came from (source_account_id), which of your posts (source_media_id), how we obtained the file (source_provenance) and our own assessment of the rendition we got (source_clean_score). We keep it so you can always see where anything we published for you originated.
Auto-pilot
Auto-pilot is off unless you switch it on, and switching it off stops all of the following. While it is on:
- What we read: a list of your own recent posts on the primary account you designated, checked roughly every ten minutes.
- What we store: a record of which of your posts we have already handled, so nothing is posted twice, and a log of what we posted or skipped and why.
- What we send, and where: your own video, and a caption written for each platform, to the connected accounts you selected — and nowhere else.
- Your permission record: what you agreed to, when you agreed to it, and which version of the wording you were shown. We keep it for as long as your account exists; it is erased along with everything else when you delete your account (see Data Deletion).
Where your data lives
All of it is held in the European Union. Our database and both private file-storage areas are hosted in Frankfurt, Germany. Your OAuth access and refresh tokens are encrypted with AES-256-GCM before they are written, so we store ciphertext only, and they are never sent back to your browser. Passwords are hashed. Everything is transmitted over HTTPS.
Your files live in two private storage areas, neither of which is publicly reachable:
video-analysis— A private storage area holding the videos we downloaded to analyse for you and the thumbnails and frames we extracted from them. Nothing in it is publicly reachable, and everything under your account id is deleted when you delete your account.repurpose-src— A private storage area holding the video files you upload or that we fetch for you to crosspost. Nothing in it is publicly reachable, and every file stored under your account id is deleted when you delete your account.
Deleting the database rows does not remove those files — a database cascade cannot reach into file storage — so account deletion sweeps every object stored under your account id explicitly, as a separate step. That is described in full on the Data Deletion page.
Retention & deletion
Per-permission retention is in the table above. In summary: cached copies of your platform profile and posts are overwritten on every refresh; your daily analytics history is kept for as long as your account exists, because it is what the charts are drawn from; video files and analyses are kept until you delete them or your account; comments are never stored at all. You can disconnect any platform at any time from your dashboard, which hands the OAuth grant back to that platform and deletes the cached data for it. You can delete your entire account and everything associated with it from our Data Deletion page — nothing survives that.
Google / YouTube limited use
Crosspost's use of information received from Google APIs adheres to the Google API Services User Data Policy, including the Limited Use requirements. We do not use YouTube data for ads, transfer it to data brokers, or use it for any purpose other than the user-facing features described above — analytics on your own channel, and uploading videos to that channel when you ask us to.
Meta & TikTok
Our handling of Instagram data complies with the Meta Platform Terms and Developer Policies. Our handling of TikTok data complies with the TikTok Developer Terms of Service. Access tokens are encrypted at rest and used only to fetch the data described above, and to publish the videos you ask us to publish, on your behalf.
Everything we hold, record by record
The complete list, written from the same inventory our deletion routine is built against — so what this page describes and what deletion actually removes cannot drift apart. Each entry names the record, the fields it holds, and how it is removed: with your account means the database deletes it automatically when your login row goes, and by our own code means deletion has to reach for it deliberately.
Your Crosspost account
Your first name and app settings
public.user_profilesYour first name and your app settings: the crossposting mode you chose, how far through setup you are, and which source platforms your account is permitted to reuse video from.
Fields:
user_id, first_name, crosspost_mode, onboarding_step, onboarding_completed_at, reuse_source_platforms, autopilot_last_seen_at. Removed with your account.What you consented to, and when
public.user_consentsA record of each consent you gave: what you agreed to, which version of the wording you were shown, where you were shown it, and when. We keep this because it is the evidence that the consent was actually given.
Fields:
user_id, kind, version, granted, disclosure_ref, source. Removed with your account.The invite list
public.allowed_emailsThe invite list. While Crosspost is invite-only, an email address is added here BEFORE any account exists for it — so it is not attached to an account row and does not disappear on its own when the account is deleted. Deleting your account removes your address from the invite list too; a later sign-up would need a fresh invite.
Fields:
email. Removed by our own code.Your Crosspost login
auth.usersYour Crosspost login itself: your email address, a one-way hash of your password (never the password), and the timestamps of your sign-ins. Deleting your account deletes this row, which is what causes almost everything else we hold about you to be deleted with it.
Fields:
id, email, phone, encrypted_password, raw_user_meta_data, raw_app_meta_data, last_sign_in_at, confirmation_sent_at. Removed by our own code.Your sign-in identity
auth.identitiesThe sign-in identity behind your login — the provider you signed in with and the email address it reported. Deleted with your account.
Fields:
user_id, provider_id, identity_data, email. Removed with your account.Your sign-in sessions
auth.sessionsYour active sign-in sessions, including the IP address and browser they were created from. Deleted with your account.
Fields:
user_id, ip, user_agent. Removed with your account.Confirmation and password-reset tokens
auth.one_time_tokensShort-lived tokens for email confirmation and password reset. They expire on their own and are deleted with your account.
Fields:
user_id, token_hash, relates_to. Removed with your account.Two-factor authentication methods
auth.mfa_factorsAny multi-factor authentication method registered on your login. Deleted with your account.
Fields:
user_id, friendly_name, phone, secret. Removed with your account.Sign-in authorisation records
auth.oauth_authorizationsAuthorisation records created by the sign-in provider on your behalf. Deleted with your account.
Fields:
user_id. Removed with your account.Sign-in consent records
auth.oauth_consentsConsent records created by the sign-in provider on your behalf. Deleted with your account.
Fields:
user_id. Removed with your account.A sign-in still in progress
auth.flow_stateA short-lived record of a sign-in that is in progress, including the temporary code and any token the sign-in provider returned. Removed when you delete your account.
Fields:
user_id, auth_code, provider_access_token, provider_refresh_token. Removed by our own code.Your authentication event log
auth.audit_log_entriesA log of authentication events on your login — sign-ins, password changes and similar — including the IP address they came from. Removed when you delete your account.
Fields:
payload, ip_address. Removed by our own code.
The accounts you connect
The accounts you connected, and their tokens
public.connected_accountsThe Instagram, TikTok and YouTube accounts you connect: the platform's own account id, your handle, display name and avatar, the permissions you granted, and the OAuth access and refresh tokens we use to act on your behalf. Tokens are encrypted with AES-256-GCM before they are written and are never sent back to your browser. Held for as long as the account is connected, and deleted when you disconnect it or delete your account.
Fields:
user_id, external_id, username, display_name, avatar_url, access_token, refresh_token, expires_at, scopes. Removed with your account.The cached copy of your profile and posts
public.platform_dataA cached copy of what each platform's API returns about you — your profile and your recent posts — so the app can show your data without calling the platform again on every page load. Overwritten on each refresh and deleted with your account.
Fields:
user_id, connected_account_id, payload. Removed with your account.A connection you are part-way through
public.oauth_connect_pendingA short-lived staging row created while you are in the middle of connecting an account. It holds the encrypted tokens for a few minutes until your browser claims them with a single-use code, and is then discarded. It expires on its own if the connection is never completed.
Fields:
intended_user_id, claim_code, email, external_id, display_name, avatar_url, access_token_enc, refresh_token_enc, token_expires_at, scopes, extra. Removed with your account.
Your content and your analytics
Your daily follower and engagement history
public.snapshotsOne row per connected account per day: follower count, views, likes and engagement, plus the audience demographics the platform reports — age, gender and country BANDS about your audience as a group, never information about an individual follower. This history is what the analytics charts are drawn from, so it is kept for as long as your account exists.
Fields:
user_id, connected_account_id, platform, snapshot_date, stats, demographics. Removed with your account.Analyses of your own videos
public.video_analysesWhen you ask us to analyse one of your videos we download the file, extract still frames and a thumbnail, and transcribe the spoken audio. We keep the transcript, the video's caption, the style/hook/score fields we derive from it, and a pointer to the thumbnail stored in our private video-analysis bucket. The frames and the transcript are sent to Anthropic (Claude), our AI sub-processor, purely to produce your analysis — they are not used to train anyone's model. Kept until you delete the analysis or your account.
Fields:
user_id, connected_account_id, media_id, transcript, style, score, caption, hook_seconds, engagement_rate, thumbnail_path, error. Removed with your account.How each post we published performed
public.repurpose_target_metricsDaily performance figures — views, likes, comments and shares — pulled back from each platform for the posts we published for you. This is what lets the app tell you which platform a video actually worked on.
Fields:
user_id, platform, metric_date, metrics. Removed with your account.
Cross-posting and auto-pilot
The crossposts you create
public.repurpose_postsEach crosspost you create: the caption and hashtags you wrote, the cover frame you chose, and a pointer to the video file in our private repurpose-src bucket. Where the video was reused from a platform you connected rather than uploaded by you, we also record WHICH of your accounts and which of your posts it came from, and how we obtained the file — so you can always see the provenance of anything we published for you.
Fields:
user_id, source_bucket, source_path, source_media_id, caption, hashtags, cover_path, source_provenance, source_clean_score, source_account_id, prepare_error. Removed with your account.Each account a crosspost went to
public.repurpose_targetsOne row per destination account for each crosspost: the caption or title you set for that platform, the privacy and comment settings you chose, the id and public URL of the resulting post, your follower count at the moment it went live, and the timestamp at which you consented to publish. The consent timestamp is kept as the record that you asked for the post to be made.
Fields:
user_id, connected_account_id, caption_override, title_override, privacy_level, external_post_id, platform_post_id, live_post_url, error, followers_at_publish, post_options, consent_at. Removed with your account.Your auto-pilot settings
public.autopilot_rulesYour auto-pilot settings: which of your accounts is the source, whether it is switched on, the point in time from which it started watching, and the free-text brief you wrote to steer the caption engine.
Fields:
user_id, primary_account_id, brief, activation_watermark, paused_reason. Removed with your account.The accounts auto-pilot may post to
public.autopilot_rule_targetsWhich of your connected accounts auto-pilot is allowed to post to.
Fields:
user_id, connected_account_id, platform. Removed with your account.What auto-pilot has already handled
public.autopilot_seenA record of every post of yours auto-pilot has looked at and what it decided — reused, skipped, or still pending — identified by the platform's own post id. This is what stops the same video being crossposted twice.
Fields:
user_id, platform, external_media_id, published_at, outcome, skip_reason. Removed with your account.
Files and background work
The background work queued for your account
public.jobsThe background work queued for your account — video analyses, caption generation, crossposts and scheduled data pulls — including each job's input, its result and any error message. This is also where caption generation is recorded; there is no separate captions table.
Fields:
user_id, payload, result, error. Removed with your account.The archive of background jobs
pgmq.a_creato_jobsAn archive of the background jobs the app has run, each recording which piece of your data it was about — and, for caption and auto-pilot jobs, the caption text itself. Removed when you delete your account.
Fields:
message. Removed by our own code.Background jobs waiting to run
pgmq.q_creato_jobsBackground jobs waiting to run or currently running, each recording which piece of your data it is about. Removed when you delete your account.
Fields:
message. Removed by our own code.The index of the files we hold for you
storage.objectsThe index of the files we hold for you. Every object key begins with your account id, so the key itself identifies you even before the file is opened. Removed when you delete your account.
Fields:
name, owner, owner_id, user_metadata. Removed by our own code.An upload that did not finish
storage.s3_multipart_uploadsIf you begin uploading a video and the upload does not finish, the part of the file we already received is held here until the upload is completed or abandoned. The key we store it under begins with your account id.
Fields:
key, bucket_id, owner_id, user_metadata. Removed by our own code.The chunks of an unfinished upload
storage.s3_multipart_uploads_partsThe individual chunks of a video upload that did not finish, held with the unfinished upload above until it is completed or abandoned.
Fields:
key, bucket_id, upload_id, owner_id. Removed by our own code.
How complete that list is
We compiled it by reading our live database catalogue rather than from memory, and an automated check fails our test suite when a table appears that is not on it. A few of the records above are maintained by the services we build on — our sign-in provider and our file-storage layer — rather than written by Crosspost — auth.flow_state, auth.audit_log_entries, storage.s3_multipart_uploads and storage.s3_multipart_uploads_parts — and while we believe deleting your account removes them, we have not yet independently confirmed it. The last two hold a video upload that was started and never finished; because no completed file exists, our own deletion sweep cannot see it. We are measuring all of these before launch, and in the meantime we will remove them by hand on request. We would rather say this than imply a completeness nobody has checked.
Contact
The data controller is CROSSPOST AI LLC, 275 Ransfield Lane, Fuquay-Varina, North Carolina 27526, United States. For any privacy request, email privacy@joincrosspost.com.