shapi-cli 0.1.0 → 0.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.
Files changed (55) hide show
  1. package/README.md +7 -4
  2. package/advisories/anthropic-api-version-2026-10-21-sampling-params-400.json +35 -0
  3. package/advisories/google-ads-api-v22-sunset.json +27 -0
  4. package/advisories/google-custom-search-json-api-shutdown.json +27 -0
  5. package/advisories/google-gemini-2-0-flash-shutdown.json +27 -0
  6. package/advisories/google-gemini-2-5-flash-image-shutdown.json +27 -0
  7. package/advisories/google-gemini-2-5-preview-tts-shutdown.json +27 -0
  8. package/advisories/hubspot-contact-lists-v1-sunset.json +28 -0
  9. package/advisories/hubspot-contacts-v1-list-memberships-removed.json +30 -0
  10. package/advisories/hubspot-marketing-emails-folderid-removed.json +39 -0
  11. package/advisories/hubspot-marketing-emails-v1-sunset.json +24 -0
  12. package/advisories/hubspot-pipelines-v1-sunset.json +22 -2
  13. package/advisories/meta-graph-commerce-order-management-removed.json +26 -0
  14. package/advisories/meta-graph-date-format-param-removed.json +30 -0
  15. package/advisories/meta-graph-delivery-estimate-fields-removed.json +30 -0
  16. package/advisories/meta-graph-instagram-oembed-fields-removed.json +33 -0
  17. package/advisories/meta-graph-marketing-api-v24-sunset.json +34 -0
  18. package/advisories/meta-graph-marketing-api-v25-sunset.json +35 -0
  19. package/advisories/meta-graph-page-insights-impressions-fans-removed.json +51 -0
  20. package/advisories/meta-graph-page-insights-reach-video-views-removed.json +57 -0
  21. package/advisories/meta-graph-root-ids-lookup-removed.json +30 -0
  22. package/advisories/meta-graph-v20-sunset.json +10 -1
  23. package/advisories/meta-graph-v21-sunset.json +10 -1
  24. package/advisories/openai-assistants-api-shutdown.json +27 -0
  25. package/advisories/openai-audio-translations-endpoint-shutdown.json +27 -0
  26. package/advisories/openai-evals-api-shutdown.json +27 -0
  27. package/advisories/quickbooks-companyinfo-neoenabled-removed.json +29 -0
  28. package/advisories/quickbooks-minorversion-below-75-ignored.json +13 -1
  29. package/advisories/quickbooks-refresh-token-five-year-hard-expiry.json +29 -0
  30. package/advisories/salesforce-soap-login-broad-ip-range-token-required.json +30 -0
  31. package/advisories/salesforce-soap-login-disabled-when-unused.json +30 -0
  32. package/advisories/salesforce-soap-login-use-any-api-auth-required.json +31 -0
  33. package/advisories/shopify-admin-api-2026-01-unsupported.json +33 -0
  34. package/advisories/shopify-admin-api-2026-04-unsupported.json +33 -0
  35. package/advisories/shopify-global-catalog-rest-api-shutdown.json +24 -0
  36. package/advisories/shopify-non-expiring-offline-tokens-rejected.json +27 -0
  37. package/advisories/shopify-script-tags-stop-running.json +27 -0
  38. package/advisories/slack-files-upload-retired.json +28 -0
  39. package/advisories/stripe-checkout-session-ui-mode-values-renamed.json +53 -0
  40. package/advisories/twilio-conference-list-default-in-progress.json +27 -0
  41. package/advisories/twilio-notify-end-of-life.json +28 -0
  42. package/advisories/twilio-rcs-undelivered-error-code-30046.json +27 -0
  43. package/advisories/twilio-voice-insights-conference-participant-removed.json +28 -0
  44. package/advisories/x-activity-api-pascalcase-event-types-removed.json +31 -0
  45. package/advisories/x-self-serve-follow-writes-removed.json +27 -0
  46. package/advisories/x-self-serve-like-writes-removed.json +27 -0
  47. package/advisories/xero-allocations-contact-mismatch-rejected.json +27 -0
  48. package/advisories/xero-au-payroll-isqualifyingearnings-required.json +28 -0
  49. package/advisories/xero-finance-accounting-activities-decommissioned.json +28 -0
  50. package/advisories/xero-invoices-email-daily-limit-429.json +32 -0
  51. package/advisories/xero-nz-payroll-employee-tax-kiwisaverstatus-required.json +27 -0
  52. package/advisories/xero-organisation-class-ultra-enum.json +31 -0
  53. package/dist/index.js +1527 -161
  54. package/dist/tree-sitter-python.wasm +0 -0
  55. package/package.json +7 -9
