0
# Confluence API
1
2
Comprehensive Confluence REST API client providing full access to Confluence content management, collaboration features, and administration. Supports both Confluence Cloud and Server/Data Center platforms with 130+ public methods covering pages, spaces, attachments, users, and system management.
3
4
## Initialization
5
6
```python { .api }
7
class Confluence(AtlassianRestAPI):
8
def __init__(self, url: str, username: str = None, password: str = None,
9
token: str = None, cloud: bool = None, api_version: str = "latest",
10
**kwargs):
11
"""
12
Initialize Confluence client.
13
14
Parameters:
15
- url (str): Base URL of Confluence instance
16
- username (str, optional): Username for authentication
17
- password (str, optional): Password or API token
18
- token (str, optional): Bearer token for authentication
19
- cloud (bool, optional): True for Cloud, False for Server/DC
20
- api_version (str): API version, defaults to "latest"
21
"""
22
```
23
24
## Capabilities
25
26
### Page Management
27
28
Core functionality for creating, reading, updating, and managing Confluence pages with comprehensive content handling.
29
30
```python { .api }
31
def get_page_by_title(self, space: str, title: str, start: int = 0,
32
limit: int = 1, expand: Optional[str] = None,
33
type: str = "page") -> T_resp_json:
34
"""
35
Get page by space key and title.
36
37
Parameters:
38
- space: Space key
39
- title: Page title
40
- start: Starting index for pagination
41
- limit: Maximum results to return
42
- expand: Additional data to expand (body.storage, version, etc.)
43
- type: Content type ("page", "blogpost")
44
45
Returns:
46
dict: Page information with content and metadata
47
"""
48
49
def get_page_by_id(self, page_id: str, expand: Optional[str] = None,
50
status: Optional[str] = None,
51
version: Optional[int] = None) -> T_resp_json:
52
"""
53
Get page by ID.
54
55
Parameters:
56
- page_id: Page ID
57
- expand: Additional data to expand
58
- status: Page status filter
59
- version: Specific version number
60
61
Returns:
62
dict: Page data with requested expansions
63
"""
64
65
def create_page(self, space: str, title: str, body: str,
66
parent_id: Optional[str] = None, type: str = "page",
67
representation: str = "storage", editor: Optional[str] = None,
68
full_width: bool = False, status: str = "current") -> T_resp_json:
69
"""
70
Create new page.
71
72
Parameters:
73
- space: Space key where page will be created
74
- title: Page title
75
- body: Page content in specified representation format
76
- parent_id: Parent page ID for hierarchy
77
- type: Content type ("page", "blogpost")
78
- representation: Content format ("storage", "wiki", "view")
79
- editor: Editor type ("v1", "v2", "fabric")
80
- full_width: Use full page width
81
- status: Page status ("current", "draft")
82
83
Returns:
84
dict: Created page data with ID and URL
85
"""
86
87
def update_page(self, page_id: str, title: str, body: Optional[str] = None,
88
parent_id: Optional[str] = None, type: str = "page",
89
representation: str = "storage", minor_edit: bool = False,
90
version_comment: Optional[str] = None,
91
always_update: bool = False, full_width: bool = False) -> T_resp_json:
92
"""
93
Update existing page.
94
95
Parameters:
96
- page_id: Page ID to update
97
- title: New page title
98
- body: New page content (optional if only updating title)
99
- parent_id: New parent page ID
100
- type: Content type
101
- representation: Content format
102
- minor_edit: Mark as minor edit
103
- version_comment: Version comment for history
104
- always_update: Update even if no changes detected
105
- full_width: Use full page width
106
107
Returns:
108
dict: Updated page data
109
"""
110
111
def update_or_create(self, parent_id: str, title: str, body: str,
112
representation: str = "storage", minor_edit: bool = False,
113
version_comment: Optional[str] = None,
114
editor: Optional[str] = None,
115
full_width: bool = False) -> T_resp_json:
116
"""
117
Update page if exists, create if not.
118
119
Parameters:
120
- parent_id: Parent page ID
121
- title: Page title
122
- body: Page content
123
- representation: Content format
124
- minor_edit: Mark as minor edit if updating
125
- version_comment: Version comment
126
- editor: Editor type
127
- full_width: Use full page width
128
129
Returns:
130
dict: Page data (created or updated)
131
"""
132
133
def page_exists(self, space: str, title: str, type: Optional[str] = None) -> bool:
134
"""
135
Check if page exists.
136
137
Parameters:
138
- space: Space key
139
- title: Page title
140
- type: Content type filter
141
142
Returns:
143
bool: True if page exists
144
"""
145
146
def remove_page(self, page_id: str, status: Optional[str] = None,
147
recursive: bool = False) -> bool:
148
"""
149
Remove page.
150
151
Parameters:
152
- page_id: Page ID to remove
153
- status: Target status ("trashed" or permanent deletion)
154
- recursive: Remove child pages as well
155
156
Returns:
157
bool: True if removal successful
158
"""
159
```
160
161
### Page Hierarchy and Navigation
162
163
```python { .api }
164
def get_child_pages(self, page_id: str) -> List[dict]:
165
"""
166
Get child pages.
167
168
Parameters:
169
- page_id: Parent page ID
170
171
Returns:
172
List[dict]: Child page list
173
"""
174
175
def get_page_ancestors(self, page_id: str) -> List[dict]:
176
"""
177
Get page ancestors.
178
179
Parameters:
180
- page_id: Page ID
181
182
Returns:
183
List[dict]: Ancestor pages from root to parent
184
"""
185
186
def get_parent_content_id(self, page_id: str) -> Optional[str]:
187
"""
188
Get parent page ID.
189
190
Parameters:
191
- page_id: Child page ID
192
193
Returns:
194
str: Parent page ID or None if no parent
195
"""
196
197
def get_subtree_of_content_ids(self, page_id: str) -> List[str]:
198
"""
199
Get complete subtree of page IDs.
200
201
Parameters:
202
- page_id: Root page ID
203
204
Returns:
205
List[str]: All descendant page IDs
206
"""
207
```
208
209
### Content Operations
210
211
```python { .api }
212
def get_all_pages_from_space(self, space: str, start: int = 0, limit: int = 50,
213
status: Optional[str] = None,
214
expand: Optional[str] = None,
215
content_type: str = "page") -> T_resp_json:
216
"""
217
Get all pages from space.
218
219
Parameters:
220
- space: Space key
221
- start: Starting index for pagination
222
- limit: Maximum results per page
223
- status: Status filter ("current", "draft", "trashed")
224
- expand: Additional data to expand
225
- content_type: Content type filter
226
227
Returns:
228
dict: Pages data with pagination info
229
"""
230
231
def get_all_pages_by_label(self, label: str, start: int = 0, limit: int = 50,
232
expand: Optional[str] = None) -> T_resp_json:
233
"""
234
Get pages by label.
235
236
Parameters:
237
- label: Label to search for
238
- start: Starting index
239
- limit: Maximum results
240
- expand: Additional data to expand
241
242
Returns:
243
dict: Labeled pages with pagination
244
"""
245
246
def append_page(self, page_id: str, title: str, append_body: str,
247
parent_id: Optional[str] = None, type: str = "page",
248
representation: str = "storage",
249
minor_edit: bool = False) -> T_resp_json:
250
"""
251
Append content to page.
252
253
Parameters:
254
- page_id: Page ID to append to
255
- title: Page title (required for API)
256
- append_body: Content to append
257
- parent_id: Parent page ID
258
- type: Content type
259
- representation: Content format
260
- minor_edit: Mark as minor edit
261
262
Returns:
263
dict: Updated page data
264
"""
265
266
def is_page_content_is_already_updated(self, page_id: str, body: str,
267
title: Optional[str] = None) -> bool:
268
"""
269
Check if page content differs from provided content.
270
271
Parameters:
272
- page_id: Page ID to check
273
- body: Content to compare against
274
- title: Title to compare (optional)
275
276
Returns:
277
bool: True if content is already the same
278
"""
279
```
280
281
### Space Management
282
283
```python { .api }
284
def get_all_spaces(self, start: int = 0, limit: int = 50,
285
expand: Optional[str] = None, space_type: Optional[str] = None,
286
space_status: Optional[str] = None) -> T_resp_json:
287
"""
288
Get all spaces.
289
290
Parameters:
291
- start: Starting index for pagination
292
- limit: Maximum results per page
293
- expand: Additional data to expand
294
- space_type: Space type filter ("global", "personal")
295
- space_status: Status filter ("current", "archived")
296
297
Returns:
298
dict: Spaces list with pagination
299
"""
300
301
def get_space(self, space_key: str,
302
expand: str = "description.plain,homepage",
303
params: Optional[dict] = None) -> T_resp_json:
304
"""
305
Get space details.
306
307
Parameters:
308
- space_key: Space key
309
- expand: Additional data to expand
310
- params: Additional query parameters
311
312
Returns:
313
dict: Space information with metadata
314
"""
315
316
def create_space(self, space_key: str, space_name: str) -> T_resp_json:
317
"""
318
Create new space.
319
320
Parameters:
321
- space_key: Unique space key
322
- space_name: Space display name
323
324
Returns:
325
dict: Created space data
326
"""
327
328
def delete_space(self, space_key: str) -> bool:
329
"""
330
Delete space.
331
332
Parameters:
333
- space_key: Space key to delete
334
335
Returns:
336
bool: True if deletion successful
337
"""
338
339
def get_home_page_of_space(self, space_key: str) -> T_resp_json:
340
"""
341
Get space homepage.
342
343
Parameters:
344
- space_key: Space key
345
346
Returns:
347
dict: Homepage data
348
"""
349
```
350
351
### Attachment Management
352
353
```python { .api }
354
def attach_file(self, filename: str, name: Optional[str] = None,
355
content_type: Optional[str] = None, page_id: Optional[str] = None,
356
title: Optional[str] = None, space: Optional[str] = None,
357
comment: Optional[str] = None) -> T_resp_json:
358
"""
359
Attach file to page.
360
361
Parameters:
362
- filename: Path to file to attach
363
- name: Attachment name (defaults to filename)
364
- content_type: MIME type
365
- page_id: Target page ID
366
- title: Target page title (used with space if no page_id)
367
- space: Target space key (used with title if no page_id)
368
- comment: Attachment comment
369
370
Returns:
371
dict: Attachment metadata
372
"""
373
374
def attach_content(self, content: bytes, name: str,
375
content_type: str = "application/binary",
376
page_id: Optional[str] = None, title: Optional[str] = None,
377
space: Optional[str] = None,
378
comment: Optional[str] = None) -> T_resp_json:
379
"""
380
Attach content from memory to page.
381
382
Parameters:
383
- content: Binary content to attach
384
- name: Attachment name
385
- content_type: MIME type
386
- page_id: Target page ID
387
- title: Target page title
388
- space: Target space key
389
- comment: Attachment comment
390
391
Returns:
392
dict: Attachment metadata
393
"""
394
395
def get_attachments_from_content(self, page_id: str, start: int = 0,
396
limit: int = 50, expand: Optional[str] = None,
397
filename: Optional[str] = None,
398
media_type: Optional[str] = None) -> T_resp_json:
399
"""
400
Get page attachments.
401
402
Parameters:
403
- page_id: Page ID
404
- start: Starting index
405
- limit: Maximum results
406
- expand: Additional data to expand
407
- filename: Filter by filename
408
- media_type: Filter by media type
409
410
Returns:
411
dict: Attachments list with metadata
412
"""
413
414
def download_attachments_from_page(self, page_id: str, path: Optional[str] = None,
415
start: int = 0, limit: int = 50,
416
filename: Optional[str] = None,
417
to_memory: bool = False) -> Union[None, List[bytes]]:
418
"""
419
Download attachments from page.
420
421
Parameters:
422
- page_id: Page ID
423
- path: Download directory path
424
- start: Starting index
425
- limit: Maximum attachments to download
426
- filename: Specific filename to download
427
- to_memory: Return content in memory instead of saving files
428
429
Returns:
430
None or List[bytes]: Downloaded content if to_memory=True
431
"""
432
433
def delete_attachment(self, page_id: str, filename: str,
434
version: Optional[int] = None) -> bool:
435
"""
436
Delete attachment.
437
438
Parameters:
439
- page_id: Page ID
440
- filename: Attachment filename
441
- version: Specific version to delete
442
443
Returns:
444
bool: True if deletion successful
445
"""
446
```
447
448
### Comments and Collaboration
449
450
```python { .api }
451
def add_comment(self, page_id: str, text: str) -> T_resp_json:
452
"""
453
Add comment to page.
454
455
Parameters:
456
- page_id: Page ID
457
- text: Comment text (supports wiki markup)
458
459
Returns:
460
dict: Created comment data
461
"""
462
463
def get_page_comments(self, content_id: str, expand: Optional[str] = None,
464
parent_version: Optional[int] = None, start: int = 0,
465
limit: int = 25, location: Optional[str] = None,
466
depth: Optional[str] = None) -> T_resp_json:
467
"""
468
Get page comments.
469
470
Parameters:
471
- content_id: Page ID
472
- expand: Additional data to expand
473
- parent_version: Parent version filter
474
- start: Starting index
475
- limit: Maximum results
476
- location: Comment location filter
477
- depth: Comment depth ("root", "all")
478
479
Returns:
480
dict: Comments data with threading
481
"""
482
483
def share_with_others(self, page_id: str, group: str, message: str) -> bool:
484
"""
485
Share page with group and send notification.
486
487
Parameters:
488
- page_id: Page ID to share
489
- group: Group name to notify
490
- message: Notification message
491
492
Returns:
493
bool: True if sharing successful
494
"""
495
```
496
497
### Labels and Properties
498
499
```python { .api }
500
def get_page_labels(self, page_id: str, prefix: Optional[str] = None,
501
start: Optional[int] = None,
502
limit: Optional[int] = None) -> T_resp_json:
503
"""
504
Get page labels.
505
506
Parameters:
507
- page_id: Page ID
508
- prefix: Label prefix filter
509
- start: Starting index
510
- limit: Maximum results
511
512
Returns:
513
dict: Labels data
514
"""
515
516
def set_page_label(self, page_id: str, label: str) -> T_resp_json:
517
"""
518
Add label to page.
519
520
Parameters:
521
- page_id: Page ID
522
- label: Label to add
523
524
Returns:
525
dict: Label operation result
526
"""
527
528
def remove_page_label(self, page_id: str, label: str) -> T_resp_json:
529
"""
530
Remove label from page.
531
532
Parameters:
533
- page_id: Page ID
534
- label: Label to remove
535
536
Returns:
537
dict: Label operation result
538
"""
539
540
def get_page_properties(self, page_id: str) -> T_resp_json:
541
"""
542
Get all page properties.
543
544
Parameters:
545
- page_id: Page ID
546
547
Returns:
548
dict: Page properties
549
"""
550
551
def set_page_property(self, page_id: str, data: dict) -> T_resp_json:
552
"""
553
Set page property.
554
555
Parameters:
556
- page_id: Page ID
557
- data: Property data with key and value
558
559
Returns:
560
dict: Property operation result
561
"""
562
563
def get_page_property(self, page_id: str, page_property_key: str) -> T_resp_json:
564
"""
565
Get specific page property.
566
567
Parameters:
568
- page_id: Page ID
569
- page_property_key: Property key
570
571
Returns:
572
dict: Property value
573
"""
574
```
575
576
### Search and Query
577
578
```python { .api }
579
def cql(self, cql: str, start: int = 0, limit: Optional[int] = None,
580
expand: Optional[str] = None,
581
include_archived_spaces: Optional[bool] = None,
582
excerpt: Optional[str] = None) -> T_resp_json:
583
"""
584
Confluence Query Language search.
585
586
Parameters:
587
- cql: CQL query string
588
- start: Starting index for pagination
589
- limit: Maximum results to return
590
- expand: Additional data to expand
591
- include_archived_spaces: Include archived spaces in results
592
- excerpt: Excerpt strategy ("highlight", "indexed", "none")
593
594
Returns:
595
dict: Search results with content matches
596
"""
597
```
598
599
### User and Group Management
600
601
```python { .api }
602
def get_user_details_by_username(self, username: str,
603
expand: Optional[str] = None) -> T_resp_json:
604
"""
605
Get user details by username.
606
607
Parameters:
608
- username: Username to lookup
609
- expand: Additional data to expand
610
611
Returns:
612
dict: User information
613
"""
614
615
def get_user_details_by_accountid(self, accountid: str,
616
expand: Optional[str] = None) -> T_resp_json:
617
"""
618
Get user details by account ID (Cloud).
619
620
Parameters:
621
- accountid: Account ID to lookup
622
- expand: Additional data to expand
623
624
Returns:
625
dict: User information
626
"""
627
628
def get_all_groups(self, start: int = 0, limit: int = 1000) -> T_resp_json:
629
"""
630
Get all groups.
631
632
Parameters:
633
- start: Starting index
634
- limit: Maximum results
635
636
Returns:
637
dict: Groups list
638
"""
639
640
def create_group(self, name: str) -> T_resp_json:
641
"""
642
Create group.
643
644
Parameters:
645
- name: Group name
646
647
Returns:
648
dict: Created group data
649
"""
650
651
def get_group_members(self, group_name: str = "confluence-users",
652
start: int = 0, limit: int = 1000,
653
expand: Optional[str] = None) -> T_resp_json:
654
"""
655
Get group members.
656
657
Parameters:
658
- group_name: Group name
659
- start: Starting index
660
- limit: Maximum results
661
- expand: Additional data to expand
662
663
Returns:
664
dict: Group members list
665
"""
666
667
def add_user_to_group(self, username: str, group_name: str) -> T_resp_json:
668
"""
669
Add user to group.
670
671
Parameters:
672
- username: Username to add
673
- group_name: Target group name
674
675
Returns:
676
dict: Operation result
677
"""
678
```
679
680
### Templates
681
682
```python { .api }
683
def create_or_update_template(self, name: str, body: str,
684
template_type: str = "page",
685
template_id: Optional[str] = None,
686
description: Optional[str] = None,
687
labels: Optional[List[str]] = None,
688
space: Optional[str] = None) -> T_resp_json:
689
"""
690
Create or update content template.
691
692
Parameters:
693
- name: Template name
694
- body: Template body content
695
- template_type: Template type ("page", "blogpost")
696
- template_id: Template ID for updates
697
- description: Template description
698
- labels: Template labels
699
- space: Space key for space templates
700
701
Returns:
702
dict: Template data
703
"""
704
705
def get_content_templates(self, space: Optional[str] = None, start: int = 0,
706
limit: Optional[int] = None,
707
expand: Optional[str] = None) -> T_resp_json:
708
"""
709
Get content templates.
710
711
Parameters:
712
- space: Space key filter
713
- start: Starting index
714
- limit: Maximum results
715
- expand: Additional data to expand
716
717
Returns:
718
dict: Templates list
719
"""
720
721
def remove_template(self, template_id: str) -> bool:
722
"""
723
Delete template.
724
725
Parameters:
726
- template_id: Template ID to delete
727
728
Returns:
729
bool: True if deletion successful
730
"""
731
```
732
733
### Export and Content Conversion
734
735
```python { .api }
736
def get_page_as_pdf(self, page_id: str) -> bytes:
737
"""
738
Export page as PDF.
739
740
Parameters:
741
- page_id: Page ID to export
742
743
Returns:
744
bytes: PDF content
745
"""
746
747
def get_page_as_word(self, page_id: str) -> bytes:
748
"""
749
Export page as Word document.
750
751
Parameters:
752
- page_id: Page ID to export
753
754
Returns:
755
bytes: Word document content
756
"""
757
758
def convert_wiki_to_storage(self, wiki: str) -> T_resp_json:
759
"""
760
Convert wiki markup to storage format.
761
762
Parameters:
763
- wiki: Wiki markup content
764
765
Returns:
766
dict: Storage format content
767
"""
768
769
def convert_storage_to_view(self, storage: str) -> T_resp_json:
770
"""
771
Convert storage format to view format.
772
773
Parameters:
774
- storage: Storage format content
775
776
Returns:
777
dict: View format content
778
"""
779
```
780
781
### History and Versioning
782
783
```python { .api }
784
def history(self, page_id: str) -> T_resp_json:
785
"""
786
Get page history.
787
788
Parameters:
789
- page_id: Page ID
790
791
Returns:
792
dict: Version history with authors and timestamps
793
"""
794
795
def get_content_history_by_version_number(self, content_id: str,
796
version_number: int) -> T_resp_json:
797
"""
798
Get specific version of content.
799
800
Parameters:
801
- content_id: Content ID
802
- version_number: Version number
803
804
Returns:
805
dict: Historical version data
806
"""
807
808
def remove_content_history(self, page_id: str, version_number: int) -> bool:
809
"""
810
Remove specific version from history.
811
812
Parameters:
813
- page_id: Page ID
814
- version_number: Version to remove
815
816
Returns:
817
bool: True if removal successful
818
"""
819
```
820
821
## Usage Examples
822
823
### Basic Page Operations
824
825
```python
826
from atlassian import Confluence
827
828
confluence = Confluence(
829
url="https://your-domain.atlassian.net",
830
username="email@example.com",
831
password="api-token"
832
)
833
834
# Create page
835
page_body = """
836
<p>This is a new page with <strong>formatted content</strong>.</p>
837
<ac:structured-macro ac:name="info">
838
<ac:parameter ac:name="title">Note</ac:parameter>
839
<ac:rich-text-body>
840
<p>This is an info macro.</p>
841
</ac:rich-text-body>
842
</ac:structured-macro>
843
"""
844
845
new_page = confluence.create_page(
846
space="DOCS",
847
title="My New Page",
848
body=page_body,
849
parent_id="123456"
850
)
851
852
# Get page
853
page = confluence.get_page_by_title(
854
"DOCS",
855
"My New Page",
856
expand="body.storage,version,ancestors"
857
)
858
859
# Update page
860
confluence.update_page(
861
page_id=page["id"],
862
title="Updated Page Title",
863
body="<p>Updated content</p>"
864
)
865
```
866
867
### Content Management
868
869
```python
870
# Get all pages from space
871
pages = confluence.get_all_pages_from_space(
872
"DOCS",
873
expand="body.storage,version",
874
limit=100
875
)
876
877
# Search with CQL
878
search_results = confluence.cql(
879
'space = "DOCS" AND title ~ "API" AND type = "page"',
880
expand="body.view"
881
)
882
883
# Work with labels
884
confluence.set_page_label(page_id, "api-docs")
885
confluence.set_page_label(page_id, "reference")
886
labels = confluence.get_page_labels(page_id)
887
```
888
889
### Attachments and Media
890
891
```python
892
# Attach file
893
attachment = confluence.attach_file(
894
filename="/path/to/document.pdf",
895
page_id=page_id,
896
comment="Updated API documentation"
897
)
898
899
# Get attachments
900
attachments = confluence.get_attachments_from_content(page_id)
901
902
# Download attachments
903
confluence.download_attachments_from_page(
904
page_id,
905
path="/download/directory"
906
)
907
```
908
909
### Space and User Management
910
911
```python
912
# Create space
913
space = confluence.create_space(
914
space_key="NEWDOCS",
915
space_name="New Documentation Space"
916
)
917
918
# Get space info
919
space_info = confluence.get_space(
920
"DOCS",
921
expand="description.plain,homepage,permissions"
922
)
923
924
# User operations
925
user = confluence.get_user_details_by_username("john.doe")
926
groups = confluence.get_all_groups()
927
members = confluence.get_group_members("confluence-administrators")
928
```
929
930
### Advanced Operations
931
932
```python
933
# Content conversion
934
wiki_content = "h1. My Heading\n\nThis is *bold* text."
935
storage_content = confluence.convert_wiki_to_storage(wiki_content)
936
937
# Templates
938
template = confluence.create_or_update_template(
939
name="Meeting Notes Template",
940
body="<h1>Meeting Notes</h1><p>Date: </p><p>Attendees: </p>",
941
description="Standard template for meeting notes"
942
)
943
944
# Export operations
945
pdf_content = confluence.get_page_as_pdf(page_id)
946
with open("page.pdf", "wb") as f:
947
f.write(pdf_content)
948
949
# Page hierarchy
950
children = confluence.get_child_pages(parent_page_id)
951
ancestors = confluence.get_page_ancestors(page_id)
952
```
953
954
## Error Handling
955
956
```python
957
from atlassian.errors import ApiNotFoundError, ApiPermissionError
958
959
try:
960
page = confluence.get_page_by_title("INVALID", "Nonexistent Page")
961
except ApiNotFoundError:
962
print("Page not found")
963
except ApiPermissionError:
964
print("Permission denied")
965
```
966
967
## Types
968
969
```python { .api }
970
from atlassian.typehints import T_id, T_resp_json
971
from typing import List, Dict, Optional, Union
972
973
# Common parameter types
974
SpaceKey = str
975
PageTitle = str
976
ContentId = str
977
ContentRepresentation = str # "storage", "wiki", "view"
978
ContentStatus = str # "current", "draft", "trashed"
979
CQLQuery = str
980
```