← All API operations

POST /api/v1/campaigns/{id}/lines/{lineId}/creatives/{creativeId}/approval

Run campaigns / lines / creatives / approval

Authenticated and advertiser scoped. Cross-tenant resource access returns 404. Product/channel entitlements also apply.

Requires an authenticated human with operator:reconcile permission. Delegated agents cannot perform this operator action.

The request schema is generated from the runtime Zod input validator. Cross-field refinements and state-dependent constraints are additionally enforced by the API.

Request

HTTP
POST /api/v1/campaigns/{id}/lines/{lineId}/creatives/{creativeId}/approval

Use the configured API origin. Private requests require a verified Bearer credential; an agent mutation can additionally require exact approval headers. Authentication guide →

ParameterLocationRequiredDescription
idpathYes
lineIdpathYes
creativeIdpathYes
Parameter schemas
JSON Schema
[
  {
    "name": "id",
    "in": "path",
    "required": true,
    "schema": {
      "type": "string"
    }
  },
  {
    "name": "lineId",
    "in": "path",
    "required": true,
    "schema": {
      "type": "string"
    }
  },
  {
    "name": "creativeId",
    "in": "path",
    "required": true,
    "schema": {
      "type": "string"
    }
  }
]
Request body contract
{
  "required": true,
  "content": {
    "application/json": {
      "schema": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "externalCreativeRef": {
                "type": "string",
                "minLength": 1,
                "maxLength": 500
              },
              "note": {
                "type": "string",
                "minLength": 1,
                "maxLength": 500
              },
              "confirmation": {
                "type": "object",
                "properties": {
                  "confirmed": {
                    "type": "boolean",
                    "const": true
                  },
                  "adapterKey": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "providerAccountRef": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500
                  },
                  "providerAccountRefAuthority": {
                    "type": "string",
                    "enum": [
                      "provider-validated",
                      "operator-attested"
                    ]
                  },
                  "providerCampaignRef": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500
                  },
                  "externalCreativeRef": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500
                  },
                  "destinationUrl": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uri"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "assetFingerprint": {
                    "type": "string",
                    "pattern": "^sha256:[a-f0-9]{64}$"
                  },
                  "configurationDigest": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  }
                },
                "required": [
                  "confirmed",
                  "adapterKey",
                  "providerAccountRef",
                  "providerAccountRefAuthority",
                  "providerCampaignRef",
                  "externalCreativeRef",
                  "destinationUrl",
                  "assetFingerprint",
                  "configurationDigest"
                ],
                "additionalProperties": false
              },
              "outcome": {
                "type": "string",
                "const": "approved"
              },
              "providerStatus": {
                "type": "string",
                "const": "APPROVED"
              }
            },
            "required": [
              "note",
              "confirmation",
              "outcome",
              "providerStatus"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "externalCreativeRef": {
                "type": "string",
                "minLength": 1,
                "maxLength": 500
              },
              "note": {
                "type": "string",
                "minLength": 1,
                "maxLength": 500
              },
              "confirmation": {
                "type": "object",
                "properties": {
                  "confirmed": {
                    "type": "boolean",
                    "const": true
                  },
                  "adapterKey": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "providerAccountRef": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500
                  },
                  "providerAccountRefAuthority": {
                    "type": "string",
                    "enum": [
                      "provider-validated",
                      "operator-attested"
                    ]
                  },
                  "providerCampaignRef": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500
                  },
                  "externalCreativeRef": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500
                  },
                  "destinationUrl": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uri"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "assetFingerprint": {
                    "type": "string",
                    "pattern": "^sha256:[a-f0-9]{64}$"
                  },
                  "configurationDigest": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  }
                },
                "required": [
                  "confirmed",
                  "adapterKey",
                  "providerAccountRef",
                  "providerAccountRefAuthority",
                  "providerCampaignRef",
                  "externalCreativeRef",
                  "destinationUrl",
                  "assetFingerprint",
                  "configurationDigest"
                ],
                "additionalProperties": false
              },
              "outcome": {
                "type": "string",
                "const": "rejected"
              },
              "providerStatus": {
                "type": "string",
                "const": "REJECTED"
              }
            },
            "required": [
              "note",
              "confirmation",
              "outcome",
              "providerStatus"
            ],
            "additionalProperties": false
          }
        ]
      }
    }
  }
}

Responses

Reference schemas resolve through the downloadable OpenAPI components. The specification marks unmodeled success payloads; an unrestricted payload is not a promise that arbitrary fields exist.