@@ -0,0 +1,57 @@
1
+ {
2
+ "id": "meta-graph-page-insights-reach-video-views-removed",
3
+ "provider": "meta-graph",
4
+ "title": "Page Insights reach and 3-second video viewer metrics removed on 2026-06-15",
5
+ "summary": "By 2026-06-15, on all API versions, the Page/post reach metrics (page_impressions_unique, post_impressions_unique and their paid, viral, nonviral, organic and fan variants, the page_posts_impressions family, page_posts_served_impressions_organic_unique) and the 3-second viewer metrics (page_video_views_unique, post_video_views_unique) return an invalid metric error. SHAPI flags calls that request one of these metrics.",
6
+ "endpoint": {
7
+ "method": "GET",
8
+ "path": "/*/*/insights"
9
+ },
10
+ "changeClass": "version-sunset",
11
+ "trigger": {
12
+ "query": [
13
+ {
14
+ "name": "metric",
15
+ "values": [
16
+ "page_impressions_unique",
17
+ "page_impressions_paid_unique",
18
+ "page_impressions_viral_unique",
19
+ "page_impressions_nonviral_unique",
20
+ "page_posts_impressions",
21
+ "page_posts_impressions_unique",
22
+ "page_posts_impressions_paid",
23
+ "page_posts_impressions_paid_unique",
24
+ "page_posts_impressions_organic_unique",
25
+ "page_posts_served_impressions_organic_unique",
26
+ "page_posts_impressions_viral",
27
+ "page_posts_impressions_viral_unique",
28
+ "page_posts_impressions_nonviral",
29
+ "page_posts_impressions_nonviral_unique",
30
+ "post_impressions_unique",
31
+ "post_impressions_paid_unique",
32
+ "post_impressions_fan_unique",
33
+ "post_impressions_organic_unique",
34
+ "post_impressions_viral_unique",
35
+ "post_impressions_nonviral_unique",
36
+ "page_video_views_unique",
37
+ "post_video_views_unique"
38
+ ]
39
+ }
40
+ ]
41
+ },
42
+ "firstObserved": null,
43
+ "publishedNotice": {
44
+ "date": "2026-02-18",
45
+ "url": "https://developers.facebook.com/blog/post/2026/02/18/introducing-graph-api-v25-and-marketing-api-v25/"
46
+ },
47
+ "effectiveDate": "2026-06-15",
48
+ "severity": "critical",
49
+ "migrationNote": "Switch reach and unique-viewer reporting to page_total_media_view_unique and post_total_media_view_unique (and page_media_view/post_media_view with is_from_ads for paid vs organic). The numbers use a different method, so do not splice them onto historical reach series, and drop metrics that have no replacement (viral/nonviral reach).",
50
+ "sources": [
51
+ "https://developers.facebook.com/docs/graph-api/reference/v22.0/insights",
52
+ "https://developers.facebook.com/blog/post/2026/02/18/introducing-graph-api-v25-and-marketing-api-v25/",
53
+ "https://developers.facebook.com/docs/platforminsights/page/deprecated-metrics",
54
+ "https://docs.supermetrics.com/docs/facebook-insights-field-changes-june-30-2026.md"
55
+ ],
56
+ "status": "verified"
57
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "id": "meta-graph-root-ids-lookup-removed",
3
+ "provider": "meta-graph",
4
+ "title": "Root GET /?ids= multi-object lookup returns an error from 2026-10-27",
5
+ "summary": "Graph API dropped legacy protocol features: root requests of the form GET /?ids=a,b (or /{version}/?ids=) return an error on v26.0+ since 2026-07-29 and on all supported versions from 2026-10-27. Meta does not state the error code.",
6
+ "endpoint": {
7
+ "method": "GET",
8
+ "path": "/*"
9
+ },
10
+ "changeClass": "version-sunset",
11
+ "trigger": {
12
+ "query": [
13
+ {
14
+ "name": "ids"
15
+ }
16
+ ]
17
+ },
18
+ "firstObserved": null,
19
+ "publishedNotice": {
20
+ "date": "2026-07-29",
21
+ "url": "https://developers.facebook.com/docs/graph-api/changelog/version26.0"
22
+ },
23
+ "effectiveDate": "2026-10-27",
24
+ "severity": "critical",
25
+ "migrationNote": "Replace each GET /?ids=... call with one request per object, or send the per-object requests in a single batch request (POST / with a batch parameter), and merge the results in your code.",
26
+ "sources": [
27
+ "https://developers.facebook.com/docs/graph-api/changelog/version26.0"
28
+ ],
29
+ "status": "verified"
30
+ }
@@ -19,6 +19,15 @@
19
19
  "effectiveDate": "2026-09-24",
20
20
  "severity": "high",
21
21
  "migrationNote": "Move the version segment to a supported version (v22.0 or later) and re-test the fields you read.",
