ad2app-lib 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/legal/index.d.ts +5 -0
- package/dist/legal/index.js +9 -0
- package/dist/legal/meta.d.ts +12 -0
- package/dist/legal/meta.js +14 -0
- package/dist/legal/privacy.d.ts +2 -0
- package/dist/legal/privacy.js +241 -0
- package/dist/legal/terms.d.ts +2 -0
- package/dist/legal/terms.js +254 -0
- package/dist/legal/types.d.ts +43 -0
- package/dist/legal/types.js +2 -0
- package/dist/types/I_User.d.ts +5 -3
- package/dist/types/I_User.js +6 -10
- package/dist/types/scheduling/I_SchedulingPost.d.ts +3 -0
- package/dist/types/scheduling/I_SchedulingPost.js +2 -0
- package/package.json +6 -2
- package/src/legal/index.ts +5 -0
- package/src/legal/meta.ts +13 -0
- package/src/legal/privacy.ts +240 -0
- package/src/legal/terms.ts +253 -0
- package/src/legal/types.ts +29 -0
- package/src/types/I_User.ts +8 -7
- package/src/types/scheduling/I_SchedulingPost.ts +5 -0
package/dist/types/I_User.d.ts
CHANGED
|
@@ -32,9 +32,11 @@ export declare class I_UserSignInDTO {
|
|
|
32
32
|
export declare class I_UserSignUpDTO {
|
|
33
33
|
email: string;
|
|
34
34
|
password: string;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
termsAccepted: boolean;
|
|
36
|
+
privacyPolicyAccepted: boolean;
|
|
37
|
+
first_name?: string;
|
|
38
|
+
last_name?: string;
|
|
39
|
+
display_name?: string;
|
|
38
40
|
}
|
|
39
41
|
export declare class I_UserFindOneDTO {
|
|
40
42
|
email: string;
|
package/dist/types/I_User.js
CHANGED
|
@@ -69,17 +69,13 @@ __decorate([
|
|
|
69
69
|
__metadata("design:type", String)
|
|
70
70
|
], I_UserSignUpDTO.prototype, "password", void 0);
|
|
71
71
|
__decorate([
|
|
72
|
-
(0, class_validator_1.
|
|
73
|
-
__metadata("design:type",
|
|
74
|
-
], I_UserSignUpDTO.prototype, "
|
|
72
|
+
(0, class_validator_1.IsBoolean)(),
|
|
73
|
+
__metadata("design:type", Boolean)
|
|
74
|
+
], I_UserSignUpDTO.prototype, "termsAccepted", void 0);
|
|
75
75
|
__decorate([
|
|
76
|
-
(0, class_validator_1.
|
|
77
|
-
__metadata("design:type",
|
|
78
|
-
], I_UserSignUpDTO.prototype, "
|
|
79
|
-
__decorate([
|
|
80
|
-
(0, class_validator_1.IsNotEmpty)(),
|
|
81
|
-
__metadata("design:type", String)
|
|
82
|
-
], I_UserSignUpDTO.prototype, "display_name", void 0);
|
|
76
|
+
(0, class_validator_1.IsBoolean)(),
|
|
77
|
+
__metadata("design:type", Boolean)
|
|
78
|
+
], I_UserSignUpDTO.prototype, "privacyPolicyAccepted", void 0);
|
|
83
79
|
class I_UserFindOneDTO {
|
|
84
80
|
}
|
|
85
81
|
exports.I_UserFindOneDTO = I_UserFindOneDTO;
|
|
@@ -30,6 +30,7 @@ export declare class SchedulingCreatePostDTO {
|
|
|
30
30
|
publishNow?: boolean;
|
|
31
31
|
mediaItems?: SchedulingMediaItemDTO[];
|
|
32
32
|
platformSpecificData?: Record<string, Record<string, unknown>>;
|
|
33
|
+
tiktokSettings?: Record<string, unknown>;
|
|
33
34
|
constructor(data?: Partial<SchedulingCreatePostDTO>);
|
|
34
35
|
}
|
|
35
36
|
/** Input DTO for updating an existing post's content or scheduled time. */
|
|
@@ -46,6 +47,8 @@ export declare class SchedulingPostDTO {
|
|
|
46
47
|
platformStatuses: SchedulingPlatformStatusMap;
|
|
47
48
|
/** Per-platform URLs to the published post (e.g. { instagram: 'https://...' }). */
|
|
48
49
|
postUrls?: Record<string, string>;
|
|
50
|
+
/** Per-platform error messages for platforms that failed to publish. */
|
|
51
|
+
platformErrors?: Record<string, string>;
|
|
49
52
|
scheduledAt?: string;
|
|
50
53
|
publishedAt?: string;
|
|
51
54
|
status: SchedulingPostStatus;
|
|
@@ -48,6 +48,7 @@ class SchedulingCreatePostDTO {
|
|
|
48
48
|
this.publishNow = data.publishNow;
|
|
49
49
|
this.mediaItems = data.mediaItems;
|
|
50
50
|
this.platformSpecificData = data.platformSpecificData;
|
|
51
|
+
this.tiktokSettings = data.tiktokSettings;
|
|
51
52
|
}
|
|
52
53
|
}
|
|
53
54
|
exports.SchedulingCreatePostDTO = SchedulingCreatePostDTO;
|
|
@@ -71,6 +72,7 @@ class SchedulingPostDTO {
|
|
|
71
72
|
this.platforms = data.platforms;
|
|
72
73
|
this.platformStatuses = data.platformStatuses;
|
|
73
74
|
this.postUrls = data.postUrls;
|
|
75
|
+
this.platformErrors = data.platformErrors;
|
|
74
76
|
this.scheduledAt = data.scheduledAt;
|
|
75
77
|
this.publishedAt = data.publishedAt;
|
|
76
78
|
this.status = data.status;
|
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ad2app-lib",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"type": "commonjs",
|
|
7
7
|
"exports": {
|
|
8
8
|
"./utils": "./dist/utils/index.js",
|
|
9
9
|
"./types": "./dist/types/index.js",
|
|
10
|
-
"./api": "./dist/api/index.js"
|
|
10
|
+
"./api": "./dist/api/index.js",
|
|
11
|
+
"./legal": "./dist/legal/index.js"
|
|
11
12
|
},
|
|
12
13
|
"typesVersions": {
|
|
13
14
|
"*": {
|
|
@@ -20,6 +21,9 @@
|
|
|
20
21
|
"api": [
|
|
21
22
|
"dist/api/index.d.ts"
|
|
22
23
|
],
|
|
24
|
+
"legal": [
|
|
25
|
+
"dist/legal/index.d.ts"
|
|
26
|
+
],
|
|
23
27
|
"*": [
|
|
24
28
|
"dist/index.d.ts"
|
|
25
29
|
]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const LEGAL_META = {
|
|
2
|
+
lastUpdated: '26 May 2025',
|
|
3
|
+
contactEmail: 'kontakt@ad2.app',
|
|
4
|
+
controllerName: 'Ad2app sp. z o.o.',
|
|
5
|
+
controllerAddress: 'ul. Juliana Smulikowskiego 4A/21, 00-389 Warszawa, Poland',
|
|
6
|
+
controllerNip: '5253042936',
|
|
7
|
+
controllerKrs: '0001168159',
|
|
8
|
+
uodoUrl: 'https://uodo.gov.pl',
|
|
9
|
+
uodoName: 'Urząd Ochrony Danych Osobowych (UODO)',
|
|
10
|
+
uodoAddress: 'ul. Stawki 2, 00-193 Warszawa, Poland',
|
|
11
|
+
} as const;
|
|
12
|
+
|
|
13
|
+
export type LegalMeta = typeof LEGAL_META;
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import type { LegalSection } from './types';
|
|
2
|
+
|
|
3
|
+
export const PRIVACY_SECTIONS: LegalSection[] = [
|
|
4
|
+
{
|
|
5
|
+
id: 's1',
|
|
6
|
+
title: '1. Data Controller',
|
|
7
|
+
blocks: [
|
|
8
|
+
{ kind: 'p', text: 'The data controller of your personal data is **Ad2app sp. z o.o.**, with its registered office at ul. Juliana Smulikowskiego 4A/21, 00-389 Warszawa, Poland, NIP: 5253042936, KRS: 0001168159 ("ad2app", "we", "us", "our").' },
|
|
9
|
+
{ kind: 'p', text: 'You can contact us regarding any privacy matter at kontakt@ad2.app.' },
|
|
10
|
+
{ kind: 'p', text: '**Data Protection Officer:** We have assessed our processing activities against the criteria of Article 37 GDPR. Our current processing volume does not meet the mandatory threshold for DPO designation under Art. 37 GDPR. All privacy queries are handled by our designated privacy contact at kontakt@ad2.app. We will appoint a DPO if our processing activities reach the applicable threshold and will update this policy accordingly.' },
|
|
11
|
+
],
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
id: 's2',
|
|
15
|
+
title: '2. Scope of This Policy',
|
|
16
|
+
blocks: [
|
|
17
|
+
{ kind: 'p', text: 'This Privacy Policy explains how we collect, use, store, share, and protect personal data when you access or use the ad2app platform — including our website, web application, and any related services (collectively, the "Service"). It applies to all users: brands, agencies, and influencers who register accounts, as well as individuals who submit their email via our waitlist form.' },
|
|
18
|
+
{ kind: 'p', text: 'We process personal data in accordance with Regulation (EU) 2016/679 (GDPR) and the Polish Act of 10 May 2018 on the Protection of Personal Data.' },
|
|
19
|
+
{ kind: 'p', text: 'In fulfilling our accountability obligations under Art. 5(2) GDPR, ad2app maintains a Record of Processing Activities (ROPA) as required by Art. 30 GDPR, available to supervisory authorities on request.' },
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: 's3',
|
|
24
|
+
title: '3. Personal Data We Collect',
|
|
25
|
+
blocks: [
|
|
26
|
+
{ kind: 'p', text: 'We collect the following categories of personal data:' },
|
|
27
|
+
{
|
|
28
|
+
kind: 'ul',
|
|
29
|
+
items: [
|
|
30
|
+
{ text: '**Identity & contact data:** first name, last name, email address, business name, phone number (if provided).' },
|
|
31
|
+
{ text: '**Account credentials:** hashed password; OAuth access and refresh tokens when you connect social media accounts — we store tokens, not your passwords.' },
|
|
32
|
+
{
|
|
33
|
+
text: '**Social platform data via OAuth:** when you authorise a connection to a social media account, we receive data from that platform\'s API as permitted by your OAuth consent. The specific data received depends on the platform and the permissions you grant:',
|
|
34
|
+
sub: [
|
|
35
|
+
{ text: '**TikTok:** basic profile (user ID, display name, avatar, biography, profile URL), account statistics (follower count, following count, like count, video count), video list and metadata (titles, view counts, engagement metrics), and — where enabled for scheduling features — video upload and publish permissions. We request only the permissions required for the features you actively use.' },
|
|
36
|
+
{ text: '**Instagram:** Instagram Business account data including username, biography, profile picture, account type, and associated business metrics.' },
|
|
37
|
+
{ text: '**Facebook:** public profile information and, where you grant permission, your Facebook email address. Facebook is an independent OAuth provider separate from Instagram.' },
|
|
38
|
+
{ text: '**YouTube:** YouTube channel data (read-only: videos, statistics, channel metadata) and your Google Account profile (name, profile picture URL, Google Account ID) via the Google identity scope used for authentication.' },
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
{ text: '**Audience data (aggregate only):** demographic and engagement statistics about your social media audience, as provided by the connected platform\'s API. This data is processed exclusively in aggregate statistical form and is not linked to any identified individual within your audience. We have assessed whether this data could constitute special category data under Art. 9 GDPR and confirm that we do not process such special category data — audience data is processed solely as aggregate numeric metrics.' },
|
|
42
|
+
{ text: '**Inbox data:** when you use the platform\'s inbox features, direct message conversations and post comments from your connected social media accounts are fetched and displayed. This includes content sent to you by your followers or other third parties on those platforms. See Section 11 for further detail.' },
|
|
43
|
+
{ text: '**Professional data:** influencer category, social media handles, media kit content.' },
|
|
44
|
+
{ text: '**Campaign & collaboration data:** campaign briefs, offer terms, messages exchanged within the platform between brands and influencers.' },
|
|
45
|
+
{ text: '**Media & content:** files you upload (images, videos, documents) for campaigns or your profile.' },
|
|
46
|
+
{ text: '**Technical & usage data:** IP address, browser type and version, operating system, pages visited, referral URLs, timestamps, crash reports, and usage events (e.g. feature interactions tracked via Google Analytics 4).' },
|
|
47
|
+
{ text: '**Billing data:** billing address and payment reference. Payment card details are handled exclusively by Stripe and are never stored by ad2app.' },
|
|
48
|
+
{ text: '**Waitlist data:** if you submit your email address via our waitlist form before registering, we store that email address to notify you when access is available.' },
|
|
49
|
+
{ text: '**Feedback data:** free-text feedback submitted via the in-app feedback form. This may incidentally contain personal data you choose to include.' },
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
{ kind: 'p', text: 'We do not knowingly collect personal data from individuals under 18 years of age.' },
|
|
53
|
+
{ kind: 'p', text: 'For information on which data fields are mandatory versus optional, see Section 8.' },
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 's4',
|
|
58
|
+
title: '4. Legal Bases and Purposes of Processing',
|
|
59
|
+
blocks: [
|
|
60
|
+
{
|
|
61
|
+
kind: 'table',
|
|
62
|
+
headers: ['Purpose', 'Legal basis (GDPR Art. 6)'],
|
|
63
|
+
rows: [
|
|
64
|
+
['Creating and managing your account', 'Art. 6(1)(b) — performance of contract'],
|
|
65
|
+
['Providing platform features (campaigns, collaborations, messaging, inbox)', 'Art. 6(1)(b) — performance of contract'],
|
|
66
|
+
['Processing social media data received via OAuth connections (audience metrics, engagement data, video metadata, inbox messages)', 'Art. 6(1)(b) — performance of contract: necessary to deliver influencer-brand matching, campaign analytics, and inbox features as contracted. Audience data is processed in aggregate and anonymised form only. No Art. 9 special category data is processed.'],
|
|
67
|
+
['Automated influencer–campaign matching and recommendations (profiling within the meaning of Art. 4(4) GDPR)', 'Art. 6(1)(b) — performance of contract. No binding automated decision with legal or similarly significant effect is made solely by automated means — all matches require affirmative acceptance by both parties. Human review is available on request.'],
|
|
68
|
+
['Temporary retention of account data for 30 days following account deletion (account recovery window)', 'Art. 6(1)(f) — legitimate interests: ad2app\'s and the user\'s shared interest in preventing irreversible accidental data loss, balanced against the minimal additional retention period.'],
|
|
69
|
+
['Processing payments and issuing invoices (via Stripe)', 'Art. 6(1)(b) & Art. 6(1)(c) — contract & legal obligation'],
|
|
70
|
+
['Complying with legal obligations (tax, accounting, record-keeping)', 'Art. 6(1)(c) — legal obligation: Polish Accounting Act (Ustawa o rachunkowości), Tax Ordinance (Ordynacja podatkowa), VAT Act (Ustawa o VAT).'],
|
|
71
|
+
['Waitlist email: notifying you when platform access is available', 'Art. 6(1)(a) — consent (given at the point of waitlist submission; withdrawable at any time).'],
|
|
72
|
+
['Processing in-app feedback', 'Art. 6(1)(f) — legitimate interests: ad2app\'s interest in improving the Service through user feedback.'],
|
|
73
|
+
['Improving and developing the Service (usage analytics via Google Analytics 4)', 'Art. 6(1)(f) — legitimate interests: ad2app\'s interest in understanding usage patterns to improve product quality, balanced against minimal privacy impact through pseudonymisation. Where analytics cookies are used, Art. 6(1)(a) consent applies.'],
|
|
74
|
+
['Security, fraud prevention, and abuse detection', 'Art. 6(1)(f) — legitimate interests: ad2app\'s interest in maintaining platform integrity and protecting users from harm, which overrides the minimal intrusiveness of security logging.'],
|
|
75
|
+
['Transfer of personal data in a merger, acquisition, or business asset sale', 'Art. 6(1)(f) — legitimate interests: ad2app\'s legitimate interest in completing lawful business restructuring, balanced against data subjects\' interests. Data subjects will be notified before their data is subject to a materially different privacy policy.'],
|
|
76
|
+
['Sending marketing communications', 'Art. 6(1)(a) — consent (withdrawable at any time without affecting prior processing).'],
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
{ kind: 'note', label: 'Data Protection Impact Assessment (Art. 35 GDPR)', text: 'ad2app has conducted a pre-screening assessment of its processing activities against the criteria of Art. 35(1) GDPR. The automated influencer–campaign matching function involves profiling of natural persons based on professional and behavioural data. We have assessed whether this constitutes "systematic and extensive evaluation… on which decisions are taken that produce legal or similarly significant effects" within the meaning of Art. 35(3)(b). Our assessment concluded that because no decision with legal or similarly significant effect is produced solely by automated means — all campaign offers require affirmative acceptance by both parties — a full DPIA is not mandated at this stage. This assessment is documented in accordance with our accountability obligations under Art. 5(2) GDPR and is reviewed annually. We will conduct a full DPIA if the nature or scope of our profiling activities changes materially.' },
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: 's5',
|
|
84
|
+
title: '5. Data Retention',
|
|
85
|
+
blocks: [
|
|
86
|
+
{ kind: 'p', text: 'We retain your personal data only for as long as necessary to fulfil the purposes described in this policy, or as required by applicable law. Retention periods correspond to the processing purposes identified in Section 4:' },
|
|
87
|
+
{
|
|
88
|
+
kind: 'ul',
|
|
89
|
+
items: [
|
|
90
|
+
{ text: '**Account data:** for the duration of your account plus 30 days after deletion (account recovery window), then permanently deleted. You may request immediate permanent deletion — waiving the recovery window — by explicitly stating this in your request to kontakt@ad2.app.' },
|
|
91
|
+
{ text: '**Campaign & collaboration data:** for the duration of your account plus 12 months after account deletion to allow dispute resolution, after which it is permanently deleted. Anonymised aggregated analytics may be retained indefinitely.' },
|
|
92
|
+
{ text: '**OAuth access and refresh tokens:** revoked and deleted immediately upon disconnection or account deletion, with a maximum retention of 24 hours for revocation processing logs.' },
|
|
93
|
+
{ text: '**Inbox data (DMs and comments):** retained for the duration of your account; deleted with your account data.' },
|
|
94
|
+
{ text: '**Invoices and billing records:** 5 years from the end of the fiscal year (Polish Accounting Act).' },
|
|
95
|
+
{ text: '**Technical logs:** up to 90 days.' },
|
|
96
|
+
{ text: '**Marketing consent records:** until consent is withdrawn plus 3 years for compliance evidence.' },
|
|
97
|
+
{ text: '**Waitlist emails:** until you register for an account or request deletion, or 24 months from submission if you do not register — whichever comes first.' },
|
|
98
|
+
{ text: '**In-app feedback:** up to 24 months from submission.' },
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
{ kind: 'p', text: 'Data processed solely on the basis of consent (marketing, analytics cookies, waitlist) is deleted within 30 days of consent withdrawal. Data processed for contractual performance is retained for the duration of the contract plus the applicable limitation period under Polish law (generally 3 years for commercial claims under Art. 118 of the Civil Code, or 6 years for documented claims). Data retained for legal obligation compliance follows the statutory schedule above.' },
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: 's6',
|
|
106
|
+
title: '6. Sharing of Personal Data',
|
|
107
|
+
blocks: [
|
|
108
|
+
{ kind: 'p', text: 'We do not sell your personal data. We may share it with:' },
|
|
109
|
+
{
|
|
110
|
+
kind: 'ul',
|
|
111
|
+
items: [
|
|
112
|
+
{ text: '**Other platform users:** when you actively participate in a collaboration, your professional profile (name, social handles, media kit) is visible to the brands/agencies you are matched with, and vice versa.' },
|
|
113
|
+
{
|
|
114
|
+
text: '**Service providers (data processors)** — engaged under contractual terms that include data protection obligations; we are in the process of formalising written Data Processing Agreements under Art. 28 GDPR with all sub-processors where not yet in place:',
|
|
115
|
+
sub: [
|
|
116
|
+
{ text: '**Zernio (ARBICHAT, S.L.)** — social media API aggregation: we pass OAuth tokens, post content, media files, and inbox data to Zernio solely to execute publishing and inbox operations on your behalf. Zernio is incorporated in Spain (EEA); however, data is processed on infrastructure with residency in North America (United States). This constitutes an international data transfer covered by Standard Contractual Clauses (Commission Decision 2021/914).' },
|
|
117
|
+
{ text: '**Stripe** — payment processing: billing address, email, and payment reference are shared with Stripe to process subscription payments. Stripe is located in the United States and operates under the EU–US Data Privacy Framework.' },
|
|
118
|
+
{ text: '**Google Analytics 4** — product analytics: pseudonymised usage event data (feature interactions, session data, device/browser info) is sent to Google only after you have given explicit analytics consent. Google is located in the United States and participates in the EU–US Data Privacy Framework.' },
|
|
119
|
+
{ text: '**Vercel Inc.** — backend API hosting and compute: server-side application code, API requests, and associated request logs are processed on Vercel\'s infrastructure. Vercel is located in the United States and transfers are covered by Standard Contractual Clauses (Commission Decision 2021/914).' },
|
|
120
|
+
{ text: '**Neon Inc.** — PostgreSQL database hosting: all structured platform data (accounts, campaigns, collaborations, social account metadata) is stored in a Neon-hosted PostgreSQL database. Neon is located in the United States and transfers are covered by Standard Contractual Clauses (Commission Decision 2021/914).' },
|
|
121
|
+
{ text: '**Google Firebase (Firebase Authentication)** — authentication token verification: authentication tokens issued to users may be verified against Firebase Authentication to validate active sessions. Firebase is a Google service located in the United States and operates under the EU–US Data Privacy Framework.' },
|
|
122
|
+
{ text: 'A current list of sub-processors (including names, countries of processing, and applicable transfer safeguards) is available on request at kontakt@ad2.app.' },
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
{ text: '**Legal authorities:** where required by law, court order, or to protect the rights and safety of ad2app or third parties.' },
|
|
126
|
+
{ text: '**Business transfers:** in the event of a merger, acquisition, or sale of assets, personal data may be transferred under Art. 6(1)(f) — you will be notified before it becomes subject to a different privacy policy.' },
|
|
127
|
+
],
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
id: 's7',
|
|
133
|
+
title: '7. International Data Transfers',
|
|
134
|
+
blocks: [
|
|
135
|
+
{ kind: 'p', text: 'Your data is primarily processed within the European Economic Area (EEA). We use certain processors located outside the EEA, including processors based in the United States (currently: Vercel, Neon, Google Firebase, Stripe, Google Analytics 4, and Zernio). For all such transfers we ensure adequate safeguards through one or more of the following mechanisms:' },
|
|
136
|
+
{
|
|
137
|
+
kind: 'ul',
|
|
138
|
+
items: [
|
|
139
|
+
{ text: 'the EU–US Data Privacy Framework (Commission Implementing Decision 2023/1795) where the recipient is certified;' },
|
|
140
|
+
{ text: 'EU Standard Contractual Clauses (SCCs, Commission Decision 2021/914) supplemented by Transfer Impact Assessments confirming equivalent protection in the destination country; or' },
|
|
141
|
+
{ text: 'an adequacy decision by the European Commission covering the recipient country.' },
|
|
142
|
+
],
|
|
143
|
+
},
|
|
144
|
+
{ kind: 'p', text: 'You may request copies of applicable SCCs or a summary of our Transfer Impact Assessment findings at kontakt@ad2.app.' },
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: 's8',
|
|
149
|
+
title: '8. Your Rights Under GDPR',
|
|
150
|
+
blocks: [
|
|
151
|
+
{ kind: 'p', text: 'As a data subject, you have the following rights under the GDPR (Articles 15–22 and Art. 77). To exercise any of these rights, contact us at kontakt@ad2.app. We will respond within 30 days (extendable by a further 60 days for complex requests, with notice). Where we decline to act on a request, we will inform you of the reasons within the same period, along with your right to lodge a complaint with UODO (see Section 12) and your right to seek a judicial remedy.' },
|
|
152
|
+
{
|
|
153
|
+
kind: 'ul',
|
|
154
|
+
items: [
|
|
155
|
+
{ text: '**Right of access (Art. 15):** obtain a copy of the personal data we hold about you and information about how it is processed.' },
|
|
156
|
+
{ text: '**Right to rectification (Art. 16):** request correction of inaccurate or incomplete personal data.' },
|
|
157
|
+
{ text: '**Right to erasure (Art. 17):** request deletion of your personal data where there is no overriding legal basis for continued processing. Following account deletion, your data is retained in a deactivated state for 30 days to allow account recovery. You may request immediate permanent deletion (waiving the recovery window) by explicitly stating this in your request.' },
|
|
158
|
+
{ text: '**Right to restriction (Art. 18):** request that we limit the processing of your data in certain circumstances.' },
|
|
159
|
+
{ text: '**Right to data portability (Art. 20):** receive your data in a structured, machine-readable format and transmit it to another controller, where technically feasible.' },
|
|
160
|
+
{ text: '**Right to object (Art. 21):** object to processing based on legitimate interests or to profiling. We will cease unless we demonstrate compelling legitimate grounds. You may object to direct marketing at any time.' },
|
|
161
|
+
{ text: '**Right to withdraw consent (Art. 7(3)):** where processing is based on your consent, you may withdraw it at any time without affecting the lawfulness of prior processing.' },
|
|
162
|
+
{ text: '**Rights related to automated decision-making and profiling (Art. 22):** our platform uses automated algorithms to match Influencers with relevant campaigns — this constitutes profiling within the meaning of Art. 4(4) GDPR. No final decision that produces legal or similarly significant effects is made solely by automated means; all campaign offers require affirmative acceptance by both parties. You may request human review of any automated match by contacting us. You may object to profiling under Art. 21(2).' },
|
|
163
|
+
{ text: '**Right to lodge a complaint (Art. 77):** you have the right to lodge a complaint with the Polish supervisory authority — Urząd Ochrony Danych Osobowych (UODO), ul. Stawki 2, 00-193 Warszawa, https://uodo.gov.pl — if you believe we are processing your personal data in violation of the GDPR.' },
|
|
164
|
+
],
|
|
165
|
+
},
|
|
166
|
+
{ kind: 'note', label: 'Mandatory vs. optional data', text: 'Providing certain personal data (email address, name, account credentials) is a contractual requirement for accessing the Service — without it, we cannot create or maintain your account. Other fields (phone number, media kit files, audience metrics) are voluntary; their absence affects only platform functionality, not account access. Connecting social media accounts via OAuth is optional but required to access campaign matching, publishing, and inbox features.' },
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
id: 's9',
|
|
171
|
+
title: '9. Cookies, Local Storage, and Tracking Technologies',
|
|
172
|
+
blocks: [
|
|
173
|
+
{ kind: 'p', text: 'We use cookies, browser local storage, and similar technologies to operate the Service and improve your experience.' },
|
|
174
|
+
{
|
|
175
|
+
kind: 'ul',
|
|
176
|
+
items: [
|
|
177
|
+
{ text: '**Strictly necessary cookies:** required for authentication sessions and core platform functionality. Cannot be disabled without breaking the Service. Legal basis: Art. 6(1)(b) — contract performance; no consent required. Duration: session cookies expire when you close your browser; authentication cookies expire after 30 days of inactivity.' },
|
|
178
|
+
{ text: '**Functional cookies:** set only in direct response to an action you take (e.g. selecting a language or theme preference), and strictly necessary to deliver that specific function you have requested. They do not track you across sessions beyond preserving your chosen setting. Legal basis: strictly necessary to fulfil your explicit request under Art. 173 of the Polish Telecommunications Act (ePrivacy); no separate consent required. Duration: up to 12 months, or cleared when you clear your browser data.' },
|
|
179
|
+
{ text: '**Analytics cookies (Google Analytics 4):** collect pseudonymised usage event data to help us understand how the Service is used. Legal basis: Art. 6(1)(a) — consent. No analytics cookies are set prior to your affirmative consent via the cookie consent banner shown on first visit. The `_ga` cookie set by Google Analytics expires after 2 years; `_ga_*` expires after 2 years. Data is sent to Google LLC (United States) under the EU–US Data Privacy Framework.' },
|
|
180
|
+
],
|
|
181
|
+
},
|
|
182
|
+
{ kind: 'p', text: 'You may withdraw or update your cookie consent at any time through the consent management panel accessible via the cookie settings link in the footer. Withdrawing analytics consent does not affect platform functionality.' },
|
|
183
|
+
{ kind: 'subheading', text: 'Browser local storage' },
|
|
184
|
+
{ kind: 'p', text: 'In addition to cookies, we use browser local storage to preserve application state between sessions. This includes: your language and theme preferences; a cached copy of your subscription tier and status (retained for up to 30 days then invalidated); and draft campaign deadline data. Local storage data is stored on your device only and is not transmitted to our servers independently of your normal usage. It is cleared when you clear your browser data or log out.' },
|
|
185
|
+
],
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
id: 's10',
|
|
189
|
+
title: '10. Data Security',
|
|
190
|
+
blocks: [
|
|
191
|
+
{ kind: 'p', text: 'We implement appropriate technical and organisational measures to protect your personal data against unauthorised access, alteration, disclosure, or destruction, in accordance with Art. 32 GDPR:' },
|
|
192
|
+
{
|
|
193
|
+
kind: 'ul',
|
|
194
|
+
items: [
|
|
195
|
+
{ text: 'Encryption in transit (TLS 1.2+) and at rest for stored personal data.' },
|
|
196
|
+
{ text: 'Hashed storage of passwords using bcrypt with appropriate cost factors; OAuth tokens encrypted at rest.' },
|
|
197
|
+
{ text: 'Role-based access controls with least-privilege principles; access logs retained for audit purposes.' },
|
|
198
|
+
{ text: 'Pseudonymisation of analytics and usage data where technically feasible.' },
|
|
199
|
+
{ text: 'Regular vulnerability assessments and periodic penetration testing.' },
|
|
200
|
+
{ text: 'Incident detection, response, and escalation procedures — including UODO notification within 72 hours of a qualifying breach under Art. 33 GDPR, and notification to affected data subjects where required under Art. 34 GDPR.' },
|
|
201
|
+
{ text: 'Business continuity and data recovery procedures tested at least annually.' },
|
|
202
|
+
],
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
id: 's11',
|
|
208
|
+
title: '11. Third-Party Links, Social Platforms, and Inbox Data',
|
|
209
|
+
blocks: [
|
|
210
|
+
{ kind: 'p', text: 'The Service allows you to connect social media accounts (TikTok, Instagram, Facebook, or YouTube) to enable platform features. When you authorise an OAuth connection, ad2app receives data from that platform\'s API as permitted by your OAuth consent screen. The source of all such data is the respective social media platform\'s API.' },
|
|
211
|
+
{ kind: 'p', text: '**Inbox data and third-party communications:** when you use the inbox features, direct message conversations and post comments from your connected social media accounts are fetched and stored. This includes messages and comments sent by your followers and other third parties on those platforms. Those individuals have not directly provided their data to ad2app. We process this data under Art. 6(1)(b) (to provide the inbox feature you have contracted for) and rely on the exemption in Art. 14(5)(b) GDPR — providing individual notice to each such person would require disproportionate effort given the volume and platform-derived nature of the data. Inbox data is not used for profiling, advertising, or any purpose beyond displaying your social media communications within the platform.' },
|
|
212
|
+
{ kind: 'p', text: '**Audience data (Art. 14 GDPR):** when you connect a social media account, the connected platform may provide aggregate audience data (e.g. demographic statistics about your followers). This data originates from the social platform and relates to individuals who are not in a direct relationship with ad2app. We rely on Art. 14(5)(b) GDPR — individual notification is impossible given the aggregate and platform-derived nature of this data. It is processed solely in aggregated form for influencer–brand matching and campaign analytics, and is not used for any other purpose.' },
|
|
213
|
+
{ kind: 'p', text: 'We are not responsible for the privacy practices of third-party social platforms. Please review their privacy policies before connecting your accounts.' },
|
|
214
|
+
],
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
id: 's12',
|
|
218
|
+
title: '12. Supervisory Authority',
|
|
219
|
+
blocks: [
|
|
220
|
+
{ kind: 'p', text: 'You have the right to lodge a complaint with the Polish data protection supervisory authority (Art. 77 GDPR) if you believe we have violated your rights:' },
|
|
221
|
+
{ kind: 'address', lines: ['Urząd Ochrony Danych Osobowych (UODO)', 'ul. Stawki 2, 00-193 Warszawa, Poland', 'https://uodo.gov.pl'] },
|
|
222
|
+
],
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
id: 's13',
|
|
226
|
+
title: '13. Changes to This Policy',
|
|
227
|
+
blocks: [
|
|
228
|
+
{ kind: 'p', text: 'We may update this Privacy Policy from time to time. Where changes are material, we will notify you by email or by a prominent notice within the Service at least 14 days before the changes take effect. The "Last updated" date at the top of this page always reflects the most recent version.' },
|
|
229
|
+
{ kind: 'p', text: 'Previous versions of this Privacy Policy are available on request at kontakt@ad2.app. A changelog summarising material amendments is maintained internally and available to supervisory authorities on request.' },
|
|
230
|
+
],
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
id: 's14',
|
|
234
|
+
title: '14. Contact',
|
|
235
|
+
blocks: [
|
|
236
|
+
{ kind: 'p', text: 'For any questions, requests, or concerns regarding this Privacy Policy or your personal data, please contact us at:' },
|
|
237
|
+
{ kind: 'address', lines: ['**Ad2app sp. z o.o.**', 'ul. Juliana Smulikowskiego 4A/21, 00-389 Warszawa, Poland', 'NIP: 5253042936', 'KRS: 0001168159', 'Email: kontakt@ad2.app'] },
|
|
238
|
+
],
|
|
239
|
+
},
|
|
240
|
+
];
|