Comunicate.eu Catalogue API
Which publications exist, what each campaign type costs, and whether your packages cover them.
Which publications exist, what each campaign type costs, and whether your packages cover them.
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-catalogue-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 Catalogue API
version: 1.0.0
contact:
url: https://comunicate.eu/ro/contact
description: 'Operations tagged Catalogue 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: Catalogue
description: Which publications exist, what each campaign type costs, and whether your packages cover them.
paths:
/partner/catalog:
get:
operationId: get_catalog
summary: List publications
description: 'The paginated catalogue, with the same filters as the interface. Each entry also states how it can be paid for: from a package, from the balance, or not at all.
Required scope: `CATALOG_READ`.'
tags:
- Catalogue
parameters:
- name: page
in: query
required: false
description: Requested page, from 1.
schema:
type: integer
- name: pageSize
in: query
required: false
description: Entries per page, at most 100.
schema:
type: integer
- name: search
in: query
required: false
description: Searches name and domain.
schema:
type: string
- name: campaign
in: query
required: false
description: Only publications accepting the given type (see `campaign-types`).
schema:
type: string
- name: serviceType
in: query
required: false
description: '`PUBLISH_ONLY`, `WRITE_AND_PUBLISH`, `HOMEPAGE_PLACEMENT` or `FACEBOOK_SHARE`. For the other three, only sites with an active offer of the requested type appear — plain publishing is the base service, any priced site has it.'
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
entries[].id:
type: string
format: uuid
description: The publication id. Used when requesting a publication.
entries[].metrics:
type: object
additionalProperties: true
description: DR, DA, PA and backlink count. `null` where we have no reading.
entries[].audit:
type: string
enum:
- object
- 'null'
description: '`flagged` is the only field that changes a decision: a site Google flags as dangerous should not be bought.'
entries[].preturiCampanii:
type: object
additionalProperties: true
description: Publication price per accepted campaign type, in minor units.
entries[].access:
type: object
additionalProperties: true
description: '`OWN`, `CREDIT` (covered by a package), `MONEY` (paid from balance), `UNAVAILABLE`. When `packages` has more than one entry, publishing requires `packageTypeId`.'
entries[].masurat:
type: object
additionalProperties: true
description: 'What we measured from our own orders: average hours to going live, how many verified publications are still fine. `null` where we have not published enough.'
example:
entries:
- id: 3f1c…
name: Exemplu.ro
url: https://exemplu.ro
language: ro
niches:
- Auto
metrics:
dr: 34
da: 41
pa: 38
backlinks: 12045
audit:
flagged: false
threatTypes: []
perfMobile: 62
crux: AVERAGE
acceptedCampaigns:
- SEO
- BRAND_AWARENESS
preturiCampanii:
SEO: 18000
BRAND_AWARENESS: 15000
deliveryDays: 2
automat: true
linkPolicy: DOFOLLOW
maxLinks: 2
access:
kind: MONEY
packages: []
priceCents: 18000
currency: RON
affordable: true
page: 1
pageSize: 25
total: 184
'400':
description: Invalid input
'401':
description: Missing or invalid API key
'403':
description: The key lacks the required scope
security:
- apiKey: []
- oauth2:
- CATALOG_READ
x-codeSamples:
- lang: Shell
label: curl
source: "curl --location 'https://app.comunicate.eu/api/v1/partner/catalog?page=1&campaign=SEO' \\\n --header 'Authorization: Bearer bk_live_…'"
servers:
- url: https://app.comunicate.eu/api/v1
/partner/catalog/{siteId}:
get:
operationId: get_catalog_siteId
summary: One publication
description: 'The same shape as a list entry, plus what does not fit in a listing: per-campaign terms, accepted topics, active offers — writing, homepage placement, Facebook sharing. A missing offer for a type means the site does not sell it.
Required scope: `CATALOG_READ`.'
tags:
- Catalogue
parameters:
- name: siteId
in: path
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
additionalProperties: true
example:
id: 3f1c…
name: Exemplu.ro
acceptedTopics: Fără politică, fără jocuri de noroc.
offers:
- serviceType: WRITE_AND_PUBLISH
words: 700
priceCents: 25000
currency: RON
- serviceType: HOMEPAGE_PLACEMENT
words: null
priceCents: 5000
currency: RON
'400':
description: Invalid input
'401':
description: Missing or invalid API key
'403':
description: The key lacks the required scope
security:
- apiKey: []
- oauth2:
- CATALOG_READ
x-codeSamples:
- lang: Shell
label: curl
source: "curl --location 'https://app.comunicate.eu/api/v1/partner/catalog/3f1c…' \\\n --header 'Authorization: Bearer bk_live_…'"
servers:
- url: https://app.comunicate.eu/api/v1
/partner/campaign-types:
get:
operationId: get_campaign_types
summary: Campaign types
description: 'A type is not a label but a set of conditions the article passes or fails on submission. Checking them up front saves a chain of one-by-one rejections.
Which types a given site accepts is a different question, answered by `acceptedCampaigns` in the catalogue.
Required scope: `CATALOG_READ`.'
tags:
- Catalogue
parameters: []
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:
- CATALOG_READ
x-codeSamples:
- lang: Shell
label: curl
source: "curl --location 'https://app.comunicate.eu/api/v1/partner/campaign-types' \\\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)