Comunicate.eu Publications API
A publication ties an article to a publisher site. It is the only place in the API that spends credits or money.
A publication ties an article to a publisher site. It is the only place in the API that spends credits or money.
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-publications-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 Publications API
version: 1.0.0
contact:
url: https://comunicate.eu/ro/contact
description: 'Operations tagged Publications 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: Publications
description: A publication ties an article to a publisher site. It is the only place in the API that spends credits or money.
paths:
/partner/publications:
post:
operationId: post_publications
summary: Request publication
description: 'One article, one or more publications.
**Payment ambiguity is never guessed.** When several owned packages cover the same site, the request is rejected with `409` and the list of options; the integration picks one and retries with `packageTypeId`. Guessing would consume the wrong package, and that cannot be undone.
Required scope: `PUBLICATIONS_WRITE`.'
tags:
- Publications
parameters: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- articleId
- siteIds
- campaignType
properties:
articleId:
type: string
format: uuid
description: The article to publish.
siteIds:
type: array
items:
type: string
format: uuid
description: The publications chosen from the catalogue.
campaignType:
type: string
description: The campaign type. Must be among the site's `acceptedCampaigns`.
packageTypeId:
type: string
format: uuid
description: Which package pays, when several cover the site.
licenseNumber:
type: string
description: The operator’s ONJN gambling licence. Required when `campaignType` is `"CASINO"` — gambling advertising must display it, and the platform writes it onto the article itself before sending it.
extrasBySite:
type: object
additionalProperties: true
description: Extras requested per site — `"HOMEPAGE_PLACEMENT"`, `"FACEBOOK_SHARE"`, at most both. The key is `siteId`, the value a list of types; each one requested must have an active offer on that site (see `GET /partner/catalog`), otherwise the request is rejected.
scheduledFor:
type: string
format: date-time
description: When it should go live, if not immediately.
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
additionalProperties: true
example:
publications:
- id: 9a3b…
siteId: 3f1c…
status: AWAITING_APPROVAL
amountCents: 18000
paymentSource: MONEY
extras:
- type: HOMEPAGE_PLACEMENT
priceCents: 5000
currency: RON
chargedCents: 5000
'400':
description: Invalid input
'401':
description: Missing or invalid API key
'403':
description: The key lacks the required scope
security:
- apiKey: []
- oauth2:
- PUBLICATIONS_WRITE
x-codeSamples:
- lang: Shell
label: curl
source: "curl --location 'https://app.comunicate.eu/api/v1/partner/publications' \\\n --header 'Authorization: Bearer bk_live_…' \\\n --header 'Content-Type: application/json' \\\n --data '{\n \"articleId\": \"2668…\",\n \"siteIds\": [\"3f1c…\"],\n \"campaignType\": \"SEO\",\n \"extrasBySite\": { \"3f1c…\": [\"HOMEPAGE_PLACEMENT\"] }\n }'"
get:
operationId: get_publications
summary: List publications
description: 'All the organisation''s publications. `status` filters. Cursor-paginated: the response''s `nextCursor` is sent back as `cursor` for the next page, `null` on the last one.
For tracking state, webhooks are better: `publication.published` arrives with the article URL the moment it goes live, while polling burns your rate limit without learning anything extra.
Required scope: `PUBLICATIONS_READ`.'
tags:
- Publications
parameters:
- name: status
in: query
required: false
description: '`DRAFT`, `AWAITING_CONTENT`, `AWAITING_APPROVAL`, `APPROVED`, `QUEUED`, `UPLOADING_MEDIA`, `CREATING_POST`, `VERIFYING`, `SCHEDULED`, `PUBLISHED`, `RETRYING`, `FAILED`, `CANCELLED`.'
schema:
type: string
- name: cursor
in: query
required: false
description: The id of the last publication seen. Absent on the first page.
schema:
type: string
format: uuid
- name: limit
in: query
required: false
description: How many publications per page.
schema:
type: integer
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
additionalProperties: true
example:
items:
- id: 9a3b…
status: PUBLISHED
publishedUrl: https://exemplu.ro/articol
publishedAt: '2026-09-01T08:14:00.000Z'
nextCursor: null
'400':
description: Invalid input
'401':
description: Missing or invalid API key
'403':
description: The key lacks the required scope
security:
- apiKey: []
- oauth2:
- PUBLICATIONS_READ
x-codeSamples:
- lang: Shell
label: curl
source: "curl --location 'https://app.comunicate.eu/api/v1/partner/publications?status=PUBLISHED&limit=50' \\\n --header 'Authorization: Bearer bk_live_…'"
servers:
- url: https://app.comunicate.eu/api/v1
/partner/publications/{publicationId}:
get:
operationId: get_publications_publicationId
summary: One publication
description: 'The whole publication, with its event history and the reason, when it failed or was rejected.
Required scope: `PUBLICATIONS_READ`.'
tags:
- Publications
parameters:
- name: publicationId
in: path
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
additionalProperties: true
example:
id: 9a3b…
status: FAILED
lastError: Site-ul a răspuns 401 la autentificare
attempts: 3
publishedUrl: null
'400':
description: Invalid input
'401':
description: Missing or invalid API key
'403':
description: The key lacks the required scope
security:
- apiKey: []
- oauth2:
- PUBLICATIONS_READ
x-codeSamples:
- lang: Shell
label: curl
source: "curl --location 'https://app.comunicate.eu/api/v1/partner/publications/9a3b…' \\\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)