400Invalid request or unsupported fields
Response contract
{
  "description": "Invalid request or unsupported fields",
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/Error"
      }
    }
  }
}
401Missing or invalid authentication
Response contract
{
  "description": "Missing or invalid authentication",
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/Error"
      }
    }
  }
}
403Permission or product scope refused
Response contract
{
  "description": "Permission or product scope refused",
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/Error"
      }
    }
  }
}
404Route or tenant-scoped resource not found
Response contract
{
  "description": "Route or tenant-scoped resource not found",
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/Error"
      }
    }
  }
}
409State, revision, approval, funding or idempotency conflict
Response contract
{
  "description": "State, revision, approval, funding or idempotency conflict",
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/Error"
      }
    }
  }
}
422Supplier configuration, capability or upstream refusal
Response contract
{
  "description": "Supplier configuration, capability or upstream refusal",
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/Error"
      }
    }
  }
}
429Rate limit reached; wait before retrying
Response contract
{
  "description": "Rate limit reached; wait before retrying",
  "headers": {
    "x-ratelimit-limit": {
      "description": "Maximum requests permitted in the current rate-limit window.",
      "schema": {
        "type": "integer"
      }
    },
    "x-ratelimit-remaining": {
      "description": "Requests remaining in the current window.",
      "schema": {
        "type": "integer"
      }
    },
    "x-ratelimit-reset": {
      "description": "Seconds until the current rate-limit window resets.",
      "schema": {
        "type": "integer"
      }
    },
    "retry-after": {
      "description": "Minimum seconds to wait before retrying.",
      "schema": {
        "type": "integer"
      }
    }
  },
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/Error"
      }
    }
  }
}
500Internal error; inspect state before retrying a mutation
Response contract
{
  "description": "Internal error; inspect state before retrying a mutation",
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/Error"
      }
    }
  }
}
503Dependency or authentication verifier unavailable
Response contract
{
  "description": "Dependency or authentication verifier unavailable",
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/Error"
      }
    }
  }
}
2XXSuccessful response. Response schema completeness: unmodeled. The request contract is complete; nested service payloads are not yet fully modeled in OpenAPI. Inspect returned fields before generating a typed SDK.
Response contract
{
  "description": "Successful response. Response schema completeness: unmodeled. The request contract is complete; nested service payloads are not yet fully modeled in OpenAPI. Inspect returned fields before generating a typed SDK.",
  "headers": {
    "x-ratelimit-limit": {
      "description": "Maximum requests permitted in the current rate-limit window.",
      "schema": {
        "type": "integer"
      }
    },
    "x-ratelimit-remaining": {
      "description": "Requests remaining in the current window.",
      "schema": {
        "type": "integer"
      }
    },
    "x-ratelimit-reset": {
      "description": "Seconds until the current rate-limit window resets.",
      "schema": {
        "type": "integer"
      }
    }
  },
  "content": {
    "application/json": {
      "schema": {}
    }
  }
}

Operation constraints

Machine-readable metadata
{
  "x-response-schema-completeness": "unmodeled",
  "x-rate-limit": {
    "requests": 300,
    "windowMilliseconds": 60000,
    "key": "request IP",
    "headers": [
      "x-ratelimit-limit",
      "x-ratelimit-remaining",
      "x-ratelimit-reset"
    ]
  },
  "x-idempotency": {
    "policy": "not-generalized",
    "note": "There is no universal Idempotency-Key middleware. Only the documented endpoint mechanisms protect retries."
  },
  "x-human-only": true,
  "x-required-human-permissions": [
    "operator:reconcile"
  ]
}

Complete operation

