Agorapulse Media API
Upload media assets to your content library.
Upload media assets to your content library.
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/agorapulse-media-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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: Agorapulse Media API
description: "# Agorapulse API\n\nWelcome to the Agorapulse API. Use it to manage publishing, social inbox conversations, analytics and your content library programmatically.\n\nThe API is organized around REST, uses resource-oriented URLs, returns JSON, and relies on standard HTTP response codes and verbs.\n\n## Base URL\n\nAll requests go to the base URL shown in the **Server** selector, and every endpoint is versioned under a `/v1.0/` prefix.\n\n## Authentication\n\nThe API authenticates requests with an **API key** sent in the `X-API-KEY` HTTP header. Every request must include it:\n\n```http\nGET /v1.0/core/organizations HTTP/1.1\nHost: api.agorapulse.com\nX-API-KEY: your-api-key\n```\n\n```bash\ncurl https://api.agorapulse.com/v1.0/core/organizations \\\n -H \"X-API-KEY: your-api-key\"\n```\n\nKeep your API key secret: it grants access to your account's data. Requests without a valid key return `401 Unauthorized`.\n\n## Resource hierarchy\n\nMost resources are nested under an organization and a workspace:\n\n```\n/v1.0/<domain>/organizations/{organizationId}/workspaces/{workspaceId}/...\n```\n\nStart from `GET /v1.0/core/organizations` to discover your organizations, then list their workspaces and profiles.\n\n## Errors\n\nThe API uses conventional HTTP status codes: `2xx` for success, `4xx` for client errors (a missing or invalid parameter, an unknown resource, a missing API key), and `5xx` for server errors.\n\nError responses carry a JSON body describing the problem, except for `405`, `406` and `415`, which answer with a status only:\n\n```json\n{\n \"code\": 1005,\n \"subCode\": 1104,\n \"message\": \"Media not found: pubmedia_abc123\"\n}\n```\n\n`code` identifies the error family: either a global one (`1` internal, `2` unauthorized, `3` rate limit exceeded, `4` unprocessable input, `5` validation failed), or the component that produced the error. That component is usually the feature you addressed, but not always — a request whose path matches no endpoint is rejected by the API gateway itself and carries the gateway's own code, `1013`, whichever feature the path pointed at. `subCode` is optional and, when present, pinpoints the exact cause within that component; the endpoints that return one document its values. `message` is a human-readable explanation and is not meant to be parsed.\n\n## Webhooks\n\nAgorapulse can push events to your endpoints. See the **Webhooks** section for the available events (for example `PUBLISHING_POST` and `INBOX_ITEM`) and their payloads.\n"
version: '1.0'
contact:
name: Agorapulse API Support
url: https://www.agorapulse.com
email: support@agorapulse.com
x-logo:
url: docs/img/logo.svg
altText: Agorapulse
servers:
- url: https://api.agorapulse.com
description: Production
security:
- bearerAuth: []
tags:
- name: Media
description: Upload media assets to your content library.
paths:
/v1.0/publishing/organizations/{organizationId}/workspaces/{workspaceId}/media:
post:
tags:
- Media
summary: Create a media upload slot
description: Generates a presigned upload URL and registers a media awaiting upload. Upload the file with a PUT request to uploadUrl before expiresAt, replaying every entry of requiredHeaders verbatim, Content-Type included. Then poll GET /media/{mediaUid} until the status is VALID, INVALID or EXPIRED, or subscribe to the PUBLISHING_MEDIA webhook, which fires with the terminal status.
operationId: create
parameters:
- name: organizationId
in: path
description: Organization identifier
required: true
schema:
type: integer
- name: workspaceId
in: path
description: Workspace identifier
required: true
schema:
type: integer
requestBody:
description: Media to create
content:
application/json:
schema:
$ref: '#/components/schemas/CreateMediaOpenRequest'
required: true
responses:
'201':
description: Media upload slot created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/MediaOpenResponse'
'400':
description: Invalid or unsupported file name
/v1.0/publishing/organizations/{organizationId}/workspaces/{workspaceId}/media/{mediaUid}:
get:
tags:
- Media
summary: Get media status
description: Returns the current status and, once probed, the technical metadata of a media
operationId: get
parameters:
- name: organizationId
in: path
description: Organization identifier
required: true
schema:
type: integer
- name: workspaceId
in: path
description: Workspace identifier
required: true
schema:
type: integer
- name: mediaUid
in: path
description: Media identifier
required: true
responses:
'200':
description: Media found
content:
application/json:
schema:
$ref: '#/components/schemas/MediaStatusOpenResponse'
'404':
description: Media not found
'410':
description: Media has expired
/v1.0/library/organizations/{organizationId}/workspaces/{workspaceId}/studio/media/upload:
post:
tags:
- Media
summary: Request a presigned upload URL for studio media
description: Returns a presigned S3 PUT URL that can be used to upload a media file directly to S3
operationId: requestUpload
parameters:
- name: organizationId
in: path
description: Organization identifier
required: true
- name: workspaceId
in: path
description: Workspace identifier
required: true
requestBody:
description: Upload request details
content:
application/json:
schema:
$ref: '#/components/schemas/StudioMediaUploadOpenRequest'
required: true
responses:
'201':
description: Presigned upload URL generated successfully
content:
application/json:
schema:
$ref: '#/components/schemas/StudioMediaUploadOpenResponse'
'400':
description: Invalid request data
'404':
description: Organization or workspace not found
components:
schemas:
NetworkCompatibility:
required:
- issues
- surfaces
type: object
properties:
surfaces:
type: object
additionalProperties:
type: string
description: OK/KO verdict keyed by surface name
issues:
type: object
additionalProperties:
type: array
items:
type: string
description: offending media-rule messages keyed by surface name, present only for surfaces marked KO
description: 'Per-network media compatibility verdict, one entry per surface variant the network exposes: `feed`/ `story`/`reel` for Facebook and Instagram, `default` for every other network.'
MediaOpenResponse:
type: object
properties:
mediaUid:
type: string
description: Unique identifier of the media
example: pubmedia_abc123
uploadUrl:
type: string
description: Presigned S3 URL to PUT the file to. Every header listed in requiredHeaders is part of the URL signature, so the PUT is rejected with a 403 unless all of them are replayed verbatim.
requiredHeaders:
type: object
additionalProperties:
type: string
description: 'Headers that must be replayed verbatim on the PUT upload request, Content-Type included. Do not derive Content-Type yourself: it is signed from the declared file extension and some extensions map to a non-obvious type (.flv is signed as video/flv, not video/x-flv).'
mediaUrl:
type: string
description: Public URL the media will be available at once uploaded
status:
type: object
description: Current status of the media
allOf:
- $ref: '#/components/schemas/PublishingApiMediaStatus'
- type: object
expiresAt:
type: string
description: Expiration timestamp of the presigned upload URL
format: date-time
description: Presigned upload slot for a media file
MediaStatusOpenResponse:
type: object
properties:
mediaUid:
type: string
description: Unique identifier of the media
example: pubmedia_abc123
mediaUrl:
type: string
description: Public URL of the media
status:
type: object
description: Current status of the media
allOf:
- $ref: '#/components/schemas/PublishingApiMediaStatus'
- type: object
mediaType:
type: string
description: '"IMAGE" or "VIDEO"'
example: IMAGE
metadata:
type: object
description: Probed technical metadata, null until the media has been probed
nullable: true
allOf:
- $ref: '#/components/schemas/PublishingApiMediaMetadata'
- type: object
errors:
type: array
description: Validation errors found while probing the media, empty when valid
items:
$ref: '#/components/schemas/PublishingApiMediaError'
compatibility:
type: object
additionalProperties:
$ref: '#/components/schemas/NetworkCompatibility'
description: Per-network media compatibility check, keyed by account type; null until the media is VALID
nullable: true
description: Status and metadata of a media
PublishingApiMediaStatus:
type: string
description: Current status of the media
enum:
- AWAITING_UPLOAD
- PROCESSING
- VALID
- INVALID
- EXPIRED
StudioMediaUploadOpenRequest:
required:
- contentType
- extension
- fileSize
- origin
type: object
properties:
extension:
minLength: 1
type: string
description: File extension
example: jpg
fileSize:
minimum: 0
exclusiveMinimum: true
type: integer
description: File size in bytes
format: int64
example: 1048576
contentType:
minLength: 1
type: string
description: Content type (MIME)
example: image/jpeg
origin:
minLength: 1
type: string
description: Origin of the upload request
example: lovable
contentStudioSessionId:
type: string
description: Optional Content Studio session ID for grouping uploads
nullable: true
description: Request to obtain a presigned upload URL for a studio media
PublishingApiMediaError:
required:
- code
- message
type: object
properties:
code:
type: string
message:
type: string
CreateMediaOpenRequest:
required:
- fileName
type: object
properties:
fileName:
minLength: 1
type: string
description: File name with extension, e.g. clip.mp4
example: clip.mp4
description: Request to create a media upload slot
StudioMediaUploadOpenResponse:
type: object
properties:
uploadUrl:
type: string
description: Presigned PUT URL - upload file with HTTP PUT to this URL
filename:
type: string
description: S3 object key
publicUrl:
type: string
description: CDN URL to access the uploaded file
baseUrl:
type: string
description: S3 URL to access the uploaded file
expiresInSeconds:
type: integer
description: URL expiration in seconds
format: int32
requiredHeaders:
type: object
additionalProperties:
type: string
description: Headers the client MUST include in the PUT upload request
description: Presigned URL for direct S3 upload
PublishingApiMediaMetadata:
type: object
properties:
width:
type: integer
format: int32
height:
type: integer
format: int32
durationSeconds:
type: number
format: double
sizeBytes:
type: integer
format: int64
format:
type: string
animated:
type: boolean
rotation:
type: integer
format: int32
description: Probed technical metadata, null until the media has been probed
securitySchemes:
bearerAuth:
type: apiKey
name: X-API-KEY
in: header
HookSignature:
description: 'The signature of the webhook request, used to verify the authenticity of the request.
The signature is a SHA256 HMAC signature computed on the request body using the shared secret from your webhook subscription.
'
type: apiKey
name: X-Hook-Signature
in: header
x-tagGroups:
- name: Account & Workspaces
tags:
- Organizations
- Workspaces
- Profiles
- Groups
- name: Publishing
tags:
- Drafts
- Calendar notes
- Pinterest boards
- name: Content Library
tags:
- Media
- name: Inbox & Engagement
tags:
- Conversations
- Items
- Replies
- name: Analytics & Reporting
tags:
- Reports
- name: System
tags:
- Health