> ## Documentation Index
> Fetch the complete documentation index at: https://docs.contentcare.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Create watermark embed order

> **Support ended.** This endpoint ended support at 09:00 KST on October 9, 2026 (00:00 UTC). Use `POST /api/v3/orders/wtr-embed` instead.

Every response from this endpoint, including authentication errors and the `410` response, includes the `Deprecation: true`, `Sunset: Fri, 09 Oct 2026 00:00:00 GMT`, and `Link: </api/v3/orders/wtr-embed>; rel="successor-version"` headers.

From 09:00 KST on October 9, 2026 (00:00 UTC):
- Authentication and permission checks still run first, so `401` and `403` errors are returned as before.
- Authenticated requests to the v2 watermark embed and extract endpoints return `410 Gone` with `{ "code": "WATERMARK_V2_API_SUNSET" }`, for both live and `sk_test_` keys. The `Link` header points to the v3 endpoint. Create new orders with v3.
- v2 orders that have not started processing by then fail without being processed. The order details (`errors.errorCode`) and the failed webhook carry `WATERMARK_V2_API_SUNSET` with a message pointing to v3. The order is not charged, and its credits are restored.
- Orders already processing at that time finish and record their result. No new run starts for them afterwards.

Create a watermark embedding order.
- Up to 10 watermark texts per image
- Up to 100 files per order
- Supported image formats (IMG): jpg, jpeg, png, webp, bmp, tiff
- Supported document formats (DOCUMENT): pdf

## Input Modes (Upload / URL / Mixed)
The input mode is determined by the presence of `originalFileUrl` in each file object:
- **Upload mode** (no `originalFileUrl`): Presigned URL issued → Client uploads to S3 → Processing starts automatically
- **URL mode** (`originalFileUrl` provided): Image downloaded from the URL and processed immediately
- **Mixed mode**: Some files in Upload mode, others in URL mode simultaneously

### Behavior
| Condition | Order Status | Confirm Required |
|-----------|-------------|-----------------|
| All files have `originalFileUrl` | `pending` | No (auto-starts after server downloads) |
| Any file without `originalFileUrl` | `pending` | No (auto-starts after upload) |

<Note>Unlike Anti-AI and AI Detection, Watermark Embed does not require a separate confirm step. Processing starts automatically after file upload completes.</Note>


