Uploadcare Webhook API

The Webhook API from Uploadcare — 3 operation(s) for webhook.

OpenAPI Specification

uploadcare-webhook-api-openapi.yml Raw ↑
openapi: 3.0.0
info:
  title: URL API Reference Add-Ons Webhook API
  version: '2022-11-28'
  description: 'Every uploaded file is immediately available on the Uploadcare CDN.

    The CDN includes on-the-fly processing features and can work as a proxy.


    ## API endpoints

    Access files in Uploadcare CDN at `ucarecdn.com` over HTTP/HTTPS like this:

    ```https://ucarecdn.com/:uuid/```


    You can add CDN operations by including directives in the CDN URL:

    ```https://ucarecdn.com/:uuid/-/:operation/:params/:filename```


    * `:uuid` stands for the unique file identifier, UUID, assigned on upload.

    * `/-/` is a mandatory parsing delimiter to divide operations and other path components.

    * `:operation/:params/` is a CDN operation directive with parameters.

    * `:filename` is an optional filename you can add after a trailing slash /.


    You can stack two and more operations like this:

    ```-/:operation/:params/-/:operation/:params/```

    '
  contact:
    name: API support
    email: help@uploadcare.com
  x-logo:
    url: https://ucarecdn.com/12e3af14-392d-416f-8542-f210c2eb6ec4/logourlapi.svg
    backgroundColor: '#fafafa'
    altText: Uploadcare URL API Reference
  x-meta:
    title: URL API Reference — Uploadcare
    description: A reference documentation for the Uploadcare's URL API.
servers:
- url: https://ucarecdn.com
  description: Production server