22
- "sources": ["https://developers.facebook.com/docs/graph-api/changelog/versions"],
22
+ "recipeId": "apply-fix",
23
+ "fix": {
24
+ "path": {
25
+ "from": "/v20.0/",
26
+ "to": "/v26.0/"
27
+ }
28
+ },
29
+ "sources": [
30
+ "https://developers.facebook.com/docs/graph-api/changelog/versions"
31
+ ],
23
32
  "status": "verified"
24
33
  }
@@ -19,6 +19,15 @@
19
19
  "effectiveDate": "2027-01-21",
20
20
  "severity": "high",
21
21
  "migrationNote": "Move the version segment to a supported version (v22.0 or later) and re-test the fields you read.",
22
- "sources": ["https://developers.facebook.com/docs/graph-api/changelog/versions"],
22
+ "recipeId": "apply-fix",
23
+ "fix": {
24
+ "path": {
25
+ "from": "/v21.0/",
26
+ "to": "/v26.0/"
27
+ }
28
+ },
29
+ "sources": [
30
+ "https://developers.facebook.com/docs/graph-api/changelog/versions"
31
+ ],
23
32
  "status": "verified"
24
33
  }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "openai-assistants-api-shutdown",
3
+ "provider": "openai",
4
+ "title": "Assistants API removed on 2026-08-26",
5
+ "summary": "OpenAI removed the Assistants API on 2026-08-26, one year after its 2025-08-26 deprecation notice. Calls to the assistants endpoints, and to the threads, messages and runs endpoints that go with them (/v1/threads/**), no longer work. The replacement is the Responses API plus the Conversations API.",
6
+ "endpoint": {
7
+ "method": "*",
8
+ "path": "/v1/assistants/**"
9
+ },
10
+ "changeClass": "version-sunset",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2025-08-26",
17
+ "url": "https://developers.openai.com/api/docs/deprecations"
18
+ },
19
+ "effectiveDate": "2026-08-26",
20
+ "severity": "critical",
21
+ "migrationNote": "Move assistants to prompts (configuration created in the dashboard), threads to Conversations, and runs to Responses (send input items or a conversation id to the Responses API), and run the tool-call loop in your own code. Thread messages can no longer be fetched from the API, so read history from your own stored copy.",
22
+ "sources": [
23
+ "https://developers.openai.com/api/docs/deprecations",
24
+ "https://developers.openai.com/api/docs/assistants/migration"
25
+ ],
26
+ "status": "verified"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "openai-audio-translations-endpoint-shutdown",
3
+ "provider": "openai",
4
+ "title": "/v1/audio/translations shuts down on 2027-02-26",
5
+ "summary": "OpenAI deprecated the audio translations endpoint on 2026-08-26 and shuts it down on 2027-02-26, together with whisper-1 and the gpt-4o transcribe models. After that date every call to POST /v1/audio/translations fails.",
6
+ "endpoint": {
7
+ "method": "POST",
8
+ "path": "/v1/audio/translations"
9
+ },
10
+ "changeClass": "version-sunset",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2026-08-26",
17
+ "url": "https://developers.openai.com/api/docs/deprecations"
18
+ },
19
+ "effectiveDate": "2027-02-26",
20
+ "severity": "high",
21
+ "migrationNote": "Replace calls to POST /v1/audio/translations with the Realtime translations interface (v1/realtime/translations) that OpenAI names as the replacement, and move transcription off whisper-1 to gpt-live-transcribe or gpt-transcribe before 2027-02-26.",
22
+ "sources": [
23
+ "https://developers.openai.com/api/docs/deprecations",
24
+ "https://developers.openai.com/api/reference/resources/audio"
25
+ ],
26
+ "status": "verified"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "openai-evals-api-shutdown",
3
+ "provider": "openai",
4
+ "title": "Evals API shuts down on 2026-11-30",
5
+ "summary": "OpenAI is retiring the Evals platform: existing evals become read-only on 2026-10-31, and the Evals dashboard and API shut down on 2026-11-30. After that, calls to /v1/evals and its runs fail.",
6
+ "endpoint": {
7
+ "method": "*",
8
+ "path": "/v1/evals/**"
9
+ },
10
+ "changeClass": "version-sunset",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2026-06-03",
17
+ "url": "https://developers.openai.com/api/docs/deprecations"
18
+ },
19
+ "effectiveDate": "2026-11-30",
20
+ "severity": "critical",
21
+ "migrationNote": "Export the eval definitions and results you need before 2026-11-30, stop creating or updating evals (they are read-only from 2026-10-31), and move eval runs to Promptfoo following OpenAI's \"Moving from OpenAI Evals to Promptfoo\" guide.",
22
+ "sources": [
23
+ "https://developers.openai.com/api/docs/deprecations",
24
+ "https://developers.openai.com/api/reference/resources/evals"
25
+ ],
26
+ "status": "verified"
27
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "id": "quickbooks-companyinfo-neoenabled-removed",
3
+ "provider": "quickbooks",
4
+ "title": "CompanyInfo no longer returns the NeoEnabled NameValue",
5
+ "summary": "Since 2026-01-27 in production (2025-12-10 in sandbox), the CompanyInfo entity no longer includes the NeoEnabled attribute in its NameValue list. Code that looks up NeoEnabled gets no entry, while the API reference samples still show it.",
6
+ "endpoint": {
7
+ "method": "GET",
8
+ "path": "/v3/company/{realmId}/companyinfo/{companyId}"
9
+ },
10
+ "changeClass": "field-rename",
11
+ "trigger": {
12
+ "fields": [
13
+ "NeoEnabled"
14
+ ]
15
+ },
16
+ "firstObserved": null,
17
+ "publishedNotice": {
18
+ "date": "2025-12-01",
19
+ "url": "https://medium.com/intuitdev/upcoming-changes-to-apis-and-tools-that-may-impact-your-application-df4680ae3535"
20
+ },
21
+ "effectiveDate": "2026-01-27",
22
+ "severity": "low",
23
+ "migrationNote": "Treat a missing NeoEnabled entry in CompanyInfo.NameValue as normal, and stop deciding behavior from it. The same applies to CompanyInfo returned by the query endpoint.",
24
+ "sources": [
25
+ "https://medium.com/intuitdev/upcoming-changes-to-apis-and-tools-that-may-impact-your-application-df4680ae3535",
26
+ "https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/companyinfo"
27
+ ],
28
+ "status": "verified"
29
+ }
@@ -9,7 +9,12 @@
9
9
  },
