···11+{
22+ "lexicon": 1,
33+ "id": "agency.portable.attestation",
44+ "defs": {
55+ "main": {
66+ "type": "record",
77+ "description": "An attestation by a verifier that a subject atproto account is linked to an identity, community, or role in an external service. Paired with a matching agency.portable.membership record on the subject's PDS.",
88+ "key": "any",
99+ "record": {
1010+ "type": "object",
1111+ "required": ["subject", "service", "createdAt"],
1212+ "properties": {
1313+ "subject": {
1414+ "type": "string",
1515+ "format": "did",
1616+ "description": "DID of the atproto account this attestation is about."
1717+ },
1818+ "service": {
1919+ "type": "ref",
2020+ "ref": "#service"
2121+ },
2222+ "role": {
2323+ "type": "string",
2424+ "description": "Optional role, rank, or status within the service or community (e.g. 'admin', 'maintainer', 'fascinator')."
2525+ },
2626+ "createdAt": {
2727+ "type": "string",
2828+ "format": "datetime"
2929+ },
3030+ "revokedAt": {
3131+ "type": "string",
3232+ "format": "datetime",
3333+ "description": "If present, indicates when this attestation was revoked (e.g. the subject lost the role). Absence means the attestation is currently active."
3434+ }
3535+ }
3636+ }
3737+ },
3838+ "service": {
3939+ "type": "object",
4040+ "description": "Identifies an external service and, optionally, a specific community and identity within it.",
4141+ "required": ["type"],
4242+ "properties": {
4343+ "type": {
4444+ "type": "string",
4545+ "description": "External service identifier (e.g. 'discord', 'github', 'slack')."
4646+ },
4747+ "community": {
4848+ "type": "string",
4949+ "description": "Optional identifier for a specific group, server, workspace, or organization within the service (e.g. a Discord guild ID, a GitHub org slug)."
5050+ },
5151+ "identifier": {
5252+ "type": "string",
5353+ "description": "Optional external identity within the service (e.g. a user ID or handle). Include when proving platform identity; may be omitted when only proving community or role membership."
5454+ }
5555+ }
5656+ }
5757+ }
5858+}
+53
lexicons/agency.portable.membership.json
···11+{
22+ "lexicon": 1,
33+ "id": "agency.portable.membership",
44+ "defs": {
55+ "main": {
66+ "type": "record",
77+ "description": "A self-attested claim by an atproto account that it is linked to an identity, community, or role in an external service. Paired with a matching agency.portable.attestation record on the attester's PDS.",
88+ "key": "any",
99+ "record": {
1010+ "type": "object",
1111+ "required": ["service", "attestedBy", "createdAt"],
1212+ "properties": {
1313+ "service": {
1414+ "type": "ref",
1515+ "ref": "#service"
1616+ },
1717+ "role": {
1818+ "type": "string",
1919+ "description": "Optional role, rank, or status within the service or community (e.g. 'admin', 'maintainer', 'fascinator')."
2020+ },
2121+ "attestedBy": {
2222+ "type": "string",
2323+ "format": "did",
2424+ "description": "DID of the attester that verified this claim."
2525+ },
2626+ "createdAt": {
2727+ "type": "string",
2828+ "format": "datetime"
2929+ }
3030+ }
3131+ }
3232+ },
3333+ "service": {
3434+ "type": "object",
3535+ "description": "Identifies an external service and, optionally, a specific community and identity within it.",
3636+ "required": ["type"],
3737+ "properties": {
3838+ "type": {
3939+ "type": "string",
4040+ "description": "External service identifier (e.g. 'discord', 'github', 'slack')."
4141+ },
4242+ "community": {
4343+ "type": "string",
4444+ "description": "Optional identifier for a specific group, server, workspace, or organization within the service (e.g. a Discord guild ID, a GitHub org slug)."
4545+ },
4646+ "identifier": {
4747+ "type": "string",
4848+ "description": "Optional external identity within the service (e.g. a user ID or handle). Include when proving platform identity; may be omitted when only proving community or role membership."
4949+ }
5050+ }
5151+ }
5252+ }
5353+}