{"openapi":"3.1.0","info":{"title":"Montastic API","version":"1.0.0","summary":"Website uptime monitoring REST API.","description":"Montastic monitors URLs (\"checkpoints\") and alerts you by email, SMS, or\nwebhook when they go down or when a keyword appears/disappears on a page.\n\nThis document is the single source of truth for the public REST API, served\nlive at https://montastic.com/openapi.json and validated against the running\napp in CI.\n\n## Authentication\nEvery request authenticates with your account API key, sent as the\n`X-API-KEY` HTTP header. Find your key on your account page at\nhttps://montastic.com/me.\n\n## Terminology\nA `checkpoint` is a single URL Montastic monitors.\n\n## Notes for API clients\n- Responses may include additional, undocumented fields; clients should\n  ignore unknown properties (the schemas below set `additionalProperties: true`).\n- `check_now`, `enable_monitoring`, and `disable_monitoring` are documented\n  with the verbs the server accepts today. They are scheduled to become\n  strictly POST in a future version.\n"},"servers":[{"url":"https://montastic.com","description":"Production"}],"security":[{"ApiKeyAuth":[]}],"tags":[{"name":"Checkpoints","description":"Create and manage monitored URLs."}],"paths":{"/checkpoints":{"get":{"tags":["Checkpoints"],"operationId":"listCheckpoints","summary":"List all your checkpoints.","description":"Returns your checkpoints. Results are paginated; the default page size is\nlarge enough that most accounts receive everything in one call. Use\n`page` / `per_page` to page through larger accounts. The total count and\ncurrent page are returned in the `X-Total-Count`, `X-Page`, and\n`X-Per-Page` response headers.\n","parameters":[{"name":"page","in":"query","required":false,"description":"1-based page number (default 1).","schema":{"type":"integer","minimum":1,"default":1}},{"name":"per_page","in":"query","required":false,"description":"Items per page (default 1000, max 1000).","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1000}}],"responses":{"200":{"description":"An array of checkpoints.","headers":{"X-Total-Count":{"description":"Total number of checkpoints for the account.","schema":{"type":"integer"}},"X-Page":{"description":"The page returned.","schema":{"type":"integer"}},"X-Per-Page":{"description":"The page size used.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Checkpoint"}}}}},"403":{"$ref":"#/components/responses/Forbidden"}}},"post":{"tags":["Checkpoints"],"operationId":"createCheckpoint","summary":"Create a checkpoint.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckpointCreate"}}}},"responses":{"201":{"description":"The created checkpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Checkpoint"}}}},"422":{"$ref":"#/components/responses/ValidationError"},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/checkpoints/{id}":{"parameters":[{"$ref":"#/components/parameters/CheckpointId"}],"get":{"tags":["Checkpoints"],"operationId":"getCheckpoint","summary":"Get one checkpoint by id.","responses":{"200":{"description":"The checkpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Checkpoint"}}}},"404":{"$ref":"#/components/responses/NotFound"},"403":{"$ref":"#/components/responses/Forbidden"}}},"patch":{"tags":["Checkpoints"],"operationId":"updateCheckpoint","summary":"Update a checkpoint.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckpointUpdate"}}}},"responses":{"200":{"description":"The updated checkpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Checkpoint"}}}},"422":{"$ref":"#/components/responses/ValidationError"},"404":{"$ref":"#/components/responses/NotFound"},"403":{"$ref":"#/components/responses/Forbidden"}}},"delete":{"tags":["Checkpoints"],"operationId":"deleteCheckpoint","summary":"Delete a checkpoint.","responses":{"204":{"description":"Deleted."},"404":{"$ref":"#/components/responses/NotFound"},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/checkpoints/{id}/check_now":{"parameters":[{"$ref":"#/components/parameters/CheckpointId"}],"get":{"tags":["Checkpoints"],"operationId":"checkNow","summary":"Trigger an immediate check.","responses":{"200":{"description":"The checkpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Checkpoint"}}}},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/checkpoints/{id}/enable_monitoring":{"parameters":[{"$ref":"#/components/parameters/CheckpointId"}],"post":{"tags":["Checkpoints"],"operationId":"enableMonitoring","summary":"Resume monitoring for a checkpoint.","responses":{"200":{"description":"The checkpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Checkpoint"}}}},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/checkpoints/{id}/disable_monitoring":{"parameters":[{"$ref":"#/components/parameters/CheckpointId"}],"post":{"tags":["Checkpoints"],"operationId":"disableMonitoring","summary":"Pause monitoring for a checkpoint (no alerts while paused).","responses":{"200":{"description":"The checkpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Checkpoint"}}}},"403":{"$ref":"#/components/responses/Forbidden"}}}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-KEY","description":"Your account API key, from https://montastic.com/me"}},"parameters":{"CheckpointId":{"name":"id","in":"path","required":true,"description":"The checkpoint id.","schema":{"type":"integer"}}},"responses":{"Forbidden":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"type":"object"}}}},"NotFound":{"description":"No such checkpoint for this account."},"ValidationError":{"description":"Validation failed. The body is an object keyed by field name, each value\nan array of human-readable messages, e.g. `{\"url\":[\"is too short\"]}`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}}},"schemas":{"Checkpoint":{"type":"object","additionalProperties":true,"description":"A monitored URL and its current state.","properties":{"id":{"type":"integer","readOnly":true,"description":"Unique id","assigned at creation.":null},"url":{"type":"string","description":"The monitored URL."},"name":{"type":"string","description":"Friendly name."},"notes":{"type":"string","nullable":true,"description":"Free-text notes."},"grep_this":{"type":"string","nullable":true,"description":"Keyword to look for in the page body."},"grep_presence":{"type":"boolean","description":"If true, the keyword must be present; if false, it must be absent."},"check_interval_id":{"type":"integer","enum":[1,5,10,30,60,180,360,1440],"description":"How often to check, in minutes."},"is_monitoring_enabled":{"type":"boolean","description":"Whether monitoring is currently active."},"status":{"type":"integer","enum":[-1,0,1],"readOnly":true,"description":"Current state: 1 = OK, -1 = alarm (down), 0 = transient/unknown."},"check_result_code":{"type":"string","nullable":true,"readOnly":true,"description":"Result code from the last check (curl exit code; 0 = OK)."},"status_changed_on":{"type":"string","format":"date-time","nullable":true,"readOnly":true,"description":"When the status last changed."}},"required":["id","url","status","check_interval_id","is_monitoring_enabled"]},"CheckpointCreate":{"type":"object","required":["checkpoint"],"properties":{"checkpoint":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"The URL to monitor."},"name":{"type":"string"},"check_interval_id":{"type":"integer","enum":[1,5,10,30,60,180,360,1440],"default":60,"description":"How often to check, in minutes (default 60)."},"grep_this":{"type":"string"},"grep_presence":{"type":"boolean","default":true},"notes":{"type":"string"}}}}},"CheckpointUpdate":{"type":"object","required":["checkpoint"],"properties":{"checkpoint":{"type":"object","properties":{"url":{"type":"string"},"name":{"type":"string"},"check_interval_id":{"type":"integer","enum":[1,5,10,30,60,180,360,1440]},"grep_this":{"type":"string"},"grep_presence":{"type":"boolean"},"notes":{"type":"string"}}}}},"ValidationError":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}},"example":{"url":["is too short (minimum is 4 characters)"]}}}}}