10
10
  "changeClass": "version-sunset",
11
11
  "trigger": {
12
- "query": [{ "name": "minorversion", "below": 75 }]
12
+ "query": [
13
+ {
14
+ "name": "minorversion",
15
+ "below": 75
16
+ }
17
+ ]
13
18
  },
14
19
  "firstObserved": "2025-08-01",
15
20
  "publishedNotice": {
@@ -19,6 +24,13 @@
19
24
  "effectiveDate": "2025-08-01",
20
25
  "severity": "high",
21
26
  "migrationNote": "Set minorversion=75 (or remove it) and re-test parsing against minor version 75 responses.",
27
+ "recipeId": "apply-fix",
28
+ "fix": {
29
+ "query": {
30
+ "name": "minorversion",
31
+ "value": "75"
32
+ }
33
+ },
22
34
  "sources": [
23
35
  "https://blogs.intuit.com/?p=34635",
24
36
  "https://www.apideck.com/blog/ai-built-accounting-integrations-maintenance",
@@ -0,0 +1,29 @@
1
+ {
2
+ "id": "quickbooks-refresh-token-five-year-hard-expiry",
3
+ "provider": "quickbooks",
4
+ "title": "Refresh tokens hard-expire after five years, first ones in February 2027",
5
+ "summary": "Intuit refresh tokens now have a maximum lifetime of five years, even if they are used regularly. For apps on restricted or granular scopes, tokens issued from February 2022 start expiring in February 2027. For com.quickbooks.accounting and com.quickbooks.payments, tokens issued from October 2023 start expiring in October 2028. Intuit gives only the month, so the effective date here is the first day of that month.",
6
+ "endpoint": {
7
+ "method": "POST",
8
+ "path": "/oauth2/v1/tokens/bearer"
9
+ },
10
+ "changeClass": "auth",
11
+ "trigger": {
12
+ "any": true
13
+ },
14
+ "firstObserved": null,
15
+ "publishedNotice": {
16
+ "date": "2025-11-12",
17
+ "url": "https://medium.com/intuitdev/important-changes-to-refresh-token-policy-8443779d40db"
18
+ },
19
+ "effectiveDate": "2027-02-01",
20
+ "severity": "high",
21
+ "migrationNote": "On refresh, send x_refresh_token_hard_expires_in=true and store the returned x_refresh_token_hard_expires_in (seconds left in the five-year lifetime) alongside the token. Treat invalid_grant from /oauth2/v1/tokens/bearer as a disconnect that needs the user to reconnect, not as a retryable error. Prompt users to re-authorize before the hard expiry, and set the Reconnect URL in the developer portal app settings.",
22
+ "sources": [
23
+ "https://medium.com/intuitdev/important-changes-to-refresh-token-policy-8443779d40db",
24
+ "https://developer.intuit.com/app/developer/qbo/docs/develop/authentication-and-authorization/oauth-2.0",
25
+ "https://developer.intuit.com/app/developer/qbo/docs/develop/authentication-and-authorization/faq",
26
+ "https://developer.intuit.com/app/developer/qbo/docs/release-notes/general-release-notes"
27
+ ],
28
+ "status": "unverified"
29
+ }
@@ -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
+ }