giantcontext 1.25.0__tar.gz

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.
@@ -0,0 +1,3422 @@
1
+ Metadata-Version: 2.4
2
+ Name: giantcontext
3
+ Version: 1.25.0
4
+ Summary: Official Python SDK for the GiantContext API
5
+ Project-URL: Homepage, https://giantcontext.com
6
+ Project-URL: Documentation, https://docs.giantcontext.com
7
+ Project-URL: Repository, https://github.com/giantcontext/giantcontext-python
8
+ Author-email: GiantContext <support@giantcontext.com>
9
+ License: MIT
10
+ Keywords: api,async,giantcontext,sdk
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Typing :: Typed
19
+ Requires-Python: >=3.11
20
+ Requires-Dist: httpx>=0.28.0
21
+ Provides-Extra: dev
22
+ Requires-Dist: pytest-asyncio>=0.24.0; extra == 'dev'
23
+ Requires-Dist: pytest-testmon>=2.1.0; extra == 'dev'
24
+ Requires-Dist: pytest>=8.0.0; extra == 'dev'
25
+ Requires-Dist: ruff>=0.9.0; extra == 'dev'
26
+ Description-Content-Type: text/markdown
27
+
28
+ # GiantContext Python SDK
29
+
30
+ Official Python SDK for the [Giant Context](https://giantcontext.com) API -- a headless CMS and AI content platform.
31
+
32
+ [![PyPI version](https://img.shields.io/pypi/v/giantcontext.svg)](https://pypi.org/project/giantcontext/)
33
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
34
+
35
+ ## Installation
36
+
37
+ ```bash
38
+ pip install giantcontext
39
+ ```
40
+
41
+ ```bash
42
+ poetry add giantcontext
43
+ ```
44
+
45
+ ```bash
46
+ uv add giantcontext
47
+ ```
48
+
49
+ ## Usage
50
+
51
+ ```python
52
+ import asyncio
53
+ import os
54
+ from giantcontext import create_giant_context
55
+
56
+ async def main():
57
+ async with create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"]) as gc:
58
+ # Get current user
59
+ me = await gc.me.get_me()
60
+ print(f"Logged in as {me['displayName']}")
61
+
62
+ # List organizations you belong to
63
+ orgs = await gc.me.get_my_organizations()
64
+ org = orgs[0]
65
+
66
+ # List projects in the organization
67
+ projects = await gc.projects.get_projects(id=org["id"])
68
+ for project in projects["data"]:
69
+ print(f" {project['name']} ({project['slug']})")
70
+
71
+ # Discover apps in a project
72
+ apps = await gc.project_apps.get_project_apps(
73
+ id=org["id"],
74
+ project_id=projects["data"][0]["id"],
75
+ )
76
+ for app in apps["data"]:
77
+ print(f" {app['type']}: {app['name']}")
78
+
79
+ asyncio.run(main())
80
+ ```
81
+
82
+ ## Authentication
83
+
84
+ ### API Keys
85
+
86
+ API keys use the `gct_` prefix. Create one from the Giant Context console under **Settings > API Keys**.
87
+
88
+ ```python
89
+ gc = create_giant_context(api_key="gct_a1b2c3d4e5f6...")
90
+ ```
91
+
92
+ The recommended pattern is to store your key in an environment variable:
93
+
94
+ ```bash
95
+ export GIANTCONTEXT_API_KEY="gct_a1b2c3d4e5f6..."
96
+ ```
97
+
98
+ ```python
99
+ import os
100
+ from giantcontext import create_giant_context
101
+
102
+ gc = create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"])
103
+ ```
104
+
105
+ ### Token Exchange
106
+
107
+ The SDK never sends your API key directly to resource endpoints. On the first request, it exchanges the key for a short-lived JWT via `POST /api/auth/token`. The JWT is cached in memory and automatically refreshed 60 seconds before expiry. This is handled transparently -- you never need to manage tokens yourself.
108
+
109
+ ## Core Concepts
110
+
111
+ Giant Context organizes content in a hierarchy:
112
+
113
+ ```
114
+ Organization
115
+ └── Project
116
+ ├── Apps
117
+ │ ├── Website (pages, posts, headers, footers, templates, dialogs, sidebars)
118
+ │ ├── Email (emails, campaigns, segments, headers, footers)
119
+ │ ├── CRM (contacts, companies, activities)
120
+ │ ├── Forms (forms, submissions)
121
+ │ └── KB (articles, categories)
122
+ ├── Files (images, documents, folders)
123
+ ├── Branding (colors, fonts, logos, design briefs)
124
+ ├── Drafts (AI-generated content awaiting review)
125
+ └── Ideas (AI suggestions from Mind)
126
+ ```
127
+
128
+ **Organizations** contain one or more **Projects**. Each project has **Apps** (website, email, CRM, forms, knowledge base), plus shared resources like files and branding. **Drafts** are AI-generated content items, and **Ideas** are suggestions surfaced by Mind, the AI engine.
129
+
130
+ The SDK mirrors this hierarchy with resource namespaces:
131
+
132
+ ```python
133
+ gc.organizations # Organization-level operations
134
+ gc.projects # Project CRUD and lookup
135
+ gc.project_apps # App discovery within a project
136
+ gc.website # Website pages, posts, headers, footers, templates
137
+ gc.email # Email templates, campaigns, segments
138
+ gc.crm # Contacts, companies, activities
139
+ gc.forms # Forms and submissions
140
+ gc.other # Knowledge base articles and categories
141
+ gc.project_files # File management and search
142
+ gc.project_branding # Branding assets
143
+ gc.drafts # AI-generated drafts
144
+ gc.ideas # Mind suggestions
145
+ gc.me # Current user profile, notifications, activity
146
+ ```
147
+
148
+ ## Async Context Manager
149
+
150
+ The SDK is fully async, built on [httpx](https://www.python-httpx.org/). The recommended pattern is `async with`, which ensures the underlying HTTP connection pool is properly closed:
151
+
152
+ ```python
153
+ async with create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"]) as gc:
154
+ orgs = await gc.me.get_my_organizations()
155
+ # Connection pool is closed automatically on exit
156
+ ```
157
+
158
+ If you need manual lifecycle control:
159
+
160
+ ```python
161
+ gc = create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"])
162
+ try:
163
+ orgs = await gc.me.get_my_organizations()
164
+ finally:
165
+ await gc.close()
166
+ ```
167
+
168
+ ## Working with Organizations and Projects
169
+
170
+ ```python
171
+ async with create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"]) as gc:
172
+ # List organizations the current user belongs to
173
+ orgs = await gc.me.get_my_organizations()
174
+ org_id = orgs[0]["id"] # e.g. "d4e5f6a7-1234-5678-9abc-def012345678"
175
+
176
+ # Get a specific organization by ID
177
+ org = await gc.organizations.get_organization(id=org_id)
178
+ print(org["name"]) # "Acme Corp"
179
+
180
+ # Or look it up by slug
181
+ org = await gc.organizations.get_organization_by_slug(slug="acme-corp")
182
+
183
+ # List projects in the organization
184
+ projects = await gc.projects.get_projects(id=org_id)
185
+ # projects == {"data": [...], "pagination": {"page": 1, "pageSize": 25, "total": 3}}
186
+
187
+ # Get a specific project by ID
188
+ project = await gc.projects.get_project(
189
+ id=org_id,
190
+ project_id="a1b2c3d4-5678-9abc-def0-123456789abc",
191
+ )
192
+ print(project["name"]) # "Marketing Site"
193
+
194
+ # Or look it up by slug
195
+ project = await gc.projects.get_project_by_slug(
196
+ id=org_id,
197
+ project_slug="marketing-site",
198
+ )
199
+ ```
200
+
201
+ ## Working with Website Content
202
+
203
+ Most app-level resources require three IDs: `organization_id`, `project_id`, and `app_id`. Discover the app ID using `get_project_apps` or `get_project_app_by_slug`:
204
+
205
+ ```python
206
+ async with create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"]) as gc:
207
+ org_id = "d4e5f6a7-1234-5678-9abc-def012345678"
208
+ project_id = "a1b2c3d4-5678-9abc-def0-123456789abc"
209
+
210
+ # Discover the website app
211
+ website_app = await gc.project_apps.get_project_app_by_slug(
212
+ id=org_id,
213
+ project_id=project_id,
214
+ app_slug="website",
215
+ )
216
+ app_id = website_app["id"]
217
+
218
+ # List all pages
219
+ pages = await gc.website.get_website_pages(
220
+ organization_id=org_id,
221
+ project_id=project_id,
222
+ app_id=app_id,
223
+ )
224
+ for page in pages["data"]:
225
+ print(f"{page['title']} - /{page['slug']}")
226
+
227
+ # Get a single page with full block content
228
+ page = await gc.website.get_website_page(
229
+ organization_id=org_id,
230
+ project_id=project_id,
231
+ app_id=app_id,
232
+ page_id="b2c3d4e5-6789-abcd-ef01-234567890abc",
233
+ )
234
+ print(page["title"]) # "About Us"
235
+ print(page["sections"]) # [{...}, {...}] -- full section/block tree
236
+
237
+ # List blog posts
238
+ posts = await gc.website.get_website_posts(
239
+ organization_id=org_id,
240
+ project_id=project_id,
241
+ app_id=app_id,
242
+ page="1",
243
+ page_size="10",
244
+ )
245
+
246
+ # Search pages by title
247
+ results = await gc.website.get_website_pages(
248
+ organization_id=org_id,
249
+ project_id=project_id,
250
+ app_id=app_id,
251
+ search="pricing",
252
+ )
253
+
254
+ # List headers, footers, templates, sidebars, dialogs
255
+ headers = await gc.website.list_website_headers(
256
+ organization_id=org_id, project_id=project_id, app_id=app_id,
257
+ )
258
+ footers = await gc.website.list_website_footers(
259
+ organization_id=org_id, project_id=project_id, app_id=app_id,
260
+ )
261
+ templates = await gc.website.list_website_templates(
262
+ organization_id=org_id, project_id=project_id, app_id=app_id,
263
+ )
264
+
265
+ # Get page URLs for sitemap generation
266
+ urls = await gc.website.get_website_urls(
267
+ organization_id=org_id, project_id=project_id, app_id=app_id,
268
+ )
269
+ ```
270
+
271
+ ## Working with Email
272
+
273
+ ```python
274
+ async with create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"]) as gc:
275
+ org_id = "d4e5f6a7-1234-5678-9abc-def012345678"
276
+ project_id = "a1b2c3d4-5678-9abc-def0-123456789abc"
277
+
278
+ # Discover the email app
279
+ email_app = await gc.project_apps.get_project_app_by_slug(
280
+ id=org_id, project_id=project_id, app_slug="email",
281
+ )
282
+ app_id = email_app["id"]
283
+
284
+ # List email templates
285
+ emails = await gc.email.get_emails(
286
+ organization_id=org_id, project_id=project_id, app_id=app_id,
287
+ )
288
+ for email in emails["data"]:
289
+ print(f"{email['name']} ({email['subject']})")
290
+
291
+ # Get a specific email template
292
+ email = await gc.email.get_email(
293
+ organization_id=org_id,
294
+ project_id=project_id,
295
+ app_id=app_id,
296
+ email_id="c3d4e5f6-789a-bcde-f012-3456789abcde",
297
+ )
298
+
299
+ # List campaigns and their send history
300
+ campaigns = await gc.email.get_email_campaigns(
301
+ organization_id=org_id, project_id=project_id, app_id=app_id,
302
+ )
303
+ campaign = campaigns["data"][0]
304
+ sends = await gc.email.get_email_campaign_sends(
305
+ organization_id=org_id,
306
+ project_id=project_id,
307
+ app_id=app_id,
308
+ campaign_id=campaign["id"],
309
+ )
310
+
311
+ # List segments and get contact count
312
+ segments = await gc.email.list_email_segments(
313
+ organization_id=org_id, project_id=project_id, app_id=app_id,
314
+ )
315
+ for segment in segments["data"]:
316
+ count = await gc.email.get_email_segment_count(
317
+ organization_id=org_id,
318
+ project_id=project_id,
319
+ app_id=app_id,
320
+ segment_id=segment["id"],
321
+ )
322
+ print(f"{segment['name']}: {count['count']} contacts")
323
+ ```
324
+
325
+ ## Working with CRM
326
+
327
+ ```python
328
+ async with create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"]) as gc:
329
+ org_id = "d4e5f6a7-1234-5678-9abc-def012345678"
330
+ project_id = "a1b2c3d4-5678-9abc-def0-123456789abc"
331
+
332
+ # Discover the CRM app
333
+ crm_app = await gc.project_apps.get_project_app_by_slug(
334
+ id=org_id, project_id=project_id, app_slug="crm",
335
+ )
336
+ app_id = crm_app["id"]
337
+
338
+ # List contacts with search
339
+ contacts = await gc.crm.get_crm_contacts_list(
340
+ organization_id=org_id,
341
+ project_id=project_id,
342
+ app_id=app_id,
343
+ search="jane",
344
+ )
345
+ for contact in contacts["data"]:
346
+ print(f"{contact['name']} <{contact['email']}>")
347
+
348
+ # Get a specific contact and their activity history
349
+ contact = await gc.crm.get_crm_contact(
350
+ organization_id=org_id,
351
+ project_id=project_id,
352
+ app_id=app_id,
353
+ contact_id="e5f6a7b8-9012-cdef-3456-789abcdef012",
354
+ )
355
+ activities = await gc.crm.get_crm_contact_activities(
356
+ organization_id=org_id,
357
+ project_id=project_id,
358
+ app_id=app_id,
359
+ contact_id=contact["id"],
360
+ )
361
+
362
+ # List companies
363
+ companies = await gc.crm.get_crm_companies_list(
364
+ organization_id=org_id, project_id=project_id, app_id=app_id,
365
+ )
366
+
367
+ # Get contacts for a specific company
368
+ company_contacts = await gc.crm.get_crm_company_contacts(
369
+ organization_id=org_id,
370
+ project_id=project_id,
371
+ app_id=app_id,
372
+ company_id=companies["data"][0]["id"],
373
+ )
374
+ ```
375
+
376
+ ## Working with Forms
377
+
378
+ ```python
379
+ async with create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"]) as gc:
380
+ org_id = "d4e5f6a7-1234-5678-9abc-def012345678"
381
+ project_id = "a1b2c3d4-5678-9abc-def0-123456789abc"
382
+
383
+ # Discover the forms app
384
+ forms_app = await gc.project_apps.get_project_app_by_slug(
385
+ id=org_id, project_id=project_id, app_slug="forms",
386
+ )
387
+ app_id = forms_app["id"]
388
+
389
+ # List all forms
390
+ forms = await gc.forms.get_forms_list(
391
+ organization_id=org_id, project_id=project_id, app_id=app_id,
392
+ )
393
+ for form in forms["data"]:
394
+ print(f"{form['name']} (id: {form['id']})")
395
+
396
+ # Get a specific form's definition (fields, validation rules)
397
+ form = await gc.forms.get_form(
398
+ organization_id=org_id,
399
+ project_id=project_id,
400
+ app_id=app_id,
401
+ form_id="f6a7b8c9-0123-def4-5678-9abcdef01234",
402
+ )
403
+
404
+ # List submissions for a form
405
+ submissions = await gc.forms.get_form_submissions(
406
+ organization_id=org_id,
407
+ project_id=project_id,
408
+ app_id=app_id,
409
+ form_id=form["id"],
410
+ page="1",
411
+ page_size="50",
412
+ )
413
+ for sub in submissions["data"]:
414
+ print(f" Submitted at {sub['createdAt']}: {sub['data']}")
415
+ ```
416
+
417
+ ## Working with Knowledge Base
418
+
419
+ Knowledge base resources are under `gc.other`:
420
+
421
+ ```python
422
+ async with create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"]) as gc:
423
+ org_id = "d4e5f6a7-1234-5678-9abc-def012345678"
424
+ project_id = "a1b2c3d4-5678-9abc-def0-123456789abc"
425
+
426
+ # Discover the KB app
427
+ kb_app = await gc.project_apps.get_project_app_by_slug(
428
+ id=org_id, project_id=project_id, app_slug="kb",
429
+ )
430
+ app_id = kb_app["id"]
431
+
432
+ # List categories
433
+ categories = await gc.other.list_kb_categories(
434
+ organization_id=org_id, project_id=project_id, app_id=app_id,
435
+ )
436
+ for cat in categories:
437
+ print(f"{cat['name']} (id: {cat['id']})")
438
+
439
+ # List articles, optionally filtered by category or status
440
+ articles = await gc.other.list_kb_articles(
441
+ organization_id=org_id,
442
+ project_id=project_id,
443
+ app_id=app_id,
444
+ status="published",
445
+ search="getting started",
446
+ )
447
+ for article in articles["data"]:
448
+ print(f"{article['title']}")
449
+
450
+ # Get a single article with full content
451
+ article = await gc.other.get_kb_article(
452
+ organization_id=org_id,
453
+ project_id=project_id,
454
+ app_id=app_id,
455
+ article_id=articles["data"][0]["id"],
456
+ )
457
+
458
+ # Get KB settings
459
+ settings = await gc.other.get_kb_settings(
460
+ organization_id=org_id, project_id=project_id, app_id=app_id,
461
+ )
462
+ ```
463
+
464
+ ## Working with Files
465
+
466
+ ```python
467
+ async with create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"]) as gc:
468
+ org_id = "d4e5f6a7-1234-5678-9abc-def012345678"
469
+ project_id = "a1b2c3d4-5678-9abc-def0-123456789abc"
470
+
471
+ # List files in a project
472
+ files = await gc.project_files.get_files(
473
+ id=org_id, project_id=project_id,
474
+ )
475
+ for f in files["data"]:
476
+ print(f"{f['name']} ({f['mimeType']}, {f['size']} bytes)")
477
+
478
+ # Search files by content (semantic search)
479
+ results = await gc.project_files.search_project_files(
480
+ id=org_id,
481
+ project_id=project_id,
482
+ query="quarterly revenue report",
483
+ limit="5",
484
+ )
485
+ for result in results:
486
+ print(f"{result['name']} (score: {result['score']})")
487
+
488
+ # Get a specific file
489
+ file = await gc.project_files.get_file(
490
+ id=org_id,
491
+ project_id=project_id,
492
+ file_id="a7b8c9d0-1234-ef56-7890-abcdef012345",
493
+ )
494
+
495
+ # Create a file from text content (useful for programmatic content ingestion)
496
+ new_file = await gc.project_files.ingest_file(
497
+ id=org_id,
498
+ project_id=project_id,
499
+ data={
500
+ "name": "meeting-notes-2026-04.md",
501
+ "content": "# Q2 Planning\n\nKey decisions from today's meeting...",
502
+ "mimeType": "text/markdown",
503
+ },
504
+ )
505
+ print(f"Created file: {new_file['id']}")
506
+
507
+ # List file folders
508
+ folders = await gc.project_files.get_file_folders(
509
+ id=org_id, project_id=project_id,
510
+ )
511
+
512
+ # List files in a specific folder
513
+ folder_files = await gc.project_files.get_files(
514
+ id=org_id,
515
+ project_id=project_id,
516
+ folder_id=folders[0]["id"],
517
+ )
518
+
519
+ # Find everywhere a file is referenced (pages, emails, etc.)
520
+ refs = await gc.project_files.get_file_references(
521
+ id=org_id,
522
+ project_id=project_id,
523
+ file_id="a7b8c9d0-1234-ef56-7890-abcdef012345",
524
+ )
525
+ for ref in refs:
526
+ print(f"Used in {ref['type']}: {ref['title']}")
527
+ ```
528
+
529
+ ## Working with Drafts
530
+
531
+ Drafts are AI-generated content items. The typical workflow is: trigger generation (via the console or API), then poll for completion.
532
+
533
+ ```python
534
+ import asyncio
535
+
536
+ async with create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"]) as gc:
537
+ org_id = "d4e5f6a7-1234-5678-9abc-def012345678"
538
+ project_id = "a1b2c3d4-5678-9abc-def0-123456789abc"
539
+
540
+ # List all drafts for a project
541
+ drafts = await gc.drafts.list_drafts(
542
+ id=org_id, project_id=project_id,
543
+ )
544
+ for draft in drafts["data"]:
545
+ print(f"{draft['title']} [{draft['status']}]")
546
+ # status: "pending", "generating", "ready", "failed"
547
+
548
+ # Get a specific draft (includes full generated content when ready)
549
+ draft = await gc.drafts.get_draft(
550
+ id=org_id,
551
+ project_id=project_id,
552
+ draft_id="b8c9d0e1-2345-f678-90ab-cdef01234567",
553
+ )
554
+
555
+ # Request an AI edit of existing content
556
+ edit = await gc.drafts.edit_draft(data={
557
+ "organizationId": org_id,
558
+ "projectId": project_id,
559
+ "contentType": "page",
560
+ "contentId": "c9d0e1f2-3456-7890-abcd-ef0123456789",
561
+ "instructions": "Make the hero section more compelling and add a CTA button",
562
+ })
563
+ draft_id = edit["id"]
564
+
565
+ # Poll until the draft is ready
566
+ while True:
567
+ draft = await gc.drafts.get_draft(
568
+ id=org_id, project_id=project_id, draft_id=draft_id,
569
+ )
570
+ if draft["status"] in ("ready", "failed"):
571
+ break
572
+ await asyncio.sleep(2)
573
+
574
+ if draft["status"] == "ready":
575
+ print(f"Draft ready: {draft['title']}")
576
+ ```
577
+
578
+ ## Working with Ideas
579
+
580
+ Ideas are suggestions generated by Mind, the AI engine. They can be approved (which creates a draft) or dismissed.
581
+
582
+ ```python
583
+ async with create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"]) as gc:
584
+ org_id = "d4e5f6a7-1234-5678-9abc-def012345678"
585
+ project_id = "a1b2c3d4-5678-9abc-def0-123456789abc"
586
+
587
+ # List all ideas for a project
588
+ ideas = await gc.ideas.list_ideas(id=org_id, project_id=project_id)
589
+ for idea in ideas["data"]:
590
+ print(f"[{idea['status']}] {idea['title']}: {idea['description']}")
591
+
592
+ # Get a specific idea
593
+ idea = await gc.ideas.get_idea(
594
+ id=org_id,
595
+ project_id=project_id,
596
+ idea_id="d0e1f2a3-4567-890a-bcde-f01234567890",
597
+ )
598
+
599
+ # Approve an idea (triggers draft generation)
600
+ result = await gc.ideas.approve_idea(
601
+ id=org_id,
602
+ project_id=project_id,
603
+ idea_id=idea["id"],
604
+ data={"feedback": "Sounds good, please generate this"},
605
+ )
606
+
607
+ # Dismiss an idea
608
+ await gc.ideas.dismiss_idea(
609
+ id=org_id,
610
+ project_id=project_id,
611
+ idea_id="e1f2a3b4-5678-90ab-cdef-012345678901",
612
+ data={"reason": "Not relevant to our current strategy"},
613
+ )
614
+ ```
615
+
616
+ ## Pagination
617
+
618
+ List endpoints return paginated results. Use `page` and `page_size` to control pagination:
619
+
620
+ ```python
621
+ async with create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"]) as gc:
622
+ org_id = "d4e5f6a7-1234-5678-9abc-def012345678"
623
+ project_id = "a1b2c3d4-5678-9abc-def0-123456789abc"
624
+ app_id = "e5f6a7b8-9012-cdef-3456-789abcdef012"
625
+
626
+ # First page, 10 items
627
+ result = await gc.website.get_website_pages(
628
+ organization_id=org_id,
629
+ project_id=project_id,
630
+ app_id=app_id,
631
+ page="1",
632
+ page_size="10",
633
+ )
634
+
635
+ pages = result["data"] # list of page objects
636
+ pagination = result["pagination"] # {"page": 1, "pageSize": 10, "total": 47}
637
+
638
+ # Iterate through all pages
639
+ all_pages = []
640
+ current_page = 1
641
+ while True:
642
+ result = await gc.website.get_website_pages(
643
+ organization_id=org_id,
644
+ project_id=project_id,
645
+ app_id=app_id,
646
+ page=str(current_page),
647
+ page_size="25",
648
+ )
649
+ all_pages.extend(result["data"])
650
+ total = result["pagination"]["total"]
651
+ if len(all_pages) >= total:
652
+ break
653
+ current_page += 1
654
+
655
+ print(f"Fetched {len(all_pages)} pages total")
656
+ ```
657
+
658
+ ## Error Handling
659
+
660
+ The SDK raises `httpx.HTTPStatusError` for non-2xx responses. The error response body contains a structured JSON message:
661
+
662
+ ```python
663
+ import httpx
664
+
665
+ async with create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"]) as gc:
666
+ try:
667
+ project = await gc.projects.get_project(
668
+ id="d4e5f6a7-1234-5678-9abc-def012345678",
669
+ project_id="nonexistent-id",
670
+ )
671
+ except httpx.HTTPStatusError as e:
672
+ print(e.response.status_code) # 404
673
+ print(e.response.json()) # {"message": "Project not found", "code": "NOT_FOUND"}
674
+ ```
675
+
676
+ Common error codes:
677
+
678
+ | Status | Code | Meaning |
679
+ | ------ | ---------------- | ------------------------------------------ |
680
+ | 400 | `BAD_REQUEST` | Invalid request body or parameters |
681
+ | 401 | `UNAUTHORIZED` | Invalid or expired API key |
682
+ | 403 | `FORBIDDEN` | Insufficient permissions for this resource |
683
+ | 404 | `NOT_FOUND` | Resource does not exist |
684
+ | 409 | `CONFLICT` | Resource already exists or state conflict |
685
+ | 429 | `RATE_LIMITED` | Too many requests, retry after backoff |
686
+ | 500 | `INTERNAL_ERROR` | Server error, contact support |
687
+
688
+ ## Request IDs and Tracing
689
+
690
+ Every API response includes an `x-request-id` header. Include this when reporting issues to support:
691
+
692
+ ```python
693
+ import httpx
694
+
695
+ async with create_giant_context(api_key=os.environ["GIANTCONTEXT_API_KEY"]) as gc:
696
+ try:
697
+ await gc.projects.get_project(
698
+ id="d4e5f6a7-1234-5678-9abc-def012345678",
699
+ project_id="nonexistent-id",
700
+ )
701
+ except httpx.HTTPStatusError as e:
702
+ request_id = e.response.headers.get("x-request-id")
703
+ print(f"Request failed. Request ID: {request_id}")
704
+ # Include this ID when contacting support
705
+ ```
706
+
707
+ ## Configuration
708
+
709
+ ```python
710
+ import os
711
+ from giantcontext import create_giant_context
712
+
713
+ gc = create_giant_context(
714
+ # Required. Your API key (format: gct_*).
715
+ # Get one from the Giant Context console: Settings > API Keys.
716
+ api_key=os.environ["GIANTCONTEXT_API_KEY"],
717
+
718
+ # Optional. API base URL. Default: "https://api.giantcontext.com"
719
+ base_url="https://api.giantcontext.com",
720
+
721
+ # Optional. Request timeout in seconds. Default: 30.0
722
+ timeout=30.0,
723
+ )
724
+ ```
725
+
726
+ | Parameter | Type | Default | Description |
727
+ | ---------- | ------- | ------------------------------ | ---------------------------- |
728
+ | `api_key` | `str` | _required_ | API key starting with `gct_` |
729
+ | `base_url` | `str` | `https://api.giantcontext.com` | API base URL |
730
+ | `timeout` | `float` | `30.0` | Request timeout in seconds |
731
+
732
+ ## API Reference
733
+
734
+ <!-- API_REFERENCE_START -->
735
+
736
+ 110 methods across 23 resources.
737
+
738
+ - [API Keys](#api-keys) (2)
739
+ - [App Members](#app-members) (2)
740
+ - [Bug Reports](#bug-reports) (2)
741
+ - [CRM](#crm) (9)
742
+ - [Chat](#chat) (2)
743
+ - [Drafts](#drafts) (3)
744
+ - [Email](#email) (13)
745
+ - [Feature Requests](#feature-requests) (3)
746
+ - [Forms](#forms) (4)
747
+ - [Ideas](#ideas) (4)
748
+ - [Invitations](#invitations) (2)
749
+ - [Me](#me) (6)
750
+ - [Organization Members](#organization-members) (4)
751
+ - [Organizations](#organizations) (4)
752
+ - [Other](#other) (5)
753
+ - [Project Apps](#project-apps) (4)
754
+ - [Project Branding](#project-branding) (2)
755
+ - [Project Domains](#project-domains) (2)
756
+ - [Project Files](#project-files) (8)
757
+ - [Project Members](#project-members) (2)
758
+ - [Project Trash](#project-trash) (2)
759
+ - [Projects](#projects) (4)
760
+ - [Website](#website) (21)
761
+
762
+ ### API Keys
763
+
764
+ `gc.api_keys`
765
+
766
+ #### `list_my_api_keys`
767
+
768
+ Get my API keys
769
+ Returns all active API keys belonging to the current user. Each key includes its ID, name, creation date, expiration date, and associated organization. The secret key value is not returned for security.
770
+
771
+ **Returns:** `dict[str, Any]`
772
+
773
+ ```python
774
+ result = await gc.api_keys.list_my_api_keys()
775
+ ```
776
+
777
+ ---
778
+
779
+ #### `list_organization_api_keys`
780
+
781
+ Get organization API keys
782
+ Returns all active API keys for an organization. Each key object includes its ID, name, creation date, expiration date, and the user it is associated with. The secret key value is never returned in list responses. Requires admin or owner role within the organization.
783
+
784
+ | Parameter | Type | Required |
785
+ | --------- | ----- | -------- |
786
+ | `id` | `str` | Yes |
787
+
788
+ **Returns:** `dict[str, Any]`
789
+
790
+ ```python
791
+ result = await gc.api_keys.list_organization_api_keys(
792
+ id="uuid-id",
793
+ )
794
+ ```
795
+
796
+ ---
797
+
798
+ ### App Members
799
+
800
+ `gc.app_members`
801
+
802
+ #### `get_app_member`
803
+
804
+ Get an app member by ID
805
+ Retrieves the full details of a specific app member by their membership ID. Returns the member's user profile information (name, email, avatar) along with their assigned role within the app and membership timestamps.
806
+
807
+ | Parameter | Type | Required |
808
+ | ------------ | ----- | -------- |
809
+ | `id` | `str` | Yes |
810
+ | `project_id` | `str` | Yes |
811
+ | `app_id` | `str` | Yes |
812
+ | `member_id` | `str` | Yes |
813
+
814
+ **Returns:** `dict[str, Any]`
815
+
816
+ ```python
817
+ result = await gc.app_members.get_app_member(
818
+ id="uuid-id",
819
+ project_id="uuid-project",
820
+ app_id="uuid-app",
821
+ member_id="uuid-member",
822
+ )
823
+ ```
824
+
825
+ ---
826
+
827
+ #### `get_app_members`
828
+
829
+ Get members of an app
830
+ Returns a paginated list of all members who have been explicitly assigned roles at the app level. Each member entry includes the user's profile information (name, email, avatar) and their assigned role within the app. This is separate from organization-level or project-level membership; only users with direct app-level role assignments are returned.
831
+
832
+ | Parameter | Type | Required |
833
+ | ------------ | ----- | -------- |
834
+ | `id` | `str` | Yes |
835
+ | `project_id` | `str` | Yes |
836
+ | `app_id` | `str` | Yes |
837
+
838
+ **Returns:** `dict[str, Any]`
839
+
840
+ ```python
841
+ result = await gc.app_members.get_app_members(
842
+ id="uuid-id",
843
+ project_id="uuid-project",
844
+ app_id="uuid-app",
845
+ )
846
+ ```
847
+
848
+ ---
849
+
850
+ ### Bug Reports
851
+
852
+ `gc.bug_reports`
853
+
854
+ #### `list_my_bug_reports`
855
+
856
+ Get my bug reports
857
+ Returns all bug reports submitted by the current user (up to 100). Each report includes its title, description, steps to reproduce, expected/actual behavior, severity, status (open/resolved/cancelled), browser info, page URL, report count, and linked GitHub issue details if any.
858
+
859
+ **Returns:** `dict[str, Any]`
860
+
861
+ ```python
862
+ result = await gc.bug_reports.list_my_bug_reports()
863
+ ```
864
+
865
+ ---
866
+
867
+ #### `get_bug_report_comments`
868
+
869
+ Get comments for a bug report
870
+ Returns all team comments and responses for a specific bug report owned by the current user. Each comment includes its ID, the comment text, the author name, and a creation timestamp. Comments are returned in chronological order.
871
+
872
+ | Parameter | Type | Required |
873
+ | --------- | ----- | -------- |
874
+ | `id` | `str` | Yes |
875
+
876
+ **Returns:** `dict[str, Any]`
877
+
878
+ ```python
879
+ result = await gc.bug_reports.get_bug_report_comments(
880
+ id="uuid-id",
881
+ )
882
+ ```
883
+
884
+ ---
885
+
886
+ ### CRM
887
+
888
+ `gc.crm`
889
+
890
+ #### `get_crm_activity`
891
+
892
+ Get activity
893
+ Returns a single CRM activity by ID, including type, subject, description, notes, duration, outcome, due date, completion status, assignee, and linked contact/company objects.
894
+
895
+ | Parameter | Type | Required |
896
+ | ----------------- | ----- | -------- |
897
+ | `organization_id` | `str` | Yes |
898
+ | `project_id` | `str` | Yes |
899
+ | `app_id` | `str` | Yes |
900
+ | `activity_id` | `str` | Yes |
901
+
902
+ **Returns:** `dict[str, Any]`
903
+
904
+ ```python
905
+ result = await gc.crm.get_crm_activity(
906
+ organization_id="uuid-organization",
907
+ project_id="uuid-project",
908
+ app_id="uuid-app",
909
+ activity_id="uuid-activity",
910
+ )
911
+ ```
912
+
913
+ ---
914
+
915
+ #### `get_crm_activities_list`
916
+
917
+ Get activities
918
+ Returns a paginated list of all CRM activities for the specified app. Supports search by subject or description. Each activity includes linked contact and company objects.
919
+
920
+ | Parameter | Type | Required |
921
+ | ----------------- | ----- | -------- |
922
+ | `organization_id` | `str` | Yes |
923
+ | `project_id` | `str` | Yes |
924
+ | `app_id` | `str` | Yes |
925
+ | `page` | `str` | No |
926
+ | `page_size` | `str` | No |
927
+ | `search` | `str` | No |
928
+
929
+ **Returns:** `dict[str, Any]`
930
+
931
+ ```python
932
+ result = await gc.crm.get_crm_activities_list(
933
+ organization_id="uuid-organization",
934
+ project_id="uuid-project",
935
+ app_id="uuid-app",
936
+ page=1,
937
+ )
938
+ ```
939
+
940
+ ---
941
+
942
+ #### `get_crm_company_activities`
943
+
944
+ Get activities for a company
945
+ Returns all CRM activities linked to a specific company, ordered by most recent first. Each activity includes type, subject, description, notes, outcome, duration, due date, and linked contact/company objects.
946
+
947
+ | Parameter | Type | Required |
948
+ | ----------------- | ----- | -------- |
949
+ | `organization_id` | `str` | Yes |
950
+ | `project_id` | `str` | Yes |
951
+ | `app_id` | `str` | Yes |
952
+ | `company_id` | `str` | Yes |
953
+
954
+ **Returns:** `list[dict[str, Any]]`
955
+
956
+ ```python
957
+ result = await gc.crm.get_crm_company_activities(
958
+ organization_id="uuid-organization",
959
+ project_id="uuid-project",
960
+ app_id="uuid-app",
961
+ company_id="uuid-company",
962
+ )
963
+ ```
964
+
965
+ ---
966
+
967
+ #### `get_crm_company_contacts`
968
+
969
+ Get contacts for a company
970
+ Returns all CRM contacts linked to a specific company, ordered by last name then first name. Each contact includes name, email, phone, title, department, status, source, tags, and linked company object.
971
+
972
+ | Parameter | Type | Required |
973
+ | ----------------- | ----- | -------- |
974
+ | `organization_id` | `str` | Yes |
975
+ | `project_id` | `str` | Yes |
976
+ | `app_id` | `str` | Yes |
977
+ | `company_id` | `str` | Yes |
978
+
979
+ **Returns:** `list[dict[str, Any]]`
980
+
981
+ ```python
982
+ result = await gc.crm.get_crm_company_contacts(
983
+ organization_id="uuid-organization",
984
+ project_id="uuid-project",
985
+ app_id="uuid-app",
986
+ company_id="uuid-company",
987
+ )
988
+ ```
989
+
990
+ ---
991
+
992
+ #### `get_crm_company`
993
+
994
+ Get company
995
+ Returns a single CRM company by ID, including name, website, industry, size, annual revenue, contact info, address, tags, custom properties, and a count of associated contacts.
996
+
997
+ | Parameter | Type | Required |
998
+ | ----------------- | ----- | -------- |
999
+ | `organization_id` | `str` | Yes |
1000
+ | `project_id` | `str` | Yes |
1001
+ | `app_id` | `str` | Yes |
1002
+ | `company_id` | `str` | Yes |
1003
+
1004
+ **Returns:** `dict[str, Any]`
1005
+
1006
+ ```python
1007
+ result = await gc.crm.get_crm_company(
1008
+ organization_id="uuid-organization",
1009
+ project_id="uuid-project",
1010
+ app_id="uuid-app",
1011
+ company_id="uuid-company",
1012
+ )
1013
+ ```
1014
+
1015
+ ---
1016
+
1017
+ #### `get_crm_companies_list`
1018
+
1019
+ Get companies
1020
+ Returns a paginated list of all CRM companies for the specified app. Supports search by company name or industry. Each company includes a count of associated contacts.
1021
+
1022
+ | Parameter | Type | Required |
1023
+ | ----------------- | ----- | -------- |
1024
+ | `organization_id` | `str` | Yes |
1025
+ | `project_id` | `str` | Yes |
1026
+ | `app_id` | `str` | Yes |
1027
+ | `page` | `str` | No |
1028
+ | `page_size` | `str` | No |
1029
+ | `search` | `str` | No |
1030
+
1031
+ **Returns:** `dict[str, Any]`
1032
+
1033
+ ```python
1034
+ result = await gc.crm.get_crm_companies_list(
1035
+ organization_id="uuid-organization",
1036
+ project_id="uuid-project",
1037
+ app_id="uuid-app",
1038
+ page=1,
1039
+ )
1040
+ ```
1041
+
1042
+ ---
1043
+
1044
+ #### `get_crm_contact_activities`
1045
+
1046
+ Get activities for a contact
1047
+ Returns all CRM activities linked to a specific contact, ordered by most recent first. Each activity includes type, subject, description, notes, outcome, duration, due date, and linked contact/company objects.
1048
+
1049
+ | Parameter | Type | Required |
1050
+ | ----------------- | ----- | -------- |
1051
+ | `organization_id` | `str` | Yes |
1052
+ | `project_id` | `str` | Yes |
1053
+ | `app_id` | `str` | Yes |
1054
+ | `contact_id` | `str` | Yes |
1055
+
1056
+ **Returns:** `list[dict[str, Any]]`
1057
+
1058
+ ```python
1059
+ result = await gc.crm.get_crm_contact_activities(
1060
+ organization_id="uuid-organization",
1061
+ project_id="uuid-project",
1062
+ app_id="uuid-app",
1063
+ contact_id="uuid-contact",
1064
+ )
1065
+ ```
1066
+
1067
+ ---
1068
+
1069
+ #### `get_crm_contact`
1070
+
1071
+ Get contact
1072
+ Returns a single CRM contact by ID, including linked company details. Fields include name, email, phone, title, department, status, source, tags, email subscription status, and last activity timestamp.
1073
+
1074
+ | Parameter | Type | Required |
1075
+ | ----------------- | ----- | -------- |
1076
+ | `organization_id` | `str` | Yes |
1077
+ | `project_id` | `str` | Yes |
1078
+ | `app_id` | `str` | Yes |
1079
+ | `contact_id` | `str` | Yes |
1080
+
1081
+ **Returns:** `dict[str, Any]`
1082
+
1083
+ ```python
1084
+ result = await gc.crm.get_crm_contact(
1085
+ organization_id="uuid-organization",
1086
+ project_id="uuid-project",
1087
+ app_id="uuid-app",
1088
+ contact_id="uuid-contact",
1089
+ )
1090
+ ```
1091
+
1092
+ ---
1093
+
1094
+ #### `get_crm_contacts_list`
1095
+
1096
+ Get contacts
1097
+ Returns a paginated list of all CRM contacts for the specified app. Supports search by first name, last name, or email. Each contact includes associated company info if linked.
1098
+
1099
+ | Parameter | Type | Required |
1100
+ | ----------------- | ----- | -------- |
1101
+ | `organization_id` | `str` | Yes |
1102
+ | `project_id` | `str` | Yes |
1103
+ | `app_id` | `str` | Yes |
1104
+ | `page` | `str` | No |
1105
+ | `page_size` | `str` | No |
1106
+ | `search` | `str` | No |
1107
+
1108
+ **Returns:** `dict[str, Any]`
1109
+
1110
+ ```python
1111
+ result = await gc.crm.get_crm_contacts_list(
1112
+ organization_id="uuid-organization",
1113
+ project_id="uuid-project",
1114
+ app_id="uuid-app",
1115
+ page=1,
1116
+ )
1117
+ ```
1118
+
1119
+ ---
1120
+
1121
+ ### Chat
1122
+
1123
+ `gc.chat`
1124
+
1125
+ #### `get_chat_conversation`
1126
+
1127
+ Get chat conversation with paginated messages
1128
+ Retrieve a chat conversation with cursor-based paginated messages. Without a cursor, returns the most recent messages (up to limit). Use direction=older with cursor/cursorId to load history.
1129
+
1130
+ | Parameter | Type | Required |
1131
+ | ----------------- | ----- | -------- |
1132
+ | `organization_id` | `str` | Yes |
1133
+ | `project_id` | `str` | Yes |
1134
+ | `app_id` | `str` | Yes |
1135
+ | `conversation_id` | `str` | Yes |
1136
+ | `cursor` | `str` | No |
1137
+ | `cursor_id` | `str` | No |
1138
+ | `direction` | `str` | No |
1139
+ | `limit` | `str` | No |
1140
+
1141
+ **Returns:** `dict[str, Any]`
1142
+
1143
+ ```python
1144
+ result = await gc.chat.get_chat_conversation(
1145
+ organization_id="uuid-organization",
1146
+ project_id="uuid-project",
1147
+ app_id="uuid-app",
1148
+ conversation_id="uuid-conversation",
1149
+ )
1150
+ ```
1151
+
1152
+ ---
1153
+
1154
+ #### `list_chat_conversations`
1155
+
1156
+ Get all chat conversations
1157
+ List all chat conversations for a given chat app. Returns a paginated list of conversations with their IDs, titles, visitor IDs, and timestamps. Supports search filtering by conversation title or visitor ID. Results are ordered by most recently updated first. This is an admin-only endpoint used to review and manage all customer chat conversations.
1158
+
1159
+ | Parameter | Type | Required |
1160
+ | ----------------- | ----- | -------- |
1161
+ | `organization_id` | `str` | Yes |
1162
+ | `project_id` | `str` | Yes |
1163
+ | `app_id` | `str` | Yes |
1164
+ | `page` | `str` | No |
1165
+ | `page_size` | `str` | No |
1166
+ | `search` | `str` | No |
1167
+
1168
+ **Returns:** `dict[str, Any]`
1169
+
1170
+ ```python
1171
+ result = await gc.chat.list_chat_conversations(
1172
+ organization_id="uuid-organization",
1173
+ project_id="uuid-project",
1174
+ app_id="uuid-app",
1175
+ page=1,
1176
+ )
1177
+ ```
1178
+
1179
+ ---
1180
+
1181
+ ### Drafts
1182
+
1183
+ `gc.drafts`
1184
+
1185
+ #### `edit_draft`
1186
+
1187
+ Create an edit draft
1188
+ Creates a draft copy of existing content for non-destructive editing. The original stays untouched until the draft is accepted. On accept, the copy's content replaces the original. On reject, the copy is deleted.
1189
+
1190
+ | Parameter | Type | Required |
1191
+ | --------- | ------ | -------- |
1192
+ | `data` | `dict` | Yes |
1193
+
1194
+ **Returns:** `dict[str, Any]`
1195
+
1196
+ ```python
1197
+ result = await gc.drafts.edit_draft(
1198
+ data={...},
1199
+ )
1200
+ ```
1201
+
1202
+ ---
1203
+
1204
+ #### `get_draft`
1205
+
1206
+ Get a draft by ID
1207
+ Retrieves the full details of a single AI-generated content draft including the prompt, generated content, tool calls, and sources.
1208
+
1209
+ | Parameter | Type | Required |
1210
+ | ------------ | ----- | -------- |
1211
+ | `id` | `str` | Yes |
1212
+ | `project_id` | `str` | Yes |
1213
+ | `draft_id` | `str` | Yes |
1214
+
1215
+ **Returns:** `dict[str, Any]`
1216
+
1217
+ ```python
1218
+ result = await gc.drafts.get_draft(
1219
+ id="uuid-id",
1220
+ project_id="uuid-project",
1221
+ draft_id="uuid-draft",
1222
+ )
1223
+ ```
1224
+
1225
+ ---
1226
+
1227
+ #### `list_drafts`
1228
+
1229
+ List drafts for a project
1230
+ Returns a paginated list of AI-generated content drafts for the specified project. Supports filtering by status and sorting.
1231
+
1232
+ | Parameter | Type | Required |
1233
+ | ------------ | ----- | -------- |
1234
+ | `id` | `str` | Yes |
1235
+ | `project_id` | `str` | Yes |
1236
+ | `page` | `str` | No |
1237
+ | `page_size` | `str` | No |
1238
+ | `lite` | `str` | No |
1239
+
1240
+ **Returns:** `dict[str, Any]`
1241
+
1242
+ ```python
1243
+ result = await gc.drafts.list_drafts(
1244
+ id="uuid-id",
1245
+ project_id="uuid-project",
1246
+ page=1,
1247
+ )
1248
+ ```
1249
+
1250
+ ---
1251
+
1252
+ ### Email
1253
+
1254
+ `gc.email`
1255
+
1256
+ #### `get_email_campaign`
1257
+
1258
+ Get campaign
1259
+ Returns a single email campaign by ID, including name, subject, status, email template reference, segment, scheduling info, and send statistics.
1260
+
1261
+ | Parameter | Type | Required |
1262
+ | ----------------- | ----- | -------- |
1263
+ | `organization_id` | `str` | Yes |
1264
+ | `project_id` | `str` | Yes |
1265
+ | `app_id` | `str` | Yes |
1266
+ | `campaign_id` | `str` | Yes |
1267
+
1268
+ **Returns:** `dict[str, Any]`
1269
+
1270
+ ```python
1271
+ result = await gc.email.get_email_campaign(
1272
+ organization_id="uuid-organization",
1273
+ project_id="uuid-project",
1274
+ app_id="uuid-app",
1275
+ campaign_id="uuid-campaign",
1276
+ )
1277
+ ```
1278
+
1279
+ ---
1280
+
1281
+ #### `get_email_campaign_sends`
1282
+
1283
+ Get campaign sends
1284
+ Returns the send history for a specific campaign. Each send record includes the recipient contact, delivery status (pending/sent/delivered/bounced/failed), open/click tracking, and timestamps.
1285
+
1286
+ | Parameter | Type | Required |
1287
+ | ----------------- | ----- | -------- |
1288
+ | `organization_id` | `str` | Yes |
1289
+ | `project_id` | `str` | Yes |
1290
+ | `app_id` | `str` | Yes |
1291
+ | `campaign_id` | `str` | Yes |
1292
+ | `limit` | `str` | No |
1293
+ | `offset` | `str` | No |
1294
+
1295
+ **Returns:** `list[dict[str, Any]]`
1296
+
1297
+ ```python
1298
+ result = await gc.email.get_email_campaign_sends(
1299
+ organization_id="uuid-organization",
1300
+ project_id="uuid-project",
1301
+ app_id="uuid-app",
1302
+ campaign_id="uuid-campaign",
1303
+ )
1304
+ ```
1305
+
1306
+ ---
1307
+
1308
+ #### `get_email_campaigns`
1309
+
1310
+ Get campaigns
1311
+ Returns a paginated list of all email campaigns for the specified app. Each campaign includes its name, subject, status (draft/scheduled/sent), associated email template, segment, and send statistics.
1312
+
1313
+ | Parameter | Type | Required |
1314
+ | ----------------- | ----- | -------- |
1315
+ | `organization_id` | `str` | Yes |
1316
+ | `project_id` | `str` | Yes |
1317
+ | `app_id` | `str` | Yes |
1318
+ | `page` | `str` | No |
1319
+ | `page_size` | `str` | No |
1320
+ | `search` | `str` | No |
1321
+
1322
+ **Returns:** `dict[str, Any]`
1323
+
1324
+ ```python
1325
+ result = await gc.email.get_email_campaigns(
1326
+ organization_id="uuid-organization",
1327
+ project_id="uuid-project",
1328
+ app_id="uuid-app",
1329
+ page=1,
1330
+ )
1331
+ ```
1332
+
1333
+ ---
1334
+
1335
+ #### `get_email`
1336
+
1337
+ Get email template
1338
+ Returns a single email template by ID, including name, subject line, full content blocks, header/footer references, and timestamps.
1339
+
1340
+ | Parameter | Type | Required |
1341
+ | ----------------- | ----- | -------- |
1342
+ | `organization_id` | `str` | Yes |
1343
+ | `project_id` | `str` | Yes |
1344
+ | `app_id` | `str` | Yes |
1345
+ | `email_id` | `str` | Yes |
1346
+
1347
+ **Returns:** `dict[str, Any]`
1348
+
1349
+ ```python
1350
+ result = await gc.email.get_email(
1351
+ organization_id="uuid-organization",
1352
+ project_id="uuid-project",
1353
+ app_id="uuid-app",
1354
+ email_id="uuid-email",
1355
+ )
1356
+ ```
1357
+
1358
+ ---
1359
+
1360
+ #### `get_emails`
1361
+
1362
+ Get email templates
1363
+ Returns a list of all email templates for the specified app. Each template includes its name, subject line, content blocks, and associated header/footer references.
1364
+
1365
+ | Parameter | Type | Required |
1366
+ | ----------------- | ----- | -------- |
1367
+ | `organization_id` | `str` | Yes |
1368
+ | `project_id` | `str` | Yes |
1369
+ | `app_id` | `str` | Yes |
1370
+ | `page` | `str` | No |
1371
+ | `page_size` | `str` | No |
1372
+ | `search` | `str` | No |
1373
+
1374
+ **Returns:** `dict[str, Any]`
1375
+
1376
+ ```python
1377
+ result = await gc.email.get_emails(
1378
+ organization_id="uuid-organization",
1379
+ project_id="uuid-project",
1380
+ app_id="uuid-app",
1381
+ page=1,
1382
+ )
1383
+ ```
1384
+
1385
+ ---
1386
+
1387
+ #### `get_email_footer`
1388
+
1389
+ Get email footer
1390
+ Returns a single email footer by ID, including its name, content blocks, and timestamps.
1391
+
1392
+ | Parameter | Type | Required |
1393
+ | ----------------- | ----- | -------- |
1394
+ | `organization_id` | `str` | Yes |
1395
+ | `project_id` | `str` | Yes |
1396
+ | `app_id` | `str` | Yes |
1397
+ | `footer_id` | `str` | Yes |
1398
+
1399
+ **Returns:** `dict[str, Any]`
1400
+
1401
+ ```python
1402
+ result = await gc.email.get_email_footer(
1403
+ organization_id="uuid-organization",
1404
+ project_id="uuid-project",
1405
+ app_id="uuid-app",
1406
+ footer_id="uuid-footer",
1407
+ )
1408
+ ```
1409
+
1410
+ ---
1411
+
1412
+ #### `list_email_footers`
1413
+
1414
+ Get email footers
1415
+ Returns a list of all email footers for the specified app. Footers contain branding, unsubscribe links, and legal text appended to emails.
1416
+
1417
+ | Parameter | Type | Required |
1418
+ | ----------------- | ----- | -------- |
1419
+ | `organization_id` | `str` | Yes |
1420
+ | `project_id` | `str` | Yes |
1421
+ | `app_id` | `str` | Yes |
1422
+ | `page` | `str` | No |
1423
+ | `page_size` | `str` | No |
1424
+ | `search` | `str` | No |
1425
+
1426
+ **Returns:** `dict[str, Any]`
1427
+
1428
+ ```python
1429
+ result = await gc.email.list_email_footers(
1430
+ organization_id="uuid-organization",
1431
+ project_id="uuid-project",
1432
+ app_id="uuid-app",
1433
+ page=1,
1434
+ )
1435
+ ```
1436
+
1437
+ ---
1438
+
1439
+ #### `get_email_header`
1440
+
1441
+ Get email header
1442
+ Returns a single email header by ID, including its name, content blocks, and timestamps.
1443
+
1444
+ | Parameter | Type | Required |
1445
+ | ----------------- | ----- | -------- |
1446
+ | `organization_id` | `str` | Yes |
1447
+ | `project_id` | `str` | Yes |
1448
+ | `app_id` | `str` | Yes |
1449
+ | `header_id` | `str` | Yes |
1450
+
1451
+ **Returns:** `dict[str, Any]`
1452
+
1453
+ ```python
1454
+ result = await gc.email.get_email_header(
1455
+ organization_id="uuid-organization",
1456
+ project_id="uuid-project",
1457
+ app_id="uuid-app",
1458
+ header_id="uuid-header",
1459
+ )
1460
+ ```
1461
+
1462
+ ---
1463
+
1464
+ #### `list_email_headers`
1465
+
1466
+ Get email headers
1467
+ Returns a list of all email headers for the specified app. Headers contain branding and navigation elements prepended to emails.
1468
+
1469
+ | Parameter | Type | Required |
1470
+ | ----------------- | ----- | -------- |
1471
+ | `organization_id` | `str` | Yes |
1472
+ | `project_id` | `str` | Yes |
1473
+ | `app_id` | `str` | Yes |
1474
+ | `page` | `str` | No |
1475
+ | `page_size` | `str` | No |
1476
+ | `search` | `str` | No |
1477
+
1478
+ **Returns:** `dict[str, Any]`
1479
+
1480
+ ```python
1481
+ result = await gc.email.list_email_headers(
1482
+ organization_id="uuid-organization",
1483
+ project_id="uuid-project",
1484
+ app_id="uuid-app",
1485
+ page=1,
1486
+ )
1487
+ ```
1488
+
1489
+ ---
1490
+
1491
+ #### `get_email_segment_contacts`
1492
+
1493
+ Get contacts in segment
1494
+ Returns the list of CRM contacts that match the specified segment's filter criteria. Each contact includes name, email, phone, status, and other profile fields.
1495
+
1496
+ | Parameter | Type | Required |
1497
+ | ----------------- | ----- | -------- |
1498
+ | `organization_id` | `str` | Yes |
1499
+ | `project_id` | `str` | Yes |
1500
+ | `app_id` | `str` | Yes |
1501
+ | `segment_id` | `str` | Yes |
1502
+ | `limit` | `str` | No |
1503
+
1504
+ **Returns:** `list[dict[str, Any]]`
1505
+
1506
+ ```python
1507
+ result = await gc.email.get_email_segment_contacts(
1508
+ organization_id="uuid-organization",
1509
+ project_id="uuid-project",
1510
+ app_id="uuid-app",
1511
+ segment_id="uuid-segment",
1512
+ )
1513
+ ```
1514
+
1515
+ ---
1516
+
1517
+ #### `get_email_segment_count`
1518
+
1519
+ Get segment contact count
1520
+ Returns the count of CRM contacts that match the specified segment's filter criteria. Useful for previewing audience size before sending a campaign.
1521
+
1522
+ | Parameter | Type | Required |
1523
+ | ----------------- | ----- | -------- |
1524
+ | `organization_id` | `str` | Yes |
1525
+ | `project_id` | `str` | Yes |
1526
+ | `app_id` | `str` | Yes |
1527
+ | `segment_id` | `str` | Yes |
1528
+
1529
+ **Returns:** `dict[str, Any]`
1530
+
1531
+ ```python
1532
+ result = await gc.email.get_email_segment_count(
1533
+ organization_id="uuid-organization",
1534
+ project_id="uuid-project",
1535
+ app_id="uuid-app",
1536
+ segment_id="uuid-segment",
1537
+ )
1538
+ ```
1539
+
1540
+ ---
1541
+
1542
+ #### `get_email_segment`
1543
+
1544
+ Get email segment
1545
+ Returns a single email segment by ID, including its name, filter rules, and timestamps.
1546
+
1547
+ | Parameter | Type | Required |
1548
+ | ----------------- | ----- | -------- |
1549
+ | `organization_id` | `str` | Yes |
1550
+ | `project_id` | `str` | Yes |
1551
+ | `app_id` | `str` | Yes |
1552
+ | `segment_id` | `str` | Yes |
1553
+
1554
+ **Returns:** `dict[str, Any]`
1555
+
1556
+ ```python
1557
+ result = await gc.email.get_email_segment(
1558
+ organization_id="uuid-organization",
1559
+ project_id="uuid-project",
1560
+ app_id="uuid-app",
1561
+ segment_id="uuid-segment",
1562
+ )
1563
+ ```
1564
+
1565
+ ---
1566
+
1567
+ #### `list_email_segments`
1568
+
1569
+ Get email segments
1570
+ Returns a list of all email segments for the specified app. Segments define targeting criteria for campaigns based on contact attributes and behavior.
1571
+
1572
+ | Parameter | Type | Required |
1573
+ | ----------------- | ----- | -------- |
1574
+ | `organization_id` | `str` | Yes |
1575
+ | `project_id` | `str` | Yes |
1576
+ | `app_id` | `str` | Yes |
1577
+ | `page` | `str` | No |
1578
+ | `page_size` | `str` | No |
1579
+ | `search` | `str` | No |
1580
+
1581
+ **Returns:** `dict[str, Any]`
1582
+
1583
+ ```python
1584
+ result = await gc.email.list_email_segments(
1585
+ organization_id="uuid-organization",
1586
+ project_id="uuid-project",
1587
+ app_id="uuid-app",
1588
+ page=1,
1589
+ )
1590
+ ```
1591
+
1592
+ ---
1593
+
1594
+ ### Feature Requests
1595
+
1596
+ `gc.feature_requests`
1597
+
1598
+ #### `get_popular_feature_requests`
1599
+
1600
+ Get popular feature requests
1601
+ Returns all non-merged, non-cancelled feature requests sorted by vote count. Includes whether the current user has voted for each request and the comment count. Does not expose user identity information for privacy.
1602
+
1603
+ | Parameter | Type | Required |
1604
+ | --------- | ----- | -------- |
1605
+ | `limit` | `str` | No |
1606
+ | `offset` | `str` | No |
1607
+ | `status` | `str` | No |
1608
+
1609
+ **Returns:** `dict[str, Any]`
1610
+
1611
+ ```python
1612
+ result = await gc.feature_requests.get_popular_feature_requests()
1613
+ ```
1614
+
1615
+ ---
1616
+
1617
+ #### `list_my_feature_requests`
1618
+
1619
+ Get my feature requests
1620
+ Returns all feature requests submitted by the current user (up to 100). Each request includes its title, description, priority, status (open/planned/shipped/cancelled), vote count, and linked GitHub issue details if any.
1621
+
1622
+ **Returns:** `dict[str, Any]`
1623
+
1624
+ ```python
1625
+ result = await gc.feature_requests.list_my_feature_requests()
1626
+ ```
1627
+
1628
+ ---
1629
+
1630
+ #### `get_feature_request_comments`
1631
+
1632
+ Get comments for a feature request
1633
+ Returns all team comments and responses for a specific feature request owned by the current user. Each comment includes its ID, the comment text, the author name, and a creation timestamp. Comments are returned in chronological order.
1634
+
1635
+ | Parameter | Type | Required |
1636
+ | --------- | ----- | -------- |
1637
+ | `id` | `str` | Yes |
1638
+
1639
+ **Returns:** `dict[str, Any]`
1640
+
1641
+ ```python
1642
+ result = await gc.feature_requests.get_feature_request_comments(
1643
+ id="uuid-id",
1644
+ )
1645
+ ```
1646
+
1647
+ ---
1648
+
1649
+ ### Forms
1650
+
1651
+ `gc.forms`
1652
+
1653
+ #### `get_form`
1654
+
1655
+ Get form
1656
+ Retrieve the full details of a single form by its identifier. Returns the form's unique identifier, associated app identifier, name, URL slug, description, field definitions (each with name, type, and required status), rich content layout (Builder block structure used for rendering), settings (notification email, redirect URL, tags, source), active/inactive status, and creation and update timestamps.
1657
+
1658
+ | Parameter | Type | Required |
1659
+ | ----------------- | ----- | -------- |
1660
+ | `organization_id` | `str` | Yes |
1661
+ | `project_id` | `str` | Yes |
1662
+ | `app_id` | `str` | Yes |
1663
+ | `form_id` | `str` | Yes |
1664
+
1665
+ **Returns:** `dict[str, Any]`
1666
+
1667
+ ```python
1668
+ result = await gc.forms.get_form(
1669
+ organization_id="uuid-organization",
1670
+ project_id="uuid-project",
1671
+ app_id="uuid-app",
1672
+ form_id="uuid-form",
1673
+ )
1674
+ ```
1675
+
1676
+ ---
1677
+
1678
+ #### `get_form_submission`
1679
+
1680
+ Get form submission
1681
+ Retrieve the full details of a single form submission by its identifier. Returns the submission's unique identifier, the parent form identifier, the complete user-submitted data (key-value pairs corresponding to form fields), metadata (user agent, IP address, referer, submission timestamp, tags, source), and the creation timestamp.
1682
+
1683
+ | Parameter | Type | Required |
1684
+ | ----------------- | ----- | -------- |
1685
+ | `organization_id` | `str` | Yes |
1686
+ | `project_id` | `str` | Yes |
1687
+ | `app_id` | `str` | Yes |
1688
+ | `form_id` | `str` | Yes |
1689
+ | `submission_id` | `str` | Yes |
1690
+
1691
+ **Returns:** `dict[str, Any]`
1692
+
1693
+ ```python
1694
+ result = await gc.forms.get_form_submission(
1695
+ organization_id="uuid-organization",
1696
+ project_id="uuid-project",
1697
+ app_id="uuid-app",
1698
+ form_id="uuid-form",
1699
+ submission_id="uuid-submission",
1700
+ )
1701
+ ```
1702
+
1703
+ ---
1704
+
1705
+ #### `get_form_submissions`
1706
+
1707
+ Get form submissions
1708
+ Retrieve a paginated list of all submissions received for a specific form. Each submission includes its unique identifier, the parent form identifier, the user-submitted data (key-value pairs corresponding to form fields), metadata (user agent, IP address, referer, submission timestamp, tags, source), and the creation timestamp. Supports full-text search across submission data.
1709
+
1710
+ | Parameter | Type | Required |
1711
+ | ----------------- | ----- | -------- |
1712
+ | `organization_id` | `str` | Yes |
1713
+ | `project_id` | `str` | Yes |
1714
+ | `app_id` | `str` | Yes |
1715
+ | `form_id` | `str` | Yes |
1716
+ | `page` | `str` | No |
1717
+ | `page_size` | `str` | No |
1718
+ | `search` | `str` | No |
1719
+
1720
+ **Returns:** `dict[str, Any]`
1721
+
1722
+ ```python
1723
+ result = await gc.forms.get_form_submissions(
1724
+ organization_id="uuid-organization",
1725
+ project_id="uuid-project",
1726
+ app_id="uuid-app",
1727
+ form_id="uuid-form",
1728
+ page=1,
1729
+ )
1730
+ ```
1731
+
1732
+ ---
1733
+
1734
+ #### `get_forms_list`
1735
+
1736
+ Get forms
1737
+ Retrieve a paginated list of all forms belonging to the specified Forms app. Each form in the response includes its unique identifier, name, URL slug, description, field definitions (name, type, required status), rich content layout, settings (notification email, redirect URL), active/inactive status, creation and update timestamps, and a count of how many submissions have been received. Supports searching forms by name or slug.
1738
+
1739
+ | Parameter | Type | Required |
1740
+ | ----------------- | ----- | -------- |
1741
+ | `organization_id` | `str` | Yes |
1742
+ | `project_id` | `str` | Yes |
1743
+ | `app_id` | `str` | Yes |
1744
+ | `page` | `str` | No |
1745
+ | `page_size` | `str` | No |
1746
+ | `search` | `str` | No |
1747
+
1748
+ **Returns:** `dict[str, Any]`
1749
+
1750
+ ```python
1751
+ result = await gc.forms.get_forms_list(
1752
+ organization_id="uuid-organization",
1753
+ project_id="uuid-project",
1754
+ app_id="uuid-app",
1755
+ page=1,
1756
+ )
1757
+ ```
1758
+
1759
+ ---
1760
+
1761
+ ### Ideas
1762
+
1763
+ `gc.ideas`
1764
+
1765
+ #### `approve_idea`
1766
+
1767
+ Approve a Mind idea
1768
+ Approve an idea, which sets its status to 'approved'. If the project has auto-draft enabled, this also triggers draft generation automatically. The idea must be in 'pending' status.
1769
+
1770
+ | Parameter | Type | Required |
1771
+ | ------------ | ------ | -------- |
1772
+ | `id` | `str` | Yes |
1773
+ | `project_id` | `str` | Yes |
1774
+ | `idea_id` | `str` | Yes |
1775
+ | `data` | `dict` | Yes |
1776
+
1777
+ **Returns:** `dict[str, Any]`
1778
+
1779
+ ```python
1780
+ result = await gc.ideas.approve_idea(
1781
+ id="uuid-id",
1782
+ project_id="uuid-project",
1783
+ idea_id="uuid-idea",
1784
+ data={...},
1785
+ )
1786
+ ```
1787
+
1788
+ ---
1789
+
1790
+ #### `dismiss_idea`
1791
+
1792
+ Dismiss a Mind idea
1793
+ Dismiss an idea that the user doesn't want to pursue. The idea must be in 'pending' status. Optionally include a reason for dismissal. Dismissed ideas are tracked so Mind doesn't re-suggest them.
1794
+
1795
+ | Parameter | Type | Required |
1796
+ | ------------ | ------ | -------- |
1797
+ | `id` | `str` | Yes |
1798
+ | `project_id` | `str` | Yes |
1799
+ | `idea_id` | `str` | Yes |
1800
+ | `data` | `dict` | Yes |
1801
+
1802
+ **Returns:** `dict[str, Any]`
1803
+
1804
+ ```python
1805
+ result = await gc.ideas.dismiss_idea(
1806
+ id="uuid-id",
1807
+ project_id="uuid-project",
1808
+ idea_id="uuid-idea",
1809
+ data={...},
1810
+ )
1811
+ ```
1812
+
1813
+ ---
1814
+
1815
+ #### `get_idea`
1816
+
1817
+ Get a Mind idea
1818
+ Returns full details of a Mind idea including title, rationale, outline, priority, similarity score, and status. If the idea has status 'pending', it can be approved (triggering draft generation) or dismissed.
1819
+
1820
+ | Parameter | Type | Required |
1821
+ | ------------ | ----- | -------- |
1822
+ | `id` | `str` | Yes |
1823
+ | `project_id` | `str` | Yes |
1824
+ | `idea_id` | `str` | Yes |
1825
+
1826
+ **Returns:** `dict[str, Any]`
1827
+
1828
+ ```python
1829
+ result = await gc.ideas.get_idea(
1830
+ id="uuid-id",
1831
+ project_id="uuid-project",
1832
+ idea_id="uuid-idea",
1833
+ )
1834
+ ```
1835
+
1836
+ ---
1837
+
1838
+ #### `list_ideas`
1839
+
1840
+ List Mind ideas for a project
1841
+ Returns a paginated list of Mind ideas for the project. Ideas represent content gaps or suggestions identified by the AI ideation engine. Filter by status to see pending, approved, dismissed, or drafted ideas.
1842
+
1843
+ | Parameter | Type | Required |
1844
+ | ------------ | ----- | -------- |
1845
+ | `id` | `str` | Yes |
1846
+ | `project_id` | `str` | Yes |
1847
+
1848
+ **Returns:** `dict[str, Any]`
1849
+
1850
+ ```python
1851
+ result = await gc.ideas.list_ideas(
1852
+ id="uuid-id",
1853
+ project_id="uuid-project",
1854
+ )
1855
+ ```
1856
+
1857
+ ---
1858
+
1859
+ ### Invitations
1860
+
1861
+ `gc.invitations`
1862
+
1863
+ #### `get_organization_invitation`
1864
+
1865
+ Get an invitation by ID
1866
+ Retrieves a single invitation by its ID within an organization. Returns the invitation object including invitee email, assigned role, status (pending, accepted, expired), creator, and timestamps. The 'id' param is the organization UUID and 'invitationId' is the invitation UUID. Returns 404 if the invitation does not exist.
1867
+
1868
+ | Parameter | Type | Required |
1869
+ | --------------- | ----- | -------- |
1870
+ | `id` | `str` | Yes |
1871
+ | `invitation_id` | `str` | Yes |
1872
+
1873
+ **Returns:** `dict[str, Any]`
1874
+
1875
+ ```python
1876
+ result = await gc.invitations.get_organization_invitation(
1877
+ id="uuid-id",
1878
+ invitation_id="uuid-invitation",
1879
+ )
1880
+ ```
1881
+
1882
+ ---
1883
+
1884
+ #### `get_organization_invitations`
1885
+
1886
+ Get organization invitations
1887
+ Returns a paginated list of pending, accepted, and expired invitations for an organization. Each invitation includes the invitee email, assigned role, status, creation date, and expiration. Supports search by email, filtering by status, and sorting. Requires owner or admin role within the organization.
1888
+
1889
+ | Parameter | Type | Required |
1890
+ | --------- | ----- | -------- |
1891
+ | `id` | `str` | Yes |
1892
+
1893
+ **Returns:** `dict[str, Any]`
1894
+
1895
+ ```python
1896
+ result = await gc.invitations.get_organization_invitations(
1897
+ id="uuid-id",
1898
+ )
1899
+ ```
1900
+
1901
+ ---
1902
+
1903
+ ### Me
1904
+
1905
+ `gc.me`
1906
+
1907
+ #### `get_my_suspension_messages`
1908
+
1909
+ Get my suspension appeal messages
1910
+ Returns the full suspension appeal message thread for the current user. Each message includes the sender (user or admin), the message content, and a timestamp. Only available to users with an active or past suspension.
1911
+
1912
+ **Returns:** `list[dict[str, Any]]`
1913
+
1914
+ ```python
1915
+ result = await gc.me.get_my_suspension_messages()
1916
+ ```
1917
+
1918
+ ---
1919
+
1920
+ #### `get_my_notifications`
1921
+
1922
+ Get my notifications
1923
+ Returns a paginated list of notifications for the authenticated user. Supports filtering by read/unread status and notification type via query parameters. Each notification includes its type, title, message, read status, and associated resource reference.
1924
+
1925
+ | Parameter | Type | Required |
1926
+ | ----------- | ----- | -------- |
1927
+ | `page` | `str` | No |
1928
+ | `page_size` | `str` | No |
1929
+ | `search` | `str` | No |
1930
+ | `status` | `str` | No |
1931
+
1932
+ **Returns:** `dict[str, Any]`
1933
+
1934
+ ```python
1935
+ result = await gc.me.get_my_notifications(
1936
+ page=1,
1937
+ )
1938
+ ```
1939
+
1940
+ ---
1941
+
1942
+ #### `get_my_organizations`
1943
+
1944
+ Get organizations I belong to
1945
+ Returns all organizations that the authenticated user is a member of. Each organization includes its ID, name, slug, logo URL, and the user's role within that organization (e.g. owner, admin, member).
1946
+
1947
+ **Returns:** `list[dict[str, Any]]`
1948
+
1949
+ ```python
1950
+ result = await gc.me.get_my_organizations()
1951
+ ```
1952
+
1953
+ ---
1954
+
1955
+ #### `get_my_invitations`
1956
+
1957
+ Get my pending invitations
1958
+ Returns a paginated list of pending organization invitations addressed to the current user's email. Each invitation includes the organization name, the role offered, who sent it, and when it was created. Supports standard pagination query parameters.
1959
+
1960
+ **Returns:** `dict[str, Any]`
1961
+
1962
+ ```python
1963
+ result = await gc.me.get_my_invitations()
1964
+ ```
1965
+
1966
+ ---
1967
+
1968
+ #### `get_my_activities`
1969
+
1970
+ Get my activity history
1971
+ Returns a paginated list of activities performed by or affecting the current user. Each activity includes the action taken, the resource type and ID involved, the actor, and a timestamp. Supports standard pagination query parameters (page, pageSize, sortBy, sortOrder).
1972
+
1973
+ | Parameter | Type | Required |
1974
+ | ----------- | ----- | -------- |
1975
+ | `page` | `str` | No |
1976
+ | `page_size` | `str` | No |
1977
+ | `lite` | `str` | No |
1978
+
1979
+ **Returns:** `dict[str, Any]`
1980
+
1981
+ ```python
1982
+ result = await gc.me.get_my_activities(
1983
+ page=1,
1984
+ )
1985
+ ```
1986
+
1987
+ ---
1988
+
1989
+ #### `get_me`
1990
+
1991
+ Get current user profile and permissions
1992
+ Returns the authenticated user's full profile including name, email, avatar, role (admin/editor/viewer), active status, notification preferences, suspension status, a list of all granted RBAC permissions, and organization memberships with roles. Auto-provisions new users on first login with a default viewer role.
1993
+
1994
+ **Returns:** `dict[str, Any]`
1995
+
1996
+ ```python
1997
+ result = await gc.me.get_me()
1998
+ ```
1999
+
2000
+ ---
2001
+
2002
+ ### Organization Members
2003
+
2004
+ `gc.organization_members`
2005
+
2006
+ #### `get_member_project_memberships`
2007
+
2008
+ Get member project memberships
2009
+ Returns a list of all projects in the organization along with the specified member's access level for each project. Each entry includes the project ID, name, and the member's role/permission level within that project (or null if they have no direct project membership). Useful for auditing a member's project access across the organization.
2010
+
2011
+ | Parameter | Type | Required |
2012
+ | ----------- | ----- | -------- |
2013
+ | `id` | `str` | Yes |
2014
+ | `member_id` | `str` | Yes |
2015
+
2016
+ **Returns:** `list[dict[str, Any]]`
2017
+
2018
+ ```python
2019
+ result = await gc.organization_members.get_member_project_memberships(
2020
+ id="uuid-id",
2021
+ member_id="uuid-member",
2022
+ )
2023
+ ```
2024
+
2025
+ ---
2026
+
2027
+ #### `get_organization_member_activities`
2028
+
2029
+ Get member activities
2030
+ Returns a paginated activity feed for a specific member within an organization. Activities include actions the member has performed such as project updates, document edits, member management changes, and settings modifications. Each activity entry includes the action type, resource details, and timestamp. Supports pagination via page and pageSize query parameters.
2031
+
2032
+ | Parameter | Type | Required |
2033
+ | ----------- | ----- | -------- |
2034
+ | `id` | `str` | Yes |
2035
+ | `member_id` | `str` | Yes |
2036
+ | `page` | `str` | No |
2037
+ | `page_size` | `str` | No |
2038
+ | `lite` | `str` | No |
2039
+
2040
+ **Returns:** `dict[str, Any]`
2041
+
2042
+ ```python
2043
+ result = await gc.organization_members.get_organization_member_activities(
2044
+ id="uuid-id",
2045
+ member_id="uuid-member",
2046
+ page=1,
2047
+ )
2048
+ ```
2049
+
2050
+ ---
2051
+
2052
+ #### `get_organization_member`
2053
+
2054
+ Get a member by ID
2055
+ Retrieves a single organization member by their member ID. Returns the member object including user profile (name, email, avatar), role, title, and join date. The 'id' param is the organization UUID and 'memberId' is the member UUID. Returns 404 if the member does not exist in this organization.
2056
+
2057
+ | Parameter | Type | Required |
2058
+ | ----------- | ----- | -------- |
2059
+ | `id` | `str` | Yes |
2060
+ | `member_id` | `str` | Yes |
2061
+
2062
+ **Returns:** `dict[str, Any]`
2063
+
2064
+ ```python
2065
+ result = await gc.organization_members.get_organization_member(
2066
+ id="uuid-id",
2067
+ member_id="uuid-member",
2068
+ )
2069
+ ```
2070
+
2071
+ ---
2072
+
2073
+ #### `get_organization_members`
2074
+
2075
+ Get organization members
2076
+ Returns a paginated list of all members in an organization. Each member object includes the member ID, user profile (name, email, avatar), role (owner, admin, member), title, and join date. Supports search by name or email, filtering by role, and sorting. Pagination is controlled via page and pageSize query parameters.
2077
+
2078
+ | Parameter | Type | Required |
2079
+ | ----------- | ----- | -------- |
2080
+ | `id` | `str` | Yes |
2081
+ | `page` | `str` | No |
2082
+ | `page_size` | `str` | No |
2083
+ | `lite` | `str` | No |
2084
+
2085
+ **Returns:** `dict[str, Any]`
2086
+
2087
+ ```python
2088
+ result = await gc.organization_members.get_organization_members(
2089
+ id="uuid-id",
2090
+ page=1,
2091
+ )
2092
+ ```
2093
+
2094
+ ---
2095
+
2096
+ ### Organizations
2097
+
2098
+ `gc.organizations`
2099
+
2100
+ #### `get_service_account`
2101
+
2102
+ Get a service account
2103
+ Returns the full details of a specific service account, including its name, description, role, and creation metadata. Only organization owners and admins can view service account details.
2104
+
2105
+ | Parameter | Type | Required |
2106
+ | ------------ | ----- | -------- |
2107
+ | `id` | `str` | Yes |
2108
+ | `account_id` | `str` | Yes |
2109
+
2110
+ **Returns:** `dict[str, Any]`
2111
+
2112
+ ```python
2113
+ result = await gc.organizations.get_service_account(
2114
+ id="uuid-id",
2115
+ account_id="uuid-account",
2116
+ )
2117
+ ```
2118
+
2119
+ ---
2120
+
2121
+ #### `list_service_accounts`
2122
+
2123
+ Get organization service accounts
2124
+ Returns all service accounts configured for the organization. Service accounts are non-human identities used for programmatic API access via API keys. Only organization owners and admins can view service accounts.
2125
+
2126
+ | Parameter | Type | Required |
2127
+ | --------- | ----- | -------- |
2128
+ | `id` | `str` | Yes |
2129
+
2130
+ **Returns:** `dict[str, Any]`
2131
+
2132
+ ```python
2133
+ result = await gc.organizations.list_service_accounts(
2134
+ id="uuid-id",
2135
+ )
2136
+ ```
2137
+
2138
+ ---
2139
+
2140
+ #### `get_organization_by_slug`
2141
+
2142
+ Get organization by slug
2143
+ Retrieves a single organization by its URL-friendly slug (e.g. 'my-company'). Returns the full organization object including ID, name, slug, logo URL, plan, status, member count, and timestamps. Useful for resolving organizations from URLs or user input where the slug is known but the ID is not. Returns 404 if no organization matches the given slug.
2144
+
2145
+ | Parameter | Type | Required |
2146
+ | --------- | ----- | -------- |
2147
+ | `slug` | `str` | Yes |
2148
+
2149
+ **Returns:** `dict[str, Any]`
2150
+
2151
+ ```python
2152
+ result = await gc.organizations.get_organization_by_slug(
2153
+ slug="my-slug",
2154
+ )
2155
+ ```
2156
+
2157
+ ---
2158
+
2159
+ #### `get_organization`
2160
+
2161
+ Get an organization by ID
2162
+ Retrieves a single organization by its unique ID. Returns the full organization object including name, slug, logo URL, plan, status, member count, and timestamps. Returns 404 if the organization does not exist.
2163
+
2164
+ | Parameter | Type | Required |
2165
+ | --------- | ----- | -------- |
2166
+ | `id` | `str` | Yes |
2167
+
2168
+ **Returns:** `dict[str, Any]`
2169
+
2170
+ ```python
2171
+ result = await gc.organizations.get_organization(
2172
+ id="uuid-id",
2173
+ )
2174
+ ```
2175
+
2176
+ ---
2177
+
2178
+ ### Other
2179
+
2180
+ `gc.other`
2181
+
2182
+ #### `get_kb_article`
2183
+
2184
+ Get KB article
2185
+ Retrieves a single knowledge base article by its ID, including its full rich text content, publish status, SEO metadata, and associated category IDs. Returns 404 if the article does not exist or has been soft-deleted.
2186
+
2187
+ | Parameter | Type | Required |
2188
+ | ----------------- | ----- | -------- |
2189
+ | `organization_id` | `str` | Yes |
2190
+ | `project_id` | `str` | Yes |
2191
+ | `app_id` | `str` | Yes |
2192
+ | `article_id` | `str` | Yes |
2193
+
2194
+ **Returns:** `dict[str, Any]`
2195
+
2196
+ ```python
2197
+ result = await gc.other.get_kb_article(
2198
+ organization_id="uuid-organization",
2199
+ project_id="uuid-project",
2200
+ app_id="uuid-app",
2201
+ article_id="uuid-article",
2202
+ )
2203
+ ```
2204
+
2205
+ ---
2206
+
2207
+ #### `list_kb_articles`
2208
+
2209
+ Get KB articles
2210
+ Lists all knowledge base articles for the specified app, with support for pagination, filtering by category, filtering by publish status, and full-text search across titles and slugs. Returns articles sorted by creation date (newest first) by default.
2211
+
2212
+ | Parameter | Type | Required |
2213
+ | ----------------- | ----- | -------- |
2214
+ | `organization_id` | `str` | Yes |
2215
+ | `project_id` | `str` | Yes |
2216
+ | `app_id` | `str` | Yes |
2217
+ | `page` | `str` | No |
2218
+ | `page_size` | `str` | No |
2219
+ | `category_id` | `str` | No |
2220
+ | `status` | `str` | No |
2221
+ | `search` | `str` | No |
2222
+
2223
+ **Returns:** `dict[str, Any]`
2224
+
2225
+ ```python
2226
+ result = await gc.other.list_kb_articles(
2227
+ organization_id="uuid-organization",
2228
+ project_id="uuid-project",
2229
+ app_id="uuid-app",
2230
+ page=1,
2231
+ )
2232
+ ```
2233
+
2234
+ ---
2235
+
2236
+ #### `get_kb_category`
2237
+
2238
+ Get KB category
2239
+ Retrieves a single knowledge base category by its ID, including its name, slug, description, parent relationship, icon, and display order. Returns 404 if the category does not exist or has been soft-deleted.
2240
+
2241
+ | Parameter | Type | Required |
2242
+ | ----------------- | ----- | -------- |
2243
+ | `organization_id` | `str` | Yes |
2244
+ | `project_id` | `str` | Yes |
2245
+ | `app_id` | `str` | Yes |
2246
+ | `category_id` | `str` | Yes |
2247
+
2248
+ **Returns:** `dict[str, Any]`
2249
+
2250
+ ```python
2251
+ result = await gc.other.get_kb_category(
2252
+ organization_id="uuid-organization",
2253
+ project_id="uuid-project",
2254
+ app_id="uuid-app",
2255
+ category_id="uuid-category",
2256
+ )
2257
+ ```
2258
+
2259
+ ---
2260
+
2261
+ #### `list_kb_categories`
2262
+
2263
+ Get KB categories
2264
+ Lists all knowledge base categories for the specified app, returned as a hierarchical tree structure. Categories are nested under their parent categories and sorted by their display order. Includes all active (non-deleted) categories.
2265
+
2266
+ | Parameter | Type | Required |
2267
+ | ----------------- | ----- | -------- |
2268
+ | `organization_id` | `str` | Yes |
2269
+ | `project_id` | `str` | Yes |
2270
+ | `app_id` | `str` | Yes |
2271
+
2272
+ **Returns:** `list[dict[str, Any]]`
2273
+
2274
+ ```python
2275
+ result = await gc.other.list_kb_categories(
2276
+ organization_id="uuid-organization",
2277
+ project_id="uuid-project",
2278
+ app_id="uuid-app",
2279
+ )
2280
+ ```
2281
+
2282
+ ---
2283
+
2284
+ #### `get_kb_settings`
2285
+
2286
+ Get KB settings
2287
+ Retrieves the current configuration settings for the knowledge base app, including display preferences, branding, and behavioral options stored as a JSON settings object on the app record.
2288
+
2289
+ | Parameter | Type | Required |
2290
+ | ----------------- | ----- | -------- |
2291
+ | `organization_id` | `str` | Yes |
2292
+ | `project_id` | `str` | Yes |
2293
+ | `app_id` | `str` | Yes |
2294
+
2295
+ **Returns:** `dict[str, Any]`
2296
+
2297
+ ```python
2298
+ result = await gc.other.get_kb_settings(
2299
+ organization_id="uuid-organization",
2300
+ project_id="uuid-project",
2301
+ app_id="uuid-app",
2302
+ )
2303
+ ```
2304
+
2305
+ ---
2306
+
2307
+ ### Project Apps
2308
+
2309
+ `gc.project_apps`
2310
+
2311
+ #### `get_project_app_by_slug`
2312
+
2313
+ Get a project app by slug
2314
+ Retrieves the full details of a single app by its URL-friendly slug within the specified project. This is an alternative to looking up an app by ID when you have the human-readable slug instead. Returns the same complete app object as the get-by-ID endpoint including name, slug, app type, configuration, and timestamps.
2315
+
2316
+ | Parameter | Type | Required |
2317
+ | ------------ | ----- | -------- |
2318
+ | `id` | `str` | Yes |
2319
+ | `project_id` | `str` | Yes |
2320
+ | `app_slug` | `str` | Yes |
2321
+
2322
+ **Returns:** `dict[str, Any]`
2323
+
2324
+ ```python
2325
+ result = await gc.project_apps.get_project_app_by_slug(
2326
+ id="uuid-id",
2327
+ project_id="uuid-project",
2328
+ app_slug="my-app",
2329
+ )
2330
+ ```
2331
+
2332
+ ---
2333
+
2334
+ #### `get_project_app`
2335
+
2336
+ Get a project app by ID
2337
+ Retrieves the full details of a single app by its unique ID within the specified project. Returns the app's name, slug, app type, configuration settings, and timestamps. The app must belong to the specified project or a 404 error is returned.
2338
+
2339
+ | Parameter | Type | Required |
2340
+ | ------------ | ----- | -------- |
2341
+ | `id` | `str` | Yes |
2342
+ | `project_id` | `str` | Yes |
2343
+ | `app_id` | `str` | Yes |
2344
+
2345
+ **Returns:** `dict[str, Any]`
2346
+
2347
+ ```python
2348
+ result = await gc.project_apps.get_project_app(
2349
+ id="uuid-id",
2350
+ project_id="uuid-project",
2351
+ app_id="uuid-app",
2352
+ )
2353
+ ```
2354
+
2355
+ ---
2356
+
2357
+ #### `get_deleted_project_apps`
2358
+
2359
+ Get deleted apps in trash
2360
+ Returns a list of all soft-deleted (trashed) apps within the specified project. These are apps that have been deleted but not yet permanently removed. Each app includes its full details including name, slug, app type, and deletion timestamp. Trashed apps can be restored using the restore endpoint or permanently deleted using the permanent delete endpoint.
2361
+
2362
+ | Parameter | Type | Required |
2363
+ | ------------ | ----- | -------- |
2364
+ | `id` | `str` | Yes |
2365
+ | `project_id` | `str` | Yes |
2366
+
2367
+ **Returns:** `list[dict[str, Any]]`
2368
+
2369
+ ```python
2370
+ result = await gc.project_apps.get_deleted_project_apps(
2371
+ id="uuid-id",
2372
+ project_id="uuid-project",
2373
+ )
2374
+ ```
2375
+
2376
+ ---
2377
+
2378
+ #### `get_project_apps`
2379
+
2380
+ Get apps in a project
2381
+ Returns a paginated list of all active (non-deleted) apps configured within the specified project. Apps represent individual applications such as websites, CRM instances, email campaigns, forms, knowledge bases, or chat widgets. Each app includes its unique ID, name, slug, app type, configuration, and timestamps. Supports pagination and search filtering.
2382
+
2383
+ | Parameter | Type | Required |
2384
+ | ------------ | ----- | -------- |
2385
+ | `id` | `str` | Yes |
2386
+ | `project_id` | `str` | Yes |
2387
+
2388
+ **Returns:** `dict[str, Any]`
2389
+
2390
+ ```python
2391
+ result = await gc.project_apps.get_project_apps(
2392
+ id="uuid-id",
2393
+ project_id="uuid-project",
2394
+ )
2395
+ ```
2396
+
2397
+ ---
2398
+
2399
+ ### Project Branding
2400
+
2401
+ `gc.project_branding`
2402
+
2403
+ #### `get_project_branding`
2404
+
2405
+ Get project branding
2406
+ Retrieves the full details of a specific branding configuration by its unique ID within the specified project. Returns the branding's name and complete set of visual identity settings including primary and secondary colors, font selections, logo URLs, favicon, and any other configured styling properties. The branding must belong to the specified project.
2407
+
2408
+ | Parameter | Type | Required |
2409
+ | ------------- | ----- | -------- |
2410
+ | `id` | `str` | Yes |
2411
+ | `project_id` | `str` | Yes |
2412
+ | `branding_id` | `str` | Yes |
2413
+
2414
+ **Returns:** `dict[str, Any]`
2415
+
2416
+ ```python
2417
+ result = await gc.project_branding.get_project_branding(
2418
+ id="uuid-id",
2419
+ project_id="uuid-project",
2420
+ branding_id="uuid-branding",
2421
+ )
2422
+ ```
2423
+
2424
+ ---
2425
+
2426
+ #### `list_project_brandings`
2427
+
2428
+ Get project brandings
2429
+ Returns a paginated list of all branding configurations for the specified project. Projects can have multiple named branding profiles (e.g., 'Website Brand', 'LMS Brand'), each containing visual identity settings such as primary and secondary colors, font selections, logo URLs, and favicon. Each branding entry includes its unique ID, name, and the full set of configured styling properties.
2430
+
2431
+ | Parameter | Type | Required |
2432
+ | ------------ | ----- | -------- |
2433
+ | `id` | `str` | Yes |
2434
+ | `project_id` | `str` | Yes |
2435
+
2436
+ **Returns:** `dict[str, Any]`
2437
+
2438
+ ```python
2439
+ result = await gc.project_branding.list_project_brandings(
2440
+ id="uuid-id",
2441
+ project_id="uuid-project",
2442
+ )
2443
+ ```
2444
+
2445
+ ---
2446
+
2447
+ ### Project Domains
2448
+
2449
+ `gc.project_domains`
2450
+
2451
+ #### `get_domain_verification_instructions`
2452
+
2453
+ Get domain verification instructions
2454
+ Retrieves the DNS verification instructions for the specified custom domain. Returns the exact DNS record (type, name, and value) that must be added to the domain's DNS configuration at the domain registrar to prove ownership. This is required before the domain can be verified and used for serving content. The instructions include the CNAME or TXT record details needed for the verification process.
2455
+
2456
+ | Parameter | Type | Required |
2457
+ | ------------ | ----- | -------- |
2458
+ | `id` | `str` | Yes |
2459
+ | `project_id` | `str` | Yes |
2460
+ | `domain_id` | `str` | Yes |
2461
+
2462
+ **Returns:** `dict[str, Any]`
2463
+
2464
+ ```python
2465
+ result = await gc.project_domains.get_domain_verification_instructions(
2466
+ id="uuid-id",
2467
+ project_id="uuid-project",
2468
+ domain_id="uuid-domain",
2469
+ )
2470
+ ```
2471
+
2472
+ ---
2473
+
2474
+ #### `list_project_domains`
2475
+
2476
+ Get all domains for a project
2477
+ Returns a comprehensive list of all domains (both auto-generated and custom) across all apps within the specified project. Each domain entry includes its hostname, verification status, whether it is generated or custom, whether it is the primary domain for its app, and the associated app name and slug. Domains are grouped by app and sorted with generated domains first and primary domains prioritized.
2478
+
2479
+ | Parameter | Type | Required |
2480
+ | ------------ | ----- | -------- |
2481
+ | `id` | `str` | Yes |
2482
+ | `project_id` | `str` | Yes |
2483
+
2484
+ **Returns:** `list[dict[str, Any]]`
2485
+
2486
+ ```python
2487
+ result = await gc.project_domains.list_project_domains(
2488
+ id="uuid-id",
2489
+ project_id="uuid-project",
2490
+ )
2491
+ ```
2492
+
2493
+ ---
2494
+
2495
+ ### Project Files
2496
+
2497
+ `gc.project_files`
2498
+
2499
+ #### `get_file_references`
2500
+
2501
+ Get all places where a file is referenced
2502
+ Returns a comprehensive list of all entities that reference this file across the project. This includes pages, headers, footers, blog posts, templates, sidebars, dialogs, forms, and branding settings. Useful for understanding the impact of deleting or replacing a file.
2503
+
2504
+ | Parameter | Type | Required |
2505
+ | ------------ | ----- | -------- |
2506
+ | `id` | `str` | Yes |
2507
+ | `project_id` | `str` | Yes |
2508
+ | `file_id` | `str` | Yes |
2509
+
2510
+ **Returns:** `list[dict[str, Any]]`
2511
+
2512
+ ```python
2513
+ result = await gc.project_files.get_file_references(
2514
+ id="uuid-id",
2515
+ project_id="uuid-project",
2516
+ file_id="uuid-file",
2517
+ )
2518
+ ```
2519
+
2520
+ ---
2521
+
2522
+ #### `get_file_folder`
2523
+
2524
+ Get a file folder
2525
+ Retrieves the details of a single folder in the project file manager, including its name, parent folder ID, and creation metadata.
2526
+
2527
+ | Parameter | Type | Required |
2528
+ | ------------ | ----- | -------- |
2529
+ | `id` | `str` | Yes |
2530
+ | `project_id` | `str` | Yes |
2531
+ | `folder_id` | `str` | Yes |
2532
+
2533
+ **Returns:** `dict[str, Any]`
2534
+
2535
+ ```python
2536
+ result = await gc.project_files.get_file_folder(
2537
+ id="uuid-id",
2538
+ project_id="uuid-project",
2539
+ folder_id="uuid-folder",
2540
+ )
2541
+ ```
2542
+
2543
+ ---
2544
+
2545
+ #### `get_file`
2546
+
2547
+ Get a file
2548
+ Retrieves the full details of a single file in the project file manager, including its filename, MIME type, size, dimensions, storage URL, alt text, caption, and folder assignment.
2549
+
2550
+ | Parameter | Type | Required |
2551
+ | ------------ | ----- | -------- |
2552
+ | `id` | `str` | Yes |
2553
+ | `project_id` | `str` | Yes |
2554
+ | `file_id` | `str` | Yes |
2555
+
2556
+ **Returns:** `dict[str, Any]`
2557
+
2558
+ ```python
2559
+ result = await gc.project_files.get_file(
2560
+ id="uuid-id",
2561
+ project_id="uuid-project",
2562
+ file_id="uuid-file",
2563
+ )
2564
+ ```
2565
+
2566
+ ---
2567
+
2568
+ #### `get_file_folders`
2569
+
2570
+ Get file folders in a project
2571
+ Returns all folders in the project file manager. Optionally filter by parentId to list only child folders of a specific parent folder. Pass parentId='null' or omit it to list root-level folders. Folders are used to organize uploaded files (images, documents, media).
2572
+
2573
+ | Parameter | Type | Required |
2574
+ | ------------ | ----- | -------- |
2575
+ | `id` | `str` | Yes |
2576
+ | `project_id` | `str` | Yes |
2577
+
2578
+ **Returns:** `list[dict[str, Any]]`
2579
+
2580
+ ```python
2581
+ result = await gc.project_files.get_file_folders(
2582
+ id="uuid-id",
2583
+ project_id="uuid-project",
2584
+ )
2585
+ ```
2586
+
2587
+ ---
2588
+
2589
+ #### `ingest_file`
2590
+
2591
+ Create a file from text or image content
2592
+ Creates a file from raw text content (Markdown, Mermaid, CSV, JSON, YAML, plain text, etc.) or base64-encoded image data (PNG, JPG, GIF, WebP, SVG). The file is stored in the project and processed for AI embeddings (text) or image classification (images). Use this to ingest documents, notes, diagrams, structured data, or screenshots into the project knowledge base.
2593
+
2594
+ | Parameter | Type | Required |
2595
+ | ------------ | ------ | -------- |
2596
+ | `id` | `str` | Yes |
2597
+ | `project_id` | `str` | Yes |
2598
+ | `data` | `dict` | Yes |
2599
+
2600
+ **Returns:** `dict[str, Any]`
2601
+
2602
+ ```python
2603
+ result = await gc.project_files.ingest_file(
2604
+ id="uuid-id",
2605
+ project_id="uuid-project",
2606
+ data={...},
2607
+ )
2608
+ ```
2609
+
2610
+ ---
2611
+
2612
+ #### `search_project_files`
2613
+
2614
+ Search files by content
2615
+ Searches project files by their content using semantic/AI search. Returns files whose content matches the meaning of the query, along with the matching content snippet and a relevance score.
2616
+
2617
+ | Parameter | Type | Required |
2618
+ | ------------ | ----- | -------- |
2619
+ | `id` | `str` | Yes |
2620
+ | `project_id` | `str` | Yes |
2621
+ | `query` | `str` | Yes |
2622
+ | `limit` | `str` | No |
2623
+
2624
+ **Returns:** `list[dict[str, Any]]`
2625
+
2626
+ ```python
2627
+ result = await gc.project_files.search_project_files(
2628
+ id="uuid-id",
2629
+ project_id="uuid-project",
2630
+ query="search term",
2631
+ )
2632
+ ```
2633
+
2634
+ ---
2635
+
2636
+ #### `list_file_trash`
2637
+
2638
+ Get items in trash
2639
+ Returns all soft-deleted files and folders currently in the project's file trash. Items remain in trash until they are restored or permanently deleted. Each item includes its original metadata and the date it was trashed.
2640
+
2641
+ | Parameter | Type | Required |
2642
+ | ------------ | ----- | -------- |
2643
+ | `id` | `str` | Yes |
2644
+ | `project_id` | `str` | Yes |
2645
+
2646
+ **Returns:** `list[dict[str, Any]]`
2647
+
2648
+ ```python
2649
+ result = await gc.project_files.list_file_trash(
2650
+ id="uuid-id",
2651
+ project_id="uuid-project",
2652
+ )
2653
+ ```
2654
+
2655
+ ---
2656
+
2657
+ #### `get_files`
2658
+
2659
+ Get files in a project
2660
+ Returns a paginated list of files (images, documents, media) uploaded to the project file manager. Supports full-text search by filename, filtering by folder ID and MIME type, and standard pagination and sorting options. Files at the root level can be retrieved by passing folderId as 'null'.
2661
+
2662
+ | Parameter | Type | Required |
2663
+ | ------------ | ----- | -------- |
2664
+ | `id` | `str` | Yes |
2665
+ | `project_id` | `str` | Yes |
2666
+ | `page` | `str` | No |
2667
+ | `page_size` | `str` | No |
2668
+ | `search` | `str` | No |
2669
+ | `folder_id` | `str` | No |
2670
+
2671
+ **Returns:** `dict[str, Any]`
2672
+
2673
+ ```python
2674
+ result = await gc.project_files.get_files(
2675
+ id="uuid-id",
2676
+ project_id="uuid-project",
2677
+ page=1,
2678
+ )
2679
+ ```
2680
+
2681
+ ---
2682
+
2683
+ ### Project Members
2684
+
2685
+ `gc.project_members`
2686
+
2687
+ #### `get_project_member`
2688
+
2689
+ Get a project member by ID
2690
+ Retrieves the full details of a single project member by their membership ID, including their user profile information, assigned role, and membership metadata.
2691
+
2692
+ | Parameter | Type | Required |
2693
+ | ------------ | ----- | -------- |
2694
+ | `id` | `str` | Yes |
2695
+ | `project_id` | `str` | Yes |
2696
+ | `member_id` | `str` | Yes |
2697
+
2698
+ **Returns:** `dict[str, Any]`
2699
+
2700
+ ```python
2701
+ result = await gc.project_members.get_project_member(
2702
+ id="uuid-id",
2703
+ project_id="uuid-project",
2704
+ member_id="uuid-member",
2705
+ )
2706
+ ```
2707
+
2708
+ ---
2709
+
2710
+ #### `get_project_members`
2711
+
2712
+ Get project members
2713
+ Returns a paginated list of users who are members of the specified project, including their roles and profile information. Supports search by name, filtering, and sorting. Project members have access to project resources based on their assigned role.
2714
+
2715
+ | Parameter | Type | Required |
2716
+ | ------------ | ----- | -------- |
2717
+ | `id` | `str` | Yes |
2718
+ | `project_id` | `str` | Yes |
2719
+ | `page` | `str` | No |
2720
+ | `page_size` | `str` | No |
2721
+
2722
+ **Returns:** `dict[str, Any]`
2723
+
2724
+ ```python
2725
+ result = await gc.project_members.get_project_members(
2726
+ id="uuid-id",
2727
+ project_id="uuid-project",
2728
+ page=1,
2729
+ )
2730
+ ```
2731
+
2732
+ ---
2733
+
2734
+ ### Project Trash
2735
+
2736
+ `gc.project_trash`
2737
+
2738
+ #### `get_project_trash_item`
2739
+
2740
+ Get a single trash item
2741
+ Retrieves the full details of a single item in the project trash by its trash record ID. Includes the original entity type, entity ID, name, deletion timestamp, and the stored entity data snapshot.
2742
+
2743
+ | Parameter | Type | Required |
2744
+ | ------------ | ----- | -------- |
2745
+ | `id` | `str` | Yes |
2746
+ | `project_id` | `str` | Yes |
2747
+ | `trash_id` | `str` | Yes |
2748
+
2749
+ **Returns:** `dict[str, Any]`
2750
+
2751
+ ```python
2752
+ result = await gc.project_trash.get_project_trash_item(
2753
+ id="uuid-id",
2754
+ project_id="uuid-project",
2755
+ trash_id="uuid-trash",
2756
+ )
2757
+ ```
2758
+
2759
+ ---
2760
+
2761
+ #### `list_project_trash`
2762
+
2763
+ Get all items in project trash
2764
+ Returns a paginated list of all soft-deleted resources across the entire project, including pages, posts, files, forms, and other entities. Supports filtering by entity type to narrow results. Each trash item includes the original entity metadata, deletion timestamp, and the user who deleted it.
2765
+
2766
+ | Parameter | Type | Required |
2767
+ | ------------ | ----- | -------- |
2768
+ | `id` | `str` | Yes |
2769
+ | `project_id` | `str` | Yes |
2770
+ | `type` | `str` | No |
2771
+ | `page` | `str` | No |
2772
+ | `page_size` | `str` | No |
2773
+ | `search` | `str` | No |
2774
+
2775
+ **Returns:** `dict[str, Any]`
2776
+
2777
+ ```python
2778
+ result = await gc.project_trash.list_project_trash(
2779
+ id="uuid-id",
2780
+ project_id="uuid-project",
2781
+ page=1,
2782
+ )
2783
+ ```
2784
+
2785
+ ---
2786
+
2787
+ ### Projects
2788
+
2789
+ `gc.projects`
2790
+
2791
+ #### `get_project_by_slug`
2792
+
2793
+ Get project by slug
2794
+ Retrieves the full details of a single project by its URL-friendly slug within the specified organization. This is an alternative to looking up a project by its UUID when you have the human-readable slug from a URL or user input. Returns the same complete project object as the get-by-ID endpoint including name, slug, description, settings, and timestamps.
2795
+
2796
+ | Parameter | Type | Required |
2797
+ | -------------- | ----- | -------- |
2798
+ | `id` | `str` | Yes |
2799
+ | `project_slug` | `str` | Yes |
2800
+
2801
+ **Returns:** `dict[str, Any]`
2802
+
2803
+ ```python
2804
+ result = await gc.projects.get_project_by_slug(
2805
+ id="uuid-id",
2806
+ project_slug="my-project",
2807
+ )
2808
+ ```
2809
+
2810
+ ---
2811
+
2812
+ #### `get_project_urls`
2813
+
2814
+ Get all project URLs
2815
+ Returns resolved relative URLs for all published content across all apps in the project. Includes pages, posts, articles, etc. with title, path, type, and SEO metadata. Used for link resolution in AI builders, menus, emails, and navigation.
2816
+
2817
+ | Parameter | Type | Required |
2818
+ | ------------ | ----- | -------- |
2819
+ | `id` | `str` | Yes |
2820
+ | `project_id` | `str` | Yes |
2821
+
2822
+ **Returns:** `dict[str, Any]`
2823
+
2824
+ ```python
2825
+ result = await gc.projects.get_project_urls(
2826
+ id="uuid-id",
2827
+ project_id="uuid-project",
2828
+ )
2829
+ ```
2830
+
2831
+ ---
2832
+
2833
+ #### `get_project`
2834
+
2835
+ Get a project by ID
2836
+ Retrieves the full details of a single project by its unique ID within the specified organization. Returns the project's name, slug, description, settings, and timestamps. The project must belong to the specified organization or a 404 error is returned.
2837
+
2838
+ | Parameter | Type | Required |
2839
+ | ------------ | ----- | -------- |
2840
+ | `id` | `str` | Yes |
2841
+ | `project_id` | `str` | Yes |
2842
+
2843
+ **Returns:** `dict[str, Any]`
2844
+
2845
+ ```python
2846
+ result = await gc.projects.get_project(
2847
+ id="uuid-id",
2848
+ project_id="uuid-project",
2849
+ )
2850
+ ```
2851
+
2852
+ ---
2853
+
2854
+ #### `get_projects`
2855
+
2856
+ Get projects in an organization
2857
+ Returns a paginated list of all projects belonging to the specified organization. Projects are the top-level containers that hold apps, brandings, and domains. Supports search filtering by project name and pagination via page and pageSize query parameters. Each project in the response includes its unique ID, name, slug, description, and timestamps.
2858
+
2859
+ | Parameter | Type | Required |
2860
+ | ----------- | ----- | -------- |
2861
+ | `id` | `str` | Yes |
2862
+ | `page` | `str` | No |
2863
+ | `page_size` | `str` | No |
2864
+ | `search` | `str` | No |
2865
+
2866
+ **Returns:** `dict[str, Any]`
2867
+
2868
+ ```python
2869
+ result = await gc.projects.get_projects(
2870
+ id="uuid-id",
2871
+ page=1,
2872
+ )
2873
+ ```
2874
+
2875
+ ---
2876
+
2877
+ ### Website
2878
+
2879
+ `gc.website`
2880
+
2881
+ #### `get_website_consent_settings`
2882
+
2883
+ Get consent settings
2884
+ Returns the cookie consent and privacy settings configured for this website app, including banner text, consent categories, and GDPR/CCPA compliance options.
2885
+
2886
+ | Parameter | Type | Required |
2887
+ | ----------------- | ----- | -------- |
2888
+ | `organization_id` | `str` | Yes |
2889
+ | `project_id` | `str` | Yes |
2890
+ | `app_id` | `str` | Yes |
2891
+
2892
+ **Returns:** `dict[str, Any]`
2893
+
2894
+ ```python
2895
+ result = await gc.website.get_website_consent_settings(
2896
+ organization_id="uuid-organization",
2897
+ project_id="uuid-project",
2898
+ app_id="uuid-app",
2899
+ )
2900
+ ```
2901
+
2902
+ ---
2903
+
2904
+ #### `get_website_dialog`
2905
+
2906
+ Get dialog
2907
+ Returns a single website dialog by ID, including its name, type, trigger rules, content blocks, and display settings.
2908
+
2909
+ | Parameter | Type | Required |
2910
+ | ----------------- | ----- | -------- |
2911
+ | `organization_id` | `str` | Yes |
2912
+ | `project_id` | `str` | Yes |
2913
+ | `app_id` | `str` | Yes |
2914
+ | `dialog_id` | `str` | Yes |
2915
+
2916
+ **Returns:** `dict[str, Any]`
2917
+
2918
+ ```python
2919
+ result = await gc.website.get_website_dialog(
2920
+ organization_id="uuid-organization",
2921
+ project_id="uuid-project",
2922
+ app_id="uuid-app",
2923
+ dialog_id="uuid-dialog",
2924
+ )
2925
+ ```
2926
+
2927
+ ---
2928
+
2929
+ #### `list_website_dialogs`
2930
+
2931
+ Get dialogs
2932
+ Returns a list of all popup dialogs configured for this website app. Dialogs are used for modals, popups, banners, and slide-ins.
2933
+
2934
+ | Parameter | Type | Required |
2935
+ | ----------------- | ----- | -------- |
2936
+ | `organization_id` | `str` | Yes |
2937
+ | `project_id` | `str` | Yes |
2938
+ | `app_id` | `str` | Yes |
2939
+ | `page` | `str` | No |
2940
+ | `page_size` | `str` | No |
2941
+ | `search` | `str` | No |
2942
+ | `lite` | `str` | No |
2943
+
2944
+ **Returns:** `dict[str, Any]`
2945
+
2946
+ ```python
2947
+ result = await gc.website.list_website_dialogs(
2948
+ organization_id="uuid-organization",
2949
+ project_id="uuid-project",
2950
+ app_id="uuid-app",
2951
+ page=1,
2952
+ )
2953
+ ```
2954
+
2955
+ ---
2956
+
2957
+ #### `get_website_custom_domain`
2958
+
2959
+ Get custom domain
2960
+ Returns a single custom domain by ID, including hostname, verification status, SSL status, DNS records needed, and primary flag.
2961
+
2962
+ | Parameter | Type | Required |
2963
+ | ----------------- | ----- | -------- |
2964
+ | `organization_id` | `str` | Yes |
2965
+ | `project_id` | `str` | Yes |
2966
+ | `app_id` | `str` | Yes |
2967
+ | `domain_id` | `str` | Yes |
2968
+
2969
+ **Returns:** `dict[str, Any]`
2970
+
2971
+ ```python
2972
+ result = await gc.website.get_website_custom_domain(
2973
+ organization_id="uuid-organization",
2974
+ project_id="uuid-project",
2975
+ app_id="uuid-app",
2976
+ domain_id="uuid-domain",
2977
+ )
2978
+ ```
2979
+
2980
+ ---
2981
+
2982
+ #### `list_website_custom_domains`
2983
+
2984
+ Get custom domains
2985
+ Returns a list of all custom domains configured for this website app, including verification status, SSL status, and whether each is the primary domain.
2986
+
2987
+ | Parameter | Type | Required |
2988
+ | ----------------- | ----- | -------- |
2989
+ | `organization_id` | `str` | Yes |
2990
+ | `project_id` | `str` | Yes |
2991
+ | `app_id` | `str` | Yes |
2992
+
2993
+ **Returns:** `list[dict[str, Any]]`
2994
+
2995
+ ```python
2996
+ result = await gc.website.list_website_custom_domains(
2997
+ organization_id="uuid-organization",
2998
+ project_id="uuid-project",
2999
+ app_id="uuid-app",
3000
+ )
3001
+ ```
3002
+
3003
+ ---
3004
+
3005
+ #### `get_website_footer`
3006
+
3007
+ Get website footer
3008
+ Returns a single website footer by ID, including its name, content blocks, and timestamps.
3009
+
3010
+ | Parameter | Type | Required |
3011
+ | ----------------- | ----- | -------- |
3012
+ | `organization_id` | `str` | Yes |
3013
+ | `project_id` | `str` | Yes |
3014
+ | `app_id` | `str` | Yes |
3015
+ | `footer_id` | `str` | Yes |
3016
+
3017
+ **Returns:** `dict[str, Any]`
3018
+
3019
+ ```python
3020
+ result = await gc.website.get_website_footer(
3021
+ organization_id="uuid-organization",
3022
+ project_id="uuid-project",
3023
+ app_id="uuid-app",
3024
+ footer_id="uuid-footer",
3025
+ )
3026
+ ```
3027
+
3028
+ ---
3029
+
3030
+ #### `list_website_footers`
3031
+
3032
+ Get website footers
3033
+ Returns a list of all footer components for this website app. Footers are reusable layout sections displayed at the bottom of pages.
3034
+
3035
+ | Parameter | Type | Required |
3036
+ | ----------------- | ----- | -------- |
3037
+ | `organization_id` | `str` | Yes |
3038
+ | `project_id` | `str` | Yes |
3039
+ | `app_id` | `str` | Yes |
3040
+ | `page` | `str` | No |
3041
+ | `page_size` | `str` | No |
3042
+ | `search` | `str` | No |
3043
+ | `lite` | `str` | No |
3044
+
3045
+ **Returns:** `dict[str, Any]`
3046
+
3047
+ ```python
3048
+ result = await gc.website.list_website_footers(
3049
+ organization_id="uuid-organization",
3050
+ project_id="uuid-project",
3051
+ app_id="uuid-app",
3052
+ page=1,
3053
+ )
3054
+ ```
3055
+
3056
+ ---
3057
+
3058
+ #### `get_website_header`
3059
+
3060
+ Get website header
3061
+ Returns a single website header by ID, including its name, content blocks, and timestamps.
3062
+
3063
+ | Parameter | Type | Required |
3064
+ | ----------------- | ----- | -------- |
3065
+ | `organization_id` | `str` | Yes |
3066
+ | `project_id` | `str` | Yes |
3067
+ | `app_id` | `str` | Yes |
3068
+ | `header_id` | `str` | Yes |
3069
+
3070
+ **Returns:** `dict[str, Any]`
3071
+
3072
+ ```python
3073
+ result = await gc.website.get_website_header(
3074
+ organization_id="uuid-organization",
3075
+ project_id="uuid-project",
3076
+ app_id="uuid-app",
3077
+ header_id="uuid-header",
3078
+ )
3079
+ ```
3080
+
3081
+ ---
3082
+
3083
+ #### `list_website_headers`
3084
+
3085
+ Get website headers
3086
+ Returns a list of all header components for this website app. Headers are reusable navigation/branding sections displayed at the top of pages.
3087
+
3088
+ | Parameter | Type | Required |
3089
+ | ----------------- | ----- | -------- |
3090
+ | `organization_id` | `str` | Yes |
3091
+ | `project_id` | `str` | Yes |
3092
+ | `app_id` | `str` | Yes |
3093
+ | `page` | `str` | No |
3094
+ | `page_size` | `str` | No |
3095
+ | `search` | `str` | No |
3096
+ | `lite` | `str` | No |
3097
+
3098
+ **Returns:** `dict[str, Any]`
3099
+
3100
+ ```python
3101
+ result = await gc.website.list_website_headers(
3102
+ organization_id="uuid-organization",
3103
+ project_id="uuid-project",
3104
+ app_id="uuid-app",
3105
+ page=1,
3106
+ )
3107
+ ```
3108
+
3109
+ ---
3110
+
3111
+ #### `get_website_page`
3112
+
3113
+ Get website page
3114
+ Returns a single website page by ID, including title, slug, full content blocks, SEO metadata, publish status, and layout references (header, footer, sidebar).
3115
+
3116
+ | Parameter | Type | Required |
3117
+ | ----------------- | ----- | -------- |
3118
+ | `organization_id` | `str` | Yes |
3119
+ | `project_id` | `str` | Yes |
3120
+ | `app_id` | `str` | Yes |
3121
+ | `page_id` | `str` | Yes |
3122
+
3123
+ **Returns:** `dict[str, Any]`
3124
+
3125
+ ```python
3126
+ result = await gc.website.get_website_page(
3127
+ organization_id="uuid-organization",
3128
+ project_id="uuid-project",
3129
+ app_id="uuid-app",
3130
+ page_id="uuid-page",
3131
+ )
3132
+ ```
3133
+
3134
+ ---
3135
+
3136
+ #### `get_website_pages`
3137
+
3138
+ Get website pages
3139
+ Returns a list of all pages for this website app. Each page includes its title, slug, publish status, SEO metadata, and associated header/footer/sidebar references.
3140
+
3141
+ | Parameter | Type | Required |
3142
+ | ----------------- | ----- | -------- |
3143
+ | `organization_id` | `str` | Yes |
3144
+ | `project_id` | `str` | Yes |
3145
+ | `app_id` | `str` | Yes |
3146
+ | `page` | `str` | No |
3147
+ | `page_size` | `str` | No |
3148
+ | `search` | `str` | No |
3149
+ | `lite` | `str` | No |
3150
+
3151
+ **Returns:** `dict[str, Any]`
3152
+
3153
+ ```python
3154
+ result = await gc.website.get_website_pages(
3155
+ organization_id="uuid-organization",
3156
+ project_id="uuid-project",
3157
+ app_id="uuid-app",
3158
+ page=1,
3159
+ )
3160
+ ```
3161
+
3162
+ ---
3163
+
3164
+ #### `get_website_post`
3165
+
3166
+ Get blog post
3167
+ Returns a single blog post by ID, including title, slug, full content blocks, excerpt, tags, author, featured image, SEO metadata, and publish status.
3168
+
3169
+ | Parameter | Type | Required |
3170
+ | ----------------- | ----- | -------- |
3171
+ | `organization_id` | `str` | Yes |
3172
+ | `project_id` | `str` | Yes |
3173
+ | `app_id` | `str` | Yes |
3174
+ | `post_id` | `str` | Yes |
3175
+
3176
+ **Returns:** `dict[str, Any]`
3177
+
3178
+ ```python
3179
+ result = await gc.website.get_website_post(
3180
+ organization_id="uuid-organization",
3181
+ project_id="uuid-project",
3182
+ app_id="uuid-app",
3183
+ post_id="uuid-post",
3184
+ )
3185
+ ```
3186
+
3187
+ ---
3188
+
3189
+ #### `get_website_posts`
3190
+
3191
+ Get blog posts
3192
+ Returns a paginated list of all blog posts for this website app. Each post includes title, slug, excerpt, publish status, author, tags, and featured image.
3193
+
3194
+ | Parameter | Type | Required |
3195
+ | ----------------- | ----- | -------- |
3196
+ | `organization_id` | `str` | Yes |
3197
+ | `project_id` | `str` | Yes |
3198
+ | `app_id` | `str` | Yes |
3199
+ | `page` | `str` | No |
3200
+ | `page_size` | `str` | No |
3201
+ | `search` | `str` | No |
3202
+ | `lite` | `str` | No |
3203
+
3204
+ **Returns:** `dict[str, Any]`
3205
+
3206
+ ```python
3207
+ result = await gc.website.get_website_posts(
3208
+ organization_id="uuid-organization",
3209
+ project_id="uuid-project",
3210
+ app_id="uuid-app",
3211
+ page=1,
3212
+ )
3213
+ ```
3214
+
3215
+ ---
3216
+
3217
+ #### `get_website_app_settings`
3218
+
3219
+ Get website settings
3220
+ Returns the website app settings including global SEO defaults, favicon, social image, language, and theme configuration.
3221
+
3222
+ | Parameter | Type | Required |
3223
+ | ----------------- | ----- | -------- |
3224
+ | `organization_id` | `str` | Yes |
3225
+ | `project_id` | `str` | Yes |
3226
+ | `app_id` | `str` | Yes |
3227
+
3228
+ **Returns:** `dict[str, Any]`
3229
+
3230
+ ```python
3231
+ result = await gc.website.get_website_app_settings(
3232
+ organization_id="uuid-organization",
3233
+ project_id="uuid-project",
3234
+ app_id="uuid-app",
3235
+ )
3236
+ ```
3237
+
3238
+ ---
3239
+
3240
+ #### `get_website_sidebar`
3241
+
3242
+ Get website sidebar
3243
+ Returns a single website sidebar by ID, including its name, content blocks, and timestamps.
3244
+
3245
+ | Parameter | Type | Required |
3246
+ | ----------------- | ----- | -------- |
3247
+ | `organization_id` | `str` | Yes |
3248
+ | `project_id` | `str` | Yes |
3249
+ | `app_id` | `str` | Yes |
3250
+ | `sidebar_id` | `str` | Yes |
3251
+
3252
+ **Returns:** `dict[str, Any]`
3253
+
3254
+ ```python
3255
+ result = await gc.website.get_website_sidebar(
3256
+ organization_id="uuid-organization",
3257
+ project_id="uuid-project",
3258
+ app_id="uuid-app",
3259
+ sidebar_id="uuid-sidebar",
3260
+ )
3261
+ ```
3262
+
3263
+ ---
3264
+
3265
+ #### `list_website_sidebars`
3266
+
3267
+ Get website sidebars
3268
+ Returns a list of all sidebar components for this website app. Sidebars are reusable layout sections displayed alongside page content.
3269
+
3270
+ | Parameter | Type | Required |
3271
+ | ----------------- | ----- | -------- |
3272
+ | `organization_id` | `str` | Yes |
3273
+ | `project_id` | `str` | Yes |
3274
+ | `app_id` | `str` | Yes |
3275
+ | `page` | `str` | No |
3276
+ | `page_size` | `str` | No |
3277
+ | `search` | `str` | No |
3278
+ | `lite` | `str` | No |
3279
+
3280
+ **Returns:** `dict[str, Any]`
3281
+
3282
+ ```python
3283
+ result = await gc.website.list_website_sidebars(
3284
+ organization_id="uuid-organization",
3285
+ project_id="uuid-project",
3286
+ app_id="uuid-app",
3287
+ page=1,
3288
+ )
3289
+ ```
3290
+
3291
+ ---
3292
+
3293
+ #### `get_website_tags`
3294
+
3295
+ Get website tags
3296
+ Returns a list of all tags used across pages and posts in this website app. Tags are used for categorization and filtering.
3297
+
3298
+ | Parameter | Type | Required |
3299
+ | ----------------- | ----- | -------- |
3300
+ | `organization_id` | `str` | Yes |
3301
+ | `project_id` | `str` | Yes |
3302
+ | `app_id` | `str` | Yes |
3303
+
3304
+ **Returns:** `list[str]`
3305
+
3306
+ ```python
3307
+ result = await gc.website.get_website_tags(
3308
+ organization_id="uuid-organization",
3309
+ project_id="uuid-project",
3310
+ app_id="uuid-app",
3311
+ )
3312
+ ```
3313
+
3314
+ ---
3315
+
3316
+ #### `get_website_template`
3317
+
3318
+ Get website template
3319
+ Returns a single website template by ID, including its name, content blocks, layout structure, and timestamps.
3320
+
3321
+ | Parameter | Type | Required |
3322
+ | ----------------- | ----- | -------- |
3323
+ | `organization_id` | `str` | Yes |
3324
+ | `project_id` | `str` | Yes |
3325
+ | `app_id` | `str` | Yes |
3326
+ | `template_id` | `str` | Yes |
3327
+
3328
+ **Returns:** `dict[str, Any]`
3329
+
3330
+ ```python
3331
+ result = await gc.website.get_website_template(
3332
+ organization_id="uuid-organization",
3333
+ project_id="uuid-project",
3334
+ app_id="uuid-app",
3335
+ template_id="uuid-template",
3336
+ )
3337
+ ```
3338
+
3339
+ ---
3340
+
3341
+ #### `list_website_templates`
3342
+
3343
+ Get website templates
3344
+ Returns a list of all page templates for this website app. Templates provide reusable page layouts and content block structures.
3345
+
3346
+ | Parameter | Type | Required |
3347
+ | ----------------- | ----- | -------- |
3348
+ | `organization_id` | `str` | Yes |
3349
+ | `project_id` | `str` | Yes |
3350
+ | `app_id` | `str` | Yes |
3351
+ | `page` | `str` | No |
3352
+ | `page_size` | `str` | No |
3353
+ | `search` | `str` | No |
3354
+ | `lite` | `str` | No |
3355
+
3356
+ **Returns:** `dict[str, Any]`
3357
+
3358
+ ```python
3359
+ result = await gc.website.list_website_templates(
3360
+ organization_id="uuid-organization",
3361
+ project_id="uuid-project",
3362
+ app_id="uuid-app",
3363
+ page=1,
3364
+ )
3365
+ ```
3366
+
3367
+ ---
3368
+
3369
+ #### `get_website_tracking_settings`
3370
+
3371
+ Get tracking settings
3372
+ Returns the analytics and tracking configuration for this website app, including Google Analytics ID, custom scripts, and tracking pixel settings.
3373
+
3374
+ | Parameter | Type | Required |
3375
+ | ----------------- | ----- | -------- |
3376
+ | `organization_id` | `str` | Yes |
3377
+ | `project_id` | `str` | Yes |
3378
+ | `app_id` | `str` | Yes |
3379
+
3380
+ **Returns:** `dict[str, Any]`
3381
+
3382
+ ```python
3383
+ result = await gc.website.get_website_tracking_settings(
3384
+ organization_id="uuid-organization",
3385
+ project_id="uuid-project",
3386
+ app_id="uuid-app",
3387
+ )
3388
+ ```
3389
+
3390
+ ---
3391
+
3392
+ #### `get_website_urls`
3393
+
3394
+ Get existing website page URLs
3395
+ Returns a list of all existing page slugs for this website app. Use this to avoid generating duplicate URLs when creating new pages.
3396
+
3397
+ | Parameter | Type | Required |
3398
+ | ----------------- | ----- | -------- |
3399
+ | `organization_id` | `str` | Yes |
3400
+ | `project_id` | `str` | Yes |
3401
+ | `app_id` | `str` | Yes |
3402
+
3403
+ **Returns:** `dict[str, Any]`
3404
+
3405
+ ```python
3406
+ result = await gc.website.get_website_urls(
3407
+ organization_id="uuid-organization",
3408
+ project_id="uuid-project",
3409
+ app_id="uuid-app",
3410
+ )
3411
+ ```
3412
+
3413
+ <!-- API_REFERENCE_END -->
3414
+
3415
+ ## Requirements
3416
+
3417
+ - Python 3.11+
3418
+ - [httpx](https://www.python-httpx.org/)
3419
+
3420
+ ## License
3421
+
3422
+ MIT