ExpenseIn Service Status API

Incidents often cause a chain reaction, use this API to build our service status into your own workflow.

GET
https://status.expensein.com/api/v1/status

Get the overall status for a page, without all the complexities of components and notices.

State
operational
No current incidents or underway maintenance.
degraded
One or more current incidents are marked as 'investigating' or 'identified'. Incidents marked as 'recovering' are no longer considered current.
under_maintenance
One or more current maintenance marked as 'underway'
*In the event that both a current incident and an underway maintenance are present, 'degraded' takes priority.
{
    "page": {
        "name": "ExpenseIn Service Status",
        "state": "operational",
        "state_text": "All systems are go!",
        "url": "https://status.expensein.com",
        "links": {
            "components": {
                "href": "/v1/components",
                "count": 50
            },
            "notices": {
                "href": "/v1/notices",
                "count": 100
            },
        },
        "created_at": "2023-01-01T00:00:00.000Z",
        "updated_at": "2023-01-01T00:00:00.000Z"
    }
}

GET
https://status.expensein.com/api/v1/components

Retrieve a paginated list of components and their status, useful to those who want a more detailed explanation of what’s impacted, or just the status of a subset of components.

State
Can be any of “operational”, “degraded” or “under_maintenance”

Filtering Components

If you want to search for certain components, such as those at the top of the tree, or the children of a given parent you can pass the filter parameter.

Example: Only top level components

GET /api/v1/components?filter[parent_id_null]=true

Example: Children of X

GET /api/v1/components?filter[parent_id_eq]=x
{
    "components": [
        {
            "id": 1,
            "state": "operational",
            "name": "Example Component",
            "description": "This is an example component.",
            "parent_id": null,
            "links": {
                "children": {
                    "href": "/api/v1/components?filter[parent_id_eq]=1",
                    "count": 1,
                }
            },
            "created_at": "2023-01-01T00:00:00.000Z",
            "updated_at": "2023-01-01T00:00:00.000Z"
        },
        {
            "id": 2,
            "state": "operational",            
            "name": "Sub-Component",
            "description": "This is an example sub-component.",
            "parent_id": 1,
            "links": {
                "children": {
                    "href": "/api/v1/components?filter[parent_id_eq]=2",
                    "count": 0,
                }
            },
            "created_at": "2023-01-01T00:00:00.000Z",
            "updated_at": "2023-01-01T00:00:00.000Z"
        }
    ],
    "meta": {
        "count": 25,
        "total_count": 50,
        "next_page": "/api/v1/components?page=2"
    }
}

GET
https://status.expensein.com/api/v1/notices

Retrieve a paginated list of notices for a page, past, present and future.

Type
Can be either "planned" or "unplanned"
Timeline State
Can be any of “future”, “present”, “past_recent” or “past_distant”
State
For “unplanned” notices can be any of “investigating”, “identified”, “recovering”, “resolved” or “false_alarm”
For “planned” notices can be any “scheduled”, “underway” or “complete”

This list only contains basic details, for more information such as the impacted components, or the entire progress update history request detailed notice information.

Filtering Notices

If you want to search for certain notices, such as planned maintenances, or only current incidents you can do so by passing the “filter” query string parameter.

Example: Only retrieve planned maintenance.

GET /api/v1/notices?filter[type_eq]=planned

Example: Only retrieve current unplanned notices.

GET /api/v1/notices?filter[timeline_state_eq]=present&filter[type_eq]=unplanned

You can mix and match other "type" and "timeline_state" values in the filter, so you have the flexibility to return just the records you need.

{
    "notices": [
        {
            "id": 1,
            "type": "unplanned",
            "timeline_state": "present",
            "state": "investigating",
            "subject": "Current Incident",
            "url": "https://status.expensein.com/notices/xxx-current-incident",
            "began_at": "2023-01-01T00:00:00.000Z",
            "ended_at": null,
            "created_at": "2023-01-01T00:00:00.000Z",
            "updated_at": "2023-01-01T00:00:00.000Z",
            "links": {
                "self": "/api/notices/1"
            },
            "latest_update": {
                "state": "investigating",
                "content": "We are currently investigating an issue with our service."
                "created_at": "2023-01-01T00:00:00.000Z",
                "updated_at": "2023-01-01T00:00:00.000Z"
            }
        },
        {
            "id": 2,
            "type": "planned",
            "timeline_state": "future",
            "state": "scheduled",
            "subject": "Planned Maintenance",
            "url": "https://status.expensein.com/notices/xxx-planned-maintenance",
            "begins_at": "2023-01-01T00:00:00.000Z",
            "ends_at": "2023-01-01T01:00:00.000Z",
            "began_at": null,
            "ended_at": null,
            "created_at": "2023-01-01T00:00:00.000Z",
            "updated_at": "2023-01-01T00:00:00.000Z",
            "links": {
                "self": "/api/notices/2"
            },
            "latest_update": {
                "state": "scheduled",
                "content": "We have some upcomming maintenance planned."
                "created_at": "2023-01-01T00:00:00.000Z",
                "updated_at": "2023-01-01T00:00:00.000Z"
            }
        }
    ],
    "meta": {
        "count": 25,
        "total_count": 100,
        "next_page": "/api/v1/notices?page=2"
    }
}

Detailed Notice Information

Anchor for Detailed Notice Information
GET
https://status.expensein.com/api/v1/notices/:id

Retrieve the detail for a given notice, including its impacted components and its full list of progress updates.

{
    "notice": {
        "id": 1,
        "type": "unplanned",
        "timeline_state": "present",
        "state": "investigating",
        "subject": "Current Incident",
        "url": "https://status.expensein.com/notices/xxx-current-incident",        
        "began_at": "2023-01-01T00:00:00.000Z",
        "ended_at": null,
        "created_at": "2023-01-01T00:00:00.000Z",
        "updated_at": "2023-01-01T00:00:00.000Z",
        "links": {
            "self": "/api/notices/1"
        },
        "components": [
            {
                "id": 1,
                "state": "operational",
                "name": "Example Component",
                "description": "This is an example component.",
                "parent_id": null,
                "created_at": "2023-01-01T00:00:00.000Z",
                "updated_at": "2023-01-01T00:00:00.000Z"
            }
        ],
        "updates": [
            {
                "state": "investigating",
                "content": "We are currently investigating an issue with our service."
                "created_at": "2023-01-01T00:00:00.000Z",
                "updated_at": "2023-01-01T00:00:00.000Z"
            }
        ]
    }
}

Collections such as “components” and “notices” only return a maximum of 25 records per request. Larger collections are split into multiple pages and contain a URL to retrieve the next page in the collection.

We also include a count of the records on this page and the total record count across all pages.

{
    "notices": [],
    "meta": {
        "count": 25,
        "total_count": 100,
        "next_page": "/v1/notices?page=2"
    }
}

The Status API allows developers to build on and benefit from the Sorry™ platform. At the same time, we must protect our system and our users’ rights, rate limiting to 10 requests per second.