Comunicate.eu Campaigns API
Grouping articles and publications by client or project. The equivalent of "projects" on other platforms.
Grouping articles and publications by client or project. The equivalent of "projects" on other platforms.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/comunicate-eu:comunicate-eu-campaigns-api"
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.
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: 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)