Get an app's agent description without changing the app
Side-effect-free sibling of the page gate: no auto-claim, no token mint, no cookie, no mutating telemetry. A public App or listed Template returns the full descriptor to anyone, with operations[].input/output/examples gated on app:read (owner, accepted share grant, team membership, or a bearer token) — an anonymous caller sees discovery-level operation fields only. An enabled-unlisted Template remains private without app:read, as does any other private App. Those callers — including an unclaimed app’s claim-cookie holder, which grants app:run but never app:read — get the minimal stub (AppDescriptorStub). Reachable via both the /app/{id} UUID form and the /{handle}/{app-name} friendly form (byte-identical id + canonical_url), and advertised from the served page’s <link rel="alternate" type="application/json"> and matching Link: HTTP header.
/app/{id}/agent.jsonOptional — this operation also accepts unauthenticated requests.
AuthorizationBearer token (chrm_app_*) · headerAuthorizationBearer token (chrm_user_*) · headeridstringrequiredtypestringrequiredschema_versionstringrequiredidstring<uuid>requiredrevisionRevisionrequireddisplay_namestringrequiredapp_namestring | nullrequiredvisibilitystringrequiredpublicremixableprivateauthorizedbooleanrequiredcanonical_urlstring<uri>requiredwhen_to_usestringrequiredauthor_providedobjectrequiredoperationsobject[]requiredhttp_apiobjectrequiredmcpobjectrequiredauthobjectrequiredadvisoriesobject[]typestringrequiredschema_versionstringrequiredvisibilitystringrequiredauthorizedbooleanrequiredmessagestringrequiredauthobjectrequiredokbooleanrequiredfalseerrorobjectrequiredShow propertiesHide properties
kindstringrequirednot_foundunknown_operationoperation_not_foundoperation_failedunauthorizedsign_in_requiredtoken_expiredforbiddenforbidden_writestored_value_too_largestorage_fullinvalid_moduleinvalid_uiinvalid_route_schemainvalid_routes_shapecontract_migration_requiredinvalid_manifest_schemainvalid_manifest_exportsinvalid_requestinvalid_inputinvalid_outputunexpected_keyscapability_deniedcapability_errorexecutor_errorinvalid_call_shapealready_claimedduplicate_remixmanifest_not_foundpayload_too_largemodule_too_largeui_too_largedescription_too_longmissing_descriptioninvalid_descriptionrate_limitedimage_origin_deniedtoo_many_requestsexpiredalready_approvedanon_not_remixabletemplate_listing_incompletetemplate_media_invalidforbidden_template_editinvalid_if_matchprecondition_requiredrevision_mismatchinvalid_revisioncandidate_effects_unsupportedold_string_not_foundold_string_not_uniqueedits_too_largemanifest_id_conflictmanifest_id_immutabletext_too_largestructured_data_too_largeapp_not_foundfeedback_not_foundfeedback_has_no_reply_recipientasset_too_largeasset_count_exceededasset_quota_exceededasset_invalid_keyasset_invalid_content_typeasset_errorinvalid_idsse_cookie_expiredinvalid_secret_namesecret_too_largesecret_already_existssecret_not_foundinvalid_iconteam_slug_takenalready_membergrantee_not_foundinvite_cap_reachedread_onlyhandle_takeninvalid_handlename_takenapp_unclaimedlink_cap_reachedgrantee_is_ownergrantee_is_selfgrantee_already_has_accessalready_invitedroutine_limit_exceededinvalid_intervalop_requires_inputduplicate_routinemessagestringreasonstringtoken_malformedtoken_unknowntoken_revokedtoken_revoked_post_claimrecoveryRecoveryPair | RecoveryRetry | RecoveryShrink | RecoveryRefetch | RecoveryFixRouteLabel | RecoveryOpenExisting | RecoveryRename | RecoveryMigrateContractShow propertiesHide properties
kindstringrequiredpairstartstring<uri>requiredverification_urlstring<uri>requiredinstructionsstringrequiredkindstringrequiredretryretry_after_secintegerrequiredretry_after_urlstring<uri>requiredinstructionsstringrequiredkindstringrequiredshrinkfieldstringrequiredmoduleuistylesdescriptiontextstructured_dataasseteditssecretpayloadsize_bytesintegerrequiredcap_bytesintegerrequiredinstructionsstringrequiredkindstringrequiredrefetchrefetch_urlstring<uri>requiredinstructionsstringrequiredkindstringrequiredfix_route_labelinstructionsstringrequiredkindstringrequiredopen_existingexisting_app_idstringrequiredexisting_urlstring<uri>requiredinstructionsstringrequiredkindstringrequiredrenameinstructionsstringrequiredkindstringrequiredmigrate_contractinstructionsstringrequiredokbooleanrequiredfalseerrorobjectrequiredShow propertiesHide properties
kindstringrequirednot_foundunknown_operationoperation_not_foundoperation_failedunauthorizedsign_in_requiredtoken_expiredforbiddenforbidden_writestored_value_too_largestorage_fullinvalid_moduleinvalid_uiinvalid_route_schemainvalid_routes_shapecontract_migration_requiredinvalid_manifest_schemainvalid_manifest_exportsinvalid_requestinvalid_inputinvalid_outputunexpected_keyscapability_deniedcapability_errorexecutor_errorinvalid_call_shapealready_claimedduplicate_remixmanifest_not_foundpayload_too_largemodule_too_largeui_too_largedescription_too_longmissing_descriptioninvalid_descriptionrate_limitedimage_origin_deniedtoo_many_requestsexpiredalready_approvedanon_not_remixabletemplate_listing_incompletetemplate_media_invalidforbidden_template_editinvalid_if_matchprecondition_requiredrevision_mismatchinvalid_revisioncandidate_effects_unsupportedold_string_not_foundold_string_not_uniqueedits_too_largemanifest_id_conflictmanifest_id_immutabletext_too_largestructured_data_too_largeapp_not_foundfeedback_not_foundfeedback_has_no_reply_recipientasset_too_largeasset_count_exceededasset_quota_exceededasset_invalid_keyasset_invalid_content_typeasset_errorinvalid_idsse_cookie_expiredinvalid_secret_namesecret_too_largesecret_already_existssecret_not_foundinvalid_iconteam_slug_takenalready_membergrantee_not_foundinvite_cap_reachedread_onlyhandle_takeninvalid_handlename_takenapp_unclaimedlink_cap_reachedgrantee_is_ownergrantee_is_selfgrantee_already_has_accessalready_invitedroutine_limit_exceededinvalid_intervalop_requires_inputduplicate_routinemessagestringreasonstringtoken_malformedtoken_unknowntoken_revokedtoken_revoked_post_claimrecoveryRecoveryPair | RecoveryRetry | RecoveryShrink | RecoveryRefetch | RecoveryFixRouteLabel | RecoveryOpenExisting | RecoveryRename | RecoveryMigrateContractShow propertiesHide properties
kindstringrequiredpairstartstring<uri>requiredverification_urlstring<uri>requiredinstructionsstringrequiredkindstringrequiredretryretry_after_secintegerrequiredretry_after_urlstring<uri>requiredinstructionsstringrequiredkindstringrequiredshrinkfieldstringrequiredmoduleuistylesdescriptiontextstructured_dataasseteditssecretpayloadsize_bytesintegerrequiredcap_bytesintegerrequiredinstructionsstringrequiredkindstringrequiredrefetchrefetch_urlstring<uri>requiredinstructionsstringrequiredkindstringrequiredfix_route_labelinstructionsstringrequiredkindstringrequiredopen_existingexisting_app_idstringrequiredexisting_urlstring<uri>requiredinstructionsstringrequiredkindstringrequiredrenameinstructionsstringrequiredkindstringrequiredmigrate_contractinstructionsstringrequiredTry it
curl -X GET "https://charm.ing/app/string/agent.json" \
-H "Authorization: Bearer YOUR_TOKEN"const response = await fetch("https://charm.ing/app/string/agent.json", {
method: "GET",
headers: {
"Authorization": "Bearer YOUR_TOKEN"
}
});import requests
response = requests.get(
"https://charm.ing/app/string/agent.json",
headers={
"Authorization": "Bearer YOUR_TOKEN"
},
){
"type": "charming.app-descriptor",
"schema_version": "v1",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"revision": 4,
"display_name": "string",
"app_name": "string",
"visibility": "public",
"authorized": true,
"canonical_url": "http://example.com",
"when_to_use": "string",
"author_provided": {},
"operations": [
{}
],
"http_api": {},
"mcp": {},
"auth": {},
"advisories": [
{}
]
}{
"ok": false,
"error": {
"kind": "not_found",
"message": "string",
"reason": "token_malformed",
"recovery": {
"kind": "pair",
"start": "http://example.com",
"verification_url": "http://example.com",
"instructions": "string"
}
}
}{
"ok": false,
"error": {
"kind": "not_found",
"message": "string",
"reason": "token_malformed",
"recovery": {
"kind": "pair",
"start": "http://example.com",
"verification_url": "http://example.com",
"instructions": "string"
}
}
}