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.
- package/README.md +7 -4
- package/advisories/anthropic-api-version-2026-10-21-sampling-params-400.json +35 -0
- package/advisories/google-ads-api-v22-sunset.json +27 -0
- package/advisories/google-custom-search-json-api-shutdown.json +27 -0
- package/advisories/google-gemini-2-0-flash-shutdown.json +27 -0
- package/advisories/google-gemini-2-5-flash-image-shutdown.json +27 -0
- package/advisories/google-gemini-2-5-preview-tts-shutdown.json +27 -0
- package/advisories/hubspot-contact-lists-v1-sunset.json +28 -0
- package/advisories/hubspot-contacts-v1-list-memberships-removed.json +30 -0
- package/advisories/hubspot-marketing-emails-folderid-removed.json +39 -0
- package/advisories/hubspot-marketing-emails-v1-sunset.json +24 -0
- package/advisories/hubspot-pipelines-v1-sunset.json +22 -2
- package/advisories/meta-graph-commerce-order-management-removed.json +26 -0
- package/advisories/meta-graph-date-format-param-removed.json +30 -0
- package/advisories/meta-graph-delivery-estimate-fields-removed.json +30 -0
- package/advisories/meta-graph-instagram-oembed-fields-removed.json +33 -0
- package/advisories/meta-graph-marketing-api-v24-sunset.json +34 -0
- package/advisories/meta-graph-marketing-api-v25-sunset.json +35 -0
- package/advisories/meta-graph-page-insights-impressions-fans-removed.json +51 -0
- package/advisories/meta-graph-page-insights-reach-video-views-removed.json +57 -0
- package/advisories/meta-graph-root-ids-lookup-removed.json +30 -0
- package/advisories/meta-graph-v20-sunset.json +10 -1
- package/advisories/meta-graph-v21-sunset.json +10 -1
- package/advisories/openai-assistants-api-shutdown.json +27 -0
- package/advisories/openai-audio-translations-endpoint-shutdown.json +27 -0
- package/advisories/openai-evals-api-shutdown.json +27 -0
- package/advisories/quickbooks-companyinfo-neoenabled-removed.json +29 -0
- package/advisories/quickbooks-minorversion-below-75-ignored.json +13 -1
- package/advisories/quickbooks-refresh-token-five-year-hard-expiry.json +29 -0
- package/advisories/salesforce-soap-login-broad-ip-range-token-required.json +30 -0
- package/advisories/salesforce-soap-login-disabled-when-unused.json +30 -0
- package/advisories/salesforce-soap-login-use-any-api-auth-required.json +31 -0
- package/advisories/shopify-admin-api-2026-01-unsupported.json +33 -0
- package/advisories/shopify-admin-api-2026-04-unsupported.json +33 -0
- package/advisories/shopify-global-catalog-rest-api-shutdown.json +24 -0
- package/advisories/shopify-non-expiring-offline-tokens-rejected.json +27 -0
- package/advisories/shopify-script-tags-stop-running.json +27 -0
- package/advisories/slack-files-upload-retired.json +28 -0
- package/advisories/stripe-checkout-session-ui-mode-values-renamed.json +53 -0
- package/advisories/twilio-conference-list-default-in-progress.json +27 -0
- package/advisories/twilio-notify-end-of-life.json +28 -0
- package/advisories/twilio-rcs-undelivered-error-code-30046.json +27 -0
- package/advisories/twilio-voice-insights-conference-participant-removed.json +28 -0
- package/advisories/x-activity-api-pascalcase-event-types-removed.json +31 -0
- package/advisories/x-self-serve-follow-writes-removed.json +27 -0
- package/advisories/x-self-serve-like-writes-removed.json +27 -0
- package/advisories/xero-allocations-contact-mismatch-rejected.json +27 -0
- package/advisories/xero-au-payroll-isqualifyingearnings-required.json +28 -0
- package/advisories/xero-finance-accounting-activities-decommissioned.json +28 -0
- package/advisories/xero-invoices-email-daily-limit-429.json +32 -0
- package/advisories/xero-nz-payroll-employee-tax-kiwisaverstatus-required.json +27 -0
- package/advisories/xero-organisation-class-ultra-enum.json +31 -0
- package/dist/index.js +1527 -161
- package/dist/tree-sitter-python.wasm +0 -0
- package/package.json +7 -9
|
@@ -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-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
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "xero-finance-accounting-activities-decommissioned",
|
|
3
|
+
"provider": "xero",
|
|
4
|
+
"title": "Finance API Accounting Activities endpoints decommissioned",
|
|
5
|
+
"summary": "On 2026-05-04 Xero decommissioned the Finance API's Accounting Activities API: Account Usage, Lock History, Report History and User Activities. All of these endpoints now return errors. Xero suggests the Bank Statements API for cash flow and financial analysis.",
|
|
6
|
+
"endpoint": {
|
|
7
|
+
"method": "GET",
|
|
8
|
+
"path": "/finance.xro/1.0/AccountingActivities/**"
|
|
9
|
+
},
|
|
10
|
+
"changeClass": "version-sunset",
|
|
11
|
+
"trigger": {
|
|
12
|
+
"any": true
|
|
13
|
+
},
|
|
14
|
+
"firstObserved": null,
|
|
15
|
+
"publishedNotice": {
|
|
16
|
+
"date": "2026-05-04",
|
|
17
|
+
"url": "https://developer.xero.com/changelog"
|
|
18
|
+
},
|
|
19
|
+
"effectiveDate": "2026-05-04",
|
|
20
|
+
"severity": "critical",
|
|
21
|
+
"migrationNote": "Remove calls to /finance.xro/1.0/AccountingActivities/AccountUsage, LockHistory, ReportHistory and UserActivities, along with the features built on them. For cash-flow or transaction analysis, move to the Finance API Bank Statements endpoint (/finance.xro/1.0/BankStatementsPlus/statements). Lock history and user activity data have no direct replacement.",
|
|
22
|
+
"sources": [
|
|
23
|
+
"https://developer.xero.com/changelog",
|
|
24
|
+
"https://raw.githubusercontent.com/XeroAPI/Xero-OpenAPI/2.29.1/xero-finance.yaml",
|
|
25
|
+
"https://raw.githubusercontent.com/XeroAPI/Xero-OpenAPI/master/xero-finance.yaml"
|
|
26
|
+
],
|
|
27
|
+
"status": "verified"
|
|
28
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "xero-invoices-email-daily-limit-429",
|
|
3
|
+
"provider": "xero",
|
|
4
|
+
"title": "Invoice email daily limit returns 429 instead of 500 from 2027-01-14",
|
|
5
|
+
"summary": "From 2027-01-14, POST Invoices/{InvoiceID}/Email returns 429 Too Many Requests instead of a generic 500 when the organisation reaches its daily invoice-email limit. The 429 has no Retry-After header. Code that treats 500 as a retryable server error, or retries a 429 at once with a short backoff, will mishandle the limit.",
|
|
6
|
+
"endpoint": {
|
|
7
|
+
"method": "POST",
|
|
8
|
+
"path": "/api.xro/2.0/Invoices/{InvoiceID}/Email"
|
|
9
|
+
},
|
|
10
|
+
"changeClass": "status-code",
|
|
11
|
+
"trigger": {
|
|
12
|
+
"statusCodes": [
|
|
13
|
+
500
|
|
14
|
+
],
|
|
15
|
+
"newStatusCodes": [
|
|
16
|
+
429
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
"firstObserved": null,
|
|
20
|
+
"publishedNotice": {
|
|
21
|
+
"date": "2026-10-15",
|
|
22
|
+
"url": "https://developer.xero.com/changelog"
|
|
23
|
+
},
|
|
24
|
+
"effectiveDate": "2027-01-14",
|
|
25
|
+
"severity": "medium",
|
|
26
|
+
"migrationNote": "Handle a 429 from the invoice Email endpoint separately from the per-minute rate limit. It is a daily limit with no Retry-After header, so don't retry immediately. Queue the send for after the daily reset, or tell the user sending was delayed. Stop relying on a 500 to detect this case.",
|
|
27
|
+
"sources": [
|
|
28
|
+
"https://developer.xero.com/changelog",
|
|
29
|
+
"https://raw.githubusercontent.com/XeroAPI/Xero-OpenAPI/master/xero_accounting.yaml"
|
|
30
|
+
],
|
|
31
|
+
"status": "verified"
|
|
32
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "xero-nz-payroll-employee-tax-kiwisaverstatus-required",
|
|
3
|
+
"provider": "xero",
|
|
4
|
+
"title": "NZ Payroll employee tax requests without KiwiSaverStatus return 400 from 2026-11-05",
|
|
5
|
+
"summary": "From 2026-11-05, KiwiSaverStatus is required when creating or updating employee tax details in NZ Payroll, for every tax code except WT and NSW. Requests that omit it return 400 Bad Request. Xero says it will not provide test instances or workarounds.",
|
|
6
|
+
"endpoint": {
|
|
7
|
+
"method": "POST",
|
|
8
|
+
"path": "/payroll.xro/2.0/Employees/{EmployeeID}/Tax"
|
|
9
|
+
},
|
|
10
|
+
"changeClass": "required-field",
|
|
11
|
+
"trigger": {
|
|
12
|
+
"any": true
|
|
13
|
+
},
|
|
14
|
+
"firstObserved": null,
|
|
15
|
+
"publishedNotice": {
|
|
16
|
+
"date": "2026-08-06",
|
|
17
|
+
"url": "https://developer.xero.com/changelog"
|
|
18
|
+
},
|
|
19
|
+
"effectiveDate": "2026-11-05",
|
|
20
|
+
"severity": "critical",
|
|
21
|
+
"migrationNote": "Send KiwiSaverStatus explicitly in every POST to /payroll.xro/2.0/Employees/{EmployeeID}/Tax whose tax code is not WT or NSW. Get it from your own employee record or read the current tax details with a GET before updating. Treat a 400 on this call as a data error to show the user, not a reason to retry.",
|
|
22
|
+
"sources": [
|
|
23
|
+
"https://developer.xero.com/changelog",
|
|
24
|
+
"https://raw.githubusercontent.com/XeroAPI/Xero-OpenAPI/master/xero-payroll-nz.yaml"
|
|
25
|
+
],
|
|
26
|
+
"status": "verified"
|
|
27
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "xero-organisation-class-ultra-enum",
|
|
3
|
+
"provider": "xero",
|
|
4
|
+
"title": "Organisation Class enum gains ULTRA",
|
|
5
|
+
"summary": "Since 2026-06-30 the Organisation endpoint can return Class ULTRA for Australian organisations on the new Xero Ultra plan. Xero warns that integrations assuming only the existing values may fail to keep their connection to Xero. Strict enum parsing, including older SDK enums, can throw on the new value.",
|
|
6
|
+
"endpoint": {
|
|
7
|
+
"method": "GET",
|
|
8
|
+
"path": "/api.xro/2.0/Organisation"
|
|
9
|
+
},
|
|
10
|
+
"changeClass": "enum-added",
|
|
11
|
+
"trigger": {
|
|
12
|
+
"enums": [
|
|
13
|
+
{
|
|
14
|
+
"field": "Class"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
"firstObserved": null,
|
|
19
|
+
"publishedNotice": {
|
|
20
|
+
"date": "2026-06-30",
|
|
21
|
+
"url": "https://developer.xero.com/changelog"
|
|
22
|
+
},
|
|
23
|
+
"effectiveDate": "2026-06-30",
|
|
24
|
+
"severity": "medium",
|
|
25
|
+
"migrationNote": "Accept unknown Organisation Class values instead of failing, and map ULTRA wherever you branch on plan type. If you use a generated SDK, upgrade to a version whose Class enum includes ULTRA, or deserialize Class as a plain string.",
|
|
26
|
+
"sources": [
|
|
27
|
+
"https://developer.xero.com/changelog",
|
|
28
|
+
"https://raw.githubusercontent.com/XeroAPI/Xero-OpenAPI/master/xero_accounting.yaml"
|
|
29
|
+
],
|
|
30
|
+
"status": "verified"
|
|
31
|
+
}
|