shapi-cli 0.0.0-stage → 0.2.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.
Files changed (61) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +49 -2
  3. package/advisories/anthropic-api-version-2026-10-21-sampling-params-400.json +35 -0
  4. package/advisories/github-workflow-dispatch-204-to-200.json +26 -0
  5. package/advisories/google-ads-api-v22-sunset.json +27 -0
  6. package/advisories/google-custom-search-json-api-shutdown.json +27 -0
  7. package/advisories/google-gemini-2-0-flash-shutdown.json +27 -0
  8. package/advisories/google-gemini-2-5-flash-image-shutdown.json +27 -0
  9. package/advisories/google-gemini-2-5-preview-tts-shutdown.json +27 -0
  10. package/advisories/hubspot-contact-lists-v1-sunset.json +28 -0
  11. package/advisories/hubspot-contacts-v1-list-memberships-removed.json +30 -0
  12. package/advisories/hubspot-marketing-emails-folderid-removed.json +39 -0
  13. package/advisories/hubspot-marketing-emails-v1-sunset.json +24 -0
  14. package/advisories/hubspot-pipelines-v1-sunset.json +44 -0
  15. package/advisories/meta-graph-commerce-order-management-removed.json +26 -0
  16. package/advisories/meta-graph-date-format-param-removed.json +30 -0
  17. package/advisories/meta-graph-delivery-estimate-fields-removed.json +30 -0
  18. package/advisories/meta-graph-instagram-oembed-fields-removed.json +33 -0
  19. package/advisories/meta-graph-marketing-api-v24-sunset.json +34 -0
  20. package/advisories/meta-graph-marketing-api-v25-sunset.json +35 -0
  21. package/advisories/meta-graph-page-insights-impressions-fans-removed.json +51 -0
  22. package/advisories/meta-graph-page-insights-reach-video-views-removed.json +57 -0
  23. package/advisories/meta-graph-root-ids-lookup-removed.json +30 -0
  24. package/advisories/meta-graph-v20-sunset.json +33 -0
  25. package/advisories/meta-graph-v21-sunset.json +33 -0
  26. package/advisories/openai-assistants-api-shutdown.json +27 -0
  27. package/advisories/openai-audio-translations-endpoint-shutdown.json +27 -0
  28. package/advisories/openai-evals-api-shutdown.json +27 -0
  29. package/advisories/quickbooks-companyinfo-neoenabled-removed.json +29 -0
  30. package/advisories/quickbooks-minorversion-below-75-ignored.json +40 -0
  31. package/advisories/quickbooks-refresh-token-five-year-hard-expiry.json +29 -0
  32. package/advisories/reddit-logged-out-json-403.json +25 -0
  33. package/advisories/salesforce-soap-login-broad-ip-range-token-required.json +30 -0
  34. package/advisories/salesforce-soap-login-disabled-when-unused.json +30 -0
  35. package/advisories/salesforce-soap-login-use-any-api-auth-required.json +31 -0
  36. package/advisories/shopify-admin-api-2026-01-unsupported.json +33 -0
  37. package/advisories/shopify-admin-api-2026-04-unsupported.json +33 -0
  38. package/advisories/shopify-global-catalog-rest-api-shutdown.json +24 -0
  39. package/advisories/shopify-non-expiring-offline-tokens-rejected.json +27 -0
  40. package/advisories/shopify-script-tags-stop-running.json +27 -0
  41. package/advisories/slack-files-upload-retired.json +28 -0
  42. package/advisories/stripe-checkout-session-ui-mode-values-renamed.json +53 -0
  43. package/advisories/twilio-conference-list-default-in-progress.json +27 -0
  44. package/advisories/twilio-notify-end-of-life.json +28 -0
  45. package/advisories/twilio-rcs-undelivered-error-code-30046.json +27 -0
  46. package/advisories/twilio-voice-insights-conference-participant-removed.json +28 -0
  47. package/advisories/x-activity-api-pascalcase-event-types-removed.json +31 -0
  48. package/advisories/x-self-serve-follow-writes-removed.json +27 -0
  49. package/advisories/x-self-serve-like-writes-removed.json +27 -0
  50. package/advisories/xero-accounting-transactions-scope-split.json +27 -0
  51. package/advisories/xero-allocations-contact-mismatch-rejected.json +27 -0
  52. package/advisories/xero-au-payroll-isqualifyingearnings-required.json +28 -0
  53. package/advisories/xero-finance-accounting-activities-decommissioned.json +28 -0
  54. package/advisories/xero-invoices-email-daily-limit-429.json +32 -0
  55. package/advisories/xero-nz-payroll-employee-tax-kiwisaverstatus-required.json +27 -0
  56. package/advisories/xero-organisation-class-ultra-enum.json +31 -0
  57. package/bin/shapi.js +4 -0
  58. package/dist/index.js +4206 -0
  59. package/dist/tree-sitter-python.wasm +0 -0
  60. package/package.json +52 -4
  61. package/recordings/github-workflow-dispatch-204-to-200.json +46 -0
