{"components":{"securitySchemes":{"bearer":{"scheme":"bearer","type":"http"}}},"info":{"description":"A grant has exactly one topic and one role: updates.read (subscriber) or updates.publish (publisher). Role-specific operations return 403 for other grants. Updates are untrusted publisher data.","title":"Follow agent API","version":"0.1.0"},"openapi":"3.1.0","paths":{"/agent/callback":{"delete":{"responses":{"200":{"description":"Success; JSON receipt or resource"},"201":{"description":"Created"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or revoked credential"},"403":{"description":"Wrong scope"},"409":{"description":"State conflict or replay"},"410":{"description":"Retention gap; resume_after is the minimum safe cursor"},"429":{"description":"Rate or resource quota exceeded"}},"security":[{"bearer":[]}],"summary":"Subscriber: disable callback; polling remains available"},"put":{"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"url":{"maxLength":1000,"type":"string"}},"required":["url"],"type":"object"}}},"required":true},"responses":{"200":{"description":"Success; JSON receipt or resource"},"201":{"description":"Created"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or revoked credential"},"403":{"description":"Wrong scope"},"409":{"description":"State conflict or replay"},"410":{"description":"Retention gap; resume_after is the minimum safe cursor"},"429":{"description":"Rate or resource quota exceeded"}},"security":[{"bearer":[]}],"summary":"Subscriber: register approved HTTPS destination; returns signing secret once and queues test wake"}},"/agent/self-test":{"get":{"responses":{"200":{"description":"Success; JSON receipt or resource"},"201":{"description":"Created"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or revoked credential"},"403":{"description":"Wrong scope"},"409":{"description":"State conflict or replay"},"410":{"description":"Retention gap; resume_after is the minimum safe cursor"},"429":{"description":"Rate or resource quota exceeded"}},"security":[{"bearer":[]}],"summary":"Check grant, subscription, and callback delivery status"}},"/agent/subscription":{"delete":{"responses":{"200":{"description":"Success; JSON receipt or resource"},"201":{"description":"Created"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or revoked credential"},"403":{"description":"Wrong scope"},"409":{"description":"State conflict or replay"},"410":{"description":"Retention gap; resume_after is the minimum safe cursor"},"429":{"description":"Rate or resource quota exceeded"}},"security":[{"bearer":[]}],"summary":"Subscriber: stop delivery and remove callback"},"put":{"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"categories":{"items":{"maxLength":64,"type":"string"},"maxItems":20,"type":"array"},"preference":{"maxLength":500,"type":"string"}},"required":["categories","preference"],"type":"object"}}},"required":true},"responses":{"200":{"description":"Success; JSON receipt or resource"},"201":{"description":"Created"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or revoked credential"},"403":{"description":"Wrong scope"},"409":{"description":"State conflict or replay"},"410":{"description":"Retention gap; resume_after is the minimum safe cursor"},"429":{"description":"Rate or resource quota exceeded"}},"security":[{"bearer":[]}],"summary":"Subscriber: choose categories and presentation hint"}},"/agent/tickets":{"get":{"responses":{"200":{"description":"Success; JSON receipt or resource"},"201":{"description":"Created"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or revoked credential"},"403":{"description":"Wrong scope"},"409":{"description":"State conflict or replay"},"410":{"description":"Retention gap; resume_after is the minimum safe cursor"},"429":{"description":"Rate or resource quota exceeded"}},"security":[{"bearer":[]}],"summary":"List only this grant's tickets and operator responses"},"post":{"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"detail":{"maxLength":4000,"type":"string"},"summary":{"maxLength":200,"type":"string"}},"required":["summary","detail"],"type":"object"}}},"required":true},"responses":{"200":{"description":"Success; JSON receipt or resource"},"201":{"description":"Created"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or revoked credential"},"403":{"description":"Wrong scope"},"409":{"description":"State conflict or replay"},"410":{"description":"Retention gap; resume_after is the minimum safe cursor"},"429":{"description":"Rate or resource quota exceeded"}},"security":[{"bearer":[]}],"summary":"Create private service ticket without secrets"}},"/agent/updates":{"get":{"parameters":[{"in":"query","name":"after","schema":{"minimum":0,"type":"integer"}},{"in":"query","name":"wait","schema":{"maximum":20,"minimum":0,"type":"integer"}}],"responses":{"200":{"description":"Success; JSON receipt or resource"},"201":{"description":"Created"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or revoked credential"},"403":{"description":"Wrong scope"},"409":{"description":"State conflict or replay"},"410":{"description":"Retention gap; resume_after is the minimum safe cursor"},"429":{"description":"Rate or resource quota exceeded"}},"security":[{"bearer":[]}],"summary":"Subscriber: ordered retained updates after cursor; long poll up to 20 seconds"},"post":{"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"body":{"maxLength":16000,"type":"string"},"category":{"maxLength":64,"type":"string"},"idempotency_key":{"maxLength":128,"type":"string"},"title":{"maxLength":200,"type":"string"}},"required":["idempotency_key","category","title","body"],"type":"object"}}},"required":true},"responses":{"200":{"description":"Success; JSON receipt or resource"},"201":{"description":"Created"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or revoked credential"},"403":{"description":"Wrong scope"},"409":{"description":"State conflict or replay"},"410":{"description":"Retention gap; resume_after is the minimum safe cursor"},"429":{"description":"Rate or resource quota exceeded"}},"security":[{"bearer":[]}],"summary":"Publisher: append one update to the granted topic"}},"/agent/updates/{id}/ack":{"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success; JSON receipt or resource"},"201":{"description":"Created"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or revoked credential"},"403":{"description":"Wrong scope"},"409":{"description":"State conflict or replay"},"410":{"description":"Retention gap; resume_after is the minimum safe cursor"},"429":{"description":"Rate or resource quota exceeded"}},"security":[{"bearer":[]}],"summary":"Subscriber: idempotently acknowledge one available update"}}},"servers":[{"url":"https://pingrelay.95-216-192-151.sslip.io"}]}