> [!WARNING]
>
> **Support ended.** This v2 endpoint ended support at 09:00 KST on October 9, 2026 (00:00 UTC). Use [`POST /api/v3/orders/wtr-embed`](https://docs.contentcare.ai/api-reference/watermark-embed/create-order-v3) for new integrations, and see the [watermark embed quickstart](https://docs.contentcare.ai/quickstart/watermark-embed.md#migrating-from-v2-to-v3) to migrate.
>
> **After v2 support ends** (from 09:00 KST on October 9, 2026, which is 00:00 UTC):
>
> * Authentication and permission checks still run first, so `401` and `403` errors are returned as before.
> * Authenticated requests to the v2 watermark embed and extract endpoints return `410 Gone` with `{ "code": "WATERMARK_V2_API_SUNSET" }`, for both live and `sk_test_` keys. The `Link` header points to the v3 endpoint. Create new orders with v3.
> * v2 orders that have not started processing by then fail without being processed. The order details (`errors.errorCode`) and the failed webhook carry `WATERMARK_V2_API_SUNSET` with a message pointing to v3. The order is not charged, and its credits are restored.
> * Orders already processing at that time finish and record their result. No new run starts for them afterwards.
> * You can still get existing v2 orders and download results and reports that were already created, within the existing retention period. New v2 reports cannot be created or regenerated.
>
> Until then, the request and response behavior is unchanged, except that every response from these endpoints includes the `Deprecation: true`, `Sunset: Fri, 09 Oct 2026 00:00:00 GMT`, and `Link` headers.

> [!WARNING]
>
> **v3 watermark extract cannot detect watermarks embedded with v2.** Switching to the v3 endpoint does not make existing v2-watermarked images detectable, and there will be no exception for v2 detection after v2 support ends.

## Response after support ends

From 09:00 KST on October 9, 2026 (00:00 UTC), an authenticated request to this endpoint returns:

```http theme={null}
HTTP/1.1 410 Gone
Content-Type: application/json; charset=utf-8
Deprecation: true
Sunset: Fri, 09 Oct 2026 00:00:00 GMT
Link: </api/v3/orders/wtr-embed>; rel="successor-version"

{ "code": "WATERMARK_V2_API_SUNSET" }
```

Send a new request to the v3 endpoint in the `Link` header.

> [!NOTE]
>
> With an `sk_test_` key, upload to the returned BIZ MORI test upload URL. The order moves to processing after its uploads finish, without a confirm call. Test processing does not create a downloadable result file.

## Download order results

Once your order reaches `complete` status, call [Get order result download URLs](https://docs.contentcare.ai/api-reference/orders/download-order-v3.md). One call returns a URL for each output file in `files[]` and a ZIP archive of all results in `archiveUrl`:

```bash theme={null}
curl -X GET https://api.bizmori.com/api/v3/orders/{orderId}/download \
  -H "Authorization: Bearer YOUR_API_KEY"
```

> [!WARNING]
>
> The URLs are valid for up to 1 hour, so request new ones each time you download. You can download files until the order's `expiresAt`; after that, the endpoint returns `400 ORDER_EXPIRED`. For an `sk_test_` order, the URLs point to fixed sample files instead of your results.


## OpenAPI

````yaml api-reference/openapi.yaml POST /api/v2/orders/wtr-embed
openapi: 3.0.0
info:
  title: BIZ MORI API
  version: 2.0.0
  description: >
    BIZ MORI API provides four core services for digital content protection:

    - **Anti-AI**: Protect images from AI training

    - **Watermark Embed**: Embed invisible digital watermarks into images

    - **Watermark Extract**: Extract and verify watermarks from images

    - **AI Detection**: Detect whether an image is AI-generated

    - **Test API keys**: Keys with the `sk_test_` prefix use the same Bearer
    authentication and support order-lifecycle testing with mock responses
    without running processing services or consuming credits; test uploads
    discard file contents and do not create result files
  contact:
    name: BIZ MORI Support
    email: support@contentcare.ai
  license:
    name: Proprietary
    url: https://docs.contentcare.ai/legal/terms
servers:
  - url: https://api.bizmori.com
    description: Production
security: []
tags:
  - name: Anti-AI
    description: Anti-AI image protection orders
  - name: Watermark Embed
    description: Watermark embedding orders
  - name: Watermark Extract
    description: Watermark extraction orders
  - name: AI Detection
    description: AI-generated image detection orders
  - name: Orders
    description: Order query and management
  - name: Webhooks
    description: Webhook configuration and events
  - name: Reports
    description: PDF analysis reports for watermark extract and AI Detection orders
paths:
  /api/v2/orders/wtr-embed:
    post:
      tags:
        - Watermark Embed
      summary: Create watermark embed order
      description: >
        **Support ended.** This endpoint ended support at 09:00 KST on October
        9, 2026 (00:00 UTC). Use `POST /api/v3/orders/wtr-embed` instead.


        Every response from this endpoint, including authentication errors and
        the `410` response, includes the `Deprecation: true`, `Sunset: Fri, 09
        Oct 2026 00:00:00 GMT`, and `Link: </api/v3/orders/wtr-embed>;
        rel="successor-version"` headers.


        From 09:00 KST on October 9, 2026 (00:00 UTC):

        - Authentication and permission checks still run first, so `401` and
        `403` errors are returned as before.

        - Authenticated requests to the v2 watermark embed and extract endpoints
        return `410 Gone` with `{ "code": "WATERMARK_V2_API_SUNSET" }`, for both
        live and `sk_test_` keys. The `Link` header points to the v3 endpoint.
        Create new orders with v3.

        - v2 orders that have not started processing by then fail without being
        processed. The order details (`errors.errorCode`) and the failed webhook
        carry `WATERMARK_V2_API_SUNSET` with a message pointing to v3. The order
        is not charged, and its credits are restored.

        - Orders already processing at that time finish and record their result.
        No new run starts for them afterwards.


        Create a watermark embedding order.

        - Up to 10 watermark texts per image

        - Up to 100 files per order

        - Supported image formats (IMG): jpg, jpeg, png, webp, bmp, tiff

        - Supported document formats (DOCUMENT): pdf


        ## Input Modes (Upload / URL / Mixed)

        The input mode is determined by the presence of `originalFileUrl` in
        each file object:

        - **Upload mode** (no `originalFileUrl`): Presigned URL issued → Client
        uploads to S3 → Processing starts automatically

        - **URL mode** (`originalFileUrl` provided): Image downloaded from the
        URL and processed immediately

        - **Mixed mode**: Some files in Upload mode, others in URL mode
        simultaneously


        ### Behavior

        | Condition | Order Status | Confirm Required |

        |-----------|-------------|-----------------|

        | All files have `originalFileUrl` | `pending` | No (auto-starts after
        server downloads) |

        | Any file without `originalFileUrl` | `pending` | No (auto-starts after
        upload) |


        <Note>Unlike Anti-AI and AI Detection, Watermark Embed does not require
        a separate confirm step. Processing starts automatically after file
        upload completes.</Note>
      operationId: createWatermarkEmbedOrder
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - idempotencyKey
                - files
              properties:
                idempotencyKey:
                  type: string
                  description: Idempotency key
                files:
                  type: array
                  minItems: 1
                  maxItems: 100
                  items:
                    type: object
                    required:
                      - fileName
                      - watermarks
                    properties:
                      fileName:
                        type: string
                        description: File name
                        example: image.jpg
                      originalFileUrl:
                        type: string
                        format: uri
                        description: >
                          Original image URL (optional)

                          - Provided: URL mode (no presigned URL issued,
                          immediate processing)

                          - Not provided: Upload mode (presigned URL issued)
                        example: https://example.com/image.jpg
                      watermarks:
                        type: array
                        minItems: 1
                        maxItems: 10
                        items:
                          type: object
                          required:
                            - text
                          properties:
                            text:
                              type: string
                              maxLength: 1000
                              description: Watermark text
            examples:
              uploadMode:
                summary: Upload mode (traditional)
                value:
                  idempotencyKey: 5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93
                  files:
                    - fileName: image1.jpg
                      watermarks:
                        - text: MORI_WATERMARK
                    - fileName: image2.png
                      watermarks:
                        - text: MORI_WATERMARK
              urlMode:
                summary: URL mode (immediate processing)
                value:
                  idempotencyKey: 6f1d8b4c-c5e3-4029-94f7-9c2b3e6a8d04
                  files:
                    - fileName: image1.jpg
                      originalFileUrl: https://example.com/image1.jpg
                      watermarks:
                        - text: MORI_WATERMARK
                    - fileName: image2.png
                      originalFileUrl: https://example.com/image2.png
                      watermarks:
                        - text: MORI_WATERMARK
              mixedMode:
                summary: Mixed mode
                value:
                  idempotencyKey: 7a2e9c5d-d6f4-413a-a5b8-0d3c4f7b9e15
                  files:
                    - fileName: upload-file.jpg
                      watermarks:
                        - text: MORI_WATERMARK
                    - fileName: url-file.png
                      originalFileUrl: https://example.com/image.png
                      watermarks:
                        - text: MORI_WATERMARK
      responses:
        '200':
          description: Order created successfully
          headers:
            Deprecation:
              description: Indicates that this API is deprecated
              schema:
                type: string
                example: 'true'
            Sunset:
              description: >-
                When support ends (RFC 8594 HTTP-date, 09:00 KST on October 9,
                2026)
              schema:
                type: string
                example: Fri, 09 Oct 2026 00:00:00 GMT
            Link:
              description: Path of the successor v3 API
              schema:
                type: string
                example: </api/v3/orders/wtr-embed>; rel="successor-version"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      orderName:
                        type: string
                      orderId:
                        type: string
                      status:
                        type: string
                        enum:
                          - pending
                        description: |
                          Order status
                          - `pending`: Always returned regardless of input mode
                      files:
                        type: array
                        items:
                          type: object
                          description: >-
                            File info (fields vary by mode)

                            - Upload mode: fileId, fileName, uploadUrl, fileKey,
                            fileFormat, fileType

                            - URL mode: fileId, fileName, originalFileUrl,
                            fileKey, fileFormat, fileType
                          properties:
                            fileId:
                              type: integer
                            fileName:
                              type: string
                            uploadUrl:
                              type: string
                              format: uri
                              description: >-
                                Upload URL, returned in upload mode only. Live
                                keys receive an S3 presigned URL; test keys
                                receive an absolute
                                `https://api.bizmori.com/api/v2/test-uploads/{signedToken}`
                                URL. Both expire after one hour. PUT needs no
                                Authorization header because the signed token
                                authorizes the test upload. Test request bodies
                                are streamed, not stored; test orders move to
                                simulated results without usage consumption or
                                actual external processing.
                            originalFileUrl:
                              type: string
                              format: uri
                              description: >-
                                Public image URL provided in the request.
                                Returned in URL mode only.
                            fileKey:
                              type: string
                              description: >
                                File identifier: an S3 object key for live keys
                                or an isolated logical key for test keys.
                            fileFormat:
                              type: string
                              description: File format.
                              enum:
                                - JPG
                                - PNG
                                - WEBP
                                - BMP
                                - TIFF
                                - PDF
                            fileType:
                              type: string
                              description: File type category.
                              enum:
                                - IMG
                                - DOCUMENT
              examples:
                uploadModeResponse:
                  summary: Upload mode response
                  value:
                    data:
                      orderName: wtr_embed_20260318120000.000
                      orderId: '424706541233094656'
                      status: pending
                      files:
                        - fileId: 2469
                          fileName: image.jpg
                          uploadUrl: >-
                            https://s3.ap-northeast-2.amazonaws.com/...?X-Amz-Algorithm=AWS4-HMAC-SHA256&...
                          fileKey: wtr-embed/424706541233094656/images/1/image.jpg
                          fileFormat: JPG
                          fileType: IMG
                        - fileId: 2470
                          fileName: document.pdf
                          uploadUrl: >-
                            https://s3.ap-northeast-2.amazonaws.com/...?X-Amz-Algorithm=AWS4-HMAC-SHA256&...
                          fileKey: >-
                            wtr-embed/424706541233094656/documents/2/document.pdf
                          fileFormat: PDF
                          fileType: DOCUMENT
                urlModeResponse:
                  summary: URL mode response
                  value:
                    data:
                      orderName: wtr_embed_20260318120000.000
                      orderId: '424707536709206016'
                      status: pending
                      files:
                        - fileId: 2490
                          fileName: image.png
                          originalFileUrl: https://example.com/image.jpg
                          fileKey: wtr-embed/424707536709206016/images/1/image.png
                          fileFormat: PNG
                          fileType: IMG
                mixedModeResponse:
                  summary: Mixed mode response
                  value:
                    data:
                      orderName: wtr_embed_20260318120000.000
                      orderId: '424707536709206016'
                      status: pending
                      files:
                        - fileId: 2490
                          fileName: image.png
                          originalFileUrl: https://example.com/image.jpg
                          fileKey: wtr-embed/424707536709206016/images/1/image.png
                          fileFormat: PNG
                          fileType: IMG
                        - fileId: 2491
                          fileName: photo.jpeg
                          uploadUrl: >-
                            https://s3.ap-northeast-2.amazonaws.com/...?X-Amz-Algorithm=AWS4-HMAC-SHA256&...
                          fileKey: wtr-embed/424707536709206016/images/2/photo.jpeg
                          fileFormat: JPG
                          fileType: IMG
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '410':
          description: >-
            v2 watermark support has ended (from 09:00 KST on October 9, 2026).
            Returned only after authentication and permission checks pass. Send
            a new request to the v3 path in the `Link` header.
          headers:
            Link:
              description: Path of the successor v3 API
              schema:
                type: string
                example: </api/v3/orders/wtr-embed>; rel="successor-version"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                code: WATERMARK_V2_API_SUNSET
        '429':
          $ref: '#/components/responses/UsageLimitExceeded'
      deprecated: true
      security:
        - BearerAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl -X POST https://api.bizmori.com/api/v2/orders/wtr-embed \
              -H "Authorization: Bearer YOUR_API_TOKEN" \
              -H "Content-Type: application/json" \
              -d '{
                "idempotencyKey": "5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93",
                "files": [
                  {
                    "fileName": "image.jpg",
                    "watermarks": [{"text": "MORI_WATERMARK"}]
                  }
                ]
              }'
        - lang: javascript
          label: JavaScript
          source: >-
            const response = await
            fetch('https://api.bizmori.com/api/v2/orders/wtr-embed', {
              method: 'POST',
              headers: {
                'Authorization': 'Bearer YOUR_API_TOKEN',
                'Content-Type': 'application/json'
              },
              body: JSON.stringify({
                idempotencyKey: '5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93',
                files: [
                  {
                    fileName: 'image.jpg',
                    watermarks: [{ text: 'MORI_WATERMARK' }]
                  }
                ]
              })
            });

            const data = await response.json();
        - lang: python
          label: Python
          source: |-
            import requests

            response = requests.post(
                'https://api.bizmori.com/api/v2/orders/wtr-embed',
                headers={'Authorization': 'Bearer YOUR_API_TOKEN'},
                json={
                    'idempotencyKey': '5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93',
                    'files': [
                        {
                            'fileName': 'image.jpg',
                            'watermarks': [{'text': 'MORI_WATERMARK'}]
                        }
                    ]
                }
            )
            data = response.json()
components:
  responses:
    BadRequest:
      description: Bad request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            code: VALIDATION_FAILED
    Unauthorized:
      description: Authentication failed
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            code: AUTH_NOT_AUTHENTICATED
    Forbidden:
      description: The API key is not allowed to use the requested mode
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            code: AUTH_FORBIDDEN
    UsageLimitExceeded:
      description: Usage limit exceeded
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            code: USAGE_LIMIT_EXCEEDED
  schemas:
    ErrorResponse:
      type: object
      properties:
        code:
          type: string
          description: Error code
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        Bearer API key for external client access. Live keys use the `sk_`
        prefix; test keys use the `sk_test_` prefix and support order-lifecycle
        testing with mock responses without processing or credit usage.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.