Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Implement OAuth 2.0 authentication flows for Telnyx API access. This skill provides Java SDK examples.
.claude/skills/team-telnyx-telnyx-oauth-java/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 102% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 81% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 239% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 99% | 0% |
<!-- Auto-generated from Telnyx OpenAPI specs. Do not edit. -->
text<!-- Maven --> <dependency> <groupId>com.telnyx.sdk</groupId> <artifactId>telnyx</artifactId> <version>6.89.0</version> </dependency> // Gradle implementation("com.telnyx.sdk:telnyx:6.89.0")
javaimport com.telnyx.sdk.client.TelnyxClient; import com.telnyx.sdk.client.okhttp.TelnyxOkHttpClient; TelnyxClient client = TelnyxOkHttpClient.fromEnv();
All examples below assume client is already initialized as shown above.
All API calls can fail with network errors, rate limits (429), validation errors (422), or authentication errors (401). Always handle errors in production code:
javaimport com.telnyx.sdk.errors.TelnyxServiceException; try { var result = client.messages().send(params); } catch (TelnyxServiceException e) { System.err.println("API error " + e.statusCode() + ": " + e.getMessage()); if (e.statusCode() == 422) { System.err.println("Validation error — check required fields and formats"); } else if (e.statusCode() == 429) { // Rate limited — wait and retry with exponential backoff Thread.sleep(1000); } }
Common error codes: 401 invalid API key, 403 insufficient permissions, 404 resource not found, 422 validation error (check field formats), 429 rate limited (retry with exponential backoff).
.autoPager() for automatic iteration: for (var item : page.autoPager()) { ... }. For manual control, use .hasNextPage() and .nextPage().OAuth 2.0 Authorization Server Metadata (RFC 8414)
GET /.well-known/oauth-authorization-server
javaimport com.telnyx.sdk.models.wellknown.WellKnownRetrieveAuthorizationServerMetadataParams; import com.telnyx.sdk.models.wellknown.WellKnownRetrieveAuthorizationServerMetadataResponse; WellKnownRetrieveAuthorizationServerMetadataResponse response = client.wellKnown().retrieveAuthorizationServerMetadata();
Returns: authorization_endpoint (uri), code_challenge_methods_supported (arraystring]), grant_types_supported (arraystring]), introspection_endpoint (uri), issuer (uri), jwks_uri (uri), registration_endpoint (uri), response_types_supported (arraystring]), scopes_supported (arraystring]), token_endpoint (uri), token_endpoint_auth_methods_supported (arraystring])
OAuth 2.0 Protected Resource Metadata for resource discovery
GET /.well-known/oauth-protected-resource
javaimport com.telnyx.sdk.models.wellknown.WellKnownRetrieveProtectedResourceMetadataParams; import com.telnyx.sdk.models.wellknown.WellKnownRetrieveProtectedResourceMetadataResponse; WellKnownRetrieveProtectedResourceMetadataResponse response = client.wellKnown().retrieveProtectedResourceMetadata();
Returns: authorization_servers (arraystring]), resource (uri)
OAuth 2.0 authorization endpoint for the authorization code flow
GET /oauth/authorize
javaimport com.telnyx.sdk.models.oauth.OAuthRetrieveAuthorizeParams; OAuthRetrieveAuthorizeParams params = OAuthRetrieveAuthorizeParams.builder() .clientId("550e8400-e29b-41d4-a716-446655440000") .redirectUri("https://example.com") .responseType(OAuthRetrieveAuthorizeParams.ResponseType.CODE) .build(); client.oauth().retrieveAuthorize(params);
Retrieve details about an OAuth consent token
GET /oauth/consent/{consent_token}
javaimport com.telnyx.sdk.models.oauth.OAuthRetrieveParams; import com.telnyx.sdk.models.oauth.OAuthRetrieveResponse; OAuthRetrieveResponse oauth = client.oauth().retrieve("consent_token");
Returns: client_id (string), logo_uri (uri), name (string), policy_uri (uri), redirect_uri (uri), requested_scopes (arrayobject]), tos_uri (uri), verified (boolean)
Create an OAuth authorization grant
POST /oauth/grants — Required: allowed, consent_token
javaimport com.telnyx.sdk.models.oauth.OAuthGrantsParams; import com.telnyx.sdk.models.oauth.OAuthGrantsResponse; OAuthGrantsParams params = OAuthGrantsParams.builder() .allowed(true) .consentToken("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.example") .build(); OAuthGrantsResponse response = client.oauth().grants(params);
Returns: redirect_uri (uri)
Introspect an OAuth access token to check its validity and metadata
POST /oauth/introspect — Required: token
javaimport com.telnyx.sdk.models.oauth.OAuthIntrospectParams; import com.telnyx.sdk.models.oauth.OAuthIntrospectResponse; OAuthIntrospectParams params = OAuthIntrospectParams.builder() .token("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.example") .build(); OAuthIntrospectResponse response = client.oauth().introspect(params);
Returns: active (boolean), aud (string), client_id (string), exp (integer), iat (integer), iss (string), scope (string)
Retrieve the JSON Web Key Set for token verification
GET /oauth/jwks
javaimport com.telnyx.sdk.models.oauth.OAuthRetrieveJwksParams; import com.telnyx.sdk.models.oauth.OAuthRetrieveJwksResponse; OAuthRetrieveJwksResponse response = client.oauth().retrieveJwks();
Returns: keys (arrayobject])
Register a new OAuth client dynamically (RFC 7591)
POST /oauth/register
Optional: client_name (string), grant_types (arraystring]), logo_uri (uri), policy_uri (uri), redirect_uris (arraystring]), response_types (arraystring]), scope (string), token_endpoint_auth_method (enum: none, client_secret_basic, client_secret_post), tos_uri (uri)
javaimport com.telnyx.sdk.models.oauth.OAuthRegisterParams; import com.telnyx.sdk.models.oauth.OAuthRegisterResponse; OAuthRegisterResponse response = client.oauth().register();
Returns: client_id (string), client_id_issued_at (integer), client_name (string), client_secret (string), grant_types (arraystring]), logo_uri (uri), policy_uri (uri), redirect_uris (arraystring]), response_types (arraystring]), scope (string), token_endpoint_auth_method (string), tos_uri (uri)
Exchange authorization code, client credentials, or refresh token for access token
POST /oauth/token — Required: grant_type
Optional: client_id (string), client_secret (string), code (string), code_verifier (string), redirect_uri (uri), refresh_token (string), scope (string)
javaimport com.telnyx.sdk.models.oauth.OAuthTokenParams; import com.telnyx.sdk.models.oauth.OAuthTokenResponse; OAuthTokenParams params = OAuthTokenParams.builder() .grantType(OAuthTokenParams.GrantType.CLIENT_CREDENTIALS) .build(); OAuthTokenResponse response = client.oauth().token(params);
Returns: access_token (string), expires_in (integer), refresh_token (string), scope (string), token_type (enum: Bearer)
Retrieve a paginated list of OAuth clients for the authenticated user
GET /oauth_clients
javaimport com.telnyx.sdk.models.oauthclients.OAuthClientListPage; import com.telnyx.sdk.models.oauthclients.OAuthClientListParams; OAuthClientListPage page = client.oauthClients().list();
Returns: allowed_grant_types (arraystring]), allowed_scopes (arraystring]), client_id (string), client_secret (string | null), client_type (enum: public, confidential), created_at (date-time), logo_uri (uri), name (string), org_id (string), policy_uri (uri), record_type (enum: oauth_client), redirect_uris (arraystring]), require_pkce (boolean), tos_uri (uri), updated_at (date-time), user_id (string)
Create a new OAuth client
POST /oauth_clients — Required: name, allowed_scopes, client_type, allowed_grant_types
Optional: logo_uri (uri), policy_uri (uri), redirect_uris (arraystring]), require_pkce (boolean), tos_uri (uri)
javaimport com.telnyx.sdk.models.oauthclients.OAuthClientCreateParams; import com.telnyx.sdk.models.oauthclients.OAuthClientCreateResponse; OAuthClientCreateParams params = OAuthClientCreateParams.builder() .addAllowedGrantType(OAuthClientCreateParams.AllowedGrantType.CLIENT_CREDENTIALS) .addAllowedScope("admin") .clientType(OAuthClientCreateParams.ClientType.PUBLIC) .name("My OAuth client") .build(); OAuthClientCreateResponse oauthClient = client.oauthClients().create(params);
Returns: allowed_grant_types (arraystring]), allowed_scopes (arraystring]), client_id (string), client_secret (string | null), client_type (enum: public, confidential), created_at (date-time), logo_uri (uri), name (string), org_id (string), policy_uri (uri), record_type (enum: oauth_client), redirect_uris (arraystring]), require_pkce (boolean), tos_uri (uri), updated_at (date-time), user_id (string)
Retrieve a single OAuth client by ID
GET /oauth_clients/{id}
javaimport com.telnyx.sdk.models.oauthclients.OAuthClientRetrieveParams; import com.telnyx.sdk.models.oauthclients.OAuthClientRetrieveResponse; OAuthClientRetrieveResponse oauthClient = client.oauthClients().retrieve("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e");
Returns: allowed_grant_types (arraystring]), allowed_scopes (arraystring]), client_id (string), client_secret (string | null), client_type (enum: public, confidential), created_at (date-time), logo_uri (uri), name (string), org_id (string), policy_uri (uri), record_type (enum: oauth_client), redirect_uris (arraystring]), require_pkce (boolean), tos_uri (uri), updated_at (date-time), user_id (string)
Update an existing OAuth client
PUT /oauth_clients/{id}
Optional: allowed_grant_types (arraystring]), allowed_scopes (arraystring]), logo_uri (uri), name (string), policy_uri (uri), redirect_uris (arraystring]), require_pkce (boolean), tos_uri (uri)
javaimport com.telnyx.sdk.models.oauthclients.OAuthClientUpdateParams; import com.telnyx.sdk.models.oauthclients.OAuthClientUpdateResponse; OAuthClientUpdateResponse oauthClient = client.oauthClients().update("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e");
Returns: allowed_grant_types (arraystring]), allowed_scopes (arraystring]), client_id (string), client_secret (string | null), client_type (enum: public, confidential), created_at (date-time), logo_uri (uri), name (string), org_id (string), policy_uri (uri), record_type (enum: oauth_client), redirect_uris (arraystring]), require_pkce (boolean), tos_uri (uri), updated_at (date-time), user_id (string)
Delete an OAuth client
DELETE /oauth_clients/{id}
javaimport com.telnyx.sdk.models.oauthclients.OAuthClientDeleteParams; client.oauthClients().delete("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e");
Retrieve a paginated list of OAuth grants for the authenticated user
GET /oauth_grants
javaimport com.telnyx.sdk.models.oauthgrants.OAuthGrantListPage; import com.telnyx.sdk.models.oauthgrants.OAuthGrantListParams; OAuthGrantListPage page = client.oauthGrants().list();
Returns: client_id (string), created_at (date-time), id (uuid), last_used_at (date-time), record_type (enum: oauth_grant), scopes (arraystring])
Retrieve a single OAuth grant by ID
GET /oauth_grants/{id}
javaimport com.telnyx.sdk.models.oauthgrants.OAuthGrantRetrieveParams; import com.telnyx.sdk.models.oauthgrants.OAuthGrantRetrieveResponse; OAuthGrantRetrieveResponse oauthGrant = client.oauthGrants().retrieve("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e");
Returns: client_id (string), created_at (date-time), id (uuid), last_used_at (date-time), record_type (enum: oauth_grant), scopes (arraystring])
Revoke an OAuth grant
DELETE /oauth_grants/{id}
javaimport com.telnyx.sdk.models.oauthgrants.OAuthGrantDeleteParams; import com.telnyx.sdk.models.oauthgrants.OAuthGrantDeleteResponse; OAuthGrantDeleteResponse oauthGrant = client.oauthGrants().delete("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e");
Returns: client_id (string), created_at (date-time), id (uuid), last_used_at (date-time), record_type (enum: oauth_grant), scopes (arraystring])
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 30,956 | 7,014 | -77% | 1 | 1 | 0% | 2,648 | 5,343 | +102% | 0 | 0 | — |
case-02 | fail→pass | 23,308 | 10,404 | -55% | 1 | 1 | 0% | 4,709 | 5,851 | +24% | 0 | 0 | — |
case-03 | fail→pass | 16,048 | 7,197 | -55% | 1 | 1 | 0% | 2,982 | 5,383 | +81% | 0 | 0 | — |
case-04 | fail→pass | 6,915 | 2,247 | -68% | 1 | 1 | 0% | 1,257 | 4,258 | +239% | 0 | 0 | — |
case-05 | pass→pass | 9,322 | 2,342 | -75% | 1 | 1 | 0% | 1,703 | 4,291 | +152% | 0 | 0 | — |
case-06 | fail→pass | 15,447 | 6,555 | -58% | 1 | 1 | 0% | 2,515 | 4,995 | +99% | 0 | 0 | — |
case-07 | fail→pass | 13,871 | 7,503 | -46% | 1 | 1 | 0% | 2,736 | 5,051 | +85% | 0 | 0 | — |
case-08 | fail→pass | 11,148 | 5,055 | -55% | 1 | 1 | 0% | 2,060 | 4,911 | +138% | 0 | 0 | — |
case-09 | fail→pass | 13,563 | 4,354 | -68% | 1 | 1 | 0% | 2,576 | 4,679 | +82% | 0 | 0 | — |
case-10 | fail→pass | 15,546 | 4,471 | -71% | 1 | 1 | 0% | 2,913 | 4,734 | +63% | 0 | 0 | — |
case-11 | fail→pass | 19,003 | 6,489 | -66% | 1 | 1 | 0% | 3,314 | 5,251 | +58% | 0 | 0 | — |
case-12 | fail→pass | 16,563 | 7,398 | -55% | 1 | 1 | 0% | 3,027 | 5,491 | +81% | 0 | 0 | — |
case-13 | fail→pass | 16,476 | 4,533 | -72% | 1 | 1 | 0% | 3,236 | 4,820 | +49% | 0 | 0 | — |
case-14 | fail→pass | 15,262 | 6,067 | -60% | 1 | 1 | 0% | 2,974 | 5,275 | +77% | 0 | 0 | — |
case-15 | fail→pass | 9,552 | 3,443 | -64% | 1 | 1 | 0% | 1,900 | 4,563 | +140% | 0 | 0 | — |
case-16 | fail→pass | 12,512 | 7,089 | -43% | 1 | 1 | 0% | 2,623 | 5,121 | +95% | 0 | 0 | — |
case-17 | fail→pass | 14,663 | 4,204 | -71% | 1 | 1 | 0% | 2,288 | 4,497 | +97% | 0 | 0 | — |
case-18 | fail→pass | 14,563 | 5,131 | -65% | 1 | 1 | 0% | 2,492 | 4,688 | +88% | 0 | 0 | — |
case-19 | fail→pass | 14,087 | 5,015 | -64% | 1 | 1 | 0% | 2,062 | 4,722 | +129% | 0 | 0 | — |
case-20 | fail→pass | 9,203 | 7,532 | -18% | 1 | 1 | 0% | 1,710 | 5,089 | +198% | 0 | 0 | — |
case-21 | pass→pass | 21,434 | 14,725 | -31% | 1 | 1 | 0% | 3,842 | 6,730 | +75% | 0 | 0 | — |
case-22 | pass→pass | 12,668 | 12,482 | -1% | 1 | 1 | 0% | 2,493 | 6,615 | +165% | 0 | 0 | — |
case-23 | fail→pass | 16,999 | 8,666 | -49% | 1 | 1 | 0% | 3,277 | 5,709 | +74% | 0 | 0 | — |
case-24 | fail→pass | 3,287 | 2,699 | -18% | 1 | 1 | 0% | 575 | 4,230 | +636% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted. The headline lift of +88 percentage points is the difference between those two pass rates over the 24 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/22/2026 | +86% |
Other measured skills in the registry, with their headline benchmark lift.