Uplika Media API
The Media API from Uplika — 4 operation(s) for media.
The Media API from Uplika — 4 operation(s) for media.
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/uplika-com:uplika-com-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: uplika Media API
version: 1.0.0
description: Publish to social channels from your own code. If you would rather have an AI agent do it, connect over MCP instead and skip API keys entirely.
contact:
url: https://uplika.com/en/docs
servers:
- url: https://api.uplika.com
security:
- apiKey: []
tags:
- name: Media
paths:
/v1/media/presign:
post:
summary: Ask for an upload URL and a media id
tags:
- Media
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
fileName:
type: string
description: Original file name.
contentType:
type: string
description: image/jpeg, image/png, image/webp, image/gif
bytes:
type: number
description: File size in bytes.
width:
type: number
description: Pixel width, if you know it.
height:
type: number
description: Pixel height, if you know it.
altText:
type: string
description: What the image shows, for screen readers. Applied to carousel items.
aiGenerated:
type: boolean
description: true when the file was generated or substantially changed with AI. Naver Blog photos get the AI usage label, and Instagram, YouTube and TikTok get their AI declaration unless the post sets it to false.
required:
- fileName
- contentType
- bytes
responses:
default:
description: See the error codes table in the docs.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
operationId: postV1MediaPresign
x-operation-id-source: derived
/v1/media/{id}/complete:
post:
summary: Confirm the upload. We check the object really exists
tags:
- Media
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
default:
description: See the error codes table in the docs.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
operationId: postV1MediaByIdComplete
x-operation-id-source: derived
/v1/media/{id}:
delete:
summary: Remove a media item you uploaded by mistake.
tags:
- Media
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
default:
description: See the error codes table in the docs.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
operationId: deleteV1MediaById
x-operation-id-source: derived
patch:
summary: Mark or clear the AI-made flag.
tags:
- Media
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
aiGenerated:
type: boolean
description: true when the file was generated or substantially changed with AI. Naver Blog photos get the AI usage label, and Instagram, YouTube and TikTok get their AI declaration unless the post sets it to false.
required:
- aiGenerated
responses:
default:
description: See the error codes table in the docs.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
operationId: patchV1MediaById
x-operation-id-source: derived
/v1/media/from-url:
post:
summary: Copy a public file into your workspace in one call
tags:
- Media
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
url:
type: string
description: Public https URL of the file itself.
altText:
type: string
description: What the image shows, for screen readers.
aiGenerated:
type: boolean
description: true when the file was generated or substantially changed with AI. Naver Blog photos get the AI usage label, and Instagram, YouTube and TikTok get their AI declaration unless the post sets it to false.
required:
- url
responses:
default:
description: See the error codes table in the docs.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
operationId: postV1MediaFromUrl
x-operation-id-source: derived
components:
schemas:
Error:
type: object
required:
- error
properties:
error:
type: object
required:
- code
- message
properties:
code:
type: string
enum:
- verification_required
- next_post_taken
- past_comments_not_supported
- past_comments_no_trigger
- automation_not_live
- past_comments_no_post
- past_comments_running
- scheduled_at_invalid
- scheduled_at_range
- draft_and_schedule
- batch_id_invalid
- naver_source_required
- naver_keep_unknown
- post_not_editable
- live_post_no_schedule
- live_post_accounts_fixed
- nothing_to_change
- target_required
- thread_piece
- naver_draft_not_found
- account_required
- invalid_api_key
- forbidden_scope
- no_accounts
- empty_content
- account_not_connected
- account_expired
- platform_not_available
- content_too_long
- media_required
- media_mixed
- media_too_many
- media_too_large
- media_aspect_ratio
- media_dimensions
- media_type_not_supported
- media_too_long
- media_url_invalid
- media_url_blocked
- media_url_unreachable
- media_unreachable
- workspace_required
- workspace_mismatch
- workspace_limit
- platform_already_connected
- quota_exceeded
- workspaces_invalid
- billing_not_configured
- full_access_open
- checkout_failed
- no_subscription
- portal_failed
- media_not_uploaded
- media_expired
- image_unreadable
- media_not_publishable
- media_in_use
- media_delete_failed
- media_store_failed
- upload_bytes_missing
- api_unreachable
- naver_media_kind_mismatch
- naver_media_over_limit
- naver_media_ref_unattached
- media_ref_unknown
- media_ref_not_supported
- media_ref_mixed_channels
- ghost_title_required
- ghost_title_too_long
- ghost_tag_invalid
- ghost_directive_not_supported
- media_not_configured
- post_not_found
- media_not_found
- key_not_found
- grant_not_found
- nothing_to_retry
- not_published
- delete_window_expired
- platform_error
- duplicate_post
- unauthenticated
- platform_rejected_content
- platform_auth_error
- topic_tag_invalid
- youtube_video_not_replaceable
- topic_tag_not_supported
- api_key_revoked
- api_key_expired
- idempotency_key_reused
- publish_in_flight
- extension_outdated
- thread_and_content
- thread_empty
- container_expired
- permission_denied
- invalid_json
- body_too_large
- internal_error
- system_error
- rate_limited
- account_not_found
- account_has_pending_posts
- account_disconnected
- post_unavailable
- post_deleted
- account_busy_publishing
- empty_reply
- cannot_hide_own_reply
- media_fields_required
- not_our_post
- key_name_required
- key_scope_required
- invalid_locale
- url_required
- reference_invalid
- reference_not_naver
- reference_not_public
- reference_not_readable
- reference_too_large
- reference_timeout
- reference_unreachable
- reference_not_read
- bad_post_ref
- post_not_owned
- post_not_in_recent
- upload_session_not_found
- upload_session_full
- media_url_invalid
- media_url_blocked
- media_url_unreachable
- workspace_required
- workspace_mismatch
- workspace_limit
- platform_already_connected
- quota_exceeded
- workspaces_invalid
- billing_not_configured
- full_access_open
- checkout_failed
- no_subscription
- portal_failed
- youtube_title_required
- youtube_title_too_long
- youtube_angle_brackets
- youtube_video_required
- youtube_tags_too_long
- youtube_schedule_needs_private
- youtube_schedule_invalid
- youtube_thumbnail_type
- youtube_thumbnail_too_large
- youtube_short_no_thumbnail
- youtube_no_threads
- instagram_reel_video_required
- instagram_reel_duration
- instagram_story_single_media
- instagram_story_no_extras
- instagram_story_duration
- instagram_cover_reel_only
- instagram_cover_type
- instagram_cover_too_large
- instagram_too_many_collaborators
- instagram_user_tag_position
- instagram_username_invalid
- instagram_audio_invalid
- instagram_audio_reel_only
- instagram_audio_needs_facebook_login
- instagram_audio_unavailable
- facebook_link_with_media
- facebook_link_invalid
- facebook_reel_video_required
- facebook_reel_duration
- facebook_story_single_media
- facebook_story_no_extras
- facebook_story_no_caption
- facebook_schedule_feed_only
- facebook_schedule_invalid
- facebook_schedule_range
- facebook_targeting_text_only
- facebook_targeting_not_editable
- facebook_schedule_no_first_comment
- threads_not_supported
- beta_access_required
- naver_title_required
- naver_title_too_long
- naver_category_required
- pinterest_board_required
- pinterest_board_not_found
- pinterest_link_invalid
- pinterest_link_too_long
- pinterest_title_too_long
- pinterest_alt_text_too_long
- pinterest_video_too_short
- discord_username_invalid
- discord_field_not_editable
- discord_forum_channel
- naver_markdown_unknown
- naver_category_unknown
- naver_category_ambiguous
- naver_form_unknown
- naver_form_required
- content_required
- help_not_found
- invalid_locale
- invalid_category
- invalid_topic
- naver_wrong_blog
- naver_wrong_login
- naver_session_permission
- naver_rate_limited
- naver_not_allowed
- naver_follow_blocked
- naver_engagement_limited
- naver_comment_gone
- upload_stalled
- platform_timeout
- naver_draft_unpublished
- naver_stats_unavailable
- naver_stats_permission
- naver_stats_unreachable
- naver_comments_closed
- naver_post_unavailable
- naver_card_unavailable
- naver_card_not_inserted
- naver_tab_lost
- naver_draft_unknown
- naver_reply_unknown
- naver_publish_unconfirmed
- comments_closed
- refresh_unsupported
- invalid_params
- quota_exceeded
- naver_seo_unavailable
- naver_api_error
- invalid_blog_id
- blog_not_found
- naver_rss_unreachable
- naver_autocomplete_unavailable
- naver_autocomplete_paused
- naver_autocomplete_busy
- research_tool_disabled
- research_tool_not_toggleable
- research_quota_exceeded
- youtube_quota_exhausted
- youtube_search_unavailable
- naver_search_busy
- naver_search_blocked
- naver_search_permission
- naver_seo_busy
- refresh_timeout
- refresh_failed
- naver_reply_media_not_supported
- naver_too_many_tags
- naver_tag_too_long
- naver_tag_has_space
- naver_scheduled_at_conflict
- naver_scheduled_at_mixed
- naver_draft_and_schedule
- naver_font_size_out_of_range
- naver_ui_changed
- naver_not_logged_in
- naver_upload_failed
- naver_publish_failed
- naver_verify_failed
- bridge_unsupported
- bridge_lost
- bridge_stalled
- bridge_timeout
- naver_category_missing
- naver_grammar_rejected
- platform_activity_blocked
- facebook_identity_required
- instagram_collaborator_unavailable
- instagram_upload_failed
- reply_parent_unavailable
- youtube_daily_cap
- thread_broken
- bridge_offline
- bridge_no_window
- naver_clip_video_required
- naver_clip_category_required
- naver_clip_category_unknown
- naver_clip_category_ambiguous
- naver_clip_tag_invalid
- naver_clip_too_many_tags
- naver_clip_visibility_invalid
- clip_no_profile
- clip_profile_mismatch
- clip_upload_failed
- clip_rejected
- clip_unconfirmed
- account_required
- not_supported
- reconsent_required
- feature_in_review
- tiktok_privacy_required
- tiktok_privacy_invalid
- tiktok_branded_private
- tiktok_interaction_disabled
- tiktok_title_required
- tiktok_title_too_long
- tiktok_title_not_supported
- tiktok_cannot_post
- ghost_plan_limit
- ghost_no_permission
- ghost_update_collision
- tiktok_reply_not_supported
message:
type: string
additionalProperties: true
securitySchemes:
apiKey:
type: http
scheme: bearer
description: An API key from the dashboard.
externalDocs:
url: https://uplika.com/en/docs
description: Reference, error codes and per-channel limits.