PublicKeyCredential: toJSON() method

Baseline 2025
Newly available

Since March 2025, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.

Secure context: This feature is available only in secure contexts (HTTPS), in some or all supporting browsers.

The toJSON() method of the PublicKeyCredential interface returns a JSON-serializable plain object representing the PublicKeyCredential object.

The method is automatically called by JSON.stringify() when a PublicKeyCredential object is encountered during JSON serialization.

Syntax

js
toJSON()

Parameters

None.

Return value

A JSON-serializable plain object containing the following properties:

Unless stated otherwise, each property's value is copied as-is.

Exceptions

SecurityError DOMException

The RP domain is not valid.

Examples

Calling toJSON() directly

When registering a new user, a relying party server will supply information about the expected credentials to the web app. The web app calls navigator.credentials.create() with the received information (createCredentialOptions below), which returns a promise that fulfills with the new credential (a PublicKeyCredential).

Calling toJSON() directly returns a plain object. Its properties have the same values as the corresponding properties of the original object.

js
const credential = await navigator.credentials.create({
  publicKey: createCredentialOptions,
});

const json = credential.toJSON();
console.log(json); // A plain object
console.log(typeof json); // "object"
console.log(json.id); // Same value as credential.id

Serializing to a JSON string

The returned credential is serialized using JSON.stringify(), which calls the toJSON() method automatically. The web app posts the serialized credential back to the server.

js
const jsonString = JSON.stringify(credential);
console.log(jsonString);

const registrationURL = "https://example.com/registration";
const apiRegOptsResp = await fetch(registrationURL, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: jsonString,
});

This would log a JSON string like so (formatted for readability):

json
{
  "authenticatorAttachment": "platform",
  "clientExtensionResults": {},
  "id": "...",
  "rawId": "...",
  "response": {
    "attestationObject": "...",
    "authenticatorData": "...",
    "clientDataJSON": "...",
    "publicKey": "...",
    "publicKeyAlgorithm": -7,
    "transports": ["internal"]
  },
  "type": "public-key"
}

The base64url-encoded values are abbreviated as "..." for readability.

Specifications

Specification
Web Authentication: An API for accessing Public Key Credentials - Level 4
# dom-publickeycredential-tojson

Browser compatibility

See also