{"openapi":"3.1.0","info":{"title":"AAuth Registry","version":"1.0.0","description":"A directory of AAuth resources. Listing needs only an agent token. Adding a resource needs a verified person; the registry fetches the host's /.well-known/aauth-resource.json and lists what it finds. Entries with `availability` are coming: not generally available, though a built one may connect for a person its provider lets in; a person can register interest in one. `account_description`, when present, names the account a connect must pass. Admin operations require a person in the Hellō tenant. Read llms.txt for guidance."},"servers":[{"url":"https://registry.aauth.dev"}],"paths":{"/resources":{"get":{"operationId":"listResources","summary":"List every registered resource, available and coming. Coming entries carry `availability` (why) and `interest_count`.","responses":{"200":{"description":"The index","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Index"}}}}}},"post":{"operationId":"addResource","x-aauth-access-mode":"auth-token","summary":"Add a resource by issuer. The registry fetches and validates https://{host}/.well-known/aauth-resource.json (issuer must equal the host). `upstream` is recorded only from an admin.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["issuer"],"properties":{"issuer":{"type":"string","description":"https://host"},"upstream":{"type":"string","description":"Admin only: the API host this resource fronts, e.g. api.github.com"}}}}}},"responses":{"200":{"description":"already_present","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"const":"already_present"},"resource":{"$ref":"#/components/schemas/Entry"}}}}}},"201":{"description":"added","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"const":"added"},"resource":{"$ref":"#/components/schemas/Entry"}}}}}},"400":{"description":"metadata_invalid (invalid_json, missing_issuer)"},"422":{"description":"metadata_invalid, with `errors`"}}}},"/resources/{host}":{"parameters":[{"name":"host","in":"path","required":true,"schema":{"type":"string"},"description":"The resource host, e.g. notes.aauth.dev (its id in the registry)"}],"get":{"operationId":"getResource","summary":"One entry by host. A renamed host resolves to its new entry.","responses":{"200":{"description":"The entry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entry"}}}},"404":{"description":"not_found"}}}},"/resources/{host}/interest":{"parameters":[{"name":"host","in":"path","required":true,"schema":{"type":"string"},"description":"The resource host, e.g. notes.aauth.dev (its id in the registry)"}],"post":{"operationId":"registerInterest","x-aauth-access-mode":"person-token","summary":"Register the person's interest in a coming resource. Only when the person asked for that resource. Idempotent per person.","responses":{"200":{"description":"already_registered"},"201":{"description":"registered","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"host":{"type":"string"},"interest_count":{"type":"integer"}}}}}},"404":{"description":"not_found"},"409":{"description":"available_connect_instead"}}}},"/feedback":{"post":{"operationId":"sendFeedback","x-aauth-access-mode":"person-token","summary":"Tell the operator something: a missing resource, a bug, a wrong description. Only when the person asked to.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"At most 4 KB"},"host":{"type":"string","description":"The resource it concerns, if any"}}}}}},"responses":{"202":{"description":"received"},"400":{"description":"invalid"}}}},"/admin/resources/{host}":{"parameters":[{"name":"host","in":"path","required":true,"schema":{"type":"string"},"description":"The resource host, e.g. notes.aauth.dev (its id in the registry)"}],"put":{"operationId":"putComingResource","x-aauth-access-mode":"person-token","summary":"Admin: create or replace a coming entry. 409 on a live entry or an alias.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","description","availability"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"availability":{"type":"string","description":"Why it is not available yet"},"upstream":{"type":"string"},"documentation_uri":{"type":"string"}}}}}},"responses":{"200":{"description":"replaced","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"created","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"forbidden"},"409":{"description":"conflict"}}}},"/admin/resources/{host}/rename":{"parameters":[{"name":"host","in":"path","required":true,"schema":{"type":"string"},"description":"The resource host, e.g. notes.aauth.dev (its id in the registry)"}],"post":{"operationId":"renameResource","x-aauth-access-mode":"person-token","summary":"Admin: rename an entry. Moves interest and leaves an alias at the old host.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["to"],"properties":{"to":{"type":"string"},"upstream":{"type":"string"}}}}}},"responses":{"200":{"description":"renamed","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_to"},"403":{"description":"forbidden"}}}},"/admin/resources/{host}/launch":{"parameters":[{"name":"host","in":"path","required":true,"schema":{"type":"string"},"description":"The resource host, e.g. notes.aauth.dev (its id in the registry)"}],"post":{"operationId":"launchResource","x-aauth-access-mode":"person-token","summary":"Admin: fetch live metadata and drop `availability`. 422 leaves the entry unchanged.","responses":{"200":{"description":"launched","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"forbidden"},"422":{"description":"metadata_invalid"}}}},"/admin/feedback":{"get":{"operationId":"listFeedback","x-aauth-access-mode":"person-token","summary":"Admin: the feedback inbox.","responses":{"200":{"description":"Feedback","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"forbidden"}}}},"/admin/feedback/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"delete":{"operationId":"deleteFeedback","x-aauth-access-mode":"person-token","summary":"Admin: delete one feedback item.","responses":{"200":{"description":"deleted"},"403":{"description":"forbidden"},"404":{"description":"not_found"}}}},"/admin/reconcile":{"post":{"operationId":"reconcile","x-aauth-access-mode":"person-token","summary":"Admin: rebuild the index now and refresh live metadata.","responses":{"200":{"description":"Reconcile result","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"forbidden"}}}}},"components":{"schemas":{"Entry":{"type":"object","properties":{"issuer":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"access_mode":{"type":"string"},"account_description":{"type":"string","description":"From the resource's connection.account_description: the account a connect must name (e.g. a Google email address). Absent when the provider's own UI picks the account."},"upstream":{"type":"string"},"availability":{"type":"string","description":"Present only on a coming entry: why it is not available"},"interest_count":{"type":"integer"},"added":{"type":"string"}}},"Index":{"type":"object","properties":{"updated":{"type":"string"},"resources":{"type":"array","items":{"$ref":"#/components/schemas/Entry"}}}}}}}