|
1 | 1 | # Platform-Specific Options |
2 | 2 |
|
| 3 | +## Platform Availability |
| 4 | + |
| 5 | +Not every platform is publishable at every moment. Each one carries a |
| 6 | +server-controlled availability state, which you can read from |
| 7 | +`GET /api/platforms`: |
| 8 | + |
| 9 | +| State | New connections | Existing channels | Meaning | |
| 10 | +|-------|-----------------|-------------------|---------| |
| 11 | +| `on` | ✅ | ✅ publish normally | Fully available. | |
| 12 | +| `connect_off` | ❌ | ✅ publish normally | New connections are paused — typically while a platform app review is pending. Customers already connected are unaffected. | |
| 13 | +| `off` | ❌ | ⏸ posts **held** | Kill switch. Posts are held, **not failed**, and publish automatically once the platform is re-enabled. | |
| 14 | + |
| 15 | +Disabled platforms are always **included** in the response with `enabled: false` |
| 16 | +and a `reason` — never omitted — so you can distinguish "switched off right now" |
| 17 | +from "not supported". |
| 18 | + |
| 19 | +```json |
| 20 | +{ |
| 21 | + "platforms": [ |
| 22 | + { |
| 23 | + "platform": "tumblr", |
| 24 | + "displayName": "Tumblr", |
| 25 | + "enabled": true, |
| 26 | + "state": "on", |
| 27 | + "reason": "enabled", |
| 28 | + "canConnect": true, |
| 29 | + "canPublish": true, |
| 30 | + "message": null |
| 31 | + } |
| 32 | + ] |
| 33 | +} |
| 34 | +``` |
| 35 | + |
| 36 | +Creating or publishing a post that targets an `off` platform returns **403** with |
| 37 | +`code: "PLATFORM_DISABLED"`: |
| 38 | + |
| 39 | +```json |
| 40 | +{ |
| 41 | + "error": { |
| 42 | + "message": "LinkedIn is temporarily unavailable. Scheduled posts are on hold and will publish once it's back.", |
| 43 | + "code": "PLATFORM_DISABLED", |
| 44 | + "platform": "linkedin", |
| 45 | + "state": "off", |
| 46 | + "reason": "flag_off" |
| 47 | + } |
| 48 | +} |
| 49 | +``` |
| 50 | + |
| 51 | +This is distinct from `FEATURE_DISABLED`, which means the platform is not |
| 52 | +included in the organization's plan. `PLATFORM_DISABLED` is temporary and |
| 53 | +resolves without any action from you; `FEATURE_DISABLED` requires an upgrade. |
| 54 | + |
| 55 | +Posts already scheduled when a platform goes `off` need no intervention — do not |
| 56 | +delete and recreate them. They remain scheduled and publish on their own once |
| 57 | +the platform returns. |
| 58 | + |
| 59 | + |
3 | 60 | ## Post Types by Platform |
4 | 61 |
|
5 | 62 | Use the `postTypeOverrides` field to set a specific post type per platform: |
@@ -27,6 +84,7 @@ Use the `postTypeOverrides` field to set a specific post type per platform: |
27 | 84 | | Bluesky | `post` (use `postFormat: "thread"` for threads) | |
28 | 85 | | Mastodon | `post` (use `postFormat: "thread"` for threads) | |
29 | 86 | | Google Business | `standard`, `event`, `offer` | |
| 87 | +| Tumblr | `post` | |
30 | 88 |
|
31 | 89 | If not specified, the platform's default post type is used based on the attached media. |
32 | 90 |
|
@@ -505,6 +563,51 @@ No platform-specific options. Standard post creation with text, images, and vide |
505 | 563 |
|
506 | 564 | --- |
507 | 565 |
|
| 566 | +## Tumblr |
| 567 | + |
| 568 | +```json |
| 569 | +{ |
| 570 | + "platformSpecific": { |
| 571 | + "tumblr": { |
| 572 | + "12": { |
| 573 | + "blogName": "myblog", |
| 574 | + "title": "An optional heading", |
| 575 | + "tags": ["art", "design"], |
| 576 | + "link": "https://example.com", |
| 577 | + "sourceUrl": "https://example.com/original" |
| 578 | + } |
| 579 | + } |
| 580 | + } |
| 581 | +} |
| 582 | +``` |
| 583 | + |
| 584 | +### Options |
| 585 | + |
| 586 | +| Field | Type | Description | |
| 587 | +|-------|------|-------------| |
| 588 | +| `blogName` | string | Which blog to publish to. Defaults to the blog the channel was connected as. | |
| 589 | +| `title` | string | Rendered as a heading above the post body. | |
| 590 | +| `tags` | string[] | Tumblr tags, without the leading `#`. | |
| 591 | +| `link` | string | Appended to the post as a link block. | |
| 592 | +| `sourceUrl` | string | Attribution URL stored as the post's source. | |
| 593 | + |
| 594 | +Note that `platformSpecific.tumblr` is keyed by **channel ID**, because a single |
| 595 | +Tumblr account can own several blogs and each connected channel may target a |
| 596 | +different one. |
| 597 | + |
| 598 | +### Notes |
| 599 | + |
| 600 | +- A Tumblr account usually owns multiple blogs. The channel connects as the |
| 601 | + account's **primary** blog; use `blogName` to publish to a different one. |
| 602 | + Call `GET /api/channels/{id}/options` to list the available blogs. |
| 603 | +- Up to **30 images** per post, **or exactly one video** — a video cannot be |
| 604 | + mixed with images in the same post. |
| 605 | +- Tags matter more on Tumblr than on most networks: they drive discovery. |
| 606 | +- Posts are built with Tumblr's Neue Post Format. Content longer than 4,096 |
| 607 | + characters is automatically split across multiple text blocks. |
| 608 | + |
| 609 | +--- |
| 610 | + |
508 | 611 | ## Post Type Overrides |
509 | 612 |
|
510 | 613 | When publishing to multiple platforms, you may want different post types per platform. Use `postTypeOverrides`: |
@@ -545,5 +648,6 @@ Each platform enforces its own character limit on the `content` field: |
545 | 648 | | Pinterest | 500 | |
546 | 649 | | Google Business | 1,500 | |
547 | 650 | | Mastodon | 500 (varies by instance) | |
| 651 | +| Tumblr | 32,768 | |
548 | 652 |
|
549 | 653 | BulkPublish validates content length per platform before creating the post and returns an error if any platform's limit is exceeded. |
0 commit comments