@postrun/js 2.2.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -361,7 +361,7 @@ type ClientOptions = {
361
361
  *
362
362
  * The closed set of machine-readable Postrun error codes. Branch on this. Each links to https://docs.postrun.ai/errors/<code>.
363
363
  */
364
- type ErrorCode = 'unauthorized' | 'forbidden' | 'not_found' | 'conflict' | 'validation_failed' | 'rate_limited' | 'internal_error' | 'idempotency_key_invalid' | 'idempotency_key_reused' | 'idempotency_request_in_progress' | 'account_not_available' | 'connection_reauth_required' | 'connection_not_pending' | 'not_implemented' | 'connection_discovery_failed' | 'tiktok_creator_info_unavailable' | 'media_processing' | 'not_publishable' | 'invalid_connection' | 'invalid_media' | 'profile_scope_invalid' | 'media_unprobeable' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_format_indeterminate' | 'media_count_invalid' | 'body_too_long' | 'content_missing' | 'content_conflict' | 'content_incomplete' | 'content_kind_mismatch' | 'media_type_mismatch' | 'tag_limit_exceeded' | 'reel_field_on_non_reel' | 'field_placement_invalid' | 'media_not_ready' | 'media_failed' | 'media_unsupported' | 'media_kind_mismatch' | 'variant_unparseable' | 'publishing_unavailable' | 'x_duplicate_content' | 'x_not_authorized' | 'x_access_not_permitted' | 'x_rate_limited' | 'x_publish_failed' | 'x_media_upload_failed' | 'linkedin_duplicate_content' | 'linkedin_auth_expired' | 'linkedin_permission_denied' | 'linkedin_rate_limited' | 'linkedin_media_processing' | 'linkedin_media_failed' | 'linkedin_media_upload_failed' | 'linkedin_publish_failed' | 'instagram_media_processing' | 'instagram_container_expired' | 'instagram_container_failed' | 'instagram_rate_limited' | 'instagram_not_authorized' | 'instagram_publish_failed' | 'facebook_reel_processing' | 'facebook_reel_failed' | 'facebook_rate_limited' | 'facebook_not_authorized' | 'facebook_publish_failed' | 'tiktok_privacy_not_allowed' | 'tiktok_duration_exceeds_max' | 'tiktok_media_processing' | 'tiktok_not_authorized' | 'tiktok_rate_limited' | 'tiktok_publish_failed' | 'post_publish_failed' | 'post_partially_published' | 'connection_platform_mismatch' | 'connection_removed';
364
+ type ErrorCode = 'unauthorized' | 'forbidden' | 'not_found' | 'conflict' | 'validation_failed' | 'rate_limited' | 'internal_error' | 'idempotency_key_invalid' | 'idempotency_key_reused' | 'idempotency_request_in_progress' | 'account_not_available' | 'connection_reauth_required' | 'connection_not_pending' | 'not_implemented' | 'connection_discovery_failed' | 'tiktok_creator_info_unavailable' | 'media_processing' | 'not_publishable' | 'invalid_connection' | 'invalid_media' | 'profile_scope_invalid' | 'media_unprobeable' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_format_indeterminate' | 'media_format_unsupported' | 'media_count_invalid' | 'body_too_long' | 'content_missing' | 'content_conflict' | 'content_incomplete' | 'content_kind_mismatch' | 'media_type_mismatch' | 'tag_limit_exceeded' | 'reel_field_on_non_reel' | 'field_placement_invalid' | 'media_not_ready' | 'media_failed' | 'media_unsupported' | 'media_kind_mismatch' | 'variant_unparseable' | 'publishing_unavailable' | 'x_duplicate_content' | 'x_not_authorized' | 'x_access_not_permitted' | 'x_rate_limited' | 'x_publish_failed' | 'x_media_upload_failed' | 'linkedin_duplicate_content' | 'linkedin_auth_expired' | 'linkedin_permission_denied' | 'linkedin_rate_limited' | 'linkedin_media_processing' | 'linkedin_media_failed' | 'linkedin_media_upload_failed' | 'linkedin_publish_failed' | 'instagram_media_processing' | 'instagram_container_expired' | 'instagram_container_failed' | 'instagram_rate_limited' | 'instagram_not_authorized' | 'instagram_publish_failed' | 'facebook_reel_processing' | 'facebook_reel_failed' | 'facebook_rate_limited' | 'facebook_not_authorized' | 'facebook_publish_failed' | 'tiktok_privacy_not_allowed' | 'tiktok_duration_exceeds_max' | 'tiktok_media_processing' | 'tiktok_not_authorized' | 'tiktok_rate_limited' | 'tiktok_url_ownership_unverified' | 'tiktok_unaudited_private_only' | 'tiktok_spam_risk' | 'tiktok_publish_failed' | 'post_publish_failed' | 'post_partially_published' | 'connection_platform_mismatch' | 'connection_removed';
365
365
  type ProfilesListData = {
366
366
  body?: never;
367
367
  path?: never;
@@ -3739,7 +3739,7 @@ type MediaListResponses = {
3739
3739
  */
3740
3740
  kind: 'image' | 'video' | 'gif' | 'document' | null;
3741
3741
  /**
3742
- * The detected MIME of the uploaded original (e.g. video/mp4), sniffed from the bytes (or the value you provided as an override). null only in the brief pre-detection window while status is `uploading`.
3742
+ * The detected MIME of the uploaded original (e.g. video/mp4), sniffed from the bytes. null only in the brief pre-detection window while status is `uploading`.
3743
3743
  */
3744
3744
  content_type: string | null;
3745
3745
  status: 'uploading' | 'processing' | 'ready' | 'failed';
@@ -3755,11 +3755,15 @@ type MediaListResponses = {
3755
3755
  * Asset-wide failure (the original itself is unusable, so no platform can succeed); null otherwise.
3756
3756
  */
3757
3757
  error: {
3758
- code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
3758
+ code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_format_unsupported' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
3759
3759
  message: string;
3760
3760
  hint?: string;
3761
3761
  allowed?: Array<string>;
3762
3762
  got?: string;
3763
+ /**
3764
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string. Size/limit codes interpolate the human cap/size.
3765
+ */
3766
+ display_error: string;
3763
3767
  } | null;
3764
3768
  source: {
3765
3769
  /**
@@ -3783,18 +3787,26 @@ type MediaListResponses = {
3783
3787
  height: number | null;
3784
3788
  bytes: number | null;
3785
3789
  warnings: Array<{
3786
- code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
3790
+ code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_format_unsupported' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
3787
3791
  message: string;
3788
3792
  hint?: string;
3789
3793
  allowed?: Array<string>;
3790
3794
  got?: string;
3795
+ /**
3796
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string. Size/limit codes interpolate the human cap/size.
3797
+ */
3798
+ display_error: string;
3791
3799
  }>;
3792
3800
  errors: Array<{
3793
- code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
3801
+ code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_format_unsupported' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
3794
3802
  message: string;
3795
3803
  hint?: string;
3796
3804
  allowed?: Array<string>;
3797
3805
  got?: string;
3806
+ /**
3807
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string. Size/limit codes interpolate the human cap/size.
3808
+ */
3809
+ display_error: string;
3798
3810
  }>;
3799
3811
  };
3800
3812
  };
@@ -3835,7 +3847,7 @@ type MediaListResponses = {
3835
3847
  type MediaListResponse = MediaListResponses[keyof MediaListResponses];
3836
3848
  type MediaCreateData = {
3837
3849
  /**
3838
- * Create a media asset — either via the signed direct upload target (omit source_url) or by importing from a public https source_url (we fetch + validate + transform + store). Size limits: a direct-upload video may be up to 5 GB; all other direct uploads and any source_url import must be 1 GB or smaller. A file over its limit is rejected with `media_too_large`.
3850
+ * Create a media asset — either via the signed direct upload target (omit source_url) or by importing from a public https source_url (we fetch + validate + transform + store). Size limits (same for direct upload and source_url): a video may be up to 4 GB; every other kind must be 1 GB or smaller. A file over its limit is rejected with `media_too_large`.
3839
3851
  */
3840
3852
  body: {
3841
3853
  /**
@@ -3843,15 +3855,7 @@ type MediaCreateData = {
3843
3855
  */
3844
3856
  profile_id: string;
3845
3857
  /**
3846
- * Optional override of the asset family. Omit it and we auto-detect it from the uploaded bytes (file-type magic-number sniff). Provide it only to force a family — a provided value wins over detection.
3847
- */
3848
- kind?: 'image' | 'video' | 'gif' | 'document';
3849
- /**
3850
- * Optional hint/override of the MIME; auto-detected from the bytes when omitted. Accepts image*, video*, or a document MIME (PDF/DOC/DOCX/PPT/PPTX). Still required for a legacy Office binary (.doc/.ppt), which magic bytes can’t disambiguate.
3851
- */
3852
- content_type?: string;
3853
- /**
3854
- * A public https URL to import the bytes from. When supplied, we fetch (SSRF-guarded), validate, transform, and store the media server-side — no signed upload target is returned (`upload` is null). Omit it to PUT the bytes to the signed upload target instead. The imported file must be 1 GB or smaller (a larger source is rejected with `media_too_large`).
3858
+ * A public https URL to import the bytes from. When supplied, we fetch (SSRF-guarded), validate, transform, and store the media server-side — no signed upload target is returned (`upload` is null). Omit it to PUT the bytes to the signed upload target instead. Size limits match a direct upload: a video may be up to 4 GB, every other kind up to 1 GB (a larger source is rejected with `media_too_large`).
3855
3859
  */
3856
3860
  source_url?: string;
3857
3861
  /**
@@ -3859,7 +3863,7 @@ type MediaCreateData = {
3859
3863
  */
3860
3864
  targets?: Array<'x' | 'linkedin' | 'facebook_page' | 'instagram' | 'tiktok' | 'google_ads'>;
3861
3865
  /**
3862
- * false (default) = process to platform-ready (validate + transform). true = validate against the targets but NEVER transform and NEVER block on MEDIA validation: every targeted platform gets a ready entry on the ORIGINAL url, with any "would have resized/converted/rejected" surfaced as a non-blocking finding in `warnings`. The platform is the final judge. (The one boundary raw does NOT relax: `google_ads` is image-only, so a non-image asset targeting it is still rejected at create — a target-kind error, not a media-quality verdict.)
3866
+ * false (default) = process to platform-ready (validate + transform). true = validate against the targets but NEVER transform and NEVER block on MEDIA validation: every targeted platform gets a ready entry on the ORIGINAL url, with any "would have resized/converted/rejected" surfaced as a non-blocking finding in `warnings`. The platform is the final judge. (The one boundary raw does NOT relax: `google_ads` is image-only, so once byte-detection finds the asset is not an image, that target is rejected with a typed `media_unsupported` failure — a target-kind error, not a media-quality verdict.)
3863
3867
  */
3864
3868
  raw?: boolean;
3865
3869
  alt_text?: string;
@@ -4094,7 +4098,7 @@ type MediaCreateResponses = {
4094
4098
  */
4095
4099
  kind: 'image' | 'video' | 'gif' | 'document' | null;
4096
4100
  /**
4097
- * The detected MIME of the uploaded original (e.g. video/mp4), sniffed from the bytes (or the value you provided as an override). null only in the brief pre-detection window while status is `uploading`.
4101
+ * The detected MIME of the uploaded original (e.g. video/mp4), sniffed from the bytes. null only in the brief pre-detection window while status is `uploading`.
4098
4102
  */
4099
4103
  content_type: string | null;
4100
4104
  status: 'uploading' | 'processing' | 'ready' | 'failed';
@@ -4110,11 +4114,15 @@ type MediaCreateResponses = {
4110
4114
  * Asset-wide failure (the original itself is unusable, so no platform can succeed); null otherwise.
4111
4115
  */
4112
4116
  error: {
4113
- code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
4117
+ code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_format_unsupported' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
4114
4118
  message: string;
4115
4119
  hint?: string;
4116
4120
  allowed?: Array<string>;
4117
4121
  got?: string;
4122
+ /**
4123
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string. Size/limit codes interpolate the human cap/size.
4124
+ */
4125
+ display_error: string;
4118
4126
  } | null;
4119
4127
  source: {
4120
4128
  /**
@@ -4138,18 +4146,26 @@ type MediaCreateResponses = {
4138
4146
  height: number | null;
4139
4147
  bytes: number | null;
4140
4148
  warnings: Array<{
4141
- code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
4149
+ code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_format_unsupported' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
4142
4150
  message: string;
4143
4151
  hint?: string;
4144
4152
  allowed?: Array<string>;
4145
4153
  got?: string;
4154
+ /**
4155
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string. Size/limit codes interpolate the human cap/size.
4156
+ */
4157
+ display_error: string;
4146
4158
  }>;
4147
4159
  errors: Array<{
4148
- code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
4160
+ code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_format_unsupported' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
4149
4161
  message: string;
4150
4162
  hint?: string;
4151
4163
  allowed?: Array<string>;
4152
4164
  got?: string;
4165
+ /**
4166
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string. Size/limit codes interpolate the human cap/size.
4167
+ */
4168
+ display_error: string;
4153
4169
  }>;
4154
4170
  };
4155
4171
  };
@@ -4637,7 +4653,7 @@ type MediaGetResponses = {
4637
4653
  */
4638
4654
  kind: 'image' | 'video' | 'gif' | 'document' | null;
4639
4655
  /**
4640
- * The detected MIME of the uploaded original (e.g. video/mp4), sniffed from the bytes (or the value you provided as an override). null only in the brief pre-detection window while status is `uploading`.
4656
+ * The detected MIME of the uploaded original (e.g. video/mp4), sniffed from the bytes. null only in the brief pre-detection window while status is `uploading`.
4641
4657
  */
4642
4658
  content_type: string | null;
4643
4659
  status: 'uploading' | 'processing' | 'ready' | 'failed';
@@ -4653,11 +4669,15 @@ type MediaGetResponses = {
4653
4669
  * Asset-wide failure (the original itself is unusable, so no platform can succeed); null otherwise.
4654
4670
  */
4655
4671
  error: {
4656
- code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
4672
+ code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_format_unsupported' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
4657
4673
  message: string;
4658
4674
  hint?: string;
4659
4675
  allowed?: Array<string>;
4660
4676
  got?: string;
4677
+ /**
4678
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string. Size/limit codes interpolate the human cap/size.
4679
+ */
4680
+ display_error: string;
4661
4681
  } | null;
4662
4682
  source: {
4663
4683
  /**
@@ -4681,18 +4701,26 @@ type MediaGetResponses = {
4681
4701
  height: number | null;
4682
4702
  bytes: number | null;
4683
4703
  warnings: Array<{
4684
- code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
4704
+ code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_format_unsupported' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
4685
4705
  message: string;
4686
4706
  hint?: string;
4687
4707
  allowed?: Array<string>;
4688
4708
  got?: string;
4709
+ /**
4710
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string. Size/limit codes interpolate the human cap/size.
4711
+ */
4712
+ display_error: string;
4689
4713
  }>;
4690
4714
  errors: Array<{
4691
- code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
4715
+ code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_format_unsupported' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
4692
4716
  message: string;
4693
4717
  hint?: string;
4694
4718
  allowed?: Array<string>;
4695
4719
  got?: string;
4720
+ /**
4721
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string. Size/limit codes interpolate the human cap/size.
4722
+ */
4723
+ display_error: string;
4696
4724
  }>;
4697
4725
  };
4698
4726
  };
@@ -4957,7 +4985,7 @@ type MediaUpdateResponses = {
4957
4985
  */
4958
4986
  kind: 'image' | 'video' | 'gif' | 'document' | null;
4959
4987
  /**
4960
- * The detected MIME of the uploaded original (e.g. video/mp4), sniffed from the bytes (or the value you provided as an override). null only in the brief pre-detection window while status is `uploading`.
4988
+ * The detected MIME of the uploaded original (e.g. video/mp4), sniffed from the bytes. null only in the brief pre-detection window while status is `uploading`.
4961
4989
  */
4962
4990
  content_type: string | null;
4963
4991
  status: 'uploading' | 'processing' | 'ready' | 'failed';
@@ -4973,11 +5001,15 @@ type MediaUpdateResponses = {
4973
5001
  * Asset-wide failure (the original itself is unusable, so no platform can succeed); null otherwise.
4974
5002
  */
4975
5003
  error: {
4976
- code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
5004
+ code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_format_unsupported' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
4977
5005
  message: string;
4978
5006
  hint?: string;
4979
5007
  allowed?: Array<string>;
4980
5008
  got?: string;
5009
+ /**
5010
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string. Size/limit codes interpolate the human cap/size.
5011
+ */
5012
+ display_error: string;
4981
5013
  } | null;
4982
5014
  source: {
4983
5015
  /**
@@ -5001,18 +5033,26 @@ type MediaUpdateResponses = {
5001
5033
  height: number | null;
5002
5034
  bytes: number | null;
5003
5035
  warnings: Array<{
5004
- code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
5036
+ code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_format_unsupported' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
5005
5037
  message: string;
5006
5038
  hint?: string;
5007
5039
  allowed?: Array<string>;
5008
5040
  got?: string;
5041
+ /**
5042
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string. Size/limit codes interpolate the human cap/size.
5043
+ */
5044
+ display_error: string;
5009
5045
  }>;
5010
5046
  errors: Array<{
5011
- code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
5047
+ code: 'media_unprobeable' | 'media_format_indeterminate' | 'media_format_unsupported' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_unsupported';
5012
5048
  message: string;
5013
5049
  hint?: string;
5014
5050
  allowed?: Array<string>;
5015
5051
  got?: string;
5052
+ /**
5053
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string. Size/limit codes interpolate the human cap/size.
5054
+ */
5055
+ display_error: string;
5016
5056
  }>;
5017
5057
  };
5018
5058
  };
@@ -5347,6 +5387,10 @@ type PostsListResponses = {
5347
5387
  error: {
5348
5388
  code: string;
5349
5389
  message: string;
5390
+ /**
5391
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string.
5392
+ */
5393
+ display_error: string;
5350
5394
  } | null;
5351
5395
  media: Array<{
5352
5396
  media_id: string;
@@ -6108,6 +6152,10 @@ type PostsCreateResponses = {
6108
6152
  error: {
6109
6153
  code: string;
6110
6154
  message: string;
6155
+ /**
6156
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string.
6157
+ */
6158
+ display_error: string;
6111
6159
  } | null;
6112
6160
  media: Array<{
6113
6161
  media_id: string;
@@ -6645,6 +6693,10 @@ type PostsGetResponses = {
6645
6693
  error: {
6646
6694
  code: string;
6647
6695
  message: string;
6696
+ /**
6697
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string.
6698
+ */
6699
+ display_error: string;
6648
6700
  } | null;
6649
6701
  media: Array<{
6650
6702
  media_id: string;
@@ -7381,6 +7433,10 @@ type PostsUpdateResponses = {
7381
7433
  error: {
7382
7434
  code: string;
7383
7435
  message: string;
7436
+ /**
7437
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade; this is the display string.
7438
+ */
7439
+ display_error: string;
7384
7440
  } | null;
7385
7441
  media: Array<{
7386
7442
  media_id: string;
@@ -8037,13 +8093,17 @@ type PostsValidateResponses = {
8037
8093
  object: 'validation';
8038
8094
  publishable: boolean;
8039
8095
  issues: Array<{
8040
- code: 'unauthorized' | 'forbidden' | 'not_found' | 'conflict' | 'validation_failed' | 'rate_limited' | 'internal_error' | 'idempotency_key_invalid' | 'idempotency_key_reused' | 'idempotency_request_in_progress' | 'account_not_available' | 'connection_reauth_required' | 'connection_not_pending' | 'not_implemented' | 'connection_discovery_failed' | 'tiktok_creator_info_unavailable' | 'media_processing' | 'not_publishable' | 'invalid_connection' | 'invalid_media' | 'profile_scope_invalid' | 'media_unprobeable' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_format_indeterminate' | 'media_count_invalid' | 'body_too_long' | 'content_missing' | 'content_conflict' | 'content_incomplete' | 'content_kind_mismatch' | 'media_type_mismatch' | 'tag_limit_exceeded' | 'reel_field_on_non_reel' | 'field_placement_invalid' | 'media_not_ready' | 'media_failed' | 'media_unsupported' | 'media_kind_mismatch' | 'variant_unparseable' | 'publishing_unavailable' | 'x_duplicate_content' | 'x_not_authorized' | 'x_access_not_permitted' | 'x_rate_limited' | 'x_publish_failed' | 'x_media_upload_failed' | 'linkedin_duplicate_content' | 'linkedin_auth_expired' | 'linkedin_permission_denied' | 'linkedin_rate_limited' | 'linkedin_media_processing' | 'linkedin_media_failed' | 'linkedin_media_upload_failed' | 'linkedin_publish_failed' | 'instagram_media_processing' | 'instagram_container_expired' | 'instagram_container_failed' | 'instagram_rate_limited' | 'instagram_not_authorized' | 'instagram_publish_failed' | 'facebook_reel_processing' | 'facebook_reel_failed' | 'facebook_rate_limited' | 'facebook_not_authorized' | 'facebook_publish_failed' | 'tiktok_privacy_not_allowed' | 'tiktok_duration_exceeds_max' | 'tiktok_media_processing' | 'tiktok_not_authorized' | 'tiktok_rate_limited' | 'tiktok_publish_failed' | 'post_publish_failed' | 'post_partially_published' | 'connection_platform_mismatch' | 'connection_removed';
8096
+ code: 'unauthorized' | 'forbidden' | 'not_found' | 'conflict' | 'validation_failed' | 'rate_limited' | 'internal_error' | 'idempotency_key_invalid' | 'idempotency_key_reused' | 'idempotency_request_in_progress' | 'account_not_available' | 'connection_reauth_required' | 'connection_not_pending' | 'not_implemented' | 'connection_discovery_failed' | 'tiktok_creator_info_unavailable' | 'media_processing' | 'not_publishable' | 'invalid_connection' | 'invalid_media' | 'profile_scope_invalid' | 'media_unprobeable' | 'media_too_large' | 'media_aspect_ratio_unsupported' | 'media_resolution_too_low' | 'media_gif_unsupported' | 'media_format_recompressed' | 'media_resolution_downscaled' | 'video_container_unsupported' | 'video_codec_unsupported' | 'video_audio_codec_unsupported' | 'video_too_large' | 'video_too_small' | 'video_dimensions_unsupported' | 'video_dimensions_too_large' | 'video_fps_unsupported' | 'video_fps_too_low' | 'video_aspect_unsupported' | 'video_duration_too_short' | 'video_duration_exceeds_max' | 'video_transform_failed' | 'media_fetch_failed' | 'document_format_unsupported' | 'document_too_large' | 'document_too_many_pages' | 'media_format_indeterminate' | 'media_format_unsupported' | 'media_count_invalid' | 'body_too_long' | 'content_missing' | 'content_conflict' | 'content_incomplete' | 'content_kind_mismatch' | 'media_type_mismatch' | 'tag_limit_exceeded' | 'reel_field_on_non_reel' | 'field_placement_invalid' | 'media_not_ready' | 'media_failed' | 'media_unsupported' | 'media_kind_mismatch' | 'variant_unparseable' | 'publishing_unavailable' | 'x_duplicate_content' | 'x_not_authorized' | 'x_access_not_permitted' | 'x_rate_limited' | 'x_publish_failed' | 'x_media_upload_failed' | 'linkedin_duplicate_content' | 'linkedin_auth_expired' | 'linkedin_permission_denied' | 'linkedin_rate_limited' | 'linkedin_media_processing' | 'linkedin_media_failed' | 'linkedin_media_upload_failed' | 'linkedin_publish_failed' | 'instagram_media_processing' | 'instagram_container_expired' | 'instagram_container_failed' | 'instagram_rate_limited' | 'instagram_not_authorized' | 'instagram_publish_failed' | 'facebook_reel_processing' | 'facebook_reel_failed' | 'facebook_rate_limited' | 'facebook_not_authorized' | 'facebook_publish_failed' | 'tiktok_privacy_not_allowed' | 'tiktok_duration_exceeds_max' | 'tiktok_media_processing' | 'tiktok_not_authorized' | 'tiktok_rate_limited' | 'tiktok_url_ownership_unverified' | 'tiktok_unaudited_private_only' | 'tiktok_spam_risk' | 'tiktok_publish_failed' | 'post_publish_failed' | 'post_partially_published' | 'connection_platform_mismatch' | 'connection_removed';
8041
8097
  message: string;
8042
8098
  hint?: string;
8043
8099
  allowed?: Array<string>;
8044
8100
  got?: string;
8045
8101
  variant_index: number;
8046
8102
  path: Array<string | number>;
8103
+ /**
8104
+ * Short, friendly, render-this end-user line (the Plaid display_message model). The `code` stays the branch key for customer branching; `message` stays developer-grade. Populated centrally — never at construction sites.
8105
+ */
8106
+ display_error: string;
8047
8107
  }>;
8048
8108
  };
8049
8109
  };
@@ -21422,6 +21482,10 @@ type LogsListResponses = {
21422
21482
  */
21423
21483
  code: string;
21424
21484
  message: string;
21485
+ /**
21486
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade.
21487
+ */
21488
+ display_error: string;
21425
21489
  } | null;
21426
21490
  }>;
21427
21491
  } | null;
@@ -21775,6 +21839,10 @@ type LogsGetResponses = {
21775
21839
  */
21776
21840
  code: string;
21777
21841
  message: string;
21842
+ /**
21843
+ * A short, friendly end-user line for `code` (render verbatim). `message` stays developer-grade.
21844
+ */
21845
+ display_error: string;
21778
21846
  } | null;
21779
21847
  }>;
21780
21848
  } | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@postrun/js",
3
- "version": "2.2.1",
3
+ "version": "2.3.0",
4
4
  "description": "Typed JavaScript client + client-side validation for the Postrun API",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://postrun.ai",