Repository navigation
·
6 commits
to refs/heads/main
since this release
Immutable
release. Only release title and notes can be modified.
The client now covers the whole Tailscale API. Every endpoint is checked against the official OpenAPI spec, and tested against a real tailnet.
Upgrading from 0.x
- Devices: only
device_id,node_id,hostname, andnameare always set. Other fields areNonewhen the API leaves them out, which it does a lot for devices shared in from another tailnet. Lists are empty then, andis_externalisFalse. - Tailnet settings: a setting the API does not return is
None, notFalseor a made up default. - Users:
tailnet_lock_keyis gone, as the API has no such field on users.profile_pic_urlis filled now; it was always empty. - Errors: an error response raises a
TailscaleResponseError, with the HTTPstatusand thereasonthe API gave. A 401 raisesTailscaleUnauthorizedErrorand a 403TailscalePermissionError; both are still aTailscaleAuthenticationError. A 403 no longer throws away the OAuth token. - IDs are escaped in request paths. An empty ID,
., or..raises aValueError. - CLI: the command is
tailscale-apiinstead oftailscale, so it no longer clashes with the official Tailscale client. - Minimums: aiohttp 3.8.3, yarl 1.8.2, mashumaro 3.17, and Typer 0.15.4 for the CLI.
Worth knowing
- Listing devices works again for tailnets with devices shared in from another tailnet (#1466).
- An OAuth client recovers from a failed token request, and a stored token the API refused is replaced instead of reused.
- Secrets stay out of reprs and CLI tracebacks.
tailscale-api dump <endpoint>prints the raw API response, for debugging and test fixtures.
What’s changed
🚨 Breaking changes
- Only require the identifiers of a device, and add its distro and posture identity @frenck (#1468)
- Fix the profile picture of users, and add the tailnet ID and list filters @frenck (#1469)
- Add the missing tailnet settings, and leave settings the API does not return unset @frenck (#1470)
- Rename the CLI command to tailscale-api @frenck (#1488)
✨ New features
- Add the policy file endpoints @frenck (#1472)
- Add the full DNS configuration endpoints @frenck (#1474)
- Add the webhook endpoints @frenck (#1476)
- Add the device posture attribute endpoints @frenck (#1477)
- Add the Tailscale Services endpoints @frenck (#1479)
- Add the device and user invite endpoints @frenck (#1480)
- Add the user management endpoints @frenck (#1475)
- Add the contact and organization endpoints @frenck (#1485)
- Add the OAuth app endpoints @frenck (#1484)
- Add the log streaming and AWS external ID endpoints @frenck (#1483)
- Add the configuration audit log and network flow log endpoints @frenck (#1482)
- Add the posture integration endpoints @frenck (#1481)
- Add CLI commands for the policy file, webhooks, Services, and audit logs @frenck (#1494)
🐛 Bug fixes
- Fix the Prettier hook, which never ran, and the YAML indentation @frenck (#1461)
- Fall back to the default fields when the device list fails with a 404 @frenck (#1466)
- Fix the profile picture of users, and add the tailnet ID and list filters @frenck (#1469)
- Recover from failed OAuth token requests, and stop reusing refused tokens @frenck (#1496)
- Escape IDs in request paths, and keep secrets out of reprs and tracebacks @frenck (#1497)
- Handle empty policy validation, domains without nameservers, and empty audit log values @frenck (#1499)
🚀 Enhancements
- Only require the identifiers of a device, and add its distro and posture identity @frenck (#1468)
- Add the missing tailnet settings, and leave settings the API does not return unset @frenck (#1470)
- Add OAuth clients and federated identities to the keys @frenck (#1471)
- Add the posture status and OAuth client of devices, and treat empty values as unset @frenck (#1473)
- Give API errors their status and the reason the API gave @frenck (#1478)
- Rename the CLI command to tailscale-api @frenck (#1488)
- Add dump commands for the whole API, and say when the API refuses a request @frenck (#1492)
- Test against anonymized responses of a real tailnet @frenck (#1493)
- Test request payloads, real values, the timeout, and the CLI through its entry point @frenck (#1501)
🧰 Maintenance
- Remove the unused workflow requirements file @frenck (#1462)
- Remove the lock workflow @frenck (#1465)
- Add actionlint to catch workflow mistakes zizmor and yamllint miss @frenck (#1489)
- Check the CLI group against Typer, not click @frenck (#1495)
📚 Documentation
- Document what the API refuses in a settings update @frenck (#1490)
- Document the whole API in the README @frenck (#1491)
- Correct the documentation of errors, device defaults, token storage, and sessions @frenck (#1500)
⬆️ Dependency updates
41 changes
- ⬆️ Lock file maintenance @renovate[bot] (#1423)
- ⬆️ Lock file maintenance @renovate[bot] (#1424)
- ⬆️ Lock file maintenance @renovate[bot] (#1425)
- ⬆️ Lock file maintenance @renovate[bot] (#1426)
- ⬆️ Lock file maintenance @renovate[bot] (#1427)
- ⬆️ Lock file maintenance @renovate[bot] (#1428)
- ⬆️ Lock file maintenance @renovate[bot] (#1429)
- ⬆️ Lock file maintenance @renovate[bot] (#1430)
- ⬆️ Lock file maintenance @renovate[bot] (#1432)
- Bump pip from 26.0.1 to 26.1 in /.github/workflows @dependabot[bot] (#1433)
- ⬆️ Lock file maintenance @renovate[bot] (#1434)
- ⬆️ Lock file maintenance @renovate[bot] (#1435)
- ⬆️ Lock file maintenance @renovate[bot] (#1437)
- ⬆️ Lock file maintenance @renovate[bot] (#1438)
- ⬆️ Lock file maintenance @renovate[bot] (#1439)
- ⬆️ Lock file maintenance @renovate[bot] (#1440)
- ⬆️ Lock file maintenance @renovate[bot] (#1441)
- ⬆️ Lock file maintenance @renovate[bot] (#1442)
- ⬆️ Lock file maintenance @renovate[bot] (#1443)
- ⬆️ Lock file maintenance @renovate[bot] (#1444)
- ⬆️ Lock file maintenance @renovate[bot] (#1445)
- ⬆️ Lock file maintenance @renovate[bot] (#1446)
- ⬆️ Lock file maintenance @renovate[bot] (#1447)
- Bump aiohttp from 3.13.5 to 3.14.0 and add aiohttp 3.14 test compatibility workaround @dependabot[bot] (#1449)
- Bump aiohttp from 3.14.0 to 3.14.1 @dependabot[bot] (#1450)
- Bump cryptography from 48.0.0 to 48.0.1 @dependabot[bot] (#1451)
- Bump joserfc from 1.6.5 to 1.6.7 @dependabot[bot] (#1452)
- Bump joserfc from 1.6.7 to 1.6.8 @dependabot[bot] (#1453)
- Bump aiohttp from 3.14.1 to 3.14.3 @dependabot[bot] (#1456)
- Bump cryptography from 48.0.1 to 50.0.0 @dependabot[bot] (#1457)
- Bump nltk from 3.9.4 to 3.10.0 @dependabot[bot] (#1454)
- Bump pip from 26.1 to 26.1.2 in /.github/workflows @dependabot[bot] (#1455)
- Bump nltk from 3.10.0 to 3.10.3 @dependabot[bot] (#1458)
- Bump pip from 26.1.2 to 26.2 in /.github/workflows @dependabot[bot] (#1459)
- Bump anyio from 4.13.0 to 4.14.2 @dependabot[bot] (#1460)
- Bump urllib3 from 2.7.0 to 2.8.0 @dependabot[bot] (#1463)
- Bump multidict from 6.7.1 to 6.9.1 @dependabot[bot] (#1467)
- Drop the unused safety dependency @frenck (#1486)
- Raise the dependency minimums to versions that install, and test them in CI @frenck (#1487)
- ⬆️ Lock file maintenance @renovate[bot] (#1448)
- Raise the mashumaro and Typer minimums, and test the minimums on every Python version @frenck (#1498)