tags:
- name: Webhook
paths:
  /webhooks/:
    get:
      summary: List of webhooks
      description: List of project webhooks.
      tags:
      - Webhook
      operationId: webhooksList
      parameters:
      - $ref: '#/components/parameters/acceptHeader'
      responses:
        '200':
          description: List of project webhooks.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/webhook_of_list_response'
        '400':
          description: Simple HTTP Auth or webhook permission errors.
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/simpleAuthHTTPForbidden'
                - $ref: '#/components/schemas/cantUseWebhooksError'
              examples:
                Authentication Error:
                  $ref: '#/components/examples/simpleAuthHTTPForbidden'
                Permission Error:
                  $ref: '#/components/examples/cantUseWebhooksError'
        '401':
          $ref: '#/components/responses/authorizationProblemsResponse'
        '406':
          $ref: '#/components/responses/invalidAcceptHeader'
        '429':
          $ref: '#/components/responses/requestWasThrottledError'
      x-codeSamples:
      - lang: JavaScript
        label: JS
        source: "import {\n  listOfWebhooks,\n  UploadcareSimpleAuthSchema,\n} from '@uploadcare/rest-client';\n\nconst uploadcareSimpleAuthSchema = new UploadcareSimpleAuthSchema({\n  publicKey: 'YOUR_PUBLIC_KEY',\n  secretKey: 'YOUR_SECRET_KEY',\n});\n\nconst result = await listOfWebhooks({}, { authSchema: uploadcareSimpleAuthSchema })\n"
      - lang: PHP
        label: PHP
        source: "<?php\n$configuration = Uploadcare\\Configuration::create((string) $_ENV['UPLOADCARE_PUBLIC_KEY'], (string) $_ENV['UPLOADCARE_SECRET_KEY']);\n\n$api = (new Uploadcare\\Api($configuration))->webhook();\nforeach ($api->listWebhooks() as $webhook) {\n    \\sprintf(\"Webhook with url %s is %s\\n\", $webhook->getTargetUrl(), $webhook->isActive() ? 'active' : 'not active');\n}\n"
      - lang: Python
        label: Python
        source: "from pyuploadcare import Uploadcare, Webhook\nuploadcare = Uploadcare(public_key='YOUR_PUBLIC_KEY', secret_key='YOUR_SECRET_KEY')\n\nwebhooks: list[Webhook] = list(uploadcare.list_webhooks(limit=10))\nfor w in webhooks:\n    print(w.id)\n"
      - lang: Ruby
        label: Ruby
        source: 'require ''uploadcare''

          Uploadcare.config.public_key = ''YOUR_PUBLIC_KEY''

          Uploadcare.config.secret_key = ''YOUR_SECRET_KEY''


          webhooks = Uploadcare::Webhook.list

          webhooks.each { |webhook| puts webhook.inspect }

          '
      - lang: Swift
        label: Swift
        source: "import Uploadcare\n\nlet uploadcare = Uploadcare(withPublicKey: \"YOUR_PUBLIC_KEY\", secretKey: \"YOUR_SECRET_KEY\")\n\nlet webhooks = try await uploadcare.getListOfWebhooks()\nfor webhook in webhooks {\n  print(webhook)\n}\n"
      - lang: Kotlin
        label: Kotlin
        source: 'import com.uploadcare.android.library.api.UploadcareClient


          val uploadcare = UploadcareClient(publicKey = "YOUR_PUBLIC_KEY", secretKey = "YOUR_SECRET_KEY")


          val webhooks = uploadcare.getWebhooks()

          Log.d("TAG", webhooks.toString())

          '
    post:
      summary: Create webhook
      description: Create and subscribe to a webhook. You can use webhooks to receive notifications about your uploads. For instance, once a file gets uploaded to your project, we can notify you by sending a message to a target URL.
      operationId: webhookCreate
      parameters:
      - $ref: '#/components/parameters/acceptHeader'
      tags:
      - Webhook
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              required:
              - target_url
              - event
              type: object
              properties:
                target_url:
                  $ref: '#/components/schemas/webhook_target'
                event:
                  $ref: '#/components/schemas/webhook_event'
                is_active:
                  $ref: '#/components/schemas/webhook_is_active'
                signing_secret:
                  $ref: '#/components/schemas/webhook_signing_secret'
                version:
                  $ref: '#/components/schemas/webhook_version_of_request'
      callbacks:
        file-uploaded:
          '{$request.body#/target_url}':
            post:
              summary: file.uploaded event payload
              description: file.uploaded event payload
              parameters:
              - $ref: '#/components/parameters/webhookSignature'
              requestBody:
                required: true
                content:
                  application/json:
                    schema:
                      $ref: '#/components/schemas/webhookFilePayload'
              responses:
                2XX:
                  description: Webhook has been received successfully
        file-infected:
          '{$request.body#/target_url}':
            post:
              summary: file.infected event payload
              description: file.infected event payload
              parameters:
              - $ref: '#/components/parameters/webhookSignature'
              requestBody:
                required: true
                content:
                  application/json:
                    schema:
                      $ref: '#/components/schemas/webhookFilePayload'
              responses:
                2XX:
                  description: Webhook has been received successfully
        file-stored:
          '{$request.body#/target_url}':
            post:
              summary: file.stored event payload
              description: file.stored event payload
              parameters:
              - $ref: '#/components/parameters/webhookSignature'
              requestBody:
                required: true
                content:
                  application/json:
                    schema:
                      $ref: '#/components/schemas/webhookFilePayload'
              responses:
                2XX:
                  description: Webhook has been received successfully
        file-deleted:
          '{$request.body#/target_url}':
            post:
              summary: file.deleted event payload
              description: file.deleted event payload
              parameters:
              - $ref: '#/components/parameters/webhookSignature'
              requestBody:
                required: true
                content:
                  application/json:
                    schema:
                      $ref: '#/components/schemas/webhookFilePayload'
              responses:
                2XX:
                  description: Webhook has been received successfully
        file-info-updated:
          '{$request.body#/target_url}':
            post:
              summary: file.info_updated event payload
              description: file.info_updated event payload
              parameters:
              - $ref: '#/components/parameters/webhookSignature'
              requestBody:
                required: true
                content:
                  application/json:
                    schema:
                      $ref: '#/components/schemas/webhookFileInfoUpdatedPayload'
              responses:
                2XX:
                  description: Webhook has been received successfully
      responses:
        '201':
          description: Webhook successfully created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/webhook_of_list_response'
        '400':
          description: Simple HTTP Auth or webhook permission or endpoint errors.
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/simpleAuthHTTPForbidden'
                - $ref: '#/components/schemas/cantUseWebhooksError'
                - $ref: '#/components/schemas/webhookTargetUrlError'
              examples:
                Authentication Error:
                  $ref: '#/components/examples/simpleAuthHTTPForbidden'
                Permission Error:
                  $ref: '#/components/examples/cantUseWebhooksError'
                Target URL Error:
                  $ref: '#/components/examples/webhookTargetUrlError'
        '401':
          $ref: '#/components/responses/authorizationProblemsResponse'
        '406':
          $ref: '#/components/responses/invalidAcceptHeader'
        '429':
          $ref: '#/components/responses/requestWasThrottledError'
      x-codeSamples:
      - lang: JavaScript
        label: JS
        source: "import {\n  createWebhook,\n  UploadcareSimpleAuthSchema,\n} from '@uploadcare/rest-client';\n\nconst uploadcareSimpleAuthSchema = new UploadcareSimpleAuthSchema({\n  publicKey: 'YOUR_PUBLIC_KEY',\n  secretKey: 'YOUR_SECRET_KEY',\n});\n\nconst result = await createWebhook(\n  {\n    targetUrl: 'https://yourwebhook.com',\n    event: 'file.uploaded',\n    isActive: true,\n  },\n  { authSchema: uploadcareSimpleAuthSchema }\n)\n"
      - lang: PHP
        label: PHP
        source: '<?php

          $configuration = Uploadcare\Configuration::create((string) $_ENV[''UPLOADCARE_PUBLIC_KEY''], (string) $_ENV[''UPLOADCARE_SECRET_KEY'']);


          $api = (new Uploadcare\Api($configuration))->webhook();

          $result = $api->createWebhook(''https://yourwebhook.com'', true, ''sign-secret'', ''file.uploaded'');

          echo \sprintf(''Webhook %s created'', $result->getId());

          '
      - lang: Python
        label: Python
        source: "from pyuploadcare import Uploadcare, Webhook\nuploadcare = Uploadcare(public_key='YOUR_PUBLIC_KEY', secret_key='YOUR_SECRET_KEY')\n\nwebhook = uploadcare.webhooks_api.create(\n    {\n        \"event\": \"file.uploaded\",\n        \"target_url\": \"https://yourwebhook.com\",\n        \"is_active\": True,\n    }\n)\nprint(webhook)\n"
      - lang: Ruby
        label: Ruby
        source: "require 'uploadcare'\nUploadcare.config.public_key = 'YOUR_PUBLIC_KEY'\nUploadcare.config.secret_key = 'YOUR_SECRET_KEY'\n\noptions = {\n  target_url: 'https://yourwebhook.com',\n  event: 'file.uploaded',\n  is_active: true\n}\nUploadcare::Webhook.create(**options)\n"
      - lang: Swift
        label: Swift
        source: 'import Uploadcare


          let uploadcare = Uploadcare(withPublicKey: "YOUR_PUBLIC_KEY", secretKey: "YOUR_SECRET_KEY")


          let url = URL(string: "https://yourwebhook.com")!

          let webhook = try await uploadcare.createWebhook(targetUrl: url,  event: .fileUploaded, isActive: true, signingSecret: "sign-secret")

          print(webhook)

          '
      - lang: Kotlin
        label: Kotlin
        source: "import com.uploadcare.android.library.api.UploadcareClient\n\nval uploadcare = UploadcareClient(publicKey = \"YOUR_PUBLIC_KEY\", secretKey = \"YOUR_SECRET_KEY\")\n\nval url = URI(\"https://yourwebhook.com\")\nval webhook = uploadcare.createWebhook(\n    targetUrl = url,\n    event = EventType.UPLOADED,\n    isActive = true,\n    signingSecret = \"sign-secret\"\n)\nLog.d(\"TAG\", webhook.toString())\n"
  /webhooks/{id}/:
    put:
      summary: Update webhook
      description: Update webhook attributes.
      operationId: updateWebhook
      tags:
      - Webhook
      parameters:
      - $ref: '#/components/parameters/acceptHeader'
      - in: path
        name: id
        description: Webhook ID.
        schema:
          type: integer
          example: 143
        required: true
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                target_url:
                  $ref: '#/components/schemas/webhook_target'
                event:
                  $ref: '#/components/schemas/webhook_event'
                is_active:
                  $ref: '#/components/schemas/webhook_is_active'
                signing_secret:
                  $ref: '#/components/schemas/webhook_signing_secret'
      responses:
        '200':
          description: Webhook attributes successfully updated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/webhook'
        '401':
          $ref: '#/components/responses/authorizationProblemsResponse'
        '404':
          description: Webhook with ID {id} not found.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Not found.
                    example: Not found.
        '406':
          $ref: '#/components/responses/invalidAcceptHeader'
        '429':
          $ref: '#/components/responses/requestWasThrottledError'
      x-codeSamples:
      - lang: JavaScript
        label: JS
        source: "import {\n  updateWebhook,\n  UploadcareSimpleAuthSchema,\n} from '@uploadcare/rest-client';\n\nconst uploadcareSimpleAuthSchema = new UploadcareSimpleAuthSchema({\n  publicKey: 'YOUR_PUBLIC_KEY',\n  secretKey: 'YOUR_SECRET_KEY',\n});\n\nconst result = await updateWebhook(\n  {\n    id: 1473151,\n    targetUrl: 'https://yourwebhook.com',\n    event: 'file.uploaded',\n    isActive: true,\n    signingSecret: 'webhook-secret',\n  },\n  { authSchema: uploadcareSimpleAuthSchema }\n)\n"
      - lang: PHP
        label: PHP
        source: "<?php\n$configuration = Uploadcare\\Configuration::create((string) $_ENV['UPLOADCARE_PUBLIC_KEY'], (string) $_ENV['UPLOADCARE_SECRET_KEY']);\n\n$api = (new Uploadcare\\Api($configuration))->webhook();\n$webhook = $api->updateWebhook(1473151, [\n    'target_url' => 'https://yourwebhook.com',\n    'event' => 'file.uploaded',\n    'is_active' => true,\n    'signing_secret' => 'webhook-secret',\n]);\n\\sprintf(\"Webhook with url %s is %s\\n\", $webhook->getTargetUrl(), $webhook->isActive() ? 'active' : 'not active');\n"
      - lang: Python
        label: Python
        source: 'from pyuploadcare import Uploadcare, Webhook

          uploadcare = Uploadcare(public_key=''YOUR_PUBLIC_KEY'', secret_key=''YOUR_SECRET_KEY'')


          webhook_id = 1473151

          webhook = uploadcare.webhooks_api.update(webhook_id, {"is_active": False})

          '
      - lang: Ruby
        label: Ruby
        source: "require 'uploadcare'\nUploadcare.config.public_key = 'YOUR_PUBLIC_KEY'\nUploadcare.config.secret_key = 'YOUR_SECRET_KEY'\n\nwebhook_id = 1_473_151\noptions = {\n  target_url: 'https://yourwebhook.com',\n  event: 'file.uploaded',\n  is_active: true,\n  signing_secret: 'webhook-secret'\n}\nUploadcare::Webhook.update(webhook_id, options)\n"
      - lang: Swift
        label: Swift
        source: 'import Uploadcare


          let uploadcare = Uploadcare(withPublicKey: "YOUR_PUBLIC_KEY", secretKey: "YOUR_SECRET_KEY")


          let url = URL(string: "https://yourwebhook.com")!

          let webhook = try await uploadcare.updateWebhook(id: 1473151, targetUrl: url, event: .fileInfoUpdated, isActive: true, signingSecret: "webhook-secret")

          print(webhook)

          '
      - lang: Kotlin
        label: Kotlin
        source: "import com.uploadcare.android.library.api.UploadcareClient\n\nval uploadcare = UploadcareClient(publicKey = \"YOUR_PUBLIC_KEY\", secretKey = \"YOUR_SECRET_KEY\")\n\nval url = URI(\"https://yourwebhook.com\")\nval webhook = uploadcare.updateWebhook(\n    webhookId = 1473151,\n    targetUrl = url,\n    event = EventType.UPLOADED,\n    isActive = true,\n    signingSecret = \"\",\n)\nLog.d(\"TAG\", webhook.toString())\n"
  /webhooks/unsubscribe/:
    delete:
      summary: Delete webhook
      description: Unsubscribe and delete a webhook.
      tags:
      - Webhook
      operationId: webhookUnsubscribe
      parameters:
      - $ref: '#/components/parameters/acceptHeader'
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              required:
              - target_url
              type: object
              properties:
                target_url:
                  $ref: '#/components/schemas/webhook_target'
      responses:
        '204':
          description: Webhook successfully deleted.
        '400':
          description: Simple HTTP Auth or webhook permission or endpoint errors.
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/simpleAuthHTTPForbidden'
                - $ref: '#/components/schemas/cantUseWebhooksError'
                - $ref: '#/components/schemas/webhookTargetUrlError'
              examples:
                Authentication Error:
                  $ref: '#/components/examples/simpleAuthHTTPForbidden'
                Permission Error:
                  $ref: '#/components/examples/cantUseWebhooksError'
                Target URL Error:
                  $ref: '#/components/examples/webhookTargetUrlError'
        '401':
          $ref: '#/components/responses/authorizationProblemsResponse'
        '406':
          $ref: '#/components/responses/invalidAcceptHeader'
        '429':
          $ref: '#/components/responses/requestWasThrottledError'
      x-codeSamples:
      - lang: JavaScript
        label: JS
        source: "import {\n  deleteWebhook,\n  UploadcareSimpleAuthSchema,\n} from '@uploadcare/rest-client';\n\nconst uploadcareSimpleAuthSchema = new UploadcareSimpleAuthSchema({\n  publicKey: 'YOUR_PUBLIC_KEY',\n  secretKey: 'YOUR_SECRET_KEY',\n});\n\nconst result = await deleteWebhook(\n  {\n    targetUrl: 'https://yourwebhook.com',\n  },\n  { authSchema: uploadcareSimpleAuthSchema }\n)\n"
      - lang: PHP
        label: PHP
        source: '<?php

          $configuration = Uploadcare\Configuration::create((string) $_ENV[''UPLOADCARE_PUBLIC_KEY''], (string) $_ENV[''UPLOADCARE_SECRET_KEY'']);


          $api = (new Uploadcare\Api($configuration))->webhook();

          $result = $api->deleteWebhook(''https://yourwebhook.com'');

          echo $result ? ''Webhook has been deleted'' : ''Webhook is not deleted, something went wrong'';

          '
      - lang: Python
        label: Python
        source: 'from pyuploadcare import Uploadcare, Webhook

          uploadcare = Uploadcare(public_key=''YOUR_PUBLIC_KEY'', secret_key=''YOUR_SECRET_KEY'')


          webhook_id = 1473151

          uploadcare.delete_webhook(webhook_id)

          '
      - lang: Ruby
        label: Ruby
        source: 'require ''uploadcare''

          Uploadcare.config.public_key = ''YOUR_PUBLIC_KEY''

          Uploadcare.config.secret_key = ''YOUR_SECRET_KEY''


          puts Uploadcare::Webhook.delete(''https://yourwebhook.com'')

          '
      - lang: Swift
        label: Swift
        source: 'import Uploadcare


          let uploadcare = Uploadcare(withPublicKey: "YOUR_PUBLIC_KEY", secretKey: "YOUR_SECRET_KEY")


          let url = URL(string: "https://yourwebhook.com")!

          try await uploadcare.deleteWebhook(forTargetUrl: url)

          '
      - lang: Kotlin
        label: Kotlin
        source: 'import com.uploadcare.android.library.api.UploadcareClient


          val uploadcare = UploadcareClient(publicKey = "YOUR_PUBLIC_KEY", secretKey = "YOUR_SECRET_KEY")


          val url = URI("https://yourwebhook.com")

          uploadcare.deleteWebhook(url)

          '
components:
  schemas:
    contentInfo:
      type: object
      nullable: true
      description: Information about file content.
      properties:
        mime:
          type: object
          description: MIME type.
          required:
          - mime
          - type
          - subtype
          properties:
            mime:
              type: string
              description: Full MIME type.
              example: image/jpeg
            type:
              type: string
              description: Type of MIME type.
              example: image
            subtype:
              type: string
              description: Subtype of MIME type.
              example: jpeg
        image:
          $ref: '#/components/schemas/imageInfo'
        video:
          $ref: '#/components/schemas/videoInfo'
    webhook_version_of_request:
      type: string
      description: Webhook payload's version.
      enum:
      - '0.7'
      example: '0.7'
      default: '0.7'
    webhook_is_active:
      type: boolean
      description: Marks a subscription as either active or not, defaults to `true`, otherwise `false`.
      default: true
      example: false
    webhook_event:
      type: string
      description: An event you subscribe to.
      enum:
      - file.uploaded
      - file.infected
      - file.stored
      - file.deleted
      - file.info_updated
      example: file.uploaded
    webhook_signing_secret:
      type: string
      format: password
      maxLength: 32
      example: 7kMVZivndx0ErgvhRKAr
      description: 'Optional [HMAC/SHA-256](https://en.wikipedia.org/wiki/HMAC) secret that, if set, will be used to

        calculate signatures for the webhook payloads sent to the `target_url`.


        Calculated signature will be sent to the `target_url` as a value of the `X-Uc-Signature` HTTP

        header. The header will have the following format: `X-Uc-Signature: v1=<HMAC-SHA256-HEX-DIGEST>`.

        See [Secure Webhooks](https://uploadcare.com/docs/webhooks/#signed-webhooks) for details.

        '
    webhook_updated:
      type: string
      format: date-time
      description: date-time when a webhook was updated.
      example: '2018-11-26T12:49:10.477888Z'
    webhook_of_list_response:
      description: Webhook.
      type: object
      properties:
        id:
          $ref: '#/components/schemas/webhook_id'
        project:
          $ref: '#/components/schemas/webhook_project'
        created:
          $ref: '#/components/schemas/webhook_created'
        updated:
          $ref: '#/components/schemas/webhook_updated'
        event:
          $ref: '#/components/schemas/webhook_event'
        target_url:
          $ref: '#/components/schemas/webhook_target'
        is_active:
          $ref: '#/components/schemas/webhook_is_active'
        version:
          $ref: '#/components/schemas/webhook_version_of_list_response'
        signing_secret:
          $ref: '#/components/schemas/webhook_signing_secret'
      example:
        id: 1
        project: 13
        created: '2016-04-27T11:49:54.948615Z'
        updated: '2016-04-27T12:04:57.819933Z'
        event: file.infected
        target_url: http://example.com/hooks/receiver
        is_active: true
        signing_secret: 7kMVZivndx0ErgvhRKAr
        version: '0.7'
    awsRekognitionDetectModerationLabels_v2016_06_27:
      allOf:
      - $ref: '#/components/schemas/applicationData'
      - type: object
        properties:
          version:
            type: string
            enum:
            - '2016-06-27'
          data:
            type: object
            description: Dictionary with a result of an aws rekognition detect moderation labels execution result.
            properties:
              ModerationModelVersion:
                type: string
              ModerationLabels:
                type: array
                items:
                  type: object
                  properties:
                    Confidence:
                      type: number
                    Name:
                      type: string
                    ParentName:
                      type: string
                  required:
                  - Name
                  - ParentName
                  - Confidence
            required:
            - ModerationLabels
            - ModerationModelVersion
            example:
              value:
                aws_rekognition_detect_moderation_labels:
                  data:
                    ModerationModelVersion: '6.0'
                    ModerationLabels:
                    - Confidence: 93.41645812988281
                      Name: Weapons
                      ParentName: Violence
                  version: '2016-06-27'
                  datetime_created: '2023-02-21T11:25:31.259763Z'
                  datetime_updated: '2023-02-21T11:27:33.359763Z'
    videoInfo:
      type: object
      description: Video metadata.
      required:
      - duration
      - format
      - bitrate
      - audio
      - video
      properties:
        duration:
          type: integer
          description: Video file's duration in milliseconds.
          nullable: true
          example: 261827
        format:
          type: string
          description: Video file's format.
          example: mp4
        bitrate:
          type: integer
          description: Video file's bitrate.
          nullable: true
          example: 393
        audio:
          type: array
          items:
            type: object
            description: Audio stream's metadata.
            required:
            - bitrate
            - codec
            - sample_rate
            - channels
            properties:
              bitrate:
                type: integer
                description: Audio stream's bitrate.
                nullable: true
                example: 78
              codec:
                type: string
                description: Audio stream's codec.
                nullable: true
                example: aac
              sample_rate:
                type: integer
                description: Audio stream's sample rate.
                nullable: true
                example: 44100
              channels:
                type: integer
                description: Audio stream's number of channels.
                nullable: true
                example: 2
        video:
          type: array
          items:
            type: object
            description: Video stream's metadata.
            required:
            - height
            - width
            - frame_rate
            - bitrate
            - codec
            properties:
              height:
                type: integer
                description: Video stream's image height.
                example: 360
              width:
                type: integer
                description: Video stream's image width.
                example: 640
              frame_rate:
                type: number
                description: Video stream's frame rate.
                example: 30
              bitrate:
                type: integer
                description: Video stream's bitrate.
                nullable: true
                example: 315
              codec:
                type: string
                description: Video stream's codec.
                nullable: true
                example: h264
    webhookFilePayload:
      type: object
      required:
      - initiator
      - hook
      - data
      - file
      properties:
        initiator:
          $ref: '#/components/schemas/webhookInitiator'
        hook:
          $ref: '#/components/schemas/webhookPublicInfo'
        data:
          $ref: '#/components/schemas/file'
        file:
          description: File CDN URL.
          type: string
          format: uri
    webhook_project_pubkey:
      type: string
      description: Public project key the webhook belongs to.
      example: 2d199fbf3896699a2639
    webhook:
      description: Webhook.
      type: object
      properties:
        id:
          $ref: '#/components/schemas/webhook_id'
        project:
          $ref: '#/components/schemas/webhook_project'
        created:
          $ref: '#/components/schemas/webhook_created'
        updated:
          $ref: '#/components/schemas/webhook_updated'
        event:
          $ref: '#/components/schemas/webhook_event'
        target_url:
          $ref: '#/components/schemas/webhook_target'
        is_active:
          $ref: '#/components/schemas/webhook_is_active'
        version:
          $ref: '#/components/schemas/webhook_version'
        signing_secret:
          $ref: '#/components/schemas/webhook_signing_secret'
      example:
        id: 1
        project: 13
        created: '2016-04-27T11:49:54.948615Z'
        updated: '2016-04-27T12:04:57.819933Z'
        event: file.infected
        target_url: http://example.com/hooks/receiver
        is_active: true
        signing_secret: 7kMVZivndx0ErgvhRKAr
        version: '0.7'
    ucClamavVirusScan:
      allOf:
      - $ref: '#/components/schemas/applicationData'
      - type: object
        properties:
          version:
            type: string
            enum:
            - 0.104.2
            - 0.104.3
            - 0.105.0
            - 0.105.1
          data:
            type: object
            description: Dictionary with a result of ClamAV execution result.
            properties:
              infected:
                type: boolean
              infected_with:
                type: string
            required:
            - infected
        example:
          value:
            uc_clamav_virus_scan:
              data:
                infected: true
                infected_with: Win.Test.EICAR_HDB-1
              version: 0.104.2
              datetime_created: '2021-09-21T11:24:33.159663Z'
              datetime_updated: '2021-09-21T11:24:33.159663Z'
    applicationDataObject:
      type: object
      nullable: true
      description: Dictionary of application names and data associated with these applications.
      properties:
        aws_rekognition_detect_labels:
          $ref: '#/components/schemas/awsRekognitionDetectLabels_v2016_06_27'
        aws_rekognition_detect_moderation_labels:
          $ref: '#/components/schemas/awsRekognitionDetectModerationLabels_v2016_06_27'
        remove_bg:
          $ref: '#/components/schemas/removeBg_v1_0'
        uc_clamav_virus_scan:
          $ref: '#/components/schemas/ucClamavVirusScan'
    cantUseWebhooksError:
      type: object
      properties:
        detail:
          type: string
          default: You can't use webhooks
      example:
        detail: You can't use webhooks
    webhookPublicInfo:
      description: Public Webhook information (does not include secret data like `signing_secret`)
      type: object
      required:
      - id
      - project_id
      - created_at
      - updated_at
      - event
      - target
      - is_active
      - version
      properties:
        id:
          $ref: '#/components/schemas/webhook_id'
        project:
          $ref: '#/components/schemas/webhook_project'
        project_pub_key:
          $ref: '#/components/schemas/webhook_project_pubkey'
        created_at:
          $ref: '#/components/schemas/webhook_created'
        updated_at:
          $ref: '#/components/schemas/webhook_updated'
        event:
          $ref: '#/components/schemas/webhook_event'
        target:
          $ref: '#/components/schemas/webhook_target'
        is_active:
          $ref: '

# --- truncated at 32 KB (50 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/uploadcare/refs/heads/main/openapi/uploadcare-webhook-api-openapi.yml