| Internet-Draft | ID MANDAT Credential | October 2026 |
| König | Expires 19 April 2027 | [Page] |
Automated software agents increasingly act for companies: they ask for quotes, book appointments and place orders. A recipient can verify, for example with Web Bot Auth, that a request was signed by the holder of a key. That does not tell the recipient which company stands behind the agent or what the agent is allowed to do on its behalf. This document describes a small credential file that a company publishes on its own domain under /.well-known/idmandat.json, a DNS TXT record that links the file to the domain, and the answer format of a public registry that checks both and reports the result in a digitally signed response. The credential states, by declaration of the company, which agents act for it and what each agent may and may not do. It does not make claims about creditworthiness, trustworthiness or quality.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 19 April 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
A website visitor can look at an imprint and judge whether a company looks serious. An automated agent cannot. Work on authenticating automated traffic, such as [WEBBOTAUTH], lets a recipient check that a request was signed by the holder of a key and, through the Signature-Agent header field, where that key can be found. That work explicitly does not say who operates the agent or what it is authorised to do.¶
This document specifies a complementary, voluntary and declarative layer:¶
The credential belongs to the company, not to the registry. It stays valid and readable without any registry.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
This is an individual submission describing a deployed beta (version 0.3). It is not the product of an IETF working group. The lookup interface described in Section 5 is operated at https://idmandat.com and is described here so that others can implement clients and compatible registries.¶
A company that wants to declare its agents publishes a JSON document [RFC8259] at:¶
https://example.com/.well-known/idmandat.json¶
The document is served with media type application/json over HTTPS. Its top-level members are:¶
Each agent object has the following members:¶
For "may" and "mayNot" the following capability names are RECOMMENDED so that different implementations read them the same way: answer_product_questions, answer_service_questions, explain_prices, check_availability, prepare_appointment, reserve_appointment, book_appointment, create_quote, take_order, qualify_lead, forward_request, conclude_contract, trigger_payment, share_personal_data, give_legal_advice, give_medical_advice. Other names are allowed.¶
The following is a non-normative example.¶
{
"idmandat": "0.1",
"domain": "example.com",
"organization": {
"name": "Example GmbH",
"country": "DE",
"vatId": "DE123456789",
"imprint": "https://example.com/impressum"
},
"agents": [
{
"id": "captain",
"name": "Captain",
"role": "Appointments and product questions",
"isHuman": false,
"protocols": ["a2a", "mcp"],
"mandate": {
"may": ["answer_product_questions", "reserve_appointment"],
"mayNot": ["conclude_contract", "trigger_payment"],
"bindingOnlyAfter": "confirmation by a human"
},
"signatureAgent": "https://bot.example.com"
}
],
"verification": {
"registry": "https://idmandat.com",
"dns": "_idmandat.example.com"
},
"updated": "2026-10-16"
}
¶
The file alone shows only that whoever controls the web server published it. To tie it to the domain holder as well, the company publishes a TXT record at the name "_idmandat" below the domain:¶
_idmandat.example.com. IN TXT "v=idmandat1; file=/.well-known/idmandat.json"¶
A checker accepts an entry at the level "registered" only if the domain in the file, the DNS record and the fetched file agree.¶
A registry reports how far it has checked an entry. The levels used by the registry described here are:¶
Where no level applies the answer says so explicitly. The text "no entry" MUST NOT be read as a sign of wrongdoing.¶
A registry offers a read-only HTTP interface that needs no account. The reference registry answers GET requests on https://idmandat.com/api/v1/verify with a JSON object. A query names either a domain ("domain", optionally with an agent name) or a key directory ("signature_agent", the address from the Signature-Agent header field or the whole header value).¶
An answer for an entry contains at least: "domain", "registered", "level", and, where applicable, "organization", "agents" (with "may" and "mayNot"), and "mandate_source" with the value "declared_by_operator". The answer states that the agent details are declarations of the operator and not checked by the registry.¶
An entry that is no longer valid is reported explicitly: "registered" is false, "level" is "none", "entry_state" is one of "revoked", "suspended" or "expired", "state_since" gives the date, and for a revocation "revoked" is true. A recipient MUST NOT rely on earlier answers for such an entry.¶
For a query by "signature_agent" the registry normalises the address (https only, lower-case host, default port removed, trailing slash removed, query kept; a well-known key directory path is shortened to the origin) and compares it with the declarations in the entries. The "resolution" is one of: none (no entry declares it), ambiguous (more than one entry declares it; the answer lists them and MUST NOT name one as responsible), or a match. A match carries "key_directory_link", with the value "same_domain" if the directory is on the same registrable domain as the entry (a hint) or "declared_only" (the company merely declares it).¶
The registry does not fetch the key directory and does not verify that the company controls it. The link rests on the declaration of the company.¶
Answers are signed with Ed25519 [RFC8032]. The answer carries "signed" (true or false), "key_id", "issued_at" and "expires_at" (valid for 15 minutes) and a "signature" object with "alg" and "value". The signed bytes are the UTF-8 encoding of the answer without the "signature" member, with all object members sorted recursively by key, written compactly (no insignificant white space), without escaping non-ASCII characters or the solidus. The value is base64url without padding. Public keys are published at https://idmandat.com/api/v1/keys. An answer with "signed" false MUST NOT be treated as evidence.¶
The statements about agents and their permissions come from the company itself. The registry confirms identity of the company and that the declaration is published on its domain. It does not confirm that the agent exists, that a power of attorney was actually granted, or that the agent respects its "mayNot" list. A recipient decides what to do with the answer and MUST enforce its own limits.¶
The link between a key directory and a company (Section 5.2) is a declaration. A company may declare a key directory it does not control. Recipients SHOULD treat "declared_only" as weak and "ambiguous" as no result.¶
Answers are valid for a short time and are signed so that they can be cached and replayed only within that time. A client MUST check "expires_at", the domain in the answer and the signature against the published keys, and SHOULD pin the "alg".¶
A valid signature on a request (for example as in [WEBBOTAUTH]) shows that the request came from the key holder. It is not evidence of an entry in a registry, and the absence of an entry is not evidence against the agent.¶
This document does not define authorisation of single transactions (amount, purpose, time window) or delegation between agents. Those belong to other layers.¶
The credential is public by design and SHOULD contain business contact points rather than personal data. The reference registry stores no record of which domains were queried, no addresses of clients and no persons. It keeps only a count of queries per day. Other registries SHOULD be equally restrictive.¶
This document requests registration of the following in the "Well-Known URIs" registry [RFC8615]:¶
The author thanks the people who commented on the early versions of the format.¶