planvortex 0.14.0__tar.gz → 0.16.0__tar.gz
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.
- {planvortex-0.14.0 → planvortex-0.16.0}/CHANGELOG.md +30 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/PKG-INFO +2 -2
- {planvortex-0.14.0 → planvortex-0.16.0}/README.md +1 -1
- {planvortex-0.14.0 → planvortex-0.16.0}/openapi/planvortex.openapi.json +291 -10
- {planvortex-0.14.0 → planvortex-0.16.0}/pyproject.toml +1 -1
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_core/errors.py +8 -1
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_generated/models.py +158 -9
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_shapes.py +23 -5
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_version.py +1 -1
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/accounts.py +26 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/accounts.py +26 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/types.py +8 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_accounts.py +22 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_core.py +2 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_route_coverage.py +4 -3
- {planvortex-0.14.0 → planvortex-0.16.0}/.gitignore +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/LICENSE +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/scripts/build_docs.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/scripts/check_packaging.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/scripts/generate_models.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/scripts/generate_sync.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/scripts/route_coverage.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/__init__.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_client.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_client_sync.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_core/__init__.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_core/auth.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_core/auth_sync.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_core/files.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_core/http.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_core/http_sync.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_core/pagination.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_core/query.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_core/transport.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/_generated/__init__.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/py.typed +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/__init__.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/ai_plans.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/apps.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/base.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/catalog.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/clients.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/comments.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/contacts.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/dashboard.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/integrations.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/messages.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/organizations.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/products.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/publications.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources/uploads.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/__init__.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/ai_plans.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/apps.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/base.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/catalog.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/clients.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/comments.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/contacts.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/dashboard.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/integrations.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/messages.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/organizations.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/products.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/publications.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/resources_sync/uploads.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/src/planvortex/webhooks.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/__init__.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/conftest.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/contrato.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/live/__init__.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/live/conftest.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/live/test_auth.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/live/test_catalog.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/live/test_connect_flow.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/live/test_errors.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/live/test_publish.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/live/test_read.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_ai_plans.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_apps.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_catalog.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_client.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_clients.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_comments.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_contacts.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_dashboard.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_example_comments.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_example_connect.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_example_publish.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_example_schedule.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_example_webhooks.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_files.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_generate_models.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_generate_sync.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_integrations.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_messages.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_models.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_openapi_freshness.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_organizations.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_packaging.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_pagination.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_products.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_publications.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_query_parity.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_readme.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_shapes_parity.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_types.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_uploads.py +0 -0
- {planvortex-0.14.0 → planvortex-0.16.0}/tests/test_webhooks.py +0 -0
|
@@ -4,6 +4,36 @@ All notable changes to this package are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to
|
|
5
5
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [0.16.0] - 2026-10-15
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **`accounts.publish_settings()`**: what an account allows when publishing, read from the network
|
|
12
|
+
right now. Today only TikTok (`publish_settings` in `catalog.social_capabilities()`; anywhere
|
|
13
|
+
else it raises error 2508). It returns the creator's nickname, the `visibility` values the
|
|
14
|
+
account allows now, the interactions the creator switched off in the app, the longest video it
|
|
15
|
+
can post and whether TikTok will take a post from it right now. TikTok's content sharing
|
|
16
|
+
guidelines ask any app that posts to show these before posting, with no privacy chosen in
|
|
17
|
+
advance: read it every time your compose screen opens. The result is typed as `PublishSettings`.
|
|
18
|
+
- **TikTok fields on publications.** `visibility` now also takes `friends` and `followers` (TikTok
|
|
19
|
+
only), and `PublicationInput` and `Publication` gain `interactions` (`comments`, `duet`,
|
|
20
|
+
`stitch`: what the audience can do) and `commercial_content` (`your_brand`, `branded_content`).
|
|
21
|
+
A paid partnership cannot be private (error 2504); values that are not booleans are 2502 and
|
|
22
|
+
2503. When the publication goes out, a visibility the account no longer allows is 2505, a video
|
|
23
|
+
longer than the account can post is 2506, and a creator TikTok will not take a post from right
|
|
24
|
+
now is 2507. All of them land in `publication_errors`.
|
|
25
|
+
- `SocialCapabilities` gains `interactions`, `commercial_content` and `publish_settings`.
|
|
26
|
+
- Errors 2500-2599 now belong to the `publication` family (`PublicationError`), like 2600. Only
|
|
27
|
+
2508 is raised; the rest travel in `publication_errors`.
|
|
28
|
+
|
|
29
|
+
## [0.15.0] - 2026-10-14
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
|
|
33
|
+
- **`billing_interval` on `ClientPlan`** (`"month"` or `"year"`): how often the plan is billed. A
|
|
34
|
+
yearly plan costs ten monthly fees, paid up front, and its resources are still counted per
|
|
35
|
+
calendar month, AI and X credits included. Clients from before yearly billing read `"month"`.
|
|
36
|
+
|
|
7
37
|
## [0.14.0] - 2026-10-07
|
|
8
38
|
|
|
9
39
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: planvortex
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.16.0
|
|
4
4
|
Summary: Official Python client for the PlanVortex API
|
|
5
5
|
Project-URL: Homepage, https://planvortex.com/en/developers
|
|
6
6
|
Project-URL: Documentation, https://taliasoftworks.github.io/PlanVortexPython/
|
|
@@ -280,7 +280,7 @@ memorising numbers:
|
|
|
280
280
|
| 601-612 | `user` | `UserError` |
|
|
281
281
|
| 700-716 | `account` | `AccountError` |
|
|
282
282
|
| 800-810 | `file` | `FileError` |
|
|
283
|
-
| 900-996, 2600-2699 | `publication` | `PublicationError` |
|
|
283
|
+
| 900-996, 2500-2599, 2600-2699 | `publication` | `PublicationError` |
|
|
284
284
|
| 1000-1003 | `general` | `PlanVortexError` |
|
|
285
285
|
| 1100-1111 | `organization` | `OrganizationError` |
|
|
286
286
|
| 1200-1207 | `role` | `PlanVortexError` |
|
|
@@ -250,7 +250,7 @@ memorising numbers:
|
|
|
250
250
|
| 601-612 | `user` | `UserError` |
|
|
251
251
|
| 700-716 | `account` | `AccountError` |
|
|
252
252
|
| 800-810 | `file` | `FileError` |
|
|
253
|
-
| 900-996, 2600-2699 | `publication` | `PublicationError` |
|
|
253
|
+
| 900-996, 2500-2599, 2600-2699 | `publication` | `PublicationError` |
|
|
254
254
|
| 1000-1003 | `general` | `PlanVortexError` |
|
|
255
255
|
| 1100-1111 | `organization` | `OrganizationError` |
|
|
256
256
|
| 1200-1207 | `role` | `PlanVortexError` |
|
|
@@ -5599,7 +5599,7 @@
|
|
|
5599
5599
|
"catalog"
|
|
5600
5600
|
],
|
|
5601
5601
|
"summary": "What every network supports",
|
|
5602
|
-
"description": "The full matrix network → capabilities. It is the **single source of truth** about what a network can do: the catalogue publishes it, the backend checks it before acting, and your integration should filter its account pickers with it rather than keeping a list of its own.\n\n`comments` is the coarse gate — whether the network has comments at all. Which *actions* it allows on one is a finer question and lives in `GET /social_comment_actions`, because the shape here is `{[capability]: boolean}` and nesting an object inside would break it.\n\nToday ten networks answer `comments: true`: Facebook, Instagram, Threads, LinkedIn, X, YouTube, Google Business, Bluesky, Discord and Telegram. TikTok, WhatsApp, Slack and Pinterest answer `false`, for reasons of theirs and not ours — on Pinterest the API *counts* a pin's comments and offers no way to read them, so the figure shows up in the publication's statistics and there is still no inbox.\n\n**Three of the keys are about publishing, not about reading.** `destinations` says the network publishes into places inside the account and every publication has to name one — a Pinterest board, read with `GET /organizations/{id_organization}/accounts/{id_account}/destinations`. `link` says a publication carries a destination link of its own, separate from its text. Both are `false` everywhere but `pinterest` today. `reply_control` says a publication can choose who can reply to it, and is `true` only on `threads`. The three are the reason to ask this matrix instead of keeping a list of your own: a composer with its own copy of which network has which field is exactly what drifted with the character limits.\n\nA `true` here is about the **network**, not about one account of it: a Telegram channel with no linked discussion group answers 965 on its comments even though the network has them.\n\nOnly needs authentication.",
|
|
5602
|
+
"description": "The full matrix network → capabilities. It is the **single source of truth** about what a network can do: the catalogue publishes it, the backend checks it before acting, and your integration should filter its account pickers with it rather than keeping a list of its own.\n\n`comments` is the coarse gate — whether the network has comments at all. Which *actions* it allows on one is a finer question and lives in `GET /social_comment_actions`, because the shape here is `{[capability]: boolean}` and nesting an object inside would break it.\n\nToday ten networks answer `comments: true`: Facebook, Instagram, Threads, LinkedIn, X, YouTube, Google Business, Bluesky, Discord and Telegram. TikTok, WhatsApp, Slack and Pinterest answer `false`, for reasons of theirs and not ours — on Pinterest the API *counts* a pin's comments and offers no way to read them, so the figure shows up in the publication's statistics and there is still no inbox.\n\n**Three of the keys are about publishing, not about reading.** `destinations` says the network publishes into places inside the account and every publication has to name one — a Pinterest board, read with `GET /organizations/{id_organization}/accounts/{id_account}/destinations`. `link` says a publication carries a destination link of its own, separate from its text. Both are `false` everywhere but `pinterest` today. `reply_control` says a publication can choose who can reply to it, and is `true` only on `threads`. The three are the reason to ask this matrix instead of keeping a list of your own: a composer with its own copy of which network has which field is exactly what drifted with the character limits.\n\n**Four more are what TikTok's content sharing guidelines ask a composer to show**, and are `true` only on `tiktok` today: `visibility` (on TikTok, with no default), `interactions`, `commercial_content`, and `publish_settings`, which says the options each account allows must be read from `GET /organizations/{id_organization}/accounts/{id_account}/publish_settings` instead of a fixed list.\n\nA `true` here is about the **network**, not about one account of it: a Telegram channel with no linked discussion group answers 965 on its comments even though the network has them.\n\nOnly needs authentication.",
|
|
5603
5603
|
"operationId": "getSocialCapabilities",
|
|
5604
5604
|
"x-planvortex-identity": [
|
|
5605
5605
|
"current_user",
|
|
@@ -5629,7 +5629,10 @@
|
|
|
5629
5629
|
"link": false,
|
|
5630
5630
|
"reply_control": false,
|
|
5631
5631
|
"visibility": false,
|
|
5632
|
-
"made_for_kids": false
|
|
5632
|
+
"made_for_kids": false,
|
|
5633
|
+
"interactions": false,
|
|
5634
|
+
"commercial_content": false,
|
|
5635
|
+
"publish_settings": false
|
|
5633
5636
|
},
|
|
5634
5637
|
"google_business": {
|
|
5635
5638
|
"publications": false,
|
|
@@ -5642,7 +5645,10 @@
|
|
|
5642
5645
|
"link": false,
|
|
5643
5646
|
"reply_control": false,
|
|
5644
5647
|
"visibility": false,
|
|
5645
|
-
"made_for_kids": false
|
|
5648
|
+
"made_for_kids": false,
|
|
5649
|
+
"interactions": false,
|
|
5650
|
+
"commercial_content": false,
|
|
5651
|
+
"publish_settings": false
|
|
5646
5652
|
},
|
|
5647
5653
|
"pinterest": {
|
|
5648
5654
|
"publications": true,
|
|
@@ -5655,7 +5661,10 @@
|
|
|
5655
5661
|
"link": true,
|
|
5656
5662
|
"reply_control": false,
|
|
5657
5663
|
"visibility": false,
|
|
5658
|
-
"made_for_kids": false
|
|
5664
|
+
"made_for_kids": false,
|
|
5665
|
+
"interactions": false,
|
|
5666
|
+
"commercial_content": false,
|
|
5667
|
+
"publish_settings": false
|
|
5659
5668
|
},
|
|
5660
5669
|
"threads": {
|
|
5661
5670
|
"publications": true,
|
|
@@ -5668,7 +5677,10 @@
|
|
|
5668
5677
|
"link": false,
|
|
5669
5678
|
"reply_control": true,
|
|
5670
5679
|
"visibility": false,
|
|
5671
|
-
"made_for_kids": false
|
|
5680
|
+
"made_for_kids": false,
|
|
5681
|
+
"interactions": false,
|
|
5682
|
+
"commercial_content": false,
|
|
5683
|
+
"publish_settings": false
|
|
5672
5684
|
}
|
|
5673
5685
|
}
|
|
5674
5686
|
}
|
|
@@ -11823,6 +11835,118 @@
|
|
|
11823
11835
|
]
|
|
11824
11836
|
}
|
|
11825
11837
|
},
|
|
11838
|
+
"/organizations/{id_organization}/accounts/{id_account}/publish_settings": {
|
|
11839
|
+
"get": {
|
|
11840
|
+
"tags": [
|
|
11841
|
+
"publications"
|
|
11842
|
+
],
|
|
11843
|
+
"summary": "Read what this account allows when publishing",
|
|
11844
|
+
"description": "What the network says, **right now**, about publishing on this account. Today only TikTok: the networks that answer `publish_settings: true` in `GET /social_capabilities`. Anywhere else this answers error 2508.\n\nTikTok's content sharing guidelines ask any app that posts to TikTok to show the user, before posting:\n\n- which account the post goes to (`creator.nickname`);\n- a privacy choice limited to `visibility_options`, with **no default**;\n- the interactions the creator switched off in the app (`interactions.*.disabled`), greyed out;\n- and to check the video length against `max_video_duration_sec`.\n\nRead it every time your compose screen opens: an account can go from public to private, or reach its daily limit, between one post and the next. `can_post: false` means TikTok will not take a post from this account now (`reason` carries its code): tell the user to try later instead of sending it.\n\nIf TikTok does not answer, this is error 919 with TikTok's detail in `data`, never an empty list: an empty `visibility_options` would read as \"this account cannot post at all\".",
|
|
11845
|
+
"operationId": "getAccountPublishSettings",
|
|
11846
|
+
"x-planvortex-identity": [
|
|
11847
|
+
"current_user",
|
|
11848
|
+
"current_app"
|
|
11849
|
+
],
|
|
11850
|
+
"parameters": [
|
|
11851
|
+
{
|
|
11852
|
+
"name": "id_organization",
|
|
11853
|
+
"in": "path",
|
|
11854
|
+
"description": "Organization identifier",
|
|
11855
|
+
"required": true,
|
|
11856
|
+
"schema": {
|
|
11857
|
+
"type": "string"
|
|
11858
|
+
}
|
|
11859
|
+
},
|
|
11860
|
+
{
|
|
11861
|
+
"name": "id_account",
|
|
11862
|
+
"in": "path",
|
|
11863
|
+
"description": "Connected account identifier",
|
|
11864
|
+
"required": true,
|
|
11865
|
+
"schema": {
|
|
11866
|
+
"type": "string"
|
|
11867
|
+
}
|
|
11868
|
+
}
|
|
11869
|
+
],
|
|
11870
|
+
"responses": {
|
|
11871
|
+
"200": {
|
|
11872
|
+
"description": "What the account allows now",
|
|
11873
|
+
"content": {
|
|
11874
|
+
"application/json": {
|
|
11875
|
+
"schema": {
|
|
11876
|
+
"type": "object",
|
|
11877
|
+
"properties": {
|
|
11878
|
+
"publish_settings": {
|
|
11879
|
+
"$ref": "#/components/schemas/PublicationsPublishSettings"
|
|
11880
|
+
}
|
|
11881
|
+
},
|
|
11882
|
+
"required": [
|
|
11883
|
+
"publish_settings"
|
|
11884
|
+
]
|
|
11885
|
+
},
|
|
11886
|
+
"example": {
|
|
11887
|
+
"publish_settings": {
|
|
11888
|
+
"social_network": "tiktok",
|
|
11889
|
+
"creator": {
|
|
11890
|
+
"username": "nordwindcafe",
|
|
11891
|
+
"nickname": "Nordwind Café",
|
|
11892
|
+
"avatar_url": "https://p16-sign.tiktokcdn.com/…/avatar.jpeg"
|
|
11893
|
+
},
|
|
11894
|
+
"visibility_options": [
|
|
11895
|
+
"public",
|
|
11896
|
+
"friends",
|
|
11897
|
+
"private"
|
|
11898
|
+
],
|
|
11899
|
+
"interactions": {
|
|
11900
|
+
"comments": {
|
|
11901
|
+
"disabled": false
|
|
11902
|
+
},
|
|
11903
|
+
"duet": {
|
|
11904
|
+
"disabled": false
|
|
11905
|
+
},
|
|
11906
|
+
"stitch": {
|
|
11907
|
+
"disabled": true
|
|
11908
|
+
}
|
|
11909
|
+
},
|
|
11910
|
+
"max_video_duration_sec": 600,
|
|
11911
|
+
"can_post": true
|
|
11912
|
+
}
|
|
11913
|
+
}
|
|
11914
|
+
}
|
|
11915
|
+
}
|
|
11916
|
+
},
|
|
11917
|
+
"400": {
|
|
11918
|
+
"description": "The request failed. The body carries the PlanVortex error code in `code`:\n\n| Code | Meaning |\n| --- | --- |\n| `2508` | This network has no publish settings to read. `data` carries `social_network` |\n| `919` | The network did not answer. `data` carries its detail |\n| `701` | Account not found in this organization |\n| `700` | Account not connected, missing authorization tokens |\n| `1101` | Invalid organization |",
|
|
11919
|
+
"content": {
|
|
11920
|
+
"application/json": {
|
|
11921
|
+
"schema": {
|
|
11922
|
+
"$ref": "#/components/schemas/Error"
|
|
11923
|
+
}
|
|
11924
|
+
}
|
|
11925
|
+
}
|
|
11926
|
+
},
|
|
11927
|
+
"500": {
|
|
11928
|
+
"description": "Unhandled error by the server"
|
|
11929
|
+
}
|
|
11930
|
+
},
|
|
11931
|
+
"x-codeSamples": [
|
|
11932
|
+
{
|
|
11933
|
+
"lang": "curl",
|
|
11934
|
+
"label": "curl",
|
|
11935
|
+
"source": "curl \"https://api.planvortex.com/v1.0.0/organizations/$ID_ORGANIZATION/accounts/$ID_ACCOUNT/publish_settings\" \\\n -H \"Authorization: Bearer $PLANVORTEX_TOKEN\""
|
|
11936
|
+
},
|
|
11937
|
+
{
|
|
11938
|
+
"lang": "JavaScript",
|
|
11939
|
+
"label": "Node",
|
|
11940
|
+
"source": "import { PlanVortex } from \"planvortex\";\n\nconst pv = new PlanVortex({\n clientId: process.env.PLANVORTEX_CLIENT_ID,\n clientSecret: process.env.PLANVORTEX_CLIENT_SECRET,\n});\n\nconst result = await pv.accounts.publishSettings(idOrganization, idAccount);"
|
|
11941
|
+
},
|
|
11942
|
+
{
|
|
11943
|
+
"lang": "Python",
|
|
11944
|
+
"label": "Python",
|
|
11945
|
+
"source": "from planvortex import PlanVortex\n\npv = PlanVortex()\n\nresult = pv.accounts.publish_settings(id_organization, id_account)"
|
|
11946
|
+
}
|
|
11947
|
+
]
|
|
11948
|
+
}
|
|
11949
|
+
},
|
|
11826
11950
|
"/organizations/{id_organization}/accounts/{id_account}/publish/{id_publication}": {
|
|
11827
11951
|
"put": {
|
|
11828
11952
|
"tags": [
|
|
@@ -14709,6 +14833,14 @@
|
|
|
14709
14833
|
"format": "date-time",
|
|
14710
14834
|
"description": "When the current billing period ends. A cancelled plan keeps working until then."
|
|
14711
14835
|
},
|
|
14836
|
+
"billing_interval": {
|
|
14837
|
+
"type": "string",
|
|
14838
|
+
"enum": [
|
|
14839
|
+
"month",
|
|
14840
|
+
"year"
|
|
14841
|
+
],
|
|
14842
|
+
"description": "How often the plan is billed. A yearly plan costs ten monthly fees, paid up front, and every resource in it is still counted per calendar month (AI and X credits included). Clients from before yearly billing existed read `month`. It means nothing on `free`."
|
|
14843
|
+
},
|
|
14712
14844
|
"stripe_customer_id": {
|
|
14713
14845
|
"type": "string"
|
|
14714
14846
|
}
|
|
@@ -15281,11 +15413,23 @@
|
|
|
15281
15413
|
},
|
|
15282
15414
|
"visibility": {
|
|
15283
15415
|
"type": "boolean",
|
|
15284
|
-
"description": "The publication can say **who can see it** when it goes out (`visibility`)
|
|
15416
|
+
"description": "The publication can say **who can see it** when it goes out (`visibility`). On a network that answers `false` the field is deleted on save, so do not offer it. Today `youtube` (public, unlisted, private) and `tiktok` (public, friends, followers, private; which ones each account allows comes from `publish_settings`)."
|
|
15285
15417
|
},
|
|
15286
15418
|
"made_for_kids": {
|
|
15287
15419
|
"type": "boolean",
|
|
15288
15420
|
"description": "The publication can say whether it is **made for kids** (`made_for_kids`, COPPA). On a network that answers `false` the field is deleted on save, so do not offer it. Today only `youtube`."
|
|
15421
|
+
},
|
|
15422
|
+
"interactions": {
|
|
15423
|
+
"type": "boolean",
|
|
15424
|
+
"description": "The publication can say **what the audience can do** with it (`interactions`: comment, Duet, Stitch). On a network that answers `false` the field is deleted on save, so do not offer it. Today only `tiktok`."
|
|
15425
|
+
},
|
|
15426
|
+
"commercial_content": {
|
|
15427
|
+
"type": "boolean",
|
|
15428
|
+
"description": "The publication can declare that it is **commercial content** (`commercial_content`: your brand, branded content). On a network that answers `false` the field is deleted on save, so do not offer it. Today only `tiktok`."
|
|
15429
|
+
},
|
|
15430
|
+
"publish_settings": {
|
|
15431
|
+
"type": "boolean",
|
|
15432
|
+
"description": "What each **account** allows when publishing is read from the network: `GET /organizations/{id_organization}/accounts/{id_account}/publish_settings` (privacy options, interactions the creator switched off, longest video, whether it can post now). Offer the `visibility` values from there, not a fixed list. Today only `tiktok`."
|
|
15289
15433
|
}
|
|
15290
15434
|
},
|
|
15291
15435
|
"required": [
|
|
@@ -15299,7 +15443,10 @@
|
|
|
15299
15443
|
"link",
|
|
15300
15444
|
"reply_control",
|
|
15301
15445
|
"visibility",
|
|
15302
|
-
"made_for_kids"
|
|
15446
|
+
"made_for_kids",
|
|
15447
|
+
"interactions",
|
|
15448
|
+
"commercial_content",
|
|
15449
|
+
"publish_settings"
|
|
15303
15450
|
]
|
|
15304
15451
|
},
|
|
15305
15452
|
"CommentsWebhookChange": {
|
|
@@ -16273,7 +16420,7 @@
|
|
|
16273
16420
|
},
|
|
16274
16421
|
"code": {
|
|
16275
16422
|
"type": "integer",
|
|
16276
|
-
"description": "PlanVortex error code. Ranges: 500-554 auth, tokens, client apps and connect sessions · 601-612 user · 700-716 social accounts · 800-810 files · 900-996 publications · 1000-1003 general · 1100-1111 organizations · 1200-1207 roles · 1300-1308 client plan · 1400-1408 organization plan · 1500-1512 messaging · 1600-1601 contacts · 1900-1906 payments · 2000-2099 products · 2100-2199 AI plans · 2200-2299 integrations · 2600-2699 comments, the ones that no longer fit in 945-948."
|
|
16423
|
+
"description": "PlanVortex error code. Ranges: 500-554 auth, tokens, client apps and connect sessions · 601-612 user · 700-716 social accounts · 800-810 files · 900-996 publications · 1000-1003 general · 1100-1111 organizations · 1200-1207 roles · 1300-1308 client plan · 1400-1408 organization plan · 1500-1512 messaging · 1600-1601 contacts · 1900-1906 payments · 2000-2099 products · 2100-2199 AI plans · 2200-2299 integrations · 2500-2599 publication fields, the ones that no longer fit in 900-996 (visibility, made for kids, TikTok's interactions and commercial content) · 2600-2699 comments, the ones that no longer fit in 945-948."
|
|
16277
16424
|
},
|
|
16278
16425
|
"data": {
|
|
16279
16426
|
"additionalProperties": true,
|
|
@@ -17849,14 +17996,24 @@
|
|
|
17849
17996
|
"enum": [
|
|
17850
17997
|
"public",
|
|
17851
17998
|
"unlisted",
|
|
17999
|
+
"friends",
|
|
18000
|
+
"followers",
|
|
17852
18001
|
"private"
|
|
17853
18002
|
],
|
|
17854
|
-
"description": "**Who can see the publication** when it goes out, on the networks that answer `visibility: true` in `GET /social_capabilities` (today `youtube`). Absent means `public`. It is set when the publication goes out.\n\n**On every other network the field is deleted on save**, like `reply_control`."
|
|
18003
|
+
"description": "**Who can see the publication** when it goes out, on the networks that answer `visibility: true` in `GET /social_capabilities` (today `youtube` and `tiktok`). Absent means `public`. It is set when the publication goes out.\n\n`unlisted` exists only on YouTube; `friends` and `followers` only on TikTok.\n\n**On every other network the field is deleted on save**, like `reply_control`."
|
|
17855
18004
|
},
|
|
17856
18005
|
"made_for_kids": {
|
|
17857
18006
|
"type": "boolean",
|
|
17858
18007
|
"description": "Whether the video is **made for kids** (COPPA), on the networks that answer `made_for_kids: true` in `GET /social_capabilities` (today `youtube`). Absent means `false`.\n\n**On every other network the field is deleted on save**, like `reply_control`."
|
|
17859
18008
|
},
|
|
18009
|
+
"interactions": {
|
|
18010
|
+
"$ref": "#/components/schemas/PublicationInteractions",
|
|
18011
|
+
"description": "**What the audience can do with the publication** (comment, Duet, Stitch), on the networks that answer `interactions: true` in `GET /social_capabilities` (today `tiktok`). `true` allows it; a missing key is the network's default (allowed).\n\n**On every other network the field is deleted on save**, like `reply_control`."
|
|
18012
|
+
},
|
|
18013
|
+
"commercial_content": {
|
|
18014
|
+
"$ref": "#/components/schemas/PublicationCommercialContent",
|
|
18015
|
+
"description": "Whether the publication is **commercial content** (`your_brand`, `branded_content`), on the networks that answer `commercial_content: true` in `GET /social_capabilities` (today `tiktok`). Absent means it is not.\n\n**On every other network the field is deleted on save**, like `reply_control`."
|
|
18016
|
+
},
|
|
17860
18017
|
"publication_type": {
|
|
17861
18018
|
"type": "string",
|
|
17862
18019
|
"enum": [
|
|
@@ -18015,6 +18172,20 @@
|
|
|
18015
18172
|
}
|
|
18016
18173
|
}
|
|
18017
18174
|
},
|
|
18175
|
+
"PublicationCommercialContent": {
|
|
18176
|
+
"type": "object",
|
|
18177
|
+
"description": "Whether a publication is commercial content. Both `false` is the same as omitting it.",
|
|
18178
|
+
"properties": {
|
|
18179
|
+
"your_brand": {
|
|
18180
|
+
"type": "boolean",
|
|
18181
|
+
"description": "It promotes the creator or their own business. TikTok labels it \"Promotional content\"."
|
|
18182
|
+
},
|
|
18183
|
+
"branded_content": {
|
|
18184
|
+
"type": "boolean",
|
|
18185
|
+
"description": "It is a paid partnership promoting a third party. TikTok labels it \"Paid partnership\", and it cannot be private."
|
|
18186
|
+
}
|
|
18187
|
+
}
|
|
18188
|
+
},
|
|
18018
18189
|
"PublicationDestination": {
|
|
18019
18190
|
"type": "object",
|
|
18020
18191
|
"description": "**Where inside the account** a publication goes, on the networks where choosing the account is not yet choosing the destination. Today that is `pinterest` alone, where it is the board the pin is saved to.\n\nAsk `destinations` in `GET /social_capabilities` instead of keeping a list of your own, and read the account's boards with `GET /organizations/{id_organization}/accounts/{id_account}/destinations`.\n\n**On Pinterest it is required.** A publication created without it is created in state `withErrors` with `publication_errors[].code = 987` and the background job will not attempt it — the same treatment as a YouTube video with no title, and for the same reason: a scheduled publication that dies at 3 a.m. over a board that was missing from the start is a failure that could have been told to the person while they were still there.\n\n**On every other network the field is deleted, not rejected.** A `destination` on a Facebook publication would be a field that does nothing, and giving it back in the response would be worse than dropping it.\n\n`name` and `section_name` are labels for display (\"Recipes > Desserts\"). The server never checks them and nothing is decided by them: what publishes is `id`.",
|
|
@@ -18037,6 +18208,24 @@
|
|
|
18037
18208
|
}
|
|
18038
18209
|
}
|
|
18039
18210
|
},
|
|
18211
|
+
"PublicationInteractions": {
|
|
18212
|
+
"type": "object",
|
|
18213
|
+
"description": "What the audience can do with a publication. `true` allows it; a missing key is the network's default.",
|
|
18214
|
+
"properties": {
|
|
18215
|
+
"comments": {
|
|
18216
|
+
"type": "boolean",
|
|
18217
|
+
"description": "The audience can comment."
|
|
18218
|
+
},
|
|
18219
|
+
"duet": {
|
|
18220
|
+
"type": "boolean",
|
|
18221
|
+
"description": "The audience can make a Duet with the video. Ignored on a photo post."
|
|
18222
|
+
},
|
|
18223
|
+
"stitch": {
|
|
18224
|
+
"type": "boolean",
|
|
18225
|
+
"description": "The audience can make a Stitch with the video. Ignored on a photo post."
|
|
18226
|
+
}
|
|
18227
|
+
}
|
|
18228
|
+
},
|
|
18040
18229
|
"PublicationPending": {
|
|
18041
18230
|
"type": "object",
|
|
18042
18231
|
"description": "Present only while the network is still **processing** what was sent, and PlanVortex is waiting to publish it. Today that happens on Instagram alone, when Meta takes longer than the ~30 seconds the request waits to process the media. In practice, that means videos.\n\nThe publication stays in state `publishing`, and the background job asks Instagram again about once a minute until it goes out (`sended`) or fails (`withErrors`). It gives up 10 minutes after the media was sent to Instagram, and then the publication ends in `withErrors` with code 999. The object disappears as soon as the publication is resolved.\n\n**Wait for it. Do not retry it and do not create it again**: it has not failed, and a second publication would put the same video out twice. There is no webhook for the outcome: read the publication again after `next_check`. While this object is present the publication **cannot be updated** (error 921), for the same reason.",
|
|
@@ -18309,14 +18498,24 @@
|
|
|
18309
18498
|
"enum": [
|
|
18310
18499
|
"public",
|
|
18311
18500
|
"unlisted",
|
|
18501
|
+
"friends",
|
|
18502
|
+
"followers",
|
|
18312
18503
|
"private"
|
|
18313
18504
|
],
|
|
18314
|
-
"description": "**Who can see the publication** when it goes out. Only on the networks that answer `visibility: true` in `GET /social_capabilities` (today `youtube`), and **deleted** on every other one.\n\n- `public`: anyone. It is what applies when the field is omitted.\n- `unlisted
|
|
18505
|
+
"description": "**Who can see the publication** when it goes out. Only on the networks that answer `visibility: true` in `GET /social_capabilities` (today `youtube` and `tiktok`), and **deleted** on every other one.\n\n- `public`: anyone. It is what applies when the field is omitted.\n- `unlisted` (YouTube only): only people with the link. It does not show on the channel or in search.\n- `friends` (TikTok only): followers the account follows back.\n- `followers` (TikTok only, private accounts): the account's followers.\n- `private`: only the owner (on YouTube, also the people they invite from YouTube Studio).\n\nBoth networks require this to be **the user's choice**: if your software publishes on behalf of someone, ask them. On TikTok your interface must have **no default**, and the options to offer are the ones this account allows right now, from `GET /organizations/{id_organization}/accounts/{id_account}/publish_settings`. If, by the time the publication goes out, the account no longer allows the chosen one (it went from public to private), it is not swapped for another: the publication ends in `withErrors` with `publication_errors[].code = 2505`. Omitting it on TikTok keeps the old behaviour (public if the account allows it, otherwise the first value it allows), which is fine for a script but not for a screen a person uses.\n\nA value the network does not accept does not fail the request: the publication is still created, in state `withErrors` with `publication_errors[].code = 2500`, whose `data` carries the `allowed` values. It is checked when the publication is **created**, so a scheduled video does not fail at 3 a.m. over a value that was already wrong.\n\nIf YouTube does not leave the video with the visibility that was asked for, the publication still ends up `sended` (the video is on the channel) and carries a warning in `publication_warnings` with `code = 2400`.\n\nOn an update: omit it to keep what was there, send `null` or `\"\"` to go back to `public`."
|
|
18315
18506
|
},
|
|
18316
18507
|
"made_for_kids": {
|
|
18317
18508
|
"type": "boolean",
|
|
18318
18509
|
"description": "Whether the video is **made for kids**. Only on the networks that answer `made_for_kids: true` in `GET /social_capabilities` (today `youtube`), and **deleted** on every other one. Absent means `false`.\n\nThe law (COPPA) and YouTube's policies require a video directed at children to be uploaded with `true`, and it is the **user's** call: if your software publishes on behalf of someone, ask them. YouTube then turns off features such as comments and personalised ads on that video.\n\nIt must be a JSON boolean. Anything else (`\"yes\"`, `\"no\"`, `1`) is not guessed: the publication is still created, in state `withErrors` with `publication_errors[].code = 2501`.\n\nOn an update: omit it to keep what was there, send `null` or `\"\"` to go back to `false`."
|
|
18319
18510
|
},
|
|
18511
|
+
"interactions": {
|
|
18512
|
+
"$ref": "#/components/schemas/PublicationInteractions",
|
|
18513
|
+
"description": "**What the audience can do with the publication**: comment and, on a video, Duet and Stitch. Only on the networks that answer `interactions: true` in `GET /social_capabilities` (today `tiktok`), and **deleted** on every other one.\n\n`true` allows it, `false` turns it off. A missing key, or the whole field missing, leaves the network's default, which on TikTok is allowed.\n\nTikTok's content sharing guidelines require this to be **the user's choice**, with **nothing ticked in advance**: if your software publishes on behalf of someone, show the three boxes unticked and send what they tick. Whatever the creator has switched off in their TikTok privacy settings is sent switched off, whatever this says (`interactions.*.disabled` in `GET /organizations/{id_organization}/accounts/{id_account}/publish_settings`).\n\nA key other than these three, or a value that is not a JSON boolean, does not fail the request: the publication is still created, in state `withErrors` with `publication_errors[].code = 2502`.\n\nOn an update: omit it to keep what was there, send `null` or `\"\"` to go back to the network's default."
|
|
18514
|
+
},
|
|
18515
|
+
"commercial_content": {
|
|
18516
|
+
"$ref": "#/components/schemas/PublicationCommercialContent",
|
|
18517
|
+
"description": "Whether the publication is **commercial content**. Only on the networks that answer `commercial_content: true` in `GET /social_capabilities` (today `tiktok`), and **deleted** on every other one. Absent, or both `false`, means it is not.\n\nTikTok's guidelines ask for a disclosure switch that is **off by default** and, when it is on, for at least one of the two boxes before the post can go out. Send the object only when the user switched it on.\n\nA paid partnership (`branded_content: true`) **cannot be private**: with `visibility` `private` or `followers` the publication is created in state `withErrors` with `publication_errors[].code = 2504`. Any other key, or a value that is not a JSON boolean, is code 2503.\n\nOn an update: omit it to keep what was there, send `null` or `\"\"` to remove it."
|
|
18518
|
+
},
|
|
18320
18519
|
"files": {
|
|
18321
18520
|
"type": "array",
|
|
18322
18521
|
"description": "Identifiers of uploads previously created through the uploads endpoints, attached to this publication.\n\n**On Slack the files travel inside the message**, not as publications of their own: up to 10 attachments counting images and videos together (`publication_errors[].code = 982` over it), each one under the `max_file_size_mb.slack` ceiling (code 983), and anything the upload itself refuses comes back as code 986.\n\n**On Pinterest a pin is an image or a video, never text alone** (code 922 with neither), and it is of one kind only: two to five images make a carousel — outside that range, code 990 — images and videos are not mixed and there is no more than one video (code 916). The weight ceilings are two orders of magnitude apart, so `max_file_size_mb.pinterest` is the **image** one (~20 MB) while a video is allowed far more; over either, code 996 with `data.max_mb`.",
|
|
@@ -18585,6 +18784,88 @@
|
|
|
18585
18784
|
}
|
|
18586
18785
|
}
|
|
18587
18786
|
},
|
|
18787
|
+
"PublicationsPublishSettings": {
|
|
18788
|
+
"type": "object",
|
|
18789
|
+
"description": "What the network says, right now, about publishing on one account. Values are in the publication's vocabulary: what you read here is what you send back.",
|
|
18790
|
+
"properties": {
|
|
18791
|
+
"social_network": {
|
|
18792
|
+
"$ref": "#/components/schemas/SocialNetwork"
|
|
18793
|
+
},
|
|
18794
|
+
"creator": {
|
|
18795
|
+
"type": "object",
|
|
18796
|
+
"description": "Who the post goes to. TikTok's guidelines ask to show the creator's nickname on the compose screen.",
|
|
18797
|
+
"properties": {
|
|
18798
|
+
"username": {
|
|
18799
|
+
"type": "string"
|
|
18800
|
+
},
|
|
18801
|
+
"nickname": {
|
|
18802
|
+
"type": "string"
|
|
18803
|
+
},
|
|
18804
|
+
"avatar_url": {
|
|
18805
|
+
"type": "string",
|
|
18806
|
+
"description": "Expires after about two hours: do not store it."
|
|
18807
|
+
}
|
|
18808
|
+
}
|
|
18809
|
+
},
|
|
18810
|
+
"visibility_options": {
|
|
18811
|
+
"type": "array",
|
|
18812
|
+
"description": "The `visibility` values this account allows now. A public account gets `public`, `friends` and `private`; a private one gets `followers` instead of `public`. Offer these and nothing else, with no default.",
|
|
18813
|
+
"items": {
|
|
18814
|
+
"type": "string",
|
|
18815
|
+
"enum": [
|
|
18816
|
+
"public",
|
|
18817
|
+
"friends",
|
|
18818
|
+
"followers",
|
|
18819
|
+
"private"
|
|
18820
|
+
]
|
|
18821
|
+
}
|
|
18822
|
+
},
|
|
18823
|
+
"interactions": {
|
|
18824
|
+
"type": "object",
|
|
18825
|
+
"description": "One entry per interaction. `disabled: true` means the creator switched it off in their TikTok privacy settings: show it greyed out. It is sent switched off whatever the publication says.",
|
|
18826
|
+
"properties": {
|
|
18827
|
+
"comments": {
|
|
18828
|
+
"$ref": "#/components/schemas/PublicationsPublishSettingsInteraction"
|
|
18829
|
+
},
|
|
18830
|
+
"duet": {
|
|
18831
|
+
"$ref": "#/components/schemas/PublicationsPublishSettingsInteraction"
|
|
18832
|
+
},
|
|
18833
|
+
"stitch": {
|
|
18834
|
+
"$ref": "#/components/schemas/PublicationsPublishSettingsInteraction"
|
|
18835
|
+
}
|
|
18836
|
+
}
|
|
18837
|
+
},
|
|
18838
|
+
"max_video_duration_sec": {
|
|
18839
|
+
"type": "integer",
|
|
18840
|
+
"description": "The longest video this account can post, in seconds. A longer one ends in `withErrors` with `publication_errors[].code = 2506`, before anything is uploaded."
|
|
18841
|
+
},
|
|
18842
|
+
"can_post": {
|
|
18843
|
+
"type": "boolean",
|
|
18844
|
+
"description": "`false` means the network will not take a post from this account now. Ask the user to try later instead of sending it: it would end in `withErrors` with `publication_errors[].code = 2507`."
|
|
18845
|
+
},
|
|
18846
|
+
"reason": {
|
|
18847
|
+
"type": "string",
|
|
18848
|
+
"description": "When `can_post` is `false`, the network's code: `spam_risk_too_many_posts` (daily limit of the creator), `spam_risk_user_banned_from_posting`, `reached_active_user_cap`."
|
|
18849
|
+
}
|
|
18850
|
+
},
|
|
18851
|
+
"required": [
|
|
18852
|
+
"social_network",
|
|
18853
|
+
"visibility_options",
|
|
18854
|
+
"interactions",
|
|
18855
|
+
"can_post"
|
|
18856
|
+
]
|
|
18857
|
+
},
|
|
18858
|
+
"PublicationsPublishSettingsInteraction": {
|
|
18859
|
+
"type": "object",
|
|
18860
|
+
"properties": {
|
|
18861
|
+
"disabled": {
|
|
18862
|
+
"type": "boolean"
|
|
18863
|
+
}
|
|
18864
|
+
},
|
|
18865
|
+
"required": [
|
|
18866
|
+
"disabled"
|
|
18867
|
+
]
|
|
18868
|
+
},
|
|
18588
18869
|
"SocialCredentials": {
|
|
18589
18870
|
"type": "object",
|
|
18590
18871
|
"description": "What can be read back about an organization's own application. The secrets are not here and never will be.",
|
|
@@ -9,7 +9,7 @@ name = "planvortex"
|
|
|
9
9
|
# entonces `project.version` desapareceria del pyproject y el paso del workflow de release que
|
|
10
10
|
# compara el tag con la version —que lo lee con `tomllib`— dejaria de encontrarla. Se quedan las dos
|
|
11
11
|
# y las ata `tests/test_packaging.py`, que falla si se separan.
|
|
12
|
-
version = "0.
|
|
12
|
+
version = "0.16.0"
|
|
13
13
|
description = "Official Python client for the PlanVortex API"
|
|
14
14
|
readme = "README.md"
|
|
15
15
|
requires-python = ">=3.10"
|
|
@@ -59,6 +59,10 @@ PLANVORTEX_ERROR_RANGES: tuple[ErrorRange, ...] = (
|
|
|
59
59
|
# Los COMENTARIOS siguen aqui porque sus 945-948 se llenaron, y van con ellos a `publication`:
|
|
60
60
|
# el 2600 (esta cuenta no tiene bandeja, un perfil personal de LinkedIn) es la version por
|
|
61
61
|
# cuenta del 945, y separarlos daria dos clases para el mismo «aqui no hay comentarios».
|
|
62
|
+
# Los campos de publicacion que no cabian en los 9xx (2500-2507: visibilidad, ninos, y lo que
|
|
63
|
+
# exige la auditoria de TikTok). Casi todos viajan en `publication_errors`, pero el 2508 se
|
|
64
|
+
# LANZA: `accounts.publish_settings()` en una red que no los tiene.
|
|
65
|
+
ErrorRange(2500, 2599, "publication"),
|
|
62
66
|
ErrorRange(2600, 2699, "publication"),
|
|
63
67
|
)
|
|
64
68
|
|
|
@@ -144,7 +148,10 @@ class PublicationError(PlanVortexError):
|
|
|
144
148
|
say which board it goes to. One of them is not a failure: 991 is Pinterest throttling the
|
|
145
149
|
application, it arrives as a 429 with ``Retry-After`` and the answer is to wait.
|
|
146
150
|
|
|
147
|
-
Also
|
|
151
|
+
Also 2500-2599, the publication fields that did not fit either (visibility, made for kids,
|
|
152
|
+
and TikTok's interactions and commercial content); only 2508 is raised, by
|
|
153
|
+
``accounts.publish_settings()`` on a network that has none. And 2600-2699, the comment codes
|
|
154
|
+
that did not fit after 945-948: 2600 is the per-account
|
|
148
155
|
version of 945, an account with no comment inbox on a network that has one (a LinkedIn
|
|
149
156
|
personal profile).
|
|
150
157
|
"""
|