{
    "asyncapi": "2.4.0",
    "info": {
        "title": "Shlink",
        "version": "3.0.0",
        "description": "Shlink, the self-hosted URL shortener",
        "license": {
            "name": "MIT",
            "url": "https://github.com/shlinkio/shlink/blob/develop/LICENSE"
        }
    },
    "defaultContentType": "application/json",
    "channels": {
        "https://shlink.io/new-visit": {
            "subscribe": {
                "summary": "Receive information about any new visit occurring on any short URL.",
                "operationId": "newVisit",
                "message": {
                    "payload": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                            "shortUrl": {
                                "$ref": "#/components/schemas/ShortUrl"
                            },
                            "visit": {
                                "$ref": "#/components/schemas/Visit"
                            }
                        }
                    }
                }
            }
        },
        "https://shlink.io/new-visit/{shortCode}": {
            "parameters": {
                "shortCode": {
                    "description": "The short code of the short URL",
                    "schema": {
                        "type": "string"
                    }
                }
            },
            "subscribe": {
                "summary": "Receive information about any new visit occurring on a specific short URL.",
                "operationId": "newShortUrlVisit",
                "message": {
                    "payload": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                            "shortUrl": {
                                "$ref": "#/components/schemas/ShortUrl"
                            },
                            "visit": {
                                "$ref": "#/components/schemas/Visit"
                            }
                        }
                    }
                }
            }
        },
        "https://shlink.io/new-orphan-visit": {
            "subscribe": {
                "summary": "Receive information about any new orphan visit.",
                "operationId": "newOrphanVisit",
                "message": {
                    "payload": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                            "visit": {
                                "$ref": "#/components/schemas/OrphanVisit"
                            }
                        }
                    }
                }
            }
        },
        "https://shlink.io/new-short-url": {
            "subscribe": {
                "summary": "Receive information about any new short URL.",
                "operationId": "newshortUrl",
                "message": {
                    "payload": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                            "shortUrl": {
                                "$ref": "#/components/schemas/ShortUrl"
                            }
                        }
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "ShortUrl": {
                "type": "object",
                "properties": {
                    "shortCode": {
                        "type": "string",
                        "description": "The short code for this short URL."
                    },
                    "shortUrl": {
                        "type": "string",
                        "description": "The short URL."
                    },
                    "longUrl": {
                        "type": "string",
                        "description": "The original long URL."
                    },
                    "dateCreated": {
                        "type": "string",
                        "format": "date-time",
                        "description": "The date in which the short URL was created in ISO format."
                    },
                    "visitsSummary": {
                        "$ref": "#/components/schemas/VisitsSummary"
                    },
                    "tags": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "description": "A list of tags applied to this short URL"
                    },
                    "meta": {
                        "$ref": "#/components/schemas/ShortUrlMeta"
                    },
                    "domain": {
                        "type": "string",
                        "description": "The domain in which the short URL was created. Null if it belongs to default domain."
                    },
                    "title": {
                        "type": "string",
                        "nullable": true,
                        "description": "A descriptive title of the short URL."
                    },
                    "crawlable": {
                        "type": "boolean",
                        "description": "Tells if this URL will be included as 'Allow' in Shlink's robots.txt."
                    }
                },
                "example": {
                    "shortCode": "12C18",
                    "shortUrl": "https://s.test/12C18",
                    "longUrl": "https://store.steampowered.com",
                    "dateCreated": "2016-08-21T20:34:16+02:00",
                    "visitsSummary": {
                        "total": 328,
                        "nonBots": 285,
                        "bots": 43
                    },
                    "tags": [
                        "games",
                        "tech"
                    ],
                    "meta": {
                        "validSince": "2017-01-21T00:00:00+02:00",
                        "validUntil": null,
                        "maxVisits": 100
                    },
                    "domain": "example.com",
                    "title": "The title",
                    "crawlable": false
                }
            },
            "ShortUrlMeta": {
                "type": "object",
                "required": [
                    "validSince",
                    "validUntil",
                    "maxVisits"
                ],
                "properties": {
                    "validSince": {
                        "description": "The date (in ISO-8601 format) from which this short code will be valid",
                        "type": "string",
                        "nullable": true
                    },
                    "validUntil": {
                        "description": "The date (in ISO-8601 format) until which this short code will be valid",
                        "type": "string",
                        "nullable": true
                    },
                    "maxVisits": {
                        "description": "The maximum number of allowed visits for this short code",
                        "type": "number",
                        "nullable": true
                    }
                }
            },
            "VisitsSummary": {
                "type": "object",
                "required": ["total", "nonBots", "bots"],
                "properties": {
                    "total": {
                        "description": "The total amount of visits",
                        "type": "number"
                    },
                    "nonBots": {
                        "description": "The amount of visits which were not identified as bots",
                        "type": "number"
                    },
                    "bots": {
                        "description": "The amount of visits that were identified as potential bots",
                        "type": "number"
                    }
                }
            },
            "Visit": {
                "type": "object",
                "properties": {
                    "referer": {
                        "type": "string",
                        "description": "The origin from which the visit was performed"
                    },
                    "date": {
                        "type": "string",
                        "format": "date-time",
                        "description": "The date in which the visit was performed"
                    },
                    "userAgent": {
                        "type": "string",
                        "description": "The user agent from which the visit was performed"
                    },
                    "visitLocation": {
                        "$ref": "#/components/schemas/VisitLocation"
                    },
                    "potentialBot": {
                        "type": "boolean",
                        "description": "Tells if Shlink thinks this visit comes potentially from a bot or crawler"
                    },
                    "visitedUrl": {
                        "type": "string",
                        "nullable": true,
                        "description": "The originally visited URL that triggered the tracking of this visit"
                    }
                },
                "example": {
                    "referer": "https://t.co",
                    "date": "2015-08-20T05:05:03+04:00",
                    "userAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
                    "visitLocation": {
                        "cityName": "Cupertino",
                        "countryCode": "US",
                        "countryName": "United States",
                        "latitude": 37.3042,
                        "longitude": -122.0946,
                        "regionName": "California",
                        "timezone": "America/Los_Angeles"
                    },
                    "potentialBot": false,
                    "visitedUrl": "https://s.test"
                }
            },
            "OrphanVisit": {
                "allOf": [
                    {"$ref": "#/components/schemas/Visit"},
                    {
                        "type": "object",
                        "properties": {
                            "type": {
                                "type": "string",
                                "enum": [
                                    "invalid_short_url",
                                    "base_url",
                                    "regular_404"
                                ],
                                "description": "Tells the type of orphan visit"
                            }
                        }
                    }
                ],
                "example": {
                    "referer": "https://t.co",
                    "date": "2015-08-20T05:05:03+04:00",
                    "userAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
                    "visitLocation": {
                        "cityName": "Cupertino",
                        "countryCode": "US",
                        "countryName": "United States",
                        "latitude": 37.3042,
                        "longitude": -122.0946,
                        "regionName": "California",
                        "timezone": "America/Los_Angeles"
                    },
                    "potentialBot": false,
                    "visitedUrl": "https://s.test",
                    "type": "base_url"
                }
            },
            "VisitLocation": {
                "type": "object",
                "properties": {
                    "cityName": {
                        "type": "string"
                    },
                    "countryCode": {
                        "type": "string"
                    },
                    "countryName": {
                        "type": "string"
                    },
                    "latitude": {
                        "type": "number"
                    },
                    "longitude": {
                        "type": "number"
                    },
                    "regionName": {
                        "type": "string"
                    },
                    "timezone": {
                        "type": "string"
                    }
                }
            }
        }
    }
}