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

# Save the transform recipe (group-by fields, creative prompt, budget per group)



## OpenAPI

````yaml /openapi/buyer.yaml put /api/v2/buyer/advertisers/{id}/catalogs/{catalogId}/transform
openapi: 3.1.0
info:
  title: Semicola Exchange buyer API
  version: 2.0.0
  description: >-
    Buyer endpoints: advertisers, storefronts and connections, product
    discovery, campaigns, proposals, media buys, creatives and reporting. Every
    write accepts an Idempotency-Key header.
servers:
  - url: https://api.semicola.com
security:
  - bearerAuth: []
  - sessionCookie: []
tags:
  - name: Advertisers
  - name: Storefronts
  - name: Product Discovery
  - name: Campaigns
  - name: Media Buys
  - name: Creatives
  - name: Catalogs
  - name: Reporting
  - name: Event Sources
  - name: Webhooks
  - name: Tasks
  - name: Audit Logs
  - name: Activity
paths:
  /api/v2/buyer/advertisers/{id}/catalogs/{catalogId}/transform:
    put:
      tags:
        - Catalogs
      summary: >-
        Save the transform recipe (group-by fields, creative prompt, budget per
        group)
      operationId: putBuyerAdvertisersByIdCatalogsByCatalogIdTransform
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            exclusiveMinimum: 0
            maximum: 9007199254740991
        - name: catalogId
          in: path
          required: true
          schema:
            type: string
            minLength: 1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                groupBy:
                  maxItems: 4
                  type: array
                  items:
                    type: string
                    minLength: 1
                    maxLength: 64
                creativePrompt:
                  type: string
                  maxLength: 2000
                budgetPerGroup:
                  type: number
                  minimum: 0
              required:
                - groupBy
              additionalProperties: false
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    anyOf:
                      - type: object
                        properties:
                          catalogId:
                            type: string
                          platformId:
                            type: string
                          type:
                            type: string
                            enum:
                              - offering
                              - product
                              - inventory
                              - store
                              - promotion
                              - hotel
                              - flight
                              - job
                              - vehicle
                              - real_estate
                              - education
                              - destination
                          sourceType:
                            type: string
                            enum:
                              - inline
                              - url
                              - selector
                          name:
                            type:
                              - string
                              - 'null'
                          url:
                            type:
                              - string
                              - 'null'
                          feedFormat:
                            anyOf:
                              - type: string
                                enum:
                                  - google_merchant_center
                                  - facebook_catalog
                                  - shopify
                                  - linkedin_jobs
                                  - custom
                              - type: 'null'
                          updateFrequency:
                            anyOf:
                              - type: string
                                enum:
                                  - realtime
                                  - hourly
                                  - daily
                                  - weekly
                              - type: 'null'
                          itemCount:
                            type: integer
                            minimum: 0
                            maximum: 9007199254740991
                          fields:
                            type: array
                            items:
                              type: string
                          syncStatus:
                            type: string
                            enum:
                              - pending
                              - syncing
                              - synced
                              - failed
                              - not_synced
                          healthStatus:
                            type: string
                            enum:
                              - not_synced
                              - healthy
                              - stale
                              - warning
                              - failed
                          latestVersionId:
                            type:
                              - string
                              - 'null'
                          latestVersionNumber:
                            anyOf:
                              - type: integer
                                minimum: -9007199254740991
                                maximum: 9007199254740991
                              - type: 'null'
                          latestContentHash:
                            type:
                              - string
                              - 'null'
                          activeTransform:
                            anyOf:
                              - type: object
                                properties:
                                  groupBy:
                                    type: array
                                    items:
                                      type: string
                                  creativePrompt:
                                    type:
                                      - string
                                      - 'null'
                                  budgetPerGroup:
                                    anyOf:
                                      - type: number
                                        minimum: 0
                                      - type: 'null'
                                  savedAt:
                                    type: string
                                    format: date-time
                                    pattern: >-
                                      ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                                required:
                                  - groupBy
                                  - creativePrompt
                                  - budgetPerGroup
                                  - savedAt
                                additionalProperties: false
                              - type: 'null'
                          latestActivationPlanId:
                            type:
                              - string
                              - 'null'
                          lastChangeSummary:
                            type: object
                            properties:
                              added:
                                type: integer
                                minimum: 0
                                maximum: 9007199254740991
                              updated:
                                type: integer
                                minimum: 0
                                maximum: 9007199254740991
                              unchanged:
                                type: integer
                                minimum: 0
                                maximum: 9007199254740991
                              removed:
                                type: integer
                                minimum: 0
                                maximum: 9007199254740991
                            required:
                              - added
                              - updated
                              - unchanged
                              - removed
                            additionalProperties: false
                          lastSyncAttemptAt:
                            anyOf:
                              - type: string
                                format: date-time
                                pattern: >-
                                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                              - type: 'null'
                          lastSyncedAt:
                            anyOf:
                              - type: string
                                format: date-time
                                pattern: >-
                                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                              - type: 'null'
                          nextSyncAt:
                            anyOf:
                              - type: string
                                format: date-time
                                pattern: >-
                                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                              - type: 'null'
                          staleAfterAt:
                            anyOf:
                              - type: string
                                format: date-time
                                pattern: >-
                                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                              - type: 'null'
                          versions:
                            type: array
                            items:
                              type: object
                              properties:
                                versionId:
                                  type: string
                                versionNumber:
                                  type: integer
                                  exclusiveMinimum: 0
                                  maximum: 9007199254740991
                                itemCount:
                                  type: integer
                                  minimum: 0
                                  maximum: 9007199254740991
                                contentHash:
                                  type: string
                                changeSummary:
                                  type: object
                                  properties:
                                    added:
                                      type: integer
                                      minimum: 0
                                      maximum: 9007199254740991
                                    updated:
                                      type: integer
                                      minimum: 0
                                      maximum: 9007199254740991
                                    unchanged:
                                      type: integer
                                      minimum: 0
                                      maximum: 9007199254740991
                                    removed:
                                      type: integer
                                      minimum: 0
                                      maximum: 9007199254740991
                                  required:
                                    - added
                                    - updated
                                    - unchanged
                                    - removed
                                  additionalProperties: false
                                syncStatus:
                                  type: string
                                  enum:
                                    - pending
                                    - syncing
                                    - synced
                                    - failed
                                    - not_synced
                                createdAt:
                                  type: string
                                  format: date-time
                                  pattern: >-
                                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                                completedAt:
                                  anyOf:
                                    - type: string
                                      format: date-time
                                      pattern: >-
                                        ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                                    - type: 'null'
                              required:
                                - versionId
                                - versionNumber
                                - itemCount
                                - contentHash
                                - changeSummary
                                - syncStatus
                                - createdAt
                                - completedAt
                              additionalProperties: false
                          recentRefreshRuns:
                            type: array
                            items:
                              type: object
                              properties:
                                refreshRunId:
                                  type: string
                                status:
                                  type: string
                                  enum:
                                    - syncing
                                    - synced
                                    - unchanged
                                    - failed
                                httpStatus:
                                  anyOf:
                                    - type: integer
                                      minimum: -9007199254740991
                                      maximum: 9007199254740991
                                    - type: 'null'
                                itemCount:
                                  anyOf:
                                    - type: integer
                                      minimum: 0
                                      maximum: 9007199254740991
                                    - type: 'null'
                                activationSkippedReason:
                                  type:
                                    - string
                                    - 'null'
                                error:
                                  type:
                                    - string
                                    - 'null'
                                startedAt:
                                  type: string
                                  format: date-time
                                  pattern: >-
                                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                                completedAt:
                                  anyOf:
                                    - type: string
                                      format: date-time
                                      pattern: >-
                                        ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                                    - type: 'null'
                              required:
                                - refreshRunId
                                - status
                                - httpStatus
                                - itemCount
                                - activationSkippedReason
                                - error
                                - startedAt
                                - completedAt
                              additionalProperties: false
                          recentActivationExecutions:
                            type: array
                            items:
                              type: object
                              properties:
                                executionId:
                                  type: string
                                planId:
                                  type:
                                    - string
                                    - 'null'
                                catalogVersionId:
                                  type:
                                    - string
                                    - 'null'
                                status:
                                  type: string
                                  enum:
                                    - pending
                                    - completed
                                    - failed
                                trigger:
                                  type: string
                                  enum:
                                    - manual
                                    - feed_refresh
                                    - scheduled
                                campaignGroupCount:
                                  type: integer
                                  minimum: 0
                                  maximum: 9007199254740991
                                creativeAssetCount:
                                  type: integer
                                  minimum: 0
                                  maximum: 9007199254740991
                                syndicationTargetCount:
                                  type: integer
                                  minimum: 0
                                  maximum: 9007199254740991
                                error:
                                  type:
                                    - string
                                    - 'null'
                                startedAt:
                                  type: string
                                  format: date-time
                                  pattern: >-
                                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                                completedAt:
                                  anyOf:
                                    - type: string
                                      format: date-time
                                      pattern: >-
                                        ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                                    - type: 'null'
                              required:
                                - executionId
                                - planId
                                - catalogVersionId
                                - status
                                - trigger
                                - campaignGroupCount
                                - creativeAssetCount
                                - syndicationTargetCount
                                - error
                                - startedAt
                                - completedAt
                              additionalProperties: false
                          advertiserId:
                            type: integer
                            exclusiveMinimum: 0
                            maximum: 9007199254740991
                        required:
                          - catalogId
                          - platformId
                          - type
                          - sourceType
                          - name
                          - url
                          - feedFormat
                          - updateFrequency
                          - itemCount
                          - fields
                          - syncStatus
                          - healthStatus
                          - latestVersionId
                          - latestVersionNumber
                          - latestContentHash
                          - activeTransform
                          - latestActivationPlanId
                          - lastChangeSummary
                          - lastSyncAttemptAt
                          - lastSyncedAt
                          - nextSyncAt
                          - staleAfterAt
                          - versions
                          - recentRefreshRuns
                          - recentActivationExecutions
                          - advertiserId
                        additionalProperties: false
                      - type: 'null'
                  error:
                    anyOf:
                      - type: object
                        properties:
                          code:
                            type: string
                          message:
                            type: string
                          field:
                            type: string
                          details: {}
                        required:
                          - code
                          - message
                        additionalProperties: false
                      - type: 'null'
                required:
                  - data
                  - error
                additionalProperties: false
        default:
          description: >-
            Error envelope `{data: null, error: {code, message, field?,
            details?}}`.
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: API key or OAuth access token.
    sessionCookie:
      type: apiKey
      in: cookie
      name: sc_session

````