Comunicate.eu Campaigns API

Grouping articles and publications by client or project. The equivalent of "projects" on other platforms.

GitHub OpenAPI

Operations 5

GET /partner/campaigns List campaigns #
POST /partner/campaigns Create a campaign #
GET /partner/campaigns/{campaignId} One campaign #
PATCH /partner/campaigns/{campaignId} Update a campaign #
DELETE /partner/campaigns/{campaignId} Delete a campaign #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/comunicate-eu:comunicate-eu-campaigns-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

comunicate-eu-campaigns-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Comunicate Eu Campaigns API
  version: 1.0.0
  contact:
    url: https://comunicate.eu/ro/contact
  description: 'Operations tagged Campaigns across 2 of this provider''s published API definitions: comunicate-eu-openapi.json, comunicate-eu-openapi.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://app.comunicate.eu/api/v1
tags:
- name: Campaigns
  description: Grouping articles and publications by client or project. The equivalent of "projects" on other platforms.
paths:
  /partner/campaigns:
    get:
      operationId: get_campaigns
      summary: List campaigns
      description: '`status` filters. Cursor-paginated: the response’s `nextCursor` is sent back as `cursor` for the next page, `null` on the last one.


        Required scope: `CAMPAIGNS_READ`.'
      tags:
      - Campaigns
      parameters:
      - name: status
        in: query
        required: false
        description: '`DRAFT`, `ACTIVE`, `PAUSED`, `COMPLETED`, `ARCHIVED`.'
        schema:
          type: string
      - name: cursor
        in: query
        required: false
        description: The id of the last campaign seen. Absent on the first page.
        schema:
          type: string
          format: uuid
      - name: limit
        in: query
        required: false
        description: How many campaigns per page.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
              example:
                items:
                - id: 8b2e…
                  name: Client Exemplu — Q3
                  status: ACTIVE
                nextCursor: null
        '400':
          description: Invalid input
        '401':
          description: Missing or invalid API key
        '403':
          description: The key lacks the required scope
      security:
      - apiKey: []
      - oauth2:
        - CAMPAIGNS_READ
      x-codeSamples:
      - lang: Shell
        label: curl
        source: "curl --location 'https://app.comunicate.eu/api/v1/partner/campaigns?limit=50' \\\n  --header 'Authorization: Bearer bk_live_…'"
    post:
      operationId: post_campaigns
      summary: Create a campaign
      description: 'The body is strict: a field it does not know is rejected with `400`, not silently ignored. Better an error on the first attempt than a setting that looks applied and is not.


        Required scope: `CAMPAIGNS_WRITE`.'
      tags:
      - Campaigns
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - name
              properties:
                name:
                  type: string
                  description: Campaign name.
                campaignType:
                  type: string
                  description: Binds the campaign to a type. Every article that joins it is checked automatically against the type’s requirements, and the verdict appears on the article in `potrivireCampanie`. It does not block writing — rejection stays at the order, where the payment is.
                clientName:
                  type: string
                  description: 'The end client’s label. Free text: clients have no account on the platform.'
                objective:
                  type: string
                  description: What the campaign is for.
                notes:
                  type: string
                  description: Internal notes.
                startsAt:
                  type: string
                  format: date-time
                  description: ISO 8601. Must precede `endsAt`.
                endsAt:
                  type: string
                  format: date-time
                  description: ISO 8601.
                budgetCents:
                  type: integer
                  description: 'A tracked budget, in minor units. Not a separate wallet: the money stays in the organisation’s account.'
                budgetCredits:
                  type: integer
                  description: Limit on credits spent in the campaign.
                allowedSiteIds:
                  type: string
                  description: Allowed sites. Empty means “any in the catalogue”.
                idempotencyKey:
                  type: string
                  description: Chosen by you — a locally generated UUID is enough. Sent again, for the same organisation, it returns the campaign already created instead of making a new one. Recommended for any code that might resend the request after a timeout.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
              example:
                id: 8b2e…
                name: Client Exemplu — Q3
                clientName: Exemplu SRL
                campaignType: SEO
                status: ACTIVE
                idempotencyKey: 9f2c7e40-9b1e-4c2a-8b0e-2e6a1f9c3d10
                articleCount: 0
        '400':
          description: Invalid input
        '401':
          description: Missing or invalid API key
        '403':
          description: The key lacks the required scope
      security:
      - apiKey: []
      - oauth2:
        - CAMPAIGNS_WRITE
      x-codeSamples:
      - lang: Shell
        label: curl
        source: "curl --location 'https://app.comunicate.eu/api/v1/partner/campaigns' \\\n  --header 'Authorization: Bearer bk_live_…' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n    \"name\": \"Client Exemplu — Q3\",\n    \"clientName\": \"Exemplu SRL\",\n    \"campaignType\": \"SEO\",\n    \"idempotencyKey\": \"9f2c7e40-9b1e-4c2a-8b0e-2e6a1f9c3d10\"\n  }'"
    servers:
    - url: https://app.comunicate.eu/api/v1
  /partner/campaigns/{campaignId}:
    get:
      operationId: get_campaigns_campaignId
      summary: One campaign
      description: 'The campaign, with its articles and publications.


        Required scope: `CAMPAIGNS_READ`.'
      tags:
      - Campaigns
      parameters:
      - name: campaignId
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
              example:
                id: 8b2e…
                name: Client Exemplu — Q3
                articles: 12
                publications: 34
        '400':
          description: Invalid input
        '401':
          description: Missing or invalid API key
        '403':
          description: The key lacks the required scope
      security:
      - apiKey: []
      - oauth2:
        - CAMPAIGNS_READ
      x-codeSamples:
      - lang: Shell
        label: curl
        source: "curl --location 'https://app.comunicate.eu/api/v1/partner/campaigns/8b2e…' \\\n  --header 'Authorization: Bearer bk_live_…'"
    patch:
      operationId: patch_campaigns_campaignId
      summary: Update a campaign
      description: 'Every field from creation, all optional. Send only what changes.


        Most often used for `campaignType`: binds an already-created campaign to a type, or clears it with `null`. Every article in the campaign is automatically rechecked against the new type — see `potrivireCampanie` on the article.


        Required scope: `CAMPAIGNS_WRITE`.'
      tags:
      - Campaigns
      parameters:
      - name: campaignId
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
              example:
                id: 8b2e…
                name: Client Exemplu — Q3
                campaignType: BRAND_AWARENESS
                articleCount: 12
        '400':
          description: Invalid input
        '401':
          description: Missing or invalid API key
        '403':
          description: The key lacks the required scope
      security:
      - apiKey: []
      - oauth2:
        - CAMPAIGNS_WRITE
      x-codeSamples:
      - lang: Shell
        label: curl
        source: "curl --location --request PATCH 'https://app.comunicate.eu/api/v1/partner/campaigns/8b2e…' \\\n  --header 'Authorization: Bearer bk_live_…' \\\n  --header 'Content-Type: application/json' \\\n  --data '{ \"campaignType\": \"BRAND_AWARENESS\" }'"
    delete:
      operationId: delete_campaigns_campaignId
      summary: Delete a campaign
      description: 'Responds `204` on success. Refused with `409` if the campaign is active and has articles — the same rule as in the interface: a campaign with history gets archived (`PATCH` with `status: "ARCHIVED"`), not deleted.


        Required scope: `CAMPAIGNS_WRITE`.'
      tags:
      - Campaigns
      parameters:
      - name: campaignId
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '400':
          description: Invalid input
        '401':
          description: Missing or invalid API key
        '403':
          description: The key lacks the required scope
      security:
      - apiKey: []
      - oauth2:
        - CAMPAIGNS_WRITE
      x-codeSamples:
      - lang: Shell
        label: curl
        source: "curl --location --request DELETE 'https://app.comunicate.eu/api/v1/partner/campaigns/8b2e…' \\\n  --header 'Authorization: Bearer bk_live_…'"
    servers:
    - url: https://app.comunicate.eu/api/v1
components:
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: API key from Integrations (bk_live_…)
    oauth2:
      type: oauth2
      description: OAuth 2.1 with PKCE (S256). Dynamic client registration at https://app.comunicate.eu/api/v1/oauth/register. The access token is an API key and is accepted everywhere an API key is.
      flows:
        authorizationCode:
          authorizationUrl: https://app.comunicate.eu/api/v1/oauth/authorize
          tokenUrl: https://app.comunicate.eu/api/v1/oauth/token
          refreshUrl: https://app.comunicate.eu/api/v1/oauth/token
          scopes:
            CATALOG_READ: catalog read
            ARTICLES_READ: articles read
            ARTICLES_WRITE: articles write
            MEDIA_WRITE: media write
            PUBLICATIONS_READ: publications read
            PUBLICATIONS_WRITE: publications write
            CAMPAIGNS_READ: campaigns read
            CAMPAIGNS_WRITE: campaigns write
            BALANCE_READ: balance read
            REPORTS_READ: reports read
x-refined-from:
- comunicate-eu-openapi.json
- comunicate-eu-openapi.json
x-provenance:
  method: harvested
  publisher: Comunicate.eu
  source: https://app.comunicate.eu/openapi.json
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)