@@ -0,0 +1,30 @@
1
+ {
2
+ "id": "salesforce-soap-login-broad-ip-range-token-required",
3
+ "provider": "salesforce",
4
+ "title": "SOAP login() from a broad IP range needs a security token from 2026-12-15",
5
+ "summary": "Starting 2026-12-15 in sandboxes and 2027-01-31 in production, SOAP API login() for a user whose org or profile login IP range is broad (larger than /8 IPv4 or /29 IPv6) fails without a security token (or mTLS); username and password alone fail with TOKEN_REQUIRED (Login History result 1502). It applies to login() on /services/Soap/c/{v} and /services/Soap/u/{v} in API 31.0-64.0.",
6
+ "endpoint": {
7
+ "method": "POST",
8
+ "path": "/services/Soap/*/*",
9
+ "hosts": [
10
+ "login.salesforce.com",
11
+ "test.salesforce.com"
12
+ ]
13
+ },
14
+ "changeClass": "auth",
15
+ "trigger": {
16
+ "any": true
17
+ },
18
+ "firstObserved": null,
19
+ "publishedNotice": {
20
+ "date": "2025-08-25",
21
+ "url": "https://help.salesforce.com/s/articleView?id=005132110&type=1"
22
+ },
23
+ "effectiveDate": "2026-12-15",
24
+ "severity": "critical",
25
+ "migrationNote": "Preferably switch the integration to an External Client App with OAuth 2.0 before 2026-12-15 (sandbox) / 2027-01-31 (production). As a stopgap, append the user's security token to the password in the login() call, or narrow the org Network Access or profile Login IP Ranges so they are no longer broad; test with the 'SOAP API login() Security Remediation' release update.",
26
+ "sources": [
27
+ "https://help.salesforce.com/s/articleView?id=005132110&type=1"
28
+ ],
29
+ "status": "verified"
30
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "id": "salesforce-soap-login-disabled-when-unused",
3
+ "provider": "salesforce",
4
+ "title": "SOAP login() turned off in orgs with no use in six months, from 2026-12-15",
5
+ "summary": "In a one-time check on 2026-12-15 (sandboxes) and 2027-01-31 (production), Salesforce disables SOAP API login() in orgs that had no SOAP login() call in the previous six months; after that, login() fails in that org. Rarely run jobs (annual, seasonal, disaster recovery) can look inactive and then break. One call by any user in the window keeps login() on.",
6
+ "endpoint": {
7
+ "method": "POST",
8
+ "path": "/services/Soap/*/*",
9
+ "hosts": [
10
+ "login.salesforce.com",
11
+ "test.salesforce.com"
12
+ ]
13
+ },
14
+ "changeClass": "auth",
15
+ "trigger": {
16
+ "any": true
17
+ },
18
+ "firstObserved": null,
19
+ "publishedNotice": {
20
+ "date": "2025-08-25",
21
+ "url": "https://help.salesforce.com/s/articleView?id=005132110&type=1"
22
+ },
23
+ "effectiveDate": "2026-12-15",
24
+ "severity": "critical",
25
+ "migrationNote": "Check Login History (API Type SOAP Enterprise/Partner) and the API Total Usage event log (API_FAMILY SOAP, API_RESOURCE login) for every integration that uses SOAP login(), including rarely run jobs, and move them to an External Client App with OAuth 2.0 before 2026-12-15 (sandbox) / 2027-01-31 (production).",
26
+ "sources": [
27
+ "https://help.salesforce.com/s/articleView?id=005132110&type=1"
28
+ ],
29
+ "status": "verified"
30
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "id": "salesforce-soap-login-use-any-api-auth-required",
3
+ "provider": "salesforce",
4
+ "title": "SOAP login() requires the Use Any API Auth permission from 2026-12-01",
5
+ "summary": "Salesforce enforces a new control on SOAP API login() in all orgs on 2026-12-01: login() succeeds only for users with the Use Any API Auth user permission, and otherwise is rejected with INSUFFICIENT_ACCESS. It is already the default in new orgs. It applies to login() on the Enterprise (/services/Soap/c/{v}) and Partner (/services/Soap/u/{v}) endpoints in API 31.0-64.0; login() is already unavailable in 65.0 and later.",
6
+ "endpoint": {
7
+ "method": "POST",
8
+ "path": "/services/Soap/*/*",
9
+ "hosts": [
10
+ "login.salesforce.com",
11
+ "test.salesforce.com"
12
+ ]
13
+ },
14
+ "changeClass": "auth",
15
+ "trigger": {
16
+ "any": true
17
+ },
18
+ "firstObserved": null,
19
+ "publishedNotice": {
20
+ "date": "2025-08-25",
21
+ "url": "https://help.salesforce.com/s/articleView?id=005132110&type=1"
22
+ },
23
+ "effectiveDate": "2026-12-01",
24
+ "severity": "critical",
25
+ "migrationNote": "Assign the Use Any API Auth permission (permission set or profile) to every integration user that still calls SOAP login(), and test with the 'Assign Use Any API Auth Permission for SOAP login()' release update. Plan the real fix at the same time: authenticate through an External Client App with OAuth 2.0 (JWT bearer or client credentials for server-to-server, web server flow for user-driven apps), because login() is retired in Summer '27.",
26
+ "sources": [
27
+ "https://help.salesforce.com/s/articleView?id=005132110&type=1",
28
+ "https://developer.salesforce.com/docs/platform/api/guide/api-eol-soap.html"
29
+ ],
30
+ "status": "verified"
31
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "id": "shopify-admin-api-2026-01-unsupported",
3
+ "provider": "shopify",
4
+ "title": "Shopify Admin API version 2026-01 becomes unsupported on 2027-01-16",
5
+ "summary": "Admin API version 2026-01 is accessible until January 16, 2027 15:00 UTC. After that, requests to /admin/api/2026-01/... (REST and GraphQL) and webhooks pinned to 2026-01 fall forward to the oldest accessible stable version without an error, so responses can change shape silently. Every app still pinned to 2026-01 is hit.",
6
+ "endpoint": {
7
+ "method": "*",
8
+ "path": "/admin/api/2026-01/**"
9
+ },
10
+ "changeClass": "version-sunset",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": null,
17
+ "url": "https://shopify.dev/docs/api/usage/versioning"
18
+ },
19
+ "effectiveDate": "2027-01-16",
20
+ "severity": "critical",
21
+ "migrationNote": "Move the version segment in your Admin API URLs and webhook subscriptions to a supported version (2026-04 or later; 2026-10 is the latest stable), work through the release notes for every version in between, and check the X-Shopify-API-Version response header to confirm Shopify is not falling forward.",
22
+ "recipeId": "apply-fix",
23
+ "fix": {
24
+ "path": {
25
+ "from": "/admin/api/2026-01/",
26
+ "to": "/admin/api/2026-10/"
27
+ }
28
+ },
29
+ "sources": [
30
+ "https://shopify.dev/docs/api/usage/versioning"
31
+ ],
32
+ "status": "verified"
33
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "id": "shopify-admin-api-2026-04-unsupported",
3
+ "provider": "shopify",
4
+ "title": "Shopify Admin API version 2026-04 becomes unsupported on 2027-04-16",
5
+ "summary": "Admin API version 2026-04 is accessible until April 16, 2027 15:00 UTC. After that, requests to /admin/api/2026-04/... (REST and GraphQL) and webhooks pinned to 2026-04 fall forward to the oldest accessible stable version without an error, so responses can change shape silently. Every app still pinned to 2026-04 is hit.",
6
+ "endpoint": {
7
+ "method": "*",
8
+ "path": "/admin/api/2026-04/**"
9
+ },
10
+ "changeClass": "version-sunset",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": null,
17
+ "url": "https://shopify.dev/docs/api/usage/versioning"
18
+ },
19
+ "effectiveDate": "2027-04-16",
20
+ "severity": "high",
21
+ "migrationNote": "Move the version segment in your Admin API URLs and webhook subscriptions to a supported version (2026-07 or later; 2026-10 is the latest stable), work through the release notes for every version in between, and check the X-Shopify-API-Version response header to confirm Shopify is not falling forward.",
22
+ "recipeId": "apply-fix",
23
+ "fix": {
24
+ "path": {
25
+ "from": "/admin/api/2026-04/",
26
+ "to": "/admin/api/2026-10/"
27
+ }
28
+ },
29
+ "sources": [
30
+ "https://shopify.dev/docs/api/usage/versioning"
31
+ ],
32
+ "status": "verified"
33
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "shopify-global-catalog-rest-api-shutdown",
3
+ "provider": "shopify",
4
+ "title": "Shopify Global Catalog REST API stops serving traffic on 2026-11-02",
5
+ "summary": "The Global Catalog REST API on discover.shopifyapps.com (/global/v2/search, /global/v2/p/{upid}, /global/v2/p/by-variant/{vid}, POST /global/v2/lookup, including saved-catalog requests) stops serving traffic on November 2, 2026, and requests to it will fail. Anything still calling it must move to the Global Catalog MCP server.",
6
+ "endpoint": {
7
+ "method": "*",
8
+ "path": "/global/v2/**"
9
+ },
10
+ "changeClass": "version-sunset",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2026-10-09",
17
+ "url": "https://shopify.dev/changelog/posts/global-catalog-rest-api-stops-serving-traffic-on-november-2-2026"
18
+ },
19
+ "effectiveDate": "2026-11-02",
20
+ "severity": "critical",
21
+ "migrationNote": "Switch to the Global Catalog MCP server at https://catalog.shopify.com/api/ucp/mcp: use the search_catalog tool instead of GET /global/v2/search, get_product instead of the single-product and by-variant lookups, and lookup_catalog (up to 50 items per request) instead of POST /global/v2/lookup.",
22
+ "sources": ["https://shopify.dev/changelog/posts/global-catalog-rest-api-stops-serving-traffic-on-november-2-2026"],
23
+ "status": "verified"
24
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "shopify-non-expiring-offline-tokens-rejected",
3
+ "provider": "shopify",
4
+ "title": "Shopify rejects non-expiring offline access tokens from public apps on 2027-01-01",
5
+ "summary": "Starting January 1, 2027, every public app (including ones created before April 1, 2026) must use expiring offline access tokens to call the Admin API. Shopify enforces this on GraphQL Admin API requests: a request with a non-expiring token gets 403 Forbidden with \"Non-expiring access tokens are no longer accepted for the Admin API\", and merchants lose access until they re-authenticate. Custom apps and merchant-created apps are not affected.",
6
+ "endpoint": {
7
+ "method": "POST",
8
+ "path": "/admin/api/{version}/graphql.json"
9
+ },
10
+ "changeClass": "auth",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2026-05-20",
17
+ "url": "https://shopify.dev/changelog/posts/expiring-offline-access-tokens-required-for-all-public-apps-as-of-january-1-2027"
18
+ },
19
+ "effectiveDate": "2027-01-01",
20
+ "severity": "critical",
21
+ "migrationNote": "Exchange each stored non-expiring token for an expiring one with POST /admin/oauth/access_token (grant_type=urn:ietf:params:oauth:grant-type:token-exchange, subject_token_type and requested_token_type urn:shopify:params:oauth:token-type:offline-access-token, expiring=1), store the access token, refresh token and expiry, and refresh before expiry; on the official app templates set future.expiringOfflineAccessTokens: true and redeploy. Check API Health in the Dev Dashboard to confirm the app is migrated.",
22
+ "sources": [
23
+ "https://shopify.dev/changelog/posts/expiring-offline-access-tokens-required-for-all-public-apps-as-of-january-1-2027",
24
+ "https://shopify.dev/docs/apps/build/authentication-authorization/migrate-to-expiring-offline-access-tokens"
25
+ ],
26
+ "status": "verified"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "shopify-script-tags-stop-running",
3
+ "provider": "shopify",
4
+ "title": "Shopify script tags stop running on storefronts on 2027-03-01",
5
+ "summary": "Script tags are deprecated in every Admin API version. Since October 1, 2026 the REST ScriptTag resource rejects POST and PUT and the GraphQL scriptTagCreate and scriptTagUpdate mutations return a user error; on March 1, 2027 Shopify stops injecting existing script tags into storefronts, so their JavaScript no longer loads. Listing and deleting script tags keeps working.",
6
+ "endpoint": {
7
+ "method": "*",
8
+ "path": "/admin/api/{version}/script_tags**"
9
+ },
10
+ "changeClass": "version-sunset",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2026-08-24",
17
+ "url": "https://shopify.dev/changelog/online-store-script-tags-deprecation"
18
+ },
19
+ "effectiveDate": "2027-03-01",
20
+ "severity": "high",
21
+ "migrationNote": "Stop creating or updating script tags (POST /admin/api/{version}/script_tags.json and PUT .../script_tags/{script_tag_id}.json already fail). Move storefront scripts to app embed blocks in a theme app extension, and analytics or conversion scripts to a web pixel; then delete the old script tags. Pinning an older API version does not delay this.",
22
+ "sources": [
23
+ "https://shopify.dev/changelog/online-store-script-tags-deprecation",
24
+ "https://shopify.dev/docs/api/admin-rest/latest/resources/scripttag"
25
+ ],
26
+ "status": "verified"
27
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "id": "slack-files-upload-retired",
3
+ "provider": "slack",
4
+ "title": "files.upload Web API method sunset on 2025-11-12",
5
+ "summary": "Slack deprecated files.upload. Apps created on or after 2024-05-16 could not use it, and Slack's reference page says the method stops working and is sunset on 2025-11-12 for existing apps too (the date was moved from 2025-03-11). Code that still uploads through files.upload fails with method_deprecated or deprecated_endpoint errors.",
6
+ "endpoint": {
7
+ "method": "POST",
8
+ "path": "/api/files.upload"
9
+ },
10
+ "changeClass": "version-sunset",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2025-03-17",
17
+ "url": "https://docs.slack.dev/changelog/2025/03/17/files-upload-extension"
18
+ },
19
+ "effectiveDate": "2025-11-12",
20
+ "severity": "critical",
21
+ "migrationNote": "Replace files.upload with the two-step flow: call files.getUploadURLExternal (filename, length) to get an upload_url and file_id, POST the file bytes to upload_url, then call files.completeUploadExternal with the file_id(s) and the channel_id, initial_comment or thread_ts you used to pass to files.upload. The official Slack SDKs wrap this as files_upload_v2 / filesUploadV2 / uploadV2.",
22
+ "sources": [
23
+ "https://docs.slack.dev/reference/methods/files.upload",
24
+ "https://docs.slack.dev/changelog/2025/03/17/files-upload-extension",
25
+ "https://docs.slack.dev/changelog/2024-04-a-better-way-to-upload-files-is-here-to-stay"
26
+ ],
27
+ "status": "verified"
28
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "id": "stripe-checkout-session-ui-mode-values-renamed",
3
+ "provider": "stripe",
4
+ "title": "Stripe 2026-03-25.dahlia renames Checkout Session ui_mode values",
5
+ "summary": "From API version 2026-03-25.dahlia, Checkout Session ui_mode values hosted, embedded and custom are replaced by hosted_page, embedded_page and elements (and form is added). Creating a session with an old value fails, and code that compares the returned ui_mode to the old strings stops matching once the account or SDK is upgraded.",
6
+ "endpoint": {
7
+ "method": "*",
8
+ "path": "/v1/checkout/sessions/**"
9
+ },
10
+ "changeClass": "enum-added",
11
+ "trigger": {
12
+ "enums": [
13
+ {
14
+ "field": "ui_mode"
15
+ }
16
+ ]
17
+ },
18
+ "firstObserved": null,
19
+ "publishedNotice": {
20
+ "date": "2026-03-25",
21
+ "url": "https://docs.stripe.com/changelog/dahlia/2026-03-25/updates-available-checkout-session-ui-modes"
22
+ },
23
+ "effectiveDate": "2026-03-25",
24
+ "severity": "high",
25
+ "migrationNote": "When moving to 2026-03-25.dahlia or later, send ui_mode hosted_page instead of hosted, embedded_page instead of embedded and elements instead of custom, and update every comparison of session.ui_mode (including checkout.session webhook handlers) to the new values; handle the new form value too.",
26
+ "recipeId": "apply-fix",
27
+ "fix": {
28
+ "enums": [
29
+ {
30
+ "field": "ui_mode",
31
+ "values": [
32
+ {
33
+ "from": "hosted",
34
+ "to": "hosted_page"
35
+ },
36
+ {
37
+ "from": "embedded",
38
+ "to": "embedded_page"
39
+ },
40
+ {
41
+ "from": "custom",
42
+ "to": "elements"
43
+ }
44
+ ]
45
+ }
46
+ ]
47
+ },
48
+ "sources": [
49
+ "https://docs.stripe.com/changelog/dahlia/2026-03-25/updates-available-checkout-session-ui-modes",
50
+ "https://docs.stripe.com/api/checkout/sessions/create"
51
+ ],
52
+ "status": "verified"
53
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "twilio-conference-list-default-in-progress",
3
+ "provider": "twilio",
4
+ "title": "Twilio Conference list returns only in-progress conferences by default from 2026-09-30",
5
+ "summary": "Starting September 30, 2026 (rollout delayed from July 13, 2026), GET /2010-04-01/Accounts/{AccountSid}/Conferences.json without a Status filter returns only in-progress conferences instead of in-progress and completed ones. Code that lists conferences without Status and expects completed ones gets silently incomplete results.",
6
+ "endpoint": {
7
+ "method": "GET",
8
+ "path": "/2010-04-01/Accounts/{AccountSid}/Conferences.json"
9
+ },
10
+ "changeClass": "required-field",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2026-09-23",
17
+ "url": "https://www.twilio.com/en-us/changelog/conference-list-endpoint-july-2026"
18
+ },
19
+ "effectiveDate": "2026-09-30",
20
+ "severity": "critical",
21
+ "migrationNote": "Pass Status=completed explicitly when you need completed conferences (reporting, billing or cleanup jobs), and make a second request without it for in-progress ones if you need both; do not rely on the unfiltered list containing completed conferences.",
22
+ "sources": [
23
+ "https://www.twilio.com/en-us/changelog/conference-list-endpoint-july-2026",
24
+ "https://www.twilio.com/en-us/changelog/conference-list-endpoint-rollout-extended"
25
+ ],
26
+ "status": "verified"
27
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "id": "twilio-notify-end-of-life",
3
+ "provider": "twilio",
4
+ "title": "Twilio Notify reaches end of life (reported for 2027-01-31)",
5
+ "summary": "Twilio Notify (notify.twilio.com, e.g. POST /v1/Services/{ServiceSid}/Notifications) has been unsupported and closed to new customers since October 2022, and is reported to reach end of life for existing customers on January 31, 2027, after which Notify API requests are expected to fail. That date comes from Twilio's help-center article as quoted by a third party; Twilio's own January 2024 changelog gave December 31, 2025, so the exact date is not confirmed on a primary page.",
6
+ "endpoint": {
7
+ "method": "POST",
8
+ "path": "/v1/Services/{ServiceSid}/Notifications"
9
+ },
10
+ "changeClass": "version-sunset",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2024-01-23",
17
+ "url": "https://www.twilio.com/en-us/changelog/notify-api-end-of-life-further-extension-notice"
18
+ },
19
+ "effectiveDate": "2027-01-31",
20
+ "severity": "critical",
21
+ "migrationNote": "Move bulk SMS sends to the Messaging API (or Twilio's Bulk Messaging API) and push notifications to a direct APNs/FCM integration or another push provider, then remove Notify Services and Bindings. Confirm the final shutdown date with Twilio support or the Console before planning around it.",
22
+ "sources": [
23
+ "https://www.courier.com/blog/twilio-notify-end-of-life",
24
+ "https://www.twilio.com/en-us/changelog/notify-api-end-of-life-further-extension-notice",
25
+ "https://www.twilio.com/docs/notify/api/notification-resource"
26
+ ],
27
+ "status": "unverified"
28
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "twilio-rcs-undelivered-error-code-30046",
3
+ "provider": "twilio",
4
+ "title": "Twilio RCS unconfirmed-delivery error code changed from 30036 to 30046",
5
+ "summary": "Since August 10, 2026, an RCS message that cannot be delivered to an unreachable device fails with error code 30046 (Message delivery not confirmed) instead of 30036 (Validity Period Expired). Custom SMS failover logic that checks error_code or ErrorCode for 30036 no longer fires; Twilio's native SMS fallback is not affected.",
6
+ "endpoint": {
7
+ "method": "GET",
8
+ "path": "/2010-04-01/Accounts/{AccountSid}/Messages/{Sid}.json"
9
+ },
10
+ "changeClass": "enum-added",
11
+ "trigger": {
12
+ "enums": [{ "field": "error_code" }]
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2026-07-09",
17
+ "url": "https://www.twilio.com/en-us/changelog/rcs-error-code-changing"
18
+ },
19
+ "effectiveDate": "2026-08-10",
20
+ "severity": "medium",
21
+ "migrationNote": "Wherever you branch on error_code (Message resource) or ErrorCode (status callbacks) to trigger SMS failover for RCS, treat 30046 the same as 30036, and test the fallback path.",
22
+ "sources": [
23
+ "https://www.twilio.com/en-us/changelog/rcs-error-code-changing",
24
+ "https://www.twilio.com/docs/messaging/api/message-resource"
25
+ ],
26
+ "status": "verified"
27
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "id": "twilio-voice-insights-conference-participant-removed",
3
+ "provider": "twilio",
4
+ "title": "Twilio Voice Insights Call Summary drops attributes.conference_participant on 2026-08-01",
5
+ "summary": "On August 1, 2026 Twilio removed the conference_participant attribute from the Voice Insights Call Summary (GET /v1/Voice/{CallSid}/Summary on insights.twilio.com) and the matching Event Streams event; attributes now returns null for every call. Code that reads attributes.conference_participant gets nothing, and code that dereferences attributes can throw.",
6
+ "endpoint": {
7
+ "method": "GET",
8
+ "path": "/v1/Voice/{CallSid}/Summary"
9
+ },
10
+ "changeClass": "field-rename",
11
+ "trigger": {
12
+ "fields": ["attributes.conference_participant"]
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2026-07-01",
17
+ "url": "https://www.twilio.com/en-us/changelog/voice-insights-removal-conference-participant-field"
18
+ },
19
+ "effectiveDate": "2026-08-01",
20
+ "severity": "medium",
21
+ "migrationNote": "Stop reading attributes.conference_participant and treat attributes as nullable. Get conference data from the Conference Insights API or Conference Insights Event Streams instead.",
22
+ "sources": [
23
+ "https://www.twilio.com/en-us/changelog/voice-insights-removal-conference-participant-field",
24
+ "https://www.twilio.com/docs/voice/voice-insights/api/call/details-call-summary",
25
+ "https://www.twilio.com/docs/voice/voice-insights/api/call/call-summary-resource"
26
+ ],
27
+ "status": "verified"
28
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "id": "x-activity-api-pascalcase-event-types-removed",
3
+ "provider": "x",
4
+ "title": "X Activity API event types renamed from PascalCase to dot-separated lowercase",
5
+ "summary": "From 2026-03-18 the X Activity API (XAA) uses dot-separated lowercase event_type values such as profile.update.bio instead of PascalCase names such as ProfileBioUpdate. Subscriptions created with, or event handlers that switch on, the old names stop matching.",
6
+ "endpoint": {
7
+ "method": "*",
8
+ "path": "/2/activity/**"
9
+ },
10
+ "changeClass": "enum-added",
11
+ "trigger": {
12
+ "enums": [
13
+ {
14
+ "field": "event_type"
15
+ }
16
+ ]
17
+ },
18
+ "firstObserved": null,
19
+ "publishedNotice": {
20
+ "date": "2026-03-13",
21
+ "url": "https://docs.x.com/changelog"
22
+ },
23
+ "effectiveDate": "2026-03-18",
24
+ "severity": "high",
25
+ "migrationNote": "Send the new lowercase names (for example profile.update.bio, follow.follow, post.create) in POST /2/activity/subscriptions and update every filter, switch statement and deserializer that reads event_type from the activity stream or webhook payloads.",
26
+ "sources": [
27
+ "https://docs.x.com/changelog",
28
+ "https://docs.x.com/x-api/activity/introduction"
29
+ ],
30
+ "status": "verified"
31
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "x-self-serve-follow-writes-removed",
3
+ "provider": "x",
4
+ "title": "Following users removed from X API self-serve tiers",
5
+ "summary": "X's 2026-04-16 changelog says Following via the API has been removed from all self-serve tiers (Free, Basic, Pro, pay-per-use), leaving it to Enterprise. POST /2/users/{id}/following calls with self-serve credentials are rejected; X does not document the status code.",
6
+ "endpoint": {
7
+ "method": "POST",
8
+ "path": "/2/users/{id}/following"
9
+ },
10
+ "changeClass": "scope-change",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2026-04-16",
17
+ "url": "https://docs.x.com/changelog"
18
+ },
19
+ "effectiveDate": "2026-04-16",
20
+ "severity": "critical",
21
+ "migrationNote": "Remove or feature-flag follow actions for self-serve apps and show users a clear message (for example a link to the profile so they can follow in the X app), or move to an Enterprise agreement.",
22
+ "sources": [
23
+ "https://docs.x.com/changelog",
24
+ "https://opentweet.io/how-to/fix-x-api-like-follow-endpoint-removed"
25
+ ],
26
+ "status": "verified"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "x-self-serve-like-writes-removed",
3
+ "provider": "x",
4
+ "title": "Liking Posts removed from X API self-serve tiers",
5
+ "summary": "X's 2026-04-16 changelog says Following, Likes and Quote-Posts via the API have been removed from all self-serve tiers (Free, Basic, Pro, pay-per-use), leaving them to Enterprise. POST /2/users/{id}/likes calls with self-serve credentials are rejected; X does not document the status code. Quote-Posts (POST /2/tweets with quote_tweet_id) are also removed but cannot be matched by path.",
6
+ "endpoint": {
7
+ "method": "POST",
8
+ "path": "/2/users/{id}/likes"
9
+ },
10
+ "changeClass": "scope-change",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2026-04-16",
17
+ "url": "https://docs.x.com/changelog"
18
+ },
19
+ "effectiveDate": "2026-04-16",
20
+ "severity": "critical",
21
+ "migrationNote": "Remove or feature-flag like actions for self-serve apps and surface a clear error to users, or move to an Enterprise agreement. Also drop quote_tweet_id from POST /2/tweets on self-serve keys.",
22
+ "sources": [
23
+ "https://docs.x.com/changelog",
24
+ "https://opentweet.io/how-to/fix-x-api-like-follow-endpoint-removed"
25
+ ],
26
+ "status": "verified"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "xero-accounting-transactions-scope-split",
3
+ "provider": "xero",
4
+ "title": "Broad accounting.transactions scope replaced by granular scopes",
5
+ "summary": "Xero split accounting.transactions into granular scopes (invoices, payments, bank transactions, manual journals, classic expenses, each with a .read variant). Apps created after 2026-03-02 must request granular scopes; existing apps keep the broad scopes until September 2027, and each connected user must re-authorize to receive the new ones.",
6
+ "endpoint": {
7
+ "method": "*",
8
+ "path": "/api.xro/2.0/**"
9
+ },
10
+ "changeClass": "scope-change",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": null,
17
+ "url": "https://devblog.xero.com/upcoming-changes-to-xero-accounting-api-scopes-705c5a9621a0"
18
+ },
19
+ "effectiveDate": "2027-09-13",
20
+ "severity": "medium",
21
+ "migrationNote": "Request the granular scopes in the authorization URL and have each connection re-authorize before the cutoff.",
22
+ "sources": [
23
+ "https://devblog.xero.com/upcoming-changes-to-xero-accounting-api-scopes-705c5a9621a0",
24
+ "https://www.apideck.com/blog/xero-scopes"
25
+ ],
26
+ "status": "verified"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "xero-allocations-contact-mismatch-rejected",
3
+ "provider": "xero",
4
+ "title": "Allocations between documents of different contacts are rejected",
5
+ "summary": "Xero now requires a credit note, prepayment or overpayment to belong to the same contact as the invoice or bill it is allocated to. Allocation requests with a contact mismatch return a validation error. The notice is dated 2026-10-08 and gives no separate enforcement date.",
6
+ "endpoint": {
7
+ "method": "PUT",
8
+ "path": "/api.xro/2.0/*/{id}/Allocations"
9
+ },
10
+ "changeClass": "status-code",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2026-10-08",
17
+ "url": "https://developer.xero.com/changelog"
18
+ },
19
+ "effectiveDate": "2026-10-08",
20
+ "severity": "medium",
21
+ "migrationNote": "Before calling PUT /CreditNotes/{CreditNoteID}/Allocations, /Prepayments/{PrepaymentID}/Allocations or /Overpayments/{OverpaymentID}/Allocations, check that Contact.ContactID is the same on the source document and on the target invoice or bill. On a validation error, show the user the mismatch instead of retrying, because the unchanged request keeps failing.",
22
+ "sources": [
23
+ "https://developer.xero.com/changelog",
24
+ "https://raw.githubusercontent.com/XeroAPI/Xero-OpenAPI/master/xero_accounting.yaml"
25
+ ],
26
+ "status": "unverified"
27
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "id": "xero-au-payroll-isqualifyingearnings-required",
3
+ "provider": "xero",
4
+ "title": "AU Payroll pay item and earnings rate writes require IsQualifyingEarnings",
5
+ "summary": "Since 2026-09-10, AU Payroll create and update requests for Earnings Rates and Pay Items must include IsQualifyingEarnings. Requests without it return a 400 validation error, and when it is true the matching super flag must agree. The same rule applies to the v2 endpoint POST /payroll.xro/2.0/earningsRates.",
6
+ "endpoint": {
7
+ "method": "POST",
8
+ "path": "/payroll.xro/1.0/PayItems"
9
+ },
10
+ "changeClass": "required-field",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2026-09-10",
17
+ "url": "https://developer.xero.com/changelog"
18
+ },
19
+ "effectiveDate": "2026-09-10",
20
+ "severity": "critical",
21
+ "migrationNote": "Add IsQualifyingEarnings to every earnings rate sent to POST /payroll.xro/1.0/PayItems, and isQualifyingEarnings to POST /payroll.xro/2.0/earningsRates. Keep it consistent with the super flags: when it is true, Pay Items need IsExemptFromSuper false and Earnings Rates need IsSubjectToSuper true. For rates you read and write back, keep the value Xero returned.",
22
+ "sources": [
23
+ "https://developer.xero.com/changelog",
24
+ "https://developer.xero.com/documentation/api/payrollau/payitems",
25
+ "https://developer.xero.com/documentation/api/payrollau/earningsrates"
26
+ ],
27
+ "status": "verified"
28
+ }