{"id":13551425,"url":"https://github.com/KonstantinKai/uploadcare_client","last_synced_at":"2025-04-03T01:32:44.223Z","repository":{"id":49851170,"uuid":"209065059","full_name":"KonstantinKai/uploadcare_client","owner":"KonstantinKai","description":"A flutter library for working with Uploadcare REST API. File uploads, media processing, and adaptive delivery for web and mobile.","archived":false,"fork":false,"pushed_at":"2025-03-10T10:58:28.000Z","size":865,"stargazers_count":20,"open_issues_count":0,"forks_count":7,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-10T11:46:42.639Z","etag":null,"topics":["cdn-api","conversions","dart","face-recognition","file-distribution","file-upload","flutter","flutter-package","flutter-uploadcare-client","upload-file","upload-images","upload-videos","uploadcare","uploadcare-api","uploadcare-client","uploader","video-encoding"],"latest_commit_sha":null,"homepage":"https://pub.dev/packages/uploadcare_client","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KonstantinKai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2019-09-17T13:43:01.000Z","updated_at":"2025-03-10T10:58:32.000Z","dependencies_parsed_at":"2023-01-22T14:46:03.171Z","dependency_job_id":"c72e2340-2ba3-4a90-a404-15a046aa522c","html_url":"https://github.com/KonstantinKai/uploadcare_client","commit_stats":{"total_commits":101,"total_committers":3,"mean_commits":"33.666666666666664","dds":0.01980198019801982,"last_synced_commit":"9f5977ac52e5c56f772bbd9de82e159f8079dad6"},"previous_names":[],"tags_count":41,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KonstantinKai%2Fuploadcare_client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KonstantinKai%2Fuploadcare_client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KonstantinKai%2Fuploadcare_client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KonstantinKai%2Fuploadcare_client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KonstantinKai","download_url":"https://codeload.github.com/KonstantinKai/uploadcare_client/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246922243,"owners_count":20855341,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cdn-api","conversions","dart","face-recognition","file-distribution","file-upload","flutter","flutter-package","flutter-uploadcare-client","upload-file","upload-images","upload-videos","uploadcare","uploadcare-api","uploadcare-client","uploader","video-encoding"],"created_at":"2024-08-01T12:01:48.070Z","updated_at":"2025-04-03T01:32:44.164Z","avatar_url":"https://github.com/KonstantinKai.png","language":"Dart","funding_links":["https://www.buymeacoffee.com/konstantinkai"],"categories":["Dart"],"sub_categories":[],"readme":"[![build](https://github.com/KonstantinKai/uploadcare_client/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/KonstantinKai/uploadcare_client/actions/workflows/build.yml)\n\n# Uploadcare client for Dart/Flutter\n\nUploadcare is a complete file handling platform that helps you ship products faster and focus on your business goals, not files. With Uploadcare, you can build infrastructure, optimize content, conversions, load times, traffic, and user experience. [Read more...](https://uploadcare.com/docs/)\n\nA dart/flutter library for working with Uploadcare REST API. File uploads, media processing, and adaptive delivery for web and mobile.\n\n## Features\n\n- [**Upload**](#upload)\n  - [**Base**](#base-upload)\n  - [**Multipart**](#chunked-upload)\n  - [**From url**](#from-url)\n  - [**Auto**](#auto)\n  - [**In isolate**](#isolate)\n  - [**Progress tracking**](#progress-tracking)\n  - [**Cancellable**](#cancellable)\n  - [**Signed**](#signed-upload)\n- [**Image and file transformations**](#image-and-file-transformations)\n  - [**Full list of image/file processing operations**](#full-list-of-image-processing-operations)\n- [**Files**](#files)\n  - [**Get file info**](#get-file-info)\n  - [**Get list of files**](#get-list-of-files)\n  - [**Remove files**](#remove-files)\n  - [**Store files**](#store-files)\n  - [**Metadata**](#metadata)\n  - [**Create file copies**](#create-file-copies)\n- [**Groups**](#groups)\n- [**Video processing**](#video-processing)\n- [**Document conversion**](#document-conversion)\n- [**Addons**](#addons)\n  - [**Object recognition**](#object-recognition)\n  - [**Malware protection**](#malware-protection)\n  - [**Background removal**](#background-removal)\n- [**Webhooks**](#webhooks)\n- [**Project**](#project)\n- [**FAQ**](#faq)\n\n### Note about `uploadcare_flutter` package\n\nThe `uploadcare_flutter` package introduced a few extensions for the base package (`Dimensions`, `Offsets`, `FaceRect`, `FacesEntityExtension`), `UploadcareImageProvider`. If you don't need these features, you can use `uploadcare_client` directly\n\n### Installation\n\nDart:\n\n```sh\ndart pub add uploadcare_client # or uploadcare_flutter\n```\n\nFlutter:\n\n```sh\nflutter pub add uploadcare_client # or uploadcare_flutter\n```\n\nCreate an `client`\n\n```dart\nfinal client = UploadcareClient.withSimpleAuth(\n  publicKey: 'puplic_key',\n  apiVersion: 'v0.7',\n);\n```\n\n`UploadcareClient` has following API sections\n\n```dart\nfinal ApiUpload upload;\nfinal ApiFiles files;\nfinal ApiGroups groups;\nfinal ApiDocumentConverting documentConverting;\nfinal ApiVideoEncoding videoEncoding;\nfinal ApiAddons addons;\nfinal ApiWebhooks webhooks;\nfinal ApiProject project;\n```\n\nYou can use each API section separately, for example:\n\n```dart\nfinal options = ClientOptions(\n  authorizationScheme: AuthSchemeRegular(\n    apiVersion: 'v0.7',\n    publicKey: 'public_key',\n    privateKey: 'private_key',\n  )\n);\n\nfinal upload = ApiUpload(options: options);\nfinal fileId = await upload.base(UCFile(File('...some/file')));\n// ...etc.\n```\n\n### Upload\n\n#### Base upload\n\n```dart\n/// For small files\nfinal fileId = await client.upload.base(UCFile(File('path/to/small_file')));\n```\n\n#### Chunked upload\n\n```dart\n/// For large files\n/// You can manage the number of concurrent requests by setting `ClientOptions.maxConcurrentChunkRequests` field.\nfinal fileId = await client.upload.multipart(UCFile(File('path/to/large_file')));\n```\n\n#### From url\n\n```dart\nfinal fileId = await client.upload.fromUrl('https://files.st/path_to_file');\n```\n\n#### Auto\n\n```dart\n/// Auto method accepts small/large/url files as a parameter and calls the necessary method for upload\nfinal fileId1 = await client.upload.auto(UCFile(File('path/to/small_file')));\nfinal fileId2 = await client.upload.auto(UCFile(File('path/to/large_file')));\nfinal fileId3 = await client.upload.auto('https://files.st/path_to_file');\n```\n\n#### Isolate\n\n```dart\n/// Also files can be uploaded in dart `isolate`\n/// You can manage the number of isolates by setting `ClientOptions.maxIsolatePoolSize` field.\n///\n/// NOTE: Doesn't work in web environment\nfinal fileId = await client.upload.auto(UCFile(File('path/to/file')), runInIsolate: true);\n```\n\n#### Progress tracking\n\n```dart\n/// Also you can track upload progress, all methods accept `onProgress` callback for this\nfinal fileId = await client.upload.(auto|base|multipart|fromUrl)(UCFile(File('path/to/file')), onProgress: (progress) =\u003e print(progress));\n```\n\n#### Cancellable\n\n```dart\n/// All upload processes can be canceled with `CancelToken`\nfinal cancelToken = CancelToken();\n\nTimer(Duration(seconds: 1), cancelToken.cancel);\n\ntry {\n  final fileId = await client.upload.auto(UCFile(File('/some/file')), cancelToken: cancelToken);\n} on CancelUploadException catch (e) {\n  // cancelled\n}\n\n```\n\n#### Signed upload\n\n[Official documentation](https://uploadcare.com/docs/security/secure-uploads/)\n\n```dart\n/// For signed upload you should provide the project's private key\nfinal client = UploadcareClient(options: ClientOptions(\n  authorizationScheme: AuthSchemeRegular(\n    publicKey: 'public_key',\n    privateKey: 'private_key',\n    apiVersion: 'v0.7',\n  ),\n  useSignedUploads: true,\n\n  /// Optionally you can customize signature lifetime for signed uploads via the `signedUploadsSignatureLifetime` property (default: 30 minutes)\n));\n\n/// Now, all your uploads will be signed\nawait client.uploads.(base|multipart|fromUrl|auto)(UCFile(File('path/to/file')));\n```\n\n### Image and file transformations\n\n[Official documentation](https://uploadcare.com/docs/transformations/image/)\n\n```dart\nfinal cropedCdnImage = CdnImage('\u003cimage-uuid\u003e')..transform(CropTransformation(ascpectRatio: AspectRatio(9, 16)));\n\n/// Use the following field for the croped image\n/// cropedCdnImage.url;\n\nfinal cropedAndInlined = CdnImage('\u003cimage-uuid\u003e')..transformAll([\n  CropTransformation(ascpectRatio: AspectRatio(9, 16)),\n  InlineTransformation(true);\n]);\n\n/// Use the following field to download the croped image\n/// cropedAndInlined.url\n```\n\nIf you use `uploadcare_flutter` you can specify the provider for the `Image` widget\n\n```dart\nfinal image = Image(\n  image: UploadcareImageProvider(\n    '\u003cimage-uuid\u003e',\n    transformations: [\n      ImageResizeTransformation(\n          const Dimensions.fromHeight(1000)),\n    ],\n),\n```\n\n#### Full list of image processing operations\n\n**Compression:**\n\n| Operation                                                                                                           | Type                        |\n| ------------------------------------------------------------------------------------------------------------------- | --------------------------- |\n| [Format](https://uploadcare.com/docs/transformations/image/compression/#operation-format)                           | `ImageFormatTransformation` |\n| [Quality, SmartCompression](https://uploadcare.com/docs/transformations/image/compression/#operation-quality)       | `QualityTransformation`     |\n| [Progressive JPEG](https://uploadcare.com/docs/transformations/image/compression/#operation-progressive)            | `ProgressiveTransformation` |\n| [Meta information control](https://uploadcare.com/docs/transformations/image/compression/#meta-information-control) | `StripMetaTransformation`   |\n\n**Resize, Crop, Rotate:**\n\n| Operation                                                                                                               | Type                         |\n| ----------------------------------------------------------------------------------------------------------------------- | ---------------------------- |\n| [Preview](https://uploadcare.com/docs/transformations/image/resize-crop/#operation-preview)                             | `PreviewTransformation`      |\n| [Resize, Smart resize](https://uploadcare.com/docs/transformations/image/resize-crop/#operation-resize)                 | `ImageResizeTransformation`  |\n| [Crop, Crop by ratio, Crop by objects](https://uploadcare.com/docs/transformations/image/resize-crop/#operation-crop)   | `CropTransformation`         |\n| [Scale crop, Smart crop](https://uploadcare.com/docs/transformations/image/resize-crop/#operation-scale-crop)           | `ScaleCropTransformation`    |\n| [Border radius and circle crop](https://uploadcare.com/docs/transformations/image/resize-crop/#operation-border-radius) | `BorderRadiusTransformation` |\n| [Set fill color](https://uploadcare.com/docs/transformations/image/resize-crop/#operation-setfill)                      | `SetFillTransformation`      |\n| [Zoom objects](https://uploadcare.com/docs/transformations/image/resize-crop/#operation-zoom-objects)                   | `ZoomObjectTransformation`   |\n| [Automatic rotation, EXIF-based](https://uploadcare.com/docs/transformations/image/resize-crop/#operation-autorotate)   | `AutoRotateTransformation`   |\n| [Manual rotation](https://uploadcare.com/docs/transformations/image/resize-crop/#operation-rotate)                      | `RotateTransformation`       |\n| [Flip](https://uploadcare.com/docs/transformations/image/resize-crop/#operation-flip)                                   | `FlipTransformation`         |\n| [Mirror](https://uploadcare.com/docs/transformations/image/resize-crop/#operation-mirror)                               | `MirrorTransformation`       |\n\n**Overlays and watermarks:**\n\n| Operation                                                                                               | Type                        |\n| ------------------------------------------------------------------------------------------------------- | --------------------------- |\n| [Image overlay, Self overlay](https://uploadcare.com/docs/transformations/image/overlay/#overlay-image) | `OverlayTransformation`     |\n| [Text overlay](https://uploadcare.com/docs/transformations/image/overlay/#overlay-text)                 | `TextOverlayTransformation` |\n\n**Effects and enhancements:**\n\n| Operation                                                                                              | Type                                                                                      |\n| ------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------- |\n| [Color adjustment](https://uploadcare.com/docs/effects-enhancements/#image-colors-operations)          | `Color(Brightness\\|Exposure\\|Gamma\\|Contrast\\|Sauration\\|Vibrance\\|Warmth)Transformation` |\n| [Enhance](https://uploadcare.com/docs/effects-enhancements/#operation-enhance)                         | `EnhanceTransformation`                                                                   |\n| [Grayscale](https://uploadcare.com/docs/effects-enhancements/#operation-grayscale)                     | `GrayscaleTransformation`                                                                 |\n| [Inverting](https://uploadcare.com/docs/effects-enhancements/#operation-invert)                        | `InvertTransformation`                                                                    |\n| [Conversion to sRGB](https://uploadcare.com/docs/effects-enhancements/#image-color-profile-management) | `SrgbTransformation`                                                                      |\n| [ICC profile size threshold](https://uploadcare.com/docs/effects-enhancements/#operation-max-icc-size) | `MaxIccSizeTransformation`                                                                |\n| [Photo filters](https://uploadcare.com/docs/effects-enhancements/#image-photo-filters)                 | `FilterTransformation`                                                                    |\n| [Blur](https://uploadcare.com/docs/effects-enhancements/#operation-blur)                               | `BlurTransformation`                                                                      |\n| [Blur region, Blur faces](https://uploadcare.com/docs/effects-enhancements/#operation-blur-region)     | `BlurRegionTransformation`                                                                |\n| [Unsharp masking](https://uploadcare.com/docs/effects-enhancements/#operation-blur-mask)               | `UnsharpMaskingTransformation`                                                            |\n| [Sharpen](https://uploadcare.com/docs/effects-enhancements/#operation-sharp)                           | `SharpTransformation`                                                                     |\n\n**Rasterization:**\n\n| Operation                                                               | Type                      |\n| ----------------------------------------------------------------------- | ------------------------- |\n| [Rasterization](https://uploadcare.com/docs/transformations/image/#svg) | `RasterizeTransformation` |\n\n**Gif to video:**\n\n| Operation                                                                 | Type                       |\n| ------------------------------------------------------------------------- | -------------------------- |\n| [Gif to video](https://uploadcare.com/docs/transformations/gif-to-video/) | `GifToVideoTransformation` |\n\n```dart\nfinal file = CdnFile('\u003cgif-uuid\u003e')\n  ..transform(GifToVideoTransformation([\n    VideoFormatTransformation(VideoFormatTValue.Mp4),\n    QualityTransformation(QualityTValue.Best),\n  ]));\n\n/// Use `file.url` to get video link\n```\n\n**Non-image specific operations:**\n\n| Operation                                                                                              | Type                           |\n| ------------------------------------------------------------------------------------------------------ | ------------------------------ |\n| [Get file info as JSON](https://uploadcare.com/docs/delivery/cdn/#operation-json)                      | `JsonFileInfoTransformation`   |\n| [Get file info as `application/javascript`](https://uploadcare.com/docs/delivery/cdn/#operation-jsonp) | `JsonpFileInfoTransformation`  |\n| [Show or download](https://uploadcare.com/docs/delivery/cdn/#inline)                                   | `InlineTransformation`         |\n| [Change filename](https://uploadcare.com/docs/delivery/cdn/#cdn-filename)                              | `ChangeFilenameTransformation` |\n\n**Face detection:**\n\n[Official documentation](https://uploadcare.com/docs/intelligence/face-detection/)\n\n```dart\n/// Detect faces for the image\nfinal FacesEntity entity = await client.files.getFacesEntity('\u003cimage-uuid\u003e');\n```\n\n### Files\n\n#### Get file info\n\n```dart\n/// Get info about the file\nfinal FileInfoEntity file = await client.files.file('\u003cfile-uuid\u003e');\n\n/// To get extended file data use `FilesIncludeFields include` field\nfinal FileInfoEntity file = await client.files.file(\n  '\u003cfile-uuid\u003e',\n  include: FilesIncludeFields.withAppData(), /// shortcut for `FilesIncludeFields(predefined: const [FilesIncludeFieldsValue.AppData])`\n);\n```\n\n#### Get list of files\n\n```dart\n/// Get list of files with default params (offset 0, limit 100, ordered by upload time)\nfinal ListEntity\u003cFileInfoEntity\u003e list = await client.files.list();\n```\n\n#### Remove files\n\n```dart\n/// Remove files by the list of ids\nawait client.files.remove(['\u003cfile-uuid\u003e', '\u003cfile-uuid\u003e']);\n```\n\n#### Store files\n\n```dart\n/// Store files by the list of ids\nawait client.files.store(['\u003cfile-uuid\u003e', '\u003cfile-uuid\u003e']);\n```\n\n#### Metadata\n\n```dart\n/// Retrieve all metadata values of the file\nfinal Map\u003cString, String\u003e metadata = await client.files.getFileMetadata('\u003cfile-uuid\u003e');\n\n/// Retrieve the metadata value of the file for the specific metadata key\nfinal String value = await client.files.getFileMetadataValue('\u003cfile-uuid\u003e', '\u003cmetadata-key\u003e');\n\n/// Update the metadata value of the file for the specific metadata metadata-key\nfinal String updatedValue = await client.files.updateFileMetadataValue('\u003cfile-uuid\u003e', '\u003cmetadata-key\u003e', '\u003cnew-value\u003e');\n\n/// Delete the metadata value of the file for the specific metadata key\nawait client.files.deleteFileMetadataValue('\u003cfile-uuid\u003e', '\u003cmetadata-key\u003e');\n```\n\n#### Create file copies\n\n```dart\n/// Copy original files or their modified versions to a default storage\nfinal FileInfoEntity copiedFile = await client.files.copyToLocalStorage('\u003cfile-uuid\u003e', metadata: {'\u003cmetadata-key\u003e': '\u003cmetadata-value\u003e'});\n\n/// Copy original files or their modified versions to a custom storage\nfinal String remoteFileUrl = await client.files.copyToRemoteStorage(file: '\u003cfile-uuid\u003e', target: '\u003cremote-storage\u003e');\n```\n\n### Groups\n\n```dart\n/// Create a group of files\nfinal GroupInfoEntity group = await client.groups.create({\n  /// Without transformation\n  '\u003cimage-uuid\u003e': [],\n\n  /// With list of transformations\n  '\u003cimage-uuid\u003e': [RotateTransformation(90)]\n});\n\n/// Retrieve group info\nfinal GroupInfoEntity group = await client.groups.group('\u003cgroup-uuid\u003e');\n\n/// Store all files in the group\nawait client.groups.storeFiles('\u003cgroup-uuid\u003e');\n\n/// Retrieve list of groups\nfinal ListEntity\u003cGroupInfoEntity\u003e list = await client.groups.list();\n\n/// Delete the group by id\nawait client.groups.delete('\u003cgroup-uuid\u003e');\n```\n\nDownload group as an archive\n\n```dart\nfinal group = CdnGroup('\u003cgroup-uuid\u003e')\n  ..transform(ArchiveTransformation(ArchiveTValue.Tar, 'archive.tar'));\n\n/// Use the following field for download the group as archive `group.url`\n```\n\n### Video processing\n\n[Official documentation](https://uploadcare.com/docs/transformations/video-encoding/)\n\n```dart\n/// Create a task for processing uploaded video files\nfinal ConvertEntity\u003cVideoEncodingResultEntity\u003e result = await client.videoEncoding.process({\n  '\u003cvideo-file-uuid\u003e': [\n    /// Cut video from 10 to 40 seconds\n    CutTransformation(\n      const Duration(seconds: 10),\n      length: const Duration(\n        seconds: 30,\n      ),\n    )\n  ],\n  '\u003cvideo-file-uuid\u003e': [\n    /// Change video resolution\n    VideoResizeTransformation(const Size(512, 384)),\n    /// Generate 10 thumbnails for the video\n    VideoThumbsGenerateTransformation(10),\n  ],\n});\n\n/// Checks processing status for the task\nfinal Stream\u003cConvertJobEntity\u003cVideoEncodingResultEntity\u003e\u003e processingStream = client.videoEncoding.statusAsStream(\n  result.results.first.token,\n  checkInterval: const Duration(seconds: 2),\n)..listen((ConvertJobEntity\u003cVideoEncodingResultEntity\u003e status) {\n  // do something\n});\n```\n\n### Document conversion\n\n[Official documentation](https://uploadcare.com/docs/transformations/document-conversion/)\n\n```dart\n/// Create a task for processing uploaded document files\nfinal ConvertEntity\u003cDocumentConvertingResultEntity\u003e result = client.documentConverting.process({\n  '\u003cdocument-file-uuid\u003e': [\n    /// Convert document to pdf\n    DocumentFormatTransformation(DucumentOutFormatTValue.PDF),\n  ],\n  '\u003cdocument-file-uuid\u003e': [\n    /// Converts the 10th page of the document\n    DocumentFormatTransformation(DucumentOutFormatTValue.PNG, page: 10),\n  ],\n});\n\n/// Checks processing status for the task\nfinal Stream\u003cConvertJobEntity\u003cDocumentConvertingResultEntity\u003e\u003e processingStream = client.documentConverting.statusAsStream(\n  result.results.first.token,\n  checkInterval: const Duration(seconds: 2),\n)..listen((ConvertJobEntity\u003cDocumentConvertingResultEntity\u003e status) {\n  // do something\n});\n```\n\n### Addons\n\n#### Object recognition\n\n[Official documentation](https://uploadcare.com/docs/intelligence/object-recognition/)\n\n```dart\nfinal taskId = await client.addons.executeAWSRekognition('\u003cimage-uuid\u003e');\n\nfinal result = await client.addons.checkAWSRekognitionExecutionStatus(taskId);\n\nif (result.status == AddonExecutionStatusValue.Done) {\n  /// Retrieve file info with appdata fields\n  final file = await client.files.file('\u003cimage-uuid\u003e', include: FilesIncludeFields.withAppData());\n\n  /// Now you can access recognition info with the following field\n  final recognitionData = file.appData.awsRecognition;\n}\n```\n\n#### Unsafe content moderation\n\n[Official documentation](https://uploadcare.com/docs/unsafe-content/)\n\n```dart\nfinal taskId = await client.addons.executeAWSRekognitionModeration('\u003cimage-uuid\u003e');\n\nfinal result = await client.addons.checkAWSRekognitionModerationExecutionStatus(taskId);\n\nif (result.status == AddonExecutionStatusValue.Done) {\n  /// Retrieve file info with appdata fields\n  final file = await client.files.file('\u003cimage-uuid\u003e', include: FilesIncludeFields.withAppData());\n\n  /// Now you can access recognition info with the following field\n  final recognitionData = file.appData.awsRecognitionModeration;\n}\n```\n\n#### Malware protection\n\n[Official documentation](https://uploadcare.com/docs/security/malware-protection/)\n\n```dart\nfinal taskId = await client.addons.executeClamAV('\u003cfile-uuid\u003e');\n\nfinal result = await client.addons.checkClamAVExecutionStatus(taskId);\n\nif (result.status == AddonExecutionStatusValue.Done) {\n  /// Retrieve file info with appdata fields\n  final file = await client.files.file('\u003cfile-uuid\u003e', include: FilesIncludeFields.withAppData());\n\n  /// Now you can access clamAV result with the following field\n  final clamAVData = file.appData.clamAV;\n}\n```\n\n#### Background removal\n\n[Official documentation](https://uploadcare.com/docs/remove-bg/)\n\n```dart\nfinal taskId = await client.addons.executeRemoveBg('\u003cimage-uuid\u003e');\n\nfinal result = await client.addons.checkRemoveBgExecutionStatus(taskId);\n\nif (result.status == AddonExecutionStatusValue.Done) {\n  /// Retrieve file info with appdata fields\n  final file = await client.files.file('\u003cimage-uuid\u003e', include: FilesIncludeFields.withAppData());\n\n  /// Now you can access removeBg result with the following field\n  final removeBgData = file.appData.removeBg;\n}\n```\n\n### Webhooks\n\n[Official documentation](https://uploadcare.com/docs/webhooks/)\n\n```dart\n/// Get list of project webhooks\nfinal List\u003cWebhookEntity\u003e hooks = await client.webhooks.list();\n\n/// Create webhook\nfinal WebhookEntity webhook = await client.webhooks.create(targetUrl: '\u003cwebhook-endpoint\u003e', event: WebhookEvent.Uploaded);\n\n/// Update webhook\nfinal WebhookEntity webhook = await client.webhooks.update(hookId: '\u003cwebhook-id\u003e', isActive: false);\n\n/// Delete webhook\nawait client.webhooks.delete('\u003cwebhook-endpoint\u003e');\n```\n\n### Project\n\n```dart\n/// Get project common information\nfinal ProjectEntity info = await client.project.info();\n```\n\n### FAQ\n\n- How to pick files on different platforms?\n  - [See uploadcare example project](https://github.com/KonstantinKai/uploadcare_client/blob/master/uploadcare_flutter_example/lib/screens/home_screen.dart#L4)\n\nDo you like the package? Buy me a coffee :)\n\n\u003ca href=\"https://www.buymeacoffee.com/konstantinkai\" target=\"_blank\"\u003e\u003cimg src=\"https://github.com/KonstantinKai/uploadcare_client/blob/master/assets/button.png?raw=true\" alt=\"Buy Me A Coffee\"\u003e\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKonstantinKai%2Fuploadcare_client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FKonstantinKai%2Fuploadcare_client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKonstantinKai%2Fuploadcare_client/lists"}