OpenAPI
{
  "operationId": "post_api_v1_campaigns_id_lines_lineId_creatives_creativeId_approval",
  "summary": "Run campaigns / lines / creatives / approval",
  "description": "Authenticated and advertiser scoped. Cross-tenant resource access returns 404. Product/channel entitlements also apply.\n\nRequires an authenticated human with operator:reconcile permission. Delegated agents cannot perform this operator action.\n\nThe request schema is generated from the runtime Zod input validator. Cross-field refinements and state-dependent constraints are additionally enforced by the API.",
  "tags": [
    "Campaigns"
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "parameters": [
    {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string"
      }
    },
    {
      "name": "lineId",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string"
      }
    },
    {
      "name": "creativeId",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "externalCreativeRef": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 500
                },
                "note": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 500
                },
                "confirmation": {
                  "type": "object",
                  "properties": {
                    "confirmed": {
                      "type": "boolean",
                      "const": true
                    },
                    "adapterKey": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 120
                    },
                    "providerAccountRef": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 500
                    },
                    "providerAccountRefAuthority": {
                      "type": "string",
                      "enum": [
                        "provider-validated",
                        "operator-attested"
                      ]
                    },
                    "providerCampaignRef": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 500
                    },
                    "externalCreativeRef": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 500
                    },
                    "destinationUrl": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uri"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "assetFingerprint": {
                      "type": "string",
                      "pattern": "^sha256:[a-f0-9]{64}$"
                    },
                    "configurationDigest": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    }
                  },
                  "required": [
                    "confirmed",
                    "adapterKey",
                    "providerAccountRef",
                    "providerAccountRefAuthority",
                    "providerCampaignRef",
                    "externalCreativeRef",
                    "destinationUrl",
                    "assetFingerprint",
                    "configurationDigest"
                  ],
                  "additionalProperties": false
                },
                "outcome": {
                  "type": "string",
                  "const": "approved"
                },
                "providerStatus": {
                  "type": "string",
                  "const": "APPROVED"
                }
              },
              "required": [
                "note",
                "confirmation",
                "outcome",
                "providerStatus"
              ],
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "externalCreativeRef": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 500
                },
                "note": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 500
                },
                "confirmation": {
                  "type": "object",
                  "properties": {
                    "confirmed": {
                      "type": "boolean",
                      "const": true
                    },
                    "adapterKey": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 120
                    },
                    "providerAccountRef": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 500
                    },
                    "providerAccountRefAuthority": {
                      "type": "string",
                      "enum": [
                        "provider-validated",
                        "operator-attested"
                      ]
                    },
                    "providerCampaignRef": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 500
                    },
                    "externalCreativeRef": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 500
                    },
                    "destinationUrl": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uri"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "assetFingerprint": {
                      "type": "string",
                      "pattern": "^sha256:[a-f0-9]{64}$"
                    },
                    "configurationDigest": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    }
                  },
                  "required": [
                    "confirmed",
                    "adapterKey",
                    "providerAccountRef",
                    "providerAccountRefAuthority",
                    "providerCampaignRef",
                    "externalCreativeRef",
                    "destinationUrl",
                    "assetFingerprint",
                    "configurationDigest"
                  ],
                  "additionalProperties": false
                },
                "outcome": {
                  "type": "string",
                  "const": "rejected"
                },
                "providerStatus": {
                  "type": "string",
                  "const": "REJECTED"
                }
              },
              "required": [
                "note",
                "confirmation",
                "outcome",
                "providerStatus"
              ],
              "additionalProperties": false
            }
          ]
        }
      }
    }
  },
  "responses": {
    "400": {
      "description": "Invalid request or unsupported fields",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    },
    "401": {
      "description": "Missing or invalid authentication",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    },
    "403": {
      "description": "Permission or product scope refused",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    },
    "404": {
      "description": "Route or tenant-scoped resource not found",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    },
    "409": {
      "description": "State, revision, approval, funding or idempotency conflict",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    },
    "422": {
      "description": "Supplier configuration, capability or upstream refusal",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    },
    "429": {
      "description": "Rate limit reached; wait before retrying",
      "headers": {
        "x-ratelimit-limit": {
          "description": "Maximum requests permitted in the current rate-limit window.",
          "schema": {
            "type": "integer"
          }
        },
        "x-ratelimit-remaining": {
          "description": "Requests remaining in the current window.",
          "schema": {
            "type": "integer"
          }
        },
        "x-ratelimit-reset": {
          "description": "Seconds until the current rate-limit window resets.",
          "schema": {
            "type": "integer"
          }
        },
        "retry-after": {
          "description": "Minimum seconds to wait before retrying.",
          "schema": {
            "type": "integer"
          }
        }
      },
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    },
    "500": {
      "description": "Internal error; inspect state before retrying a mutation",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    },
    "503": {
      "description": "Dependency or authentication verifier unavailable",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    },
    "2XX": {
      "description": "Successful response. Response schema completeness: unmodeled. The request contract is complete; nested service payloads are not yet fully modeled in OpenAPI. Inspect returned fields before generating a typed SDK.",
      "headers": {
        "x-ratelimit-limit": {
          "description": "Maximum requests permitted in the current rate-limit window.",
          "schema": {
            "type": "integer"
          }
        },
        "x-ratelimit-remaining": {
          "description": "Requests remaining in the current window.",
          "schema": {
            "type": "integer"
          }
        },
        "x-ratelimit-reset": {
          "description": "Seconds until the current rate-limit window resets.",
          "schema": {
            "type": "integer"
          }
        }
      },
      "content": {
        "application/json": {
          "schema": {}
        }
      }
    }
  },
  "x-response-schema-completeness": "unmodeled",
  "x-rate-limit": {
    "requests": 300,
    "windowMilliseconds": 60000,
    "key": "request IP",
    "headers": [
      "x-ratelimit-limit",
      "x-ratelimit-remaining",
      "x-ratelimit-reset"
    ]
  },
  "x-idempotency": {
    "policy": "not-generalized",
    "note": "There is no universal Idempotency-Key middleware. Only the documented endpoint mechanisms protect retries."
  },
  "x-human-only": true,
  "x-required-human-permissions": [
    "operator:reconcile"
  ]
}
Download the complete specification, including shared schema components →
Run campaigns / lines / creatives / approval | AdBuyMCP docs