You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by sr...@apache.org on 2022/09/13 16:42:59 UTC

[trafficcontrol] branch master updated: Add TO API v5 (#7063)

This is an automated email from the ASF dual-hosted git repository.

srijeet0406 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new da0250202b Add TO API v5 (#7063)
da0250202b is described below

commit da0250202b36158d4b57dfa2875ad65fb5a50f19
Author: ocket8888 <oc...@apache.org>
AuthorDate: Tue Sep 13 10:42:51 2022 -0600

    Add TO API v5 (#7063)
    
    * Add APIv5 routes
    
    (cherry picked from commit a70d6282e68213383b8491ff0e8315450df79296)
    
    * Add v5 API client
    
    (cherry picked from commit 523b13a0fa946571003f20e6a0342c4701a0017f)
    
    * Add APIv5 docs
    
    (cherry picked from commit 8592b498ba21110f5e51021b7021569e0591c846)
    
    * Remove instability notice from client that's no longer unstable
    
    * Remove outdated instability notice
    
    * Add APIv5 support to the client
    
    Also bumps default from now-deprecated 3.0 to current 4.1
    
    * Add APIv5 to tests
    
    * Update CHANGELOG
    
    * Fix rebase issues
    
    * Fix incorrect typing
    
    * fix broken reference
    
    * Fix malformed table
    
    * Fix duplicate label
    
    * Fix incorrect user-agent
---
 .github/workflows/traffic-ops.yml                  |   74 +
 CHANGELOG.md                                       |    2 +
 docs/source/api/index.rst                          |   12 +-
 docs/source/api/v4/acme_accounts.rst               |    2 +-
 .../source/api/v4/acme_accounts_provider_email.rst |    2 +-
 docs/source/api/v4/acme_accounts_providers.rst     |    2 +-
 docs/source/api/v4/acme_autorenew.rst              |    2 +-
 docs/source/api/v4/asns.rst                        |    2 +-
 docs/source/api/v4/asns_id.rst                     |    2 +-
 docs/source/api/v4/async_status.rst                |    2 +-
 docs/source/api/v4/cache_stats.rst                 |    8 +-
 docs/source/api/v4/cachegroups.rst                 |    4 +-
 docs/source/api/v4/cachegroups_id.rst              |    4 +-
 .../api/v4/cachegroups_id_deliveryservices.rst     |    3 +-
 docs/source/api/v4/cachegroups_id_queue_update.rst |    2 +-
 docs/source/api/v4/caches_stats.rst                |    4 +-
 docs/source/api/v4/cdn_locks.rst                   |    2 +-
 docs/source/api/v4/cdn_notifications.rst           |    2 +-
 docs/source/api/v4/cdns.rst                        |    2 +-
 docs/source/api/v4/cdns_capacity.rst               |    2 +-
 docs/source/api/v4/cdns_dnsseckeys_generate.rst    |    2 +-
 docs/source/api/v4/cdns_dnsseckeys_refresh.rst     |    2 +-
 docs/source/api/v4/cdns_domains.rst                |    2 +-
 docs/source/api/v4/cdns_health.rst                 |    2 +-
 docs/source/api/v4/cdns_id.rst                     |    3 +-
 docs/source/api/v4/cdns_id_queue_update.rst        |    2 +-
 .../source/api/v4/cdns_name_configs_monitoring.rst |    2 +-
 .../api/v4/cdns_name_dnsseckeys_ksk_generate.rst   |    2 +-
 docs/source/api/v4/cdns_name_federations.rst       |    2 +-
 docs/source/api/v4/cdns_name_federations_id.rst    |    2 +-
 docs/source/api/v4/cdns_name_health.rst            |    2 +-
 docs/source/api/v4/cdns_name_name.rst              |    3 +-
 docs/source/api/v4/cdns_name_name_dnsseckeys.rst   |    3 +-
 docs/source/api/v4/cdns_name_name_sslkeys.rst      |    2 +-
 docs/source/api/v4/cdns_name_snapshot.rst          |    2 +-
 docs/source/api/v4/cdns_name_snapshot_new.rst      |    2 +-
 docs/source/api/v4/cdns_routing.rst                |    2 +-
 docs/source/api/v4/consistenthash.rst              |    2 +-
 docs/source/api/v4/coordinates.rst                 |    2 +-
 docs/source/api/v4/current_stats.rst               |    2 +-
 docs/source/api/v4/dbdump.rst                      |    2 +-
 .../api/v4/deliveryservice_request_comments.rst    |    2 +-
 docs/source/api/v4/deliveryservice_requests.rst    |    6 +-
 .../api/v4/deliveryservice_requests_id_assign.rst  |    2 +-
 .../api/v4/deliveryservice_requests_id_status.rst  |    2 +-
 docs/source/api/v4/deliveryservice_stats.rst       |    2 +-
 docs/source/api/v4/deliveryservices.rst            |    2 +-
 docs/source/api/v4/deliveryservices_id.rst         |    2 +-
 .../source/api/v4/deliveryservices_id_capacity.rst |    2 +-
 docs/source/api/v4/deliveryservices_id_health.rst  |    2 +-
 docs/source/api/v4/deliveryservices_id_regexes.rst |    2 +-
 .../api/v4/deliveryservices_id_regexes_rid.rst     |    2 +-
 docs/source/api/v4/deliveryservices_id_routing.rst |    2 +-
 docs/source/api/v4/deliveryservices_id_safe.rst    |    2 +-
 docs/source/api/v4/deliveryservices_id_servers.rst |    2 +-
 .../v4/deliveryservices_id_servers_eligible.rst    |    2 +-
 docs/source/api/v4/deliveryservices_id_urlkeys.rst |    6 +-
 docs/source/api/v4/deliveryservices_regexes.rst    |    2 +-
 .../v4/deliveryservices_required_capabilities.rst  |    2 +-
 .../source/api/v4/deliveryservices_sslkeys_add.rst |    4 +-
 .../api/v4/deliveryservices_sslkeys_generate.rst   |    2 +-
 .../v4/deliveryservices_sslkeys_generate_acme.rst  |    2 +-
 ...liveryservices_sslkeys_generate_letsencrypt.rst |    2 +-
 .../api/v4/deliveryservices_xmlid_servers.rst      |    2 +-
 .../api/v4/deliveryservices_xmlid_urisignkeys.rst  |    2 +-
 .../v4/deliveryservices_xmlid_xmlid_sslkeys.rst    |    2 +-
 .../v4/deliveryservices_xmlid_xmlid_urlkeys.rst    |    6 +-
 ...d_xmlid_urlkeys_copyfromxmlid_copyfromxmlid.rst |    2 +-
 ...liveryservices_xmlid_xmlid_urlkeys_generate.rst |    2 +-
 docs/source/api/v4/deliveryserviceserver.rst       |    2 +-
 .../api/v4/deliveryserviceserver_dsid_serverid.rst |    2 +-
 docs/source/api/v4/divisions.rst                   |    2 +-
 docs/source/api/v4/divisions_id.rst                |    2 +-
 docs/source/api/v4/federation_resolvers.rst        |    4 +-
 docs/source/api/v4/federations.rst                 |    6 +-
 docs/source/api/v4/federations_all.rst             |    2 +-
 .../api/v4/federations_id_deliveryservices.rst     |    3 +-
 .../api/v4/federations_id_deliveryservices_id.rst  |    2 +-
 .../api/v4/federations_id_federation_resolvers.rst |    2 +-
 docs/source/api/v4/federations_id_users.rst        |    2 +-
 docs/source/api/v4/federations_id_users_id.rst     |    2 +-
 docs/source/api/v4/isos.rst                        |    5 +-
 docs/source/api/v4/jobs.rst                        |    2 +-
 docs/source/api/v4/letsencrypt_autorenew.rst       |    2 +-
 docs/source/api/v4/letsencrypt_dnsrecords.rst      |    2 +-
 docs/source/api/v4/logs.rst                        |    4 +-
 docs/source/api/v4/logs_newcount.rst               |    6 +-
 .../source/api/v4/multiple_server_capabilities.rst |    2 +-
 docs/source/api/v4/oc_ci_configuration.rst         |    2 +-
 docs/source/api/v4/oc_ci_configuration_host.rst    |    2 +-
 .../v4/oc_ci_configuration_request_id_approved.rst |    2 +-
 .../source/api/v4/oc_ci_configuration_requests.rst |    2 +-
 docs/source/api/v4/oc_fci_advertisement.rst        |    3 +-
 docs/source/api/v4/origins.rst                     |    2 +-
 docs/source/api/v4/osversions.rst                  |    2 +-
 docs/source/api/v4/parameterprofile.rst            |    2 +-
 docs/source/api/v4/parameters.rst                  |    2 +-
 docs/source/api/v4/parameters_id.rst               |    2 +-
 docs/source/api/v4/phys_locations.rst              |    2 +-
 docs/source/api/v4/phys_locations_id.rst           |    2 +-
 docs/source/api/v4/ping.rst                        |    2 +-
 docs/source/api/v4/plugins.rst                     |    2 +-
 docs/source/api/v4/profileparameter.rst            |    4 +-
 docs/source/api/v4/profileparameters.rst           |    2 +-
 .../v4/profileparameters_profileID_parameterID.rst |    2 +-
 docs/source/api/v4/profiles.rst                    |    2 +-
 docs/source/api/v4/profiles_id.rst                 |    2 +-
 docs/source/api/v4/profiles_id_export.rst          |    2 +-
 docs/source/api/v4/profiles_id_parameters.rst      |    2 +-
 docs/source/api/v4/profiles_import.rst             |    4 +-
 .../source/api/v4/profiles_name_name_copy_copy.rst |    2 +-
 .../api/v4/profiles_name_name_parameters.rst       |    2 +-
 docs/source/api/v4/regions.rst                     |    4 +-
 docs/source/api/v4/regions_id.rst                  |    2 +-
 docs/source/api/v4/roles.rst                       |    2 +-
 docs/source/api/v4/server_capabilities.rst         |    2 +-
 docs/source/api/v4/server_server_capabilities.rst  |    2 +-
 docs/source/api/v4/servercheck.rst                 |    3 +-
 docs/source/api/v4/servercheck_extensions.rst      |    2 +-
 docs/source/api/v4/servercheck_extensions_id.rst   |    2 +-
 docs/source/api/v4/servers.rst                     |    4 +-
 docs/source/api/v4/servers_hostname_update.rst     |    2 +-
 .../api/v4/servers_hostname_update_status.rst      |    4 +-
 docs/source/api/v4/servers_id.rst                  |    2 +-
 docs/source/api/v4/servers_id_deliveryservices.rst |    2 +-
 docs/source/api/v4/servers_id_queue_update.rst     |    4 +-
 docs/source/api/v4/servers_id_status.rst           |    2 +-
 docs/source/api/v4/service_categories.rst          |    2 +-
 docs/source/api/v4/service_categories_name.rst     |    2 +-
 docs/source/api/v4/snapshot.rst                    |    6 +-
 docs/source/api/v4/sslkey_expirations.rst          |    2 +-
 docs/source/api/v4/staticdnsentries.rst            |    2 +-
 docs/source/api/v4/stats_summary.rst               |    2 +-
 docs/source/api/v4/statuses.rst                    |    2 +-
 docs/source/api/v4/statuses_id.rst                 |    2 +-
 docs/source/api/v4/steering.rst                    |    2 +-
 docs/source/api/v4/steering_id_targets.rst         |    2 +-
 .../source/api/v4/steering_id_targets_targetID.rst |    2 +-
 docs/source/api/v4/system_info.rst                 |    2 +-
 docs/source/api/v4/tenants.rst                     |    2 +-
 docs/source/api/v4/tenants_id.rst                  |    2 +-
 docs/source/api/v4/topologies.rst                  |    2 +-
 .../source/api/v4/topologies_name_queue_update.rst |    2 +-
 docs/source/api/v4/types.rst                       |    2 +-
 docs/source/api/v4/types_id.rst                    |    2 +-
 docs/source/api/v4/user_current.rst                |   10 +-
 docs/source/api/v4/user_login.rst                  |    2 +-
 docs/source/api/v4/user_login_oauth.rst            |    2 +-
 docs/source/api/v4/user_login_token.rst            |    4 +-
 docs/source/api/v4/user_logout.rst                 |    2 +-
 docs/source/api/v4/user_reset_password.rst         |    2 +-
 docs/source/api/v4/users.rst                       |    6 +-
 docs/source/api/v4/users_id.rst                    |    6 +-
 docs/source/api/v4/users_register.rst              |    2 +-
 docs/source/api/v4/vault_ping.rst                  |    2 +-
 docs/source/api/v5/about.rst                       |   80 +
 docs/source/api/{v4 => v5}/acme_accounts.rst       |    4 +-
 .../{v4 => v5}/acme_accounts_provider_email.rst    |    0
 .../api/{v4 => v5}/acme_accounts_providers.rst     |    2 -
 docs/source/api/{v4 => v5}/acme_autorenew.rst      |    2 +-
 docs/source/api/{v4 => v5}/asns.rst                |    8 +-
 docs/source/api/{v4 => v5}/asns_id.rst             |    4 +-
 docs/source/api/{v4 => v5}/async_status.rst        |    0
 docs/source/api/{v4 => v5}/cache_stats.rst         |    2 +-
 docs/source/api/{v4 => v5}/cachegroups.rst         |    4 +-
 docs/source/api/{v4 => v5}/cachegroups_id.rst      |    4 +-
 .../{v4 => v5}/cachegroups_id_deliveryservices.rst |    3 +-
 .../api/{v4 => v5}/cachegroups_id_queue_update.rst |    2 +-
 docs/source/api/{v4 => v5}/caches_stats.rst        |    0
 docs/source/api/{v4 => v5}/cdn_locks.rst           |    6 +-
 docs/source/api/{v4 => v5}/cdn_notifications.rst   |    6 +-
 docs/source/api/{v4 => v5}/cdns.rst                |    2 +-
 docs/source/api/{v4 => v5}/cdns_capacity.rst       |    0
 .../api/{v4 => v5}/cdns_dnsseckeys_generate.rst    |    2 +-
 .../api/{v4 => v5}/cdns_dnsseckeys_refresh.rst     |    4 +-
 docs/source/api/{v4 => v5}/cdns_domains.rst        |    0
 docs/source/api/{v4 => v5}/cdns_health.rst         |    0
 docs/source/api/{v4 => v5}/cdns_id.rst             |    3 +-
 .../source/api/{v4 => v5}/cdns_id_queue_update.rst |    2 +-
 .../{v4 => v5}/cdns_name_configs_monitoring.rst    |    0
 .../cdns_name_dnsseckeys_ksk_generate.rst          |    0
 .../api/{v4 => v5}/cdns_name_federations.rst       |    4 +-
 .../api/{v4 => v5}/cdns_name_federations_id.rst    |    4 +-
 docs/source/api/{v4 => v5}/cdns_name_health.rst    |    2 +-
 docs/source/api/{v4 => v5}/cdns_name_name.rst      |    0
 .../api/{v4 => v5}/cdns_name_name_dnsseckeys.rst   |    0
 .../api/{v4 => v5}/cdns_name_name_sslkeys.rst      |    0
 docs/source/api/{v4 => v5}/cdns_name_snapshot.rst  |    4 +-
 .../api/{v4 => v5}/cdns_name_snapshot_new.rst      |    4 +-
 docs/source/api/{v4 => v5}/cdns_routing.rst        |    0
 docs/source/api/{v4 => v5}/consistenthash.rst      |    2 +-
 docs/source/api/{v4 => v5}/coordinates.rst         |    4 +-
 docs/source/api/{v4 => v5}/current_stats.rst       |    2 +-
 docs/source/api/{v4 => v5}/dbdump.rst              |    2 +-
 .../deliveryservice_request_comments.rst           |    8 +-
 .../api/{v4 => v5}/deliveryservice_requests.rst    |   10 +-
 .../deliveryservice_requests_id_assign.rst         |   15 +-
 .../deliveryservice_requests_id_status.rst         |    6 +-
 .../api/{v4 => v5}/deliveryservice_stats.rst       |   16 +-
 docs/source/api/{v4 => v5}/deliveryservices.rst    |   71 +-
 docs/source/api/{v4 => v5}/deliveryservices_id.rst |   43 +-
 .../{v4 => v5}/deliveryservices_id_capacity.rst    |    0
 .../api/{v4 => v5}/deliveryservices_id_health.rst  |    0
 .../api/{v4 => v5}/deliveryservices_id_regexes.rst |    4 +-
 .../{v4 => v5}/deliveryservices_id_regexes_rid.rst |    4 +-
 .../api/{v4 => v5}/deliveryservices_id_routing.rst |    2 +-
 .../api/{v4 => v5}/deliveryservices_id_safe.rst    |   11 +-
 .../api/{v4 => v5}/deliveryservices_id_servers.rst |    0
 .../deliveryservices_id_servers_eligible.rst       |    0
 .../api/{v4 => v5}/deliveryservices_id_urlkeys.rst |    2 +-
 .../api/{v4 => v5}/deliveryservices_regexes.rst    |    0
 .../deliveryservices_required_capabilities.rst     |    6 +-
 .../{v4 => v5}/deliveryservices_sslkeys_add.rst    |    2 +-
 .../deliveryservices_sslkeys_generate.rst          |    2 +-
 .../deliveryservices_sslkeys_generate_acme.rst     |    6 +-
 ...liveryservices_sslkeys_generate_letsencrypt.rst |    4 +-
 .../{v4 => v5}/deliveryservices_xmlid_servers.rst  |    2 +-
 .../deliveryservices_xmlid_urisignkeys.rst         |    0
 .../deliveryservices_xmlid_xmlid_sslkeys.rst       |    6 +-
 .../deliveryservices_xmlid_xmlid_urlkeys.rst       |    0
 ...d_xmlid_urlkeys_copyfromxmlid_copyfromxmlid.rst |    0
 ...liveryservices_xmlid_xmlid_urlkeys_generate.rst |    0
 .../api/{v4 => v5}/deliveryserviceserver.rst       |    4 +-
 .../deliveryserviceserver_dsid_serverid.rst        |    0
 docs/source/api/{v4 => v5}/divisions.rst           |    2 +-
 docs/source/api/{v4 => v5}/divisions_id.rst        |    4 +-
 .../source/api/{v4 => v5}/federation_resolvers.rst |    6 +-
 docs/source/api/{v4 => v5}/federations.rst         |    6 +-
 docs/source/api/{v4 => v5}/federations_all.rst     |    2 +-
 .../{v4 => v5}/federations_id_deliveryservices.rst |    5 +-
 .../federations_id_deliveryservices_id.rst         |    2 +-
 .../federations_id_federation_resolvers.rst        |    4 +-
 .../source/api/{v4 => v5}/federations_id_users.rst |    2 +-
 .../api/{v4 => v5}/federations_id_users_id.rst     |    2 +-
 docs/source/api/{v4 => v5}/isos.rst                |    3 +-
 docs/source/api/{v4 => v5}/jobs.rst                |   10 +-
 .../api/{v4 => v5}/letsencrypt_autorenew.rst       |    0
 .../api/{v4 => v5}/letsencrypt_dnsrecords.rst      |    2 +-
 docs/source/api/{v4 => v5}/logs.rst                |    2 +-
 docs/source/api/{v4 => v5}/logs_newcount.rst       |    0
 .../{v4 => v5}/multiple_server_capabilities.rst    |    4 +-
 docs/source/api/{v4 => v5}/oc_ci_configuration.rst |    4 +-
 .../api/{v4 => v5}/oc_ci_configuration_host.rst    |    4 +-
 .../oc_ci_configuration_request_id_approved.rst    |    0
 .../{v4 => v5}/oc_ci_configuration_requests.rst    |    0
 .../source/api/{v4 => v5}/oc_fci_advertisement.rst |    0
 docs/source/api/{v4 => v5}/origins.rst             |    8 +-
 docs/source/api/{v4 => v5}/osversions.rst          |    0
 docs/source/api/{v4 => v5}/parameterprofile.rst    |    2 +-
 docs/source/api/{v4 => v5}/parameters.rst          |    6 +-
 docs/source/api/{v4 => v5}/parameters_id.rst       |    4 +-
 docs/source/api/{v4 => v5}/phys_locations.rst      |    4 +-
 docs/source/api/{v4 => v5}/phys_locations_id.rst   |    4 +-
 docs/source/api/{v4 => v5}/ping.rst                |    2 +-
 docs/source/api/{v4 => v5}/plugins.rst             |    2 +-
 docs/source/api/{v4 => v5}/profileparameter.rst    |    2 +-
 docs/source/api/{v4 => v5}/profileparameters.rst   |    4 +-
 .../profileparameters_profileID_parameterID.rst    |    2 +-
 docs/source/api/{v4 => v5}/profiles.rst            |    4 +-
 docs/source/api/{v4 => v5}/profiles_id.rst         |    4 +-
 docs/source/api/{v4 => v5}/profiles_id_export.rst  |    2 +-
 .../api/{v4 => v5}/profiles_id_parameters.rst      |    6 +-
 docs/source/api/{v4 => v5}/profiles_import.rst     |    2 +-
 .../{v4 => v5}/profiles_name_name_copy_copy.rst    |    2 +-
 .../{v4 => v5}/profiles_name_name_parameters.rst   |    6 +-
 docs/source/api/{v4 => v5}/regions.rst             |    6 +-
 docs/source/api/{v4 => v5}/regions_id.rst          |    2 +-
 docs/source/api/{v4 => v5}/roles.rst               |    8 +-
 docs/source/api/{v4 => v5}/server_capabilities.rst |    8 +-
 .../api/{v4 => v5}/server_server_capabilities.rst  |    6 +-
 docs/source/api/{v4 => v5}/servercheck.rst         |    7 +-
 .../api/{v4 => v5}/servercheck_extensions.rst      |    4 +-
 .../api/{v4 => v5}/servercheck_extensions_id.rst   |    2 +-
 docs/source/api/{v4 => v5}/servers.rst             |   16 +-
 .../api/{v4 => v5}/servers_hostname_update.rst     |    2 +-
 .../{v4 => v5}/servers_hostname_update_status.rst  |    5 +-
 docs/source/api/{v4 => v5}/servers_id.rst          |    4 +-
 .../api/{v4 => v5}/servers_id_deliveryservices.rst |   33 +-
 .../api/{v4 => v5}/servers_id_queue_update.rst     |    2 +-
 docs/source/api/{v4 => v5}/servers_id_status.rst   |    2 +-
 docs/source/api/{v4 => v5}/service_categories.rst  |    4 +-
 .../api/{v4 => v5}/service_categories_name.rst     |    4 +-
 docs/source/api/{v4 => v5}/snapshot.rst            |    2 +-
 docs/source/api/{v4 => v5}/sslkey_expirations.rst  |    2 +-
 docs/source/api/{v4 => v5}/staticdnsentries.rst    |    8 +-
 docs/source/api/{v4 => v5}/stats_summary.rst       |    6 +-
 docs/source/api/{v4 => v5}/statuses.rst            |    4 +-
 docs/source/api/{v4 => v5}/statuses_id.rst         |    4 +-
 docs/source/api/{v4 => v5}/steering.rst            |    2 +-
 docs/source/api/{v4 => v5}/steering_id_targets.rst |    4 +-
 .../{v4 => v5}/steering_id_targets_targetID.rst    |    4 +-
 docs/source/api/{v4 => v5}/system_info.rst         |    0
 docs/source/api/{v4 => v5}/tenants.rst             |    4 +-
 docs/source/api/{v4 => v5}/tenants_id.rst          |    4 +-
 docs/source/api/{v4 => v5}/topologies.rst          |    8 +-
 .../{v4 => v5}/topologies_name_queue_update.rst    |    2 +-
 docs/source/api/{v4 => v5}/types.rst               |    4 +-
 docs/source/api/{v4 => v5}/types_id.rst            |    4 +-
 docs/source/api/{v4 => v5}/user_current.rst        |   22 +-
 docs/source/api/{v4 => v5}/user_login.rst          |    2 +-
 docs/source/api/{v4 => v5}/user_login_oauth.rst    |    2 +-
 docs/source/api/{v4 => v5}/user_login_token.rst    |    2 +-
 docs/source/api/{v4 => v5}/user_logout.rst         |    0
 docs/source/api/{v4 => v5}/user_reset_password.rst |    2 +-
 docs/source/api/{v4 => v5}/users.rst               |   21 +-
 docs/source/api/{v4 => v5}/users_id.rst            |   41 +-
 docs/source/api/{v4 => v5}/users_register.rst      |    2 +-
 docs/source/api/{v4 => v5}/vault_ping.rst          |    0
 docs/source/development/traffic_ops.rst            |    1 +
 docs/source/overview/delivery_services.rst         |    2 +-
 .../traffic_ops_integration_test/Dockerfile        |    1 +
 .../clients/python/to_access/__init__.py           |    4 +-
 .../clients/python/trafficops/__version__.py       |    9 +-
 .../clients/python/trafficops/tosession.py         |  306 +-
 traffic_ops/testing/api/utils/utils.go             |   35 +-
 traffic_ops/testing/api/v5/.gitignore              |   18 +
 traffic_ops/testing/api/v5/about_test.go           |   53 +
 traffic_ops/testing/api/v5/acme_test.go            |   49 +
 traffic_ops/testing/api/v5/asns_test.go            |  187 +
 traffic_ops/testing/api/v5/cachegroups_test.go     |  453 ++
 .../api/v5/cachegroupsdeliveryservices_test.go     |  163 +
 traffic_ops/testing/api/v5/cdn_dnsseckeys_test.go  |  158 +
 traffic_ops/testing/api/v5/cdn_domains_test.go     |   62 +
 traffic_ops/testing/api/v5/cdn_federations_test.go |  301 +
 traffic_ops/testing/api/v5/cdn_locks_test.go       |  726 +++
 .../testing/api/v5/cdn_queue_updates_test.go       |  130 +
 .../testing/api/v5/cdnnotifications_test.go        |  100 +
 traffic_ops/testing/api/v5/cdns_test.go            |  369 ++
 traffic_ops/testing/api/v5/cookie_test.go          |   80 +
 traffic_ops/testing/api/v5/coordinates_test.go     |  363 ++
 traffic_ops/testing/api/v5/crconfig_test.go        |  356 ++
 .../v5/deliveryservice_request_comments_test.go    |  205 +
 .../api/v5/deliveryservice_requests_test.go        |  394 ++
 .../testing/api/v5/deliveryservices_keys_test.go   |  611 ++
 .../deliveryservices_required_capabilities_test.go |  285 +
 .../testing/api/v5/deliveryservices_test.go        |  778 +++
 .../testing/api/v5/deliveryserviceservers_test.go  |  373 ++
 .../api/v5/deliveryservicesideligible_test.go      |   52 +
 .../testing/api/v5/deliveryservicesregexes_test.go |  133 +
 traffic_ops/testing/api/v5/divisions_test.go       |  319 +
 .../api/v5/federation_deliveryservices_test.go     |  215 +
 .../api/v5/federation_federation_resolvers_test.go |  158 +
 .../testing/api/v5/federation_resolvers_test.go    |  294 +
 .../testing/api/v5/federation_users_test.go        |  257 +
 traffic_ops/testing/api/v5/federations_test.go     |  277 +
 traffic_ops/testing/api/v5/fixtures_test.go        |   43 +
 traffic_ops/testing/api/v5/iso_test.go             |   91 +
 traffic_ops/testing/api/v5/jobs_test.go            |  665 ++
 traffic_ops/testing/api/v5/loginfail_test.go       |  111 +
 traffic_ops/testing/api/v5/logs_test.go            |   82 +
 traffic_ops/testing/api/v5/monitoring_test.go      |   93 +
 traffic_ops/testing/api/v5/origins_test.go         |  681 +++
 traffic_ops/testing/api/v5/parameters_test.go      |  428 ++
 traffic_ops/testing/api/v5/phys_locations_test.go  |  361 ++
 traffic_ops/testing/api/v5/ping_test.go            |   53 +
 .../testing/api/v5/profile_parameters_test.go      |  261 +
 traffic_ops/testing/api/v5/profiles_export_test.go |   78 +
 traffic_ops/testing/api/v5/profiles_import_test.go |  128 +
 .../testing/api/v5/profiles_name_copy_test.go      |   93 +
 traffic_ops/testing/api/v5/profiles_test.go        |  373 ++
 traffic_ops/testing/api/v5/regions_test.go         |  352 ++
 traffic_ops/testing/api/v5/roles_test.go           |  357 ++
 .../testing/api/v5/server_capabilities_test.go     |  214 +
 .../api/v5/server_server_capabilities_test.go      |  341 ++
 .../testing/api/v5/servercheckextension_test.go    |  133 +
 traffic_ops/testing/api/v5/serverchecks_test.go    |  187 +
 .../api/v5/servers_id_deliveryservices_test.go     |  180 +
 traffic_ops/testing/api/v5/servers_test.go         |  651 ++
 .../testing/api/v5/serverupdatestatus_test.go      |  639 ++
 .../testing/api/v5/servicecategories_test.go       |  313 +
 traffic_ops/testing/api/v5/session_test.go         |   55 +
 .../testing/api/v5/staticdnsentries_test.go        |  280 +
 traffic_ops/testing/api/v5/stats_summary_test.go   |  169 +
 traffic_ops/testing/api/v5/statuses_test.go        |  220 +
 traffic_ops/testing/api/v5/steering_test.go        |   88 +
 traffic_ops/testing/api/v5/steeringtargets_test.go |  252 +
 traffic_ops/testing/api/v5/tc-fixtures.json        | 6406 ++++++++++++++++++++
 traffic_ops/testing/api/v5/tenants_test.go         |  338 ++
 traffic_ops/testing/api/v5/todb_test.go            |  453 ++
 .../testing/api/v5/topologies_queue_update_test.go |  149 +
 traffic_ops/testing/api/v5/topologies_test.go      | 1412 +++++
 traffic_ops/testing/api/v5/traffic_control_test.go |   64 +
 traffic_ops/testing/api/v5/traffic_ops_test.go     |  115 +
 .../testing/api/v5/traffic_vault_ping_test.go      |   56 +
 traffic_ops/testing/api/v5/types_test.go           |  279 +
 traffic_ops/testing/api/v5/user_current_test.go    |  115 +
 traffic_ops/testing/api/v5/users_register_test.go  |   93 +
 traffic_ops/testing/api/v5/users_test.go           |  375 ++
 traffic_ops/testing/api/v5/withobjs_test.go        |  132 +
 traffic_ops/traffic_ops_golang/routing/routes.go   |  400 ++
 traffic_ops/v4-client/README.md                    |    5 -
 traffic_ops/{v4-client => v5-client}/README.md     |    9 +-
 traffic_ops/v5-client/about.go                     |   32 +
 traffic_ops/v5-client/acme.go                      |   31 +
 traffic_ops/v5-client/asn.go                       |   64 +
 traffic_ops/v5-client/async_status.go              |   34 +
 traffic_ops/v5-client/cachegroup.go                |  111 +
 traffic_ops/v5-client/cdn.go                       |   78 +
 traffic_ops/v5-client/cdn_dnssec.go                |   68 +
 traffic_ops/v5-client/cdn_domains.go               |   28 +
 traffic_ops/v5-client/cdn_lock.go                  |   45 +
 traffic_ops/v5-client/cdn_notifications.go         |   53 +
 traffic_ops/v5-client/cdnfederations.go            |   65 +
 traffic_ops/v5-client/coordinate.go                |   64 +
 traffic_ops/v5-client/crconfig.go                  |   61 +
 traffic_ops/v5-client/deliveryservice.go           |  350 ++
 traffic_ops/v5-client/deliveryservice_regexes.go   |   53 +
 .../v5-client/deliveryservice_request_comments.go  |   68 +
 traffic_ops/v5-client/deliveryservice_requests.go  |  142 +
 .../deliveryservices_required_capabilities.go      |   55 +
 traffic_ops/v5-client/deliveryserviceserver.go     |   75 +
 traffic_ops/v5-client/division.go                  |   57 +
 traffic_ops/v5-client/endpoints.go                 |   27 +
 traffic_ops/v5-client/federation.go                |  141 +
 .../v5-client/federation_federation_resolver.go    |   48 +
 traffic_ops/v5-client/federation_resolver.go       |   52 +
 traffic_ops/v5-client/iso.go                       |   36 +
 traffic_ops/v5-client/job.go                       |   66 +
 traffic_ops/v5-client/log.go                       |   31 +
 traffic_ops/v5-client/origin.go                    |  151 +
 traffic_ops/v5-client/parameter.go                 |   64 +
 traffic_ops/v5-client/phys_location.go             |   70 +
 traffic_ops/v5-client/ping.go                      |   38 +
 traffic_ops/v5-client/profile.go                   |  117 +
 traffic_ops/v5-client/profile_parameter.go         |   72 +
 traffic_ops/v5-client/region.go                    |   79 +
 traffic_ops/v5-client/role.go                      |   62 +
 traffic_ops/v5-client/server.go                    |  170 +
 .../v5-client/server_server_capabilities.go        |   65 +
 traffic_ops/v5-client/server_update_status.go      |   79 +
 traffic_ops/v5-client/servercapability.go          |   63 +
 traffic_ops/v5-client/servercheck.go               |   40 +
 traffic_ops/v5-client/servercheckextensions.go     |   47 +
 traffic_ops/v5-client/serviceCategory.go           |   59 +
 traffic_ops/v5-client/session.go                   |  147 +
 traffic_ops/v5-client/staticdnsentry.go            |  128 +
 traffic_ops/v5-client/stats_summary.go             |   53 +
 traffic_ops/v5-client/status.go                    |   56 +
 traffic_ops/v5-client/steering.go                  |   29 +
 traffic_ops/v5-client/steeringtarget.go            |   71 +
 traffic_ops/v5-client/tenant.go                    |   70 +
 traffic_ops/v5-client/topology.go                  |   62 +
 traffic_ops/v5-client/topology_queue_updates.go    |   36 +
 traffic_ops/v5-client/traffic_monitor.go           |   42 +
 traffic_ops/v5-client/traffic_stats.go             |   27 +
 traffic_ops/v5-client/type.go                      |   59 +
 traffic_ops/v5-client/user.go                      |  114 +
 traffic_ops/v5-client/vault.go                     |   32 +
 448 files changed, 31158 insertions(+), 796 deletions(-)

diff --git a/.github/workflows/traffic-ops.yml b/.github/workflows/traffic-ops.yml
index 9b08d200d2..ce04ac71a6 100644
--- a/.github/workflows/traffic-ops.yml
+++ b/.github/workflows/traffic-ops.yml
@@ -202,3 +202,77 @@ jobs:
         path: ${{ github.workspace }}/traffic_ops/traffic_ops_golang/traffic.ops.log
     - name: Save Alpine Docker image
       run: .github/actions/save-alpine-tar/entrypoint.sh save ${{ env.ALPINE_VERSION }}
+
+  APIv5Tests:
+    if: github.event.pull_request.draft == false
+    runs-on: ubuntu-latest
+
+    services:
+      postgres:
+        image: postgres:13
+        env:
+          POSTGRES_USER: traffic_ops
+          POSTGRES_PASSWORD: twelve
+          POSTGRES_DB: traffic_ops
+        ports:
+        - 5432:5432
+        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
+
+      smtp:
+        image: maildev/maildev:2.0.0-beta3
+        ports:
+          - 25:25
+        options: >-
+          --entrypoint=bin/maildev
+          --user=root
+          --health-cmd="sh -c \"[[ \$(wget -qO- http://smtp/healthz) == true ]]\""
+          --
+          maildev/maildev:2.0.0-beta3
+          --smtp=25
+          --hide-extensions=STARTTLS
+          --web=80
+
+    steps:
+    - name: Checkout
+      uses: actions/checkout@master
+    - name: Cache Alpine Docker image
+      uses: actions/cache@v2
+      with:
+        path: ${{ github.workspace }}/docker-images
+        key: docker-images/alpine@${{ env.ALPINE_VERSION }}.tar.gz
+    - name: Import cached Alpine Docker image
+      run: .github/actions/save-alpine-tar/entrypoint.sh load ${{ env.ALPINE_VERSION }}
+    - name: Initialize Traffic Ops Database
+      id: todb
+      uses: ./.github/actions/todb-init
+    - name: Initialize Traffic Vault Database
+      id: tvdb
+      uses: ./.github/actions/tvdb-init
+    - name: Check Go Version
+      run: echo "::set-output name=value::$(cat GO_VERSION)"
+      id: go-version
+    - name: Install Go
+      uses: actions/setup-go@v2
+      with:
+        go-version: ${{ steps.go-version.outputs.value }}
+    - name: Run API v5 tests
+      id: v5Tests
+      if: ${{ steps.todb.outcome == 'success' && always() }}
+      uses: ./.github/actions/to-integration-tests
+      with:
+        version: 5
+        smtp_address: 172.17.0.1
+    - name: Upload v5 Vault logs
+      if: ${{ steps.v5Tests.outcome != 'success' && always() }}
+      uses: actions/upload-artifact@v2
+      with:
+        name: v5 Traffic Vault logs
+        path: ${{ github.workspace }}/infrastructure/cdn-in-a-box/traffic.vault.logs
+    - name: Upload v5 Ops logs
+      if: ${{ steps.v5Tests.outcome != 'success' && always() }}
+      uses: actions/upload-artifact@v2
+      with:
+        name: v5 Traffic Ops logs
+        path: ${{ github.workspace }}/traffic_ops/traffic_ops_golang/traffic.ops.log
+    - name: Save Alpine Docker image
+      run: .github/actions/save-alpine-tar/entrypoint.sh save ${{ env.ALPINE_VERSION }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c74a5b183a..df848da75e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
 - [#2101](https://github.com/apache/trafficcontrol/issues/2101) Added the ability to tell if a Delivery Service is the target of another steering DS.
 - [#6033](https://github.com/apache/trafficcontrol/issues/6033) Added ability to assign multiple server capabilities to a server.
 - [#7032](https://github.com/apache/trafficcontrol/issues/7032) Add t3c-apply flag to use local ATS version for config generation rather than Server package Parameter, to allow managing the ATS OS package via external tools. See 'man t3c-apply' and 'man t3c-generate' for details.
+- Traffic Ops API version 5.0
 
 - [Traffic Monitor] Added logging for `ipv4Availability` and `ipv6Availability` in TM.
 - [Traffic Ops] Added the `ASN` field in TO Server struct, which provides the ability to query servers by `ASN`.
@@ -15,6 +16,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
 ### Changed
 - Traffic Portal now obscures sensitive text in Delivery Service "Raw Remap" fields, private SSL keys, "Header Rewrite" rules, and ILO interface passwords by default.
 - Traffic Router now uses Traffic Ops API 4.0 by default
+- The Traffic Ops Python client now uses Traffic Ops API 4.1 by default.
 
 ### Fixed
 - Traffic Stats: Reuse InfluxDB client handle to prevent potential connection leaks
diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst
index db4d5cf060..136db1986e 100644
--- a/docs/source/api/index.rst
+++ b/docs/source/api/index.rst
@@ -22,7 +22,7 @@ The Traffic Ops API provides programmatic access to read and write Traffic Contr
 
 How to Read this Documentation
 ==============================
-Each endpoint for each version is on its own page, titled with the request path. The request paths shown on each endpoint's page are - unless otherwise noted - only usable by being appended to the request path prefix ``/api/<version>/`` where ``<version>`` is the API version being requested. The API versions officially supported as of the time of this writing are 3.0, 3.1, and 4.0. All endpoints are documented as though they were being used in version 3.1 in the version 3 documentation a [...]
+Each endpoint for each version is on its own page, titled with the request path. The request paths shown on each endpoint's page are - unless otherwise noted - only usable by being appended to the request path prefix ``/api/<version>/`` where ``<version>`` is the API version being requested. The API versions officially supported as of the time of this writing are 3.0, 3.1, 4.0, 4.1, and 5.0. All endpoints are documented as though they were being used in version 3.1 in the version 3 docum [...]
 
 Every endpoint is documented with a section for each method, containing the subsections "Request Structure" and "Response Structure" which identify all properties and structure of the Request to and Response from the endpoint. Before these subsections, three key pieces of information will be provided:
 
@@ -332,5 +332,15 @@ API routes available in version 4.
 
 	v4/*
 
+API V5 Routes
+=============
+API routes available in version 5.
+
+.. toctree::
+	:maxdepth: 4
+	:glob:
+
+	v5/*
+
 
 .. [1] A cookie obtained by logging in through Traffic Portal can be used to access API endpoints under the Traffic Portal domain name - since it will proxy such requests back to Traffic Ops. This is not recommended in actual deployments, however, because it will involve an extra network connection which could be avoided by simply using the Traffic Ops domain itself.
diff --git a/docs/source/api/v4/acme_accounts.rst b/docs/source/api/v4/acme_accounts.rst
index 391f521253..0e9b90e8b9 100644
--- a/docs/source/api/v4/acme_accounts.rst
+++ b/docs/source/api/v4/acme_accounts.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-acme-accounts:
+.. _to-api-v4-acme-accounts:
 
 *****************
 ``acme_accounts``
diff --git a/docs/source/api/v4/acme_accounts_provider_email.rst b/docs/source/api/v4/acme_accounts_provider_email.rst
index 4dd7777d7e..3535af4997 100644
--- a/docs/source/api/v4/acme_accounts_provider_email.rst
+++ b/docs/source/api/v4/acme_accounts_provider_email.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-acme-accounts-provider-email:
+.. _to-api-v4-acme-accounts-provider-email:
 
 ****************************************
 ``acme_accounts/{{provider}}/{{email}}``
diff --git a/docs/source/api/v4/acme_accounts_providers.rst b/docs/source/api/v4/acme_accounts_providers.rst
index 8dfc1c3170..eea9ca96a3 100644
--- a/docs/source/api/v4/acme_accounts_providers.rst
+++ b/docs/source/api/v4/acme_accounts_providers.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-acme-accounts-providers:
+.. _to-api-v4-acme-accounts-providers:
 
 ***************************
 ``acme_accounts/providers``
diff --git a/docs/source/api/v4/acme_autorenew.rst b/docs/source/api/v4/acme_autorenew.rst
index 0ac7171f26..0e9568935b 100644
--- a/docs/source/api/v4/acme_autorenew.rst
+++ b/docs/source/api/v4/acme_autorenew.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-acme-autorenew:
+.. _to-api-v4-acme-autorenew:
 
 ******************
 ``acme_autorenew``
diff --git a/docs/source/api/v4/asns.rst b/docs/source/api/v4/asns.rst
index cdb37e064e..4dfa127822 100644
--- a/docs/source/api/v4/asns.rst
+++ b/docs/source/api/v4/asns.rst
@@ -14,7 +14,7 @@
 ..
 
 
-.. _to-api-asns:
+.. _to-api-v4-asns:
 
 ********
 ``asns``
diff --git a/docs/source/api/v4/asns_id.rst b/docs/source/api/v4/asns_id.rst
index 72cb4b1a05..6312c46d20 100644
--- a/docs/source/api/v4/asns_id.rst
+++ b/docs/source/api/v4/asns_id.rst
@@ -14,7 +14,7 @@
 ..
 
 
-.. _to-api-asns-id:
+.. _to-api-v4-asns-id:
 
 ***************
 ``asns/{{id}}``
diff --git a/docs/source/api/v4/async_status.rst b/docs/source/api/v4/async_status.rst
index 6f1a1e9acc..e22eac5c37 100644
--- a/docs/source/api/v4/async_status.rst
+++ b/docs/source/api/v4/async_status.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-async_status:
+.. _to-api-v4-async_status:
 
 ***********************
 ``async_status/{{id}}``
diff --git a/docs/source/api/v4/cache_stats.rst b/docs/source/api/v4/cache_stats.rst
index 297205b60d..462bfbcc0b 100644
--- a/docs/source/api/v4/cache_stats.rst
+++ b/docs/source/api/v4/cache_stats.rst
@@ -14,14 +14,14 @@
 ..
 
 
-.. _to-api-cache_stats:
+.. _to-api-v4-cache_stats:
 
 ***************
 ``cache_stats``
 ***************
 Retrieves detailed, aggregated statistics for caches in a specific CDN.
 
-.. seealso:: This gives an aggregate of statistics for *all caches* within a particular CDN and time range. For statistics basic statistics from all caches regardless of CDN and at the current time, use :ref:`to-api-caches-stats`.
+.. seealso:: This gives an aggregate of statistics for *all caches* within a particular CDN and time range. For statistics basic statistics from all caches regardless of CDN and at the current time, use :ref:`to-api-v4-caches-stats`.
 
 ``GET``
 -------
@@ -65,7 +65,7 @@ Request Structure
 	|                     |                   | Epoch, or in the same, proprietary format as the ``lastUpdated`` fields prevalent throughout the Traffic Ops API                                                                          |
 	+---------------------+-------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 
-.. _cache_stats-get-request-example:
+.. _cache_stats-v4-get-request-example:
 .. code-block:: http
 	:caption: Request Example
 
@@ -78,7 +78,7 @@ Request Structure
 
 Content Format
 """"""""""""""
-It's important to note in :ref:`cache_stats-get-request-example` the use of a complex "Accept" header. This endpoint accepts two special media types in the "Accept" header that instruct it on how to format the timestamps associated with the returned data. Specifically, Traffic Ops will recognize the special, optional, non-standard parameter of :mimetype:`application/json`: ``timestamp``. The values of this parameter are restricted to one of
+It's important to note in :ref:`cache_stats-v4-get-request-example` the use of a complex "Accept" header. This endpoint accepts two special media types in the "Accept" header that instruct it on how to format the timestamps associated with the returned data. Specifically, Traffic Ops will recognize the special, optional, non-standard parameter of :mimetype:`application/json`: ``timestamp``. The values of this parameter are restricted to one of
 
 rfc
 	Returned timestamps will be formatted according to :rfc:`3339` (no sub-second precision).
diff --git a/docs/source/api/v4/cachegroups.rst b/docs/source/api/v4/cachegroups.rst
index 561776d9a2..5cc80bc04f 100644
--- a/docs/source/api/v4/cachegroups.rst
+++ b/docs/source/api/v4/cachegroups.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cachegroups:
+.. _to-api-v4-cachegroups:
 
 ***************
 ``cachegroups``
@@ -150,7 +150,7 @@ Request Structure
 :shortName:                   An abbreviation of the ``name``
 :typeId:                      An integral, unique identifier for the :ref:`Cache Group's Type <cache-group-type>`
 
-	.. note:: The actual, integral, unique identifiers for these :term:`Types` must first be obtained, generally via :ref:`to-api-types`.
+	.. note:: The actual, integral, unique identifiers for these :term:`Types` must first be obtained, generally via :ref:`to-api-v4-types`.
 
 .. code-block:: http
 	:caption: Request Example
diff --git a/docs/source/api/v4/cachegroups_id.rst b/docs/source/api/v4/cachegroups_id.rst
index 284e3477fd..c0fe9f1b68 100644
--- a/docs/source/api/v4/cachegroups_id.rst
+++ b/docs/source/api/v4/cachegroups_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cachegroups-id:
+.. _to-api-v4-cachegroups-id:
 
 **********************
 ``cachegroups/{{ID}}``
@@ -55,7 +55,7 @@ Request Structure
 :shortName:                   An abbreviation of the ``name``
 :typeId:                      An integral, unique identifier for the :ref:`Cache Group's Type <cache-group-type>`
 
-	.. note:: The actual, integral, unique identifiers for these :term:`Types` must first be obtained, generally via :ref:`to-api-types`.
+	.. note:: The actual, integral, unique identifiers for these :term:`Types` must first be obtained, generally via :ref:`to-api-v4-types`.
 
 .. code-block:: http
 	:caption: Request Example
diff --git a/docs/source/api/v4/cachegroups_id_deliveryservices.rst b/docs/source/api/v4/cachegroups_id_deliveryservices.rst
index d014e9cf1b..8ca74d00c7 100644
--- a/docs/source/api/v4/cachegroups_id_deliveryservices.rst
+++ b/docs/source/api/v4/cachegroups_id_deliveryservices.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cachegroups-id-deliveryservices:
+.. _to-api-v4-cachegroups-id-deliveryservices:
 
 ***************************************
 ``cachegroups/{{ID}}/deliveryservices``
@@ -91,4 +91,3 @@ Response Structure
 			2
 		]
 	}}
-
diff --git a/docs/source/api/v4/cachegroups_id_queue_update.rst b/docs/source/api/v4/cachegroups_id_queue_update.rst
index ced0e56484..d9cffaa8e7 100644
--- a/docs/source/api/v4/cachegroups_id_queue_update.rst
+++ b/docs/source/api/v4/cachegroups_id_queue_update.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cachegroups-id-queue_update:
+.. _to-api-v4-cachegroups-id-queue_update:
 
 ***********************************
 ``cachegroups/{{ID}}/queue_update``
diff --git a/docs/source/api/v4/caches_stats.rst b/docs/source/api/v4/caches_stats.rst
index 9b2238cff1..9243251f7d 100644
--- a/docs/source/api/v4/caches_stats.rst
+++ b/docs/source/api/v4/caches_stats.rst
@@ -14,14 +14,14 @@
 ..
 
 
-.. _to-api-caches-stats:
+.. _to-api-v4-caches-stats:
 
 ****************
 ``caches/stats``
 ****************
 An API endpoint that returns cache statistics using the :ref:`tm-api`.
 
-.. seealso:: This gives a set of basic statistics for *all* :term:`cache servers` at the current time. For statistics from time ranges and/or aggregated over a specific CDN, use :ref:`to-api-cache_stats`.
+.. seealso:: This gives a set of basic statistics for *all* :term:`cache servers` at the current time. For statistics from time ranges and/or aggregated over a specific CDN, use :ref:`to-api-v4-cache_stats`.
 
 ``GET``
 =======
diff --git a/docs/source/api/v4/cdn_locks.rst b/docs/source/api/v4/cdn_locks.rst
index 0bd4619974..37b527e158 100644
--- a/docs/source/api/v4/cdn_locks.rst
+++ b/docs/source/api/v4/cdn_locks.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdn-locks:
+.. _to-api-v4-cdn-locks:
 
 *****************
 ``cdn_locks``
diff --git a/docs/source/api/v4/cdn_notifications.rst b/docs/source/api/v4/cdn_notifications.rst
index c056192786..ca37c3b68b 100644
--- a/docs/source/api/v4/cdn_notifications.rst
+++ b/docs/source/api/v4/cdn_notifications.rst
@@ -14,7 +14,7 @@
 ..
 
 
-.. _to-api-cdn-notifications:
+.. _to-api-v4-cdn-notifications:
 
 *********************
 ``cdn_notifications``
diff --git a/docs/source/api/v4/cdns.rst b/docs/source/api/v4/cdns.rst
index 219625ecb3..8e13605df5 100644
--- a/docs/source/api/v4/cdns.rst
+++ b/docs/source/api/v4/cdns.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns:
+.. _to-api-v4-cdns:
 
 ********
 ``cdns``
diff --git a/docs/source/api/v4/cdns_capacity.rst b/docs/source/api/v4/cdns_capacity.rst
index 70560fa8f5..56bd64625e 100644
--- a/docs/source/api/v4/cdns_capacity.rst
+++ b/docs/source/api/v4/cdns_capacity.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-capacity:
+.. _to-api-v4-cdns-capacity:
 
 *****************
 ``cdns/capacity``
diff --git a/docs/source/api/v4/cdns_dnsseckeys_generate.rst b/docs/source/api/v4/cdns_dnsseckeys_generate.rst
index 243a75fa0e..f050af072b 100644
--- a/docs/source/api/v4/cdns_dnsseckeys_generate.rst
+++ b/docs/source/api/v4/cdns_dnsseckeys_generate.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-dnsseckeys-generate:
+.. _to-api-v4-cdns-dnsseckeys-generate:
 
 ****************************
 ``cdns/dnsseckeys/generate``
diff --git a/docs/source/api/v4/cdns_dnsseckeys_refresh.rst b/docs/source/api/v4/cdns_dnsseckeys_refresh.rst
index 314e750a30..89c78c8734 100644
--- a/docs/source/api/v4/cdns_dnsseckeys_refresh.rst
+++ b/docs/source/api/v4/cdns_dnsseckeys_refresh.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-dnsseckeys-refresh:
+.. _to-api-v4-cdns-dnsseckeys-refresh:
 
 ***************************
 ``cdns/dnsseckeys/refresh``
diff --git a/docs/source/api/v4/cdns_domains.rst b/docs/source/api/v4/cdns_domains.rst
index 4211a1cbc7..9148580e7f 100644
--- a/docs/source/api/v4/cdns_domains.rst
+++ b/docs/source/api/v4/cdns_domains.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-domains:
+.. _to-api-v4-cdns-domains:
 
 ****************
 ``cdns/domains``
diff --git a/docs/source/api/v4/cdns_health.rst b/docs/source/api/v4/cdns_health.rst
index fde114c615..f12bc2050d 100644
--- a/docs/source/api/v4/cdns_health.rst
+++ b/docs/source/api/v4/cdns_health.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-health:
+.. _to-api-v4-cdns-health:
 
 ***************
 ``cdns/health``
diff --git a/docs/source/api/v4/cdns_id.rst b/docs/source/api/v4/cdns_id.rst
index 90d1e20fcf..55b2ebe859 100644
--- a/docs/source/api/v4/cdns_id.rst
+++ b/docs/source/api/v4/cdns_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-id:
+.. _to-api-v4-cdns-id:
 
 ***************
 ``cdns/{{ID}}``
@@ -134,4 +134,3 @@ Response Structure
 			"level": "success"
 		}
 	]}
-
diff --git a/docs/source/api/v4/cdns_id_queue_update.rst b/docs/source/api/v4/cdns_id_queue_update.rst
index 3f179e6352..fdcd7e57e5 100644
--- a/docs/source/api/v4/cdns_id_queue_update.rst
+++ b/docs/source/api/v4/cdns_id_queue_update.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-id-queue_update:
+.. _to-api-v4-cdns-id-queue_update:
 
 ****************************
 ``cdns/{{ID}}/queue_update``
diff --git a/docs/source/api/v4/cdns_name_configs_monitoring.rst b/docs/source/api/v4/cdns_name_configs_monitoring.rst
index 552be5f98c..132bd2d79c 100644
--- a/docs/source/api/v4/cdns_name_configs_monitoring.rst
+++ b/docs/source/api/v4/cdns_name_configs_monitoring.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-name-configs-monitoring:
+.. _to-api-v4-cdns-name-configs-monitoring:
 
 ************************************
 ``cdns/{{name}}/configs/monitoring``
diff --git a/docs/source/api/v4/cdns_name_dnsseckeys_ksk_generate.rst b/docs/source/api/v4/cdns_name_dnsseckeys_ksk_generate.rst
index 79fdd9b4ca..e8502dc7e5 100644
--- a/docs/source/api/v4/cdns_name_dnsseckeys_ksk_generate.rst
+++ b/docs/source/api/v4/cdns_name_dnsseckeys_ksk_generate.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-name-dnsseckeys-ksk-generate:
+.. _to-api-v4-cdns-name-dnsseckeys-ksk-generate:
 
 *****************************************
 ``cdns/{{name}}/dnsseckeys/ksk/generate``
diff --git a/docs/source/api/v4/cdns_name_federations.rst b/docs/source/api/v4/cdns_name_federations.rst
index 2f391c2a10..9b5a8b87bf 100644
--- a/docs/source/api/v4/cdns_name_federations.rst
+++ b/docs/source/api/v4/cdns_name_federations.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-name-federations:
+.. _to-api-v4-cdns-name-federations:
 
 *****************************
 ``cdns/{{name}}/federations``
diff --git a/docs/source/api/v4/cdns_name_federations_id.rst b/docs/source/api/v4/cdns_name_federations_id.rst
index 4b934f266c..f9ebb96bf4 100644
--- a/docs/source/api/v4/cdns_name_federations_id.rst
+++ b/docs/source/api/v4/cdns_name_federations_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-name-federations-id:
+.. _to-api-v4-cdns-name-federations-id:
 
 ************************************
 ``cdns/{{name}}/federations/{{ID}}``
diff --git a/docs/source/api/v4/cdns_name_health.rst b/docs/source/api/v4/cdns_name_health.rst
index bcf3e6caf9..0d651920f9 100644
--- a/docs/source/api/v4/cdns_name_health.rst
+++ b/docs/source/api/v4/cdns_name_health.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-name-health:
+.. _to-api-v4-cdns-name-health:
 
 ************************
 ``cdns/{{name}}/health``
diff --git a/docs/source/api/v4/cdns_name_name.rst b/docs/source/api/v4/cdns_name_name.rst
index 0cd153dd7f..6e5f1311c7 100644
--- a/docs/source/api/v4/cdns_name_name.rst
+++ b/docs/source/api/v4/cdns_name_name.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-name-name:
+.. _to-api-v4-cdns-name-name:
 
 **********************
 ``cdns/name/{{name}}``
@@ -61,4 +61,3 @@ Response Structure
 			"level": "success"
 		}
 	]}
-
diff --git a/docs/source/api/v4/cdns_name_name_dnsseckeys.rst b/docs/source/api/v4/cdns_name_name_dnsseckeys.rst
index bfa46790d3..941eb1ea0d 100644
--- a/docs/source/api/v4/cdns_name_name_dnsseckeys.rst
+++ b/docs/source/api/v4/cdns_name_name_dnsseckeys.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-name-name-dnsseckeys:
+.. _to-api-v4-cdns-name-name-dnsseckeys:
 
 *********************************
 ``cdns/name/{{name}}/dnsseckeys``
@@ -139,4 +139,3 @@ Response Structure
 	{
 		"response": "Successfully deleted dnssec keys for test"
 	}
-
diff --git a/docs/source/api/v4/cdns_name_name_sslkeys.rst b/docs/source/api/v4/cdns_name_name_sslkeys.rst
index 4418ed583f..ee5e3660c9 100644
--- a/docs/source/api/v4/cdns_name_name_sslkeys.rst
+++ b/docs/source/api/v4/cdns_name_name_sslkeys.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-name-name-sslkeys:
+.. _to-api-v4-cdns-name-name-sslkeys:
 
 ******************************
 ``cdns/name/{{name}}/sslkeys``
diff --git a/docs/source/api/v4/cdns_name_snapshot.rst b/docs/source/api/v4/cdns_name_snapshot.rst
index 0309995139..03070a17bc 100644
--- a/docs/source/api/v4/cdns_name_snapshot.rst
+++ b/docs/source/api/v4/cdns_name_snapshot.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-name-snapshot:
+.. _to-api-v4-cdns-name-snapshot:
 
 **************************
 ``cdns/{{name}}/snapshot``
diff --git a/docs/source/api/v4/cdns_name_snapshot_new.rst b/docs/source/api/v4/cdns_name_snapshot_new.rst
index 911f1ee73d..3438e77e6d 100644
--- a/docs/source/api/v4/cdns_name_snapshot_new.rst
+++ b/docs/source/api/v4/cdns_name_snapshot_new.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-name-snapshot-new:
+.. _to-api-v4-cdns-name-snapshot-new:
 
 ******************************
 ``cdns/{{name}}/snapshot/new``
diff --git a/docs/source/api/v4/cdns_routing.rst b/docs/source/api/v4/cdns_routing.rst
index 1d00ff9c27..b97f7f0660 100644
--- a/docs/source/api/v4/cdns_routing.rst
+++ b/docs/source/api/v4/cdns_routing.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-cdns-routing:
+.. _to-api-v4-cdns-routing:
 
 ****************
 ``cdns/routing``
diff --git a/docs/source/api/v4/consistenthash.rst b/docs/source/api/v4/consistenthash.rst
index 3bd31cc891..b0d8f18a60 100644
--- a/docs/source/api/v4/consistenthash.rst
+++ b/docs/source/api/v4/consistenthash.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-consistenthash:
+.. _to-api-v4-consistenthash:
 
 ******************
 ``consistenthash``
diff --git a/docs/source/api/v4/coordinates.rst b/docs/source/api/v4/coordinates.rst
index 6cda66f3c8..a3f39a32ea 100644
--- a/docs/source/api/v4/coordinates.rst
+++ b/docs/source/api/v4/coordinates.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-coordinates:
+.. _to-api-v4-coordinates:
 
 ***************
 ``coordinates``
diff --git a/docs/source/api/v4/current_stats.rst b/docs/source/api/v4/current_stats.rst
index 467775c846..05a78d758b 100644
--- a/docs/source/api/v4/current_stats.rst
+++ b/docs/source/api/v4/current_stats.rst
@@ -14,7 +14,7 @@
 ..
 
 
-.. _to-api-current-stats:
+.. _to-api-v4-current-stats:
 
 *****************
 ``current_stats``
diff --git a/docs/source/api/v4/dbdump.rst b/docs/source/api/v4/dbdump.rst
index e622cab685..d5090fd060 100644
--- a/docs/source/api/v4/dbdump.rst
+++ b/docs/source/api/v4/dbdump.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-dbdump:
+.. _to-api-v4-dbdump:
 
 **********
 ``dbdump``
diff --git a/docs/source/api/v4/deliveryservice_request_comments.rst b/docs/source/api/v4/deliveryservice_request_comments.rst
index 49d67a87fc..85ee56c9b8 100644
--- a/docs/source/api/v4/deliveryservice_request_comments.rst
+++ b/docs/source/api/v4/deliveryservice_request_comments.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservice_request_comments:
+.. _to-api-v4-deliveryservice_request_comments:
 
 ************************************
 ``deliveryservice_request_comments``
diff --git a/docs/source/api/v4/deliveryservice_requests.rst b/docs/source/api/v4/deliveryservice_requests.rst
index bb9ca7a2a8..084164c58b 100644
--- a/docs/source/api/v4/deliveryservice_requests.rst
+++ b/docs/source/api/v4/deliveryservice_requests.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservice-requests:
+.. _to-api-v4-deliveryservice-requests:
 
 ****************************
 ``deliveryservice_requests``
@@ -194,7 +194,7 @@ The response is an array of representations of :term:`Delivery Service Requests`
 		"status": "draft"
 	}]}
 
-.. _to-api-deliveryservice-requests-post:
+.. _to-api-v4-deliveryservice-requests-post:
 
 ``POST``
 ========
@@ -524,7 +524,7 @@ The response will be a representation of the created :term:`Delivery Service Req
 =======
 Updates an existing :term:`Delivery Service Request`. Note that "closed" :term:`Delivery Service Requests` are uneditable.
 
-.. seealso:: The proper way to change a :term:`Delivery Service Request`'s :ref:`dsr-status` is by using the :ref:`to-api-deliveryservice_requests-id-status` endpoint's ``PUT`` handler.
+.. seealso:: The proper way to change a :term:`Delivery Service Request`'s :ref:`dsr-status` is by using the :ref:`to-api-v4-deliveryservice_requests-id-status` endpoint's ``PUT`` handler.
 
 :Auth. Required: Yes
 :Roles Required: "admin", "Federation", "operations", "Portal", or "Steering"
diff --git a/docs/source/api/v4/deliveryservice_requests_id_assign.rst b/docs/source/api/v4/deliveryservice_requests_id_assign.rst
index a8e14b2aa9..ceab2da19a 100644
--- a/docs/source/api/v4/deliveryservice_requests_id_assign.rst
+++ b/docs/source/api/v4/deliveryservice_requests_id_assign.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservice_requests-id-assign:
+.. _to-api-v4-deliveryservice_requests-id-assign:
 
 ******************************************
 ``deliveryservice_requests/{{ID}}/assign``
diff --git a/docs/source/api/v4/deliveryservice_requests_id_status.rst b/docs/source/api/v4/deliveryservice_requests_id_status.rst
index a61b58aa34..2238bf30d2 100644
--- a/docs/source/api/v4/deliveryservice_requests_id_status.rst
+++ b/docs/source/api/v4/deliveryservice_requests_id_status.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservice_requests-id-status:
+.. _to-api-v4-deliveryservice_requests-id-status:
 
 ******************************************
 ``deliveryservice_requests/{{ID}}/status``
diff --git a/docs/source/api/v4/deliveryservice_stats.rst b/docs/source/api/v4/deliveryservice_stats.rst
index 895d02ecc6..9c785d4a34 100644
--- a/docs/source/api/v4/deliveryservice_stats.rst
+++ b/docs/source/api/v4/deliveryservice_stats.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservice_stats:
+.. _to-api-v4-deliveryservice_stats:
 
 *************************
 ``deliveryservice_stats``
diff --git a/docs/source/api/v4/deliveryservices.rst b/docs/source/api/v4/deliveryservices.rst
index 9996bcf1ed..2e1ff81a73 100644
--- a/docs/source/api/v4/deliveryservices.rst
+++ b/docs/source/api/v4/deliveryservices.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices:
+.. _to-api-v4-deliveryservices:
 
 ********************
 ``deliveryservices``
diff --git a/docs/source/api/v4/deliveryservices_id.rst b/docs/source/api/v4/deliveryservices_id.rst
index 3ba01c06f6..c946ee62fa 100644
--- a/docs/source/api/v4/deliveryservices_id.rst
+++ b/docs/source/api/v4/deliveryservices_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-id:
+.. _to-api-v4-deliveryservices-id:
 
 ***************************
 ``deliveryservices/{{ID}}``
diff --git a/docs/source/api/v4/deliveryservices_id_capacity.rst b/docs/source/api/v4/deliveryservices_id_capacity.rst
index 90f86119cf..7b1bd56a21 100644
--- a/docs/source/api/v4/deliveryservices_id_capacity.rst
+++ b/docs/source/api/v4/deliveryservices_id_capacity.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-id-capacity:
+.. _to-api-v4-deliveryservices-id-capacity:
 
 ************************************
 ``deliveryservices/{{ID}}/capacity``
diff --git a/docs/source/api/v4/deliveryservices_id_health.rst b/docs/source/api/v4/deliveryservices_id_health.rst
index 7ff51196d1..bffe7aa74e 100644
--- a/docs/source/api/v4/deliveryservices_id_health.rst
+++ b/docs/source/api/v4/deliveryservices_id_health.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-id-health:
+.. _to-api-v4-deliveryservices-id-health:
 
 **********************************
 ``deliveryservices/{{ID}}/health``
diff --git a/docs/source/api/v4/deliveryservices_id_regexes.rst b/docs/source/api/v4/deliveryservices_id_regexes.rst
index 4c7d3ad719..dc13e90b07 100644
--- a/docs/source/api/v4/deliveryservices_id_regexes.rst
+++ b/docs/source/api/v4/deliveryservices_id_regexes.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-id-regexes:
+.. _to-api-v4-deliveryservices-id-regexes:
 
 ***********************************
 ``deliveryservices/{{ID}}/regexes``
diff --git a/docs/source/api/v4/deliveryservices_id_regexes_rid.rst b/docs/source/api/v4/deliveryservices_id_regexes_rid.rst
index 781a20db4c..2f8340aef0 100644
--- a/docs/source/api/v4/deliveryservices_id_regexes_rid.rst
+++ b/docs/source/api/v4/deliveryservices_id_regexes_rid.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-id-regexes-rid:
+.. _to-api-v4-deliveryservices-id-regexes-rid:
 
 *******************************************
 ``deliveryservices/{{ID}}/regexes/{{rID}}``
diff --git a/docs/source/api/v4/deliveryservices_id_routing.rst b/docs/source/api/v4/deliveryservices_id_routing.rst
index 0d92b7b789..7725063f0f 100644
--- a/docs/source/api/v4/deliveryservices_id_routing.rst
+++ b/docs/source/api/v4/deliveryservices_id_routing.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-id-routing:
+.. _to-api-v4-deliveryservices-id-routing:
 
 ***********************************
 ``deliveryservices/{{ID}}/routing``
diff --git a/docs/source/api/v4/deliveryservices_id_safe.rst b/docs/source/api/v4/deliveryservices_id_safe.rst
index c6a529b437..147bc9eda8 100644
--- a/docs/source/api/v4/deliveryservices_id_safe.rst
+++ b/docs/source/api/v4/deliveryservices_id_safe.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-id-safe:
+.. _to-api-v4-deliveryservices-id-safe:
 
 ********************************
 ``deliveryservices/{{ID}}/safe``
diff --git a/docs/source/api/v4/deliveryservices_id_servers.rst b/docs/source/api/v4/deliveryservices_id_servers.rst
index 02e578982a..69a64377f8 100644
--- a/docs/source/api/v4/deliveryservices_id_servers.rst
+++ b/docs/source/api/v4/deliveryservices_id_servers.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-id-servers:
+.. _to-api-v4-deliveryservices-id-servers:
 
 ***********************************
 ``deliveryservices/{{ID}}/servers``
diff --git a/docs/source/api/v4/deliveryservices_id_servers_eligible.rst b/docs/source/api/v4/deliveryservices_id_servers_eligible.rst
index f51c34f946..903b661aba 100644
--- a/docs/source/api/v4/deliveryservices_id_servers_eligible.rst
+++ b/docs/source/api/v4/deliveryservices_id_servers_eligible.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-id-servers-eligible:
+.. _to-api-v4-deliveryservices-id-servers-eligible:
 
 ********************************************
 ``deliveryservices/{{ID}}/servers/eligible``
diff --git a/docs/source/api/v4/deliveryservices_id_urlkeys.rst b/docs/source/api/v4/deliveryservices_id_urlkeys.rst
index cd1b51f174..d30db02412 100644
--- a/docs/source/api/v4/deliveryservices_id_urlkeys.rst
+++ b/docs/source/api/v4/deliveryservices_id_urlkeys.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-id-urlkeys:
+.. _to-api-v4-deliveryservices-id-urlkeys:
 
 ***********************************
 ``deliveryservices/{{ID}}/urlkeys``
@@ -21,7 +21,7 @@
 
 ``GET``
 =======
-.. seealso:: :ref:`to-api-deliveryservices-xmlid-xmlid-urlkeys`
+.. seealso:: :ref:`to-api-v4-deliveryservices-xmlid-xmlid-urlkeys`
 
 Retrieves URL signing keys for a :term:`Delivery Service`.
 
@@ -96,7 +96,7 @@ Response Structure
 
 ``DELETE``
 ==========
-.. seealso:: :ref:`to-api-deliveryservices-xmlid-xmlid-urlkeys`
+.. seealso:: :ref:`to-api-v4-deliveryservices-xmlid-xmlid-urlkeys`
 
 Deletes URL signing keys for a :term:`Delivery Service`.
 
diff --git a/docs/source/api/v4/deliveryservices_regexes.rst b/docs/source/api/v4/deliveryservices_regexes.rst
index 2bff8db293..341af3e17a 100644
--- a/docs/source/api/v4/deliveryservices_regexes.rst
+++ b/docs/source/api/v4/deliveryservices_regexes.rst
@@ -14,7 +14,7 @@
 ..
 
 
-.. _to-api-deliveryservices_regexes:
+.. _to-api-v4-deliveryservices_regexes:
 
 ****************************
 ``deliveryservices_regexes``
diff --git a/docs/source/api/v4/deliveryservices_required_capabilities.rst b/docs/source/api/v4/deliveryservices_required_capabilities.rst
index 92561630d9..1bf4b4d81a 100644
--- a/docs/source/api/v4/deliveryservices_required_capabilities.rst
+++ b/docs/source/api/v4/deliveryservices_required_capabilities.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-required-capabilities:
+.. _to-api-v4-deliveryservices-required-capabilities:
 
 ******************************************
 ``deliveryservices_required_capabilities``
diff --git a/docs/source/api/v4/deliveryservices_sslkeys_add.rst b/docs/source/api/v4/deliveryservices_sslkeys_add.rst
index 2e68d1c869..9b6f000154 100644
--- a/docs/source/api/v4/deliveryservices_sslkeys_add.rst
+++ b/docs/source/api/v4/deliveryservices_sslkeys_add.rst
@@ -13,13 +13,13 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-sslkeys-add:
+.. _to-api-v4-deliveryservices-sslkeys-add:
 
 ********************************
 ``deliveryservices/sslkeys/add``
 ********************************
 
-.. seealso:: In most cases it is preferable to allow Traffic Ops to generate the keys via :ref:`to-api-deliveryservices-sslkeys-generate`, rather than uploading them manually using this endpoint.
+.. seealso:: In most cases it is preferable to allow Traffic Ops to generate the keys via :ref:`to-api-v4-deliveryservices-sslkeys-generate`, rather than uploading them manually using this endpoint.
 
 ``POST``
 ========
diff --git a/docs/source/api/v4/deliveryservices_sslkeys_generate.rst b/docs/source/api/v4/deliveryservices_sslkeys_generate.rst
index 282e31efc3..1a3f47b376 100644
--- a/docs/source/api/v4/deliveryservices_sslkeys_generate.rst
+++ b/docs/source/api/v4/deliveryservices_sslkeys_generate.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-sslkeys-generate:
+.. _to-api-v4-deliveryservices-sslkeys-generate:
 
 *************************************
 ``deliveryservices/sslkeys/generate``
diff --git a/docs/source/api/v4/deliveryservices_sslkeys_generate_acme.rst b/docs/source/api/v4/deliveryservices_sslkeys_generate_acme.rst
index 9a1b185291..56e882f91e 100644
--- a/docs/source/api/v4/deliveryservices_sslkeys_generate_acme.rst
+++ b/docs/source/api/v4/deliveryservices_sslkeys_generate_acme.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-sslkeys-generate-acme:
+.. _to-api-v4-deliveryservices-sslkeys-generate-acme:
 
 ******************************************
 ``deliveryservices/sslkeys/generate/acme``
diff --git a/docs/source/api/v4/deliveryservices_sslkeys_generate_letsencrypt.rst b/docs/source/api/v4/deliveryservices_sslkeys_generate_letsencrypt.rst
index e4599b3924..5e1eff459c 100644
--- a/docs/source/api/v4/deliveryservices_sslkeys_generate_letsencrypt.rst
+++ b/docs/source/api/v4/deliveryservices_sslkeys_generate_letsencrypt.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-sslkeys-generate-letsencrypt:
+.. _to-api-v4-deliveryservices-sslkeys-generate-letsencrypt:
 
 *************************************************
 ``deliveryservices/sslkeys/generate/letsencrypt``
diff --git a/docs/source/api/v4/deliveryservices_xmlid_servers.rst b/docs/source/api/v4/deliveryservices_xmlid_servers.rst
index d824467e72..961df9107c 100644
--- a/docs/source/api/v4/deliveryservices_xmlid_servers.rst
+++ b/docs/source/api/v4/deliveryservices_xmlid_servers.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-xmlid-servers:
+.. _to-api-v4-deliveryservices-xmlid-servers:
 
 ***************************************
 ``deliveryservices/{{xml_id}}/servers``
diff --git a/docs/source/api/v4/deliveryservices_xmlid_urisignkeys.rst b/docs/source/api/v4/deliveryservices_xmlid_urisignkeys.rst
index 9e4f0ca9d7..5d55008602 100644
--- a/docs/source/api/v4/deliveryservices_xmlid_urisignkeys.rst
+++ b/docs/source/api/v4/deliveryservices_xmlid_urisignkeys.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-xmlid-urisignkeys:
+.. _to-api-v4-deliveryservices-xmlid-urisignkeys:
 
 *******************************************
 ``deliveryservices/{{xml_id}}/urisignkeys``
diff --git a/docs/source/api/v4/deliveryservices_xmlid_xmlid_sslkeys.rst b/docs/source/api/v4/deliveryservices_xmlid_xmlid_sslkeys.rst
index 992cb063ce..ad62a4d93d 100644
--- a/docs/source/api/v4/deliveryservices_xmlid_xmlid_sslkeys.rst
+++ b/docs/source/api/v4/deliveryservices_xmlid_xmlid_sslkeys.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-xmlid-xmlid-sslkeys:
+.. _to-api-v4-deliveryservices-xmlid-xmlid-sslkeys:
 
 ********************************************
 ``deliveryservices/xmlId/{{XMLID}}/sslkeys``
diff --git a/docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys.rst b/docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys.rst
index a1ed4921db..ae284388c4 100644
--- a/docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys.rst
+++ b/docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-xmlid-xmlid-urlkeys:
+.. _to-api-v4-deliveryservices-xmlid-xmlid-urlkeys:
 
 ********************************************
 ``deliveryservices/xmlId/{{xmlid}}/urlkeys``
@@ -21,7 +21,7 @@
 
 ``GET``
 =======
-.. seealso:: :ref:`to-api-deliveryservices-id-urlkeys`
+.. seealso:: :ref:`to-api-v4-deliveryservices-id-urlkeys`
 
 Retrieves URL signing keys for a :term:`Delivery Service`.
 
@@ -71,7 +71,7 @@ Response Structure
 
 ``DELETE``
 ==========
-.. seealso:: :ref:`to-api-deliveryservices-id-urlkeys`
+.. seealso:: :ref:`to-api-v4-deliveryservices-id-urlkeys`
 
 Deletes URL signing keys for a :term:`Delivery Service`.
 
diff --git a/docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys_copyfromxmlid_copyfromxmlid.rst b/docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys_copyfromxmlid_copyfromxmlid.rst
index 0a9505b431..083a30dafd 100644
--- a/docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys_copyfromxmlid_copyfromxmlid.rst
+++ b/docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys_copyfromxmlid_copyfromxmlid.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-xmlid-xml_id-urlkeys-copyFrom_xml_id:
+.. _to-api-v4-deliveryservices-xmlid-xml_id-urlkeys-copyFrom_xml_id:
 
 *******************************************************************************
 ``deliveryservices/xmlId/{{xml_id}}/urlkeys/copyFromXmlId/{{copyFrom_xml_id}}``
diff --git a/docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys_generate.rst b/docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys_generate.rst
index 62f2dedab3..7229f676e7 100644
--- a/docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys_generate.rst
+++ b/docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys_generate.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryservices-xmlid-xmlid-urlkeys-generate:
+.. _to-api-v4-deliveryservices-xmlid-xmlid-urlkeys-generate:
 
 ******************************************************
 ``deliveryservices/xmlId/{{xml_id}}/urlkeys/generate``
diff --git a/docs/source/api/v4/deliveryserviceserver.rst b/docs/source/api/v4/deliveryserviceserver.rst
index e3c3f94272..59360026be 100644
--- a/docs/source/api/v4/deliveryserviceserver.rst
+++ b/docs/source/api/v4/deliveryserviceserver.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryserviceserver:
+.. _to-api-v4-deliveryserviceserver:
 
 *************************
 ``deliveryserviceserver``
diff --git a/docs/source/api/v4/deliveryserviceserver_dsid_serverid.rst b/docs/source/api/v4/deliveryserviceserver_dsid_serverid.rst
index f23ee1584f..68cc92e149 100644
--- a/docs/source/api/v4/deliveryserviceserver_dsid_serverid.rst
+++ b/docs/source/api/v4/deliveryserviceserver_dsid_serverid.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-deliveryserviceserver-dsid-serverid:
+.. _to-api-v4-deliveryserviceserver-dsid-serverid:
 
 ***********************************************
 ``deliveryserviceserver/{{DSID}}/{{serverID}}``
diff --git a/docs/source/api/v4/divisions.rst b/docs/source/api/v4/divisions.rst
index 77e6627043..acdfefc5e4 100644
--- a/docs/source/api/v4/divisions.rst
+++ b/docs/source/api/v4/divisions.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-divisions:
+.. _to-api-v4-divisions:
 
 *************
 ``divisions``
diff --git a/docs/source/api/v4/divisions_id.rst b/docs/source/api/v4/divisions_id.rst
index 4096468513..98f384cf36 100644
--- a/docs/source/api/v4/divisions_id.rst
+++ b/docs/source/api/v4/divisions_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-divisions-id:
+.. _to-api-v4-divisions-id:
 
 ********************
 ``divisions/{{ID}}``
diff --git a/docs/source/api/v4/federation_resolvers.rst b/docs/source/api/v4/federation_resolvers.rst
index 0e14ba97b4..65a3c2eea0 100644
--- a/docs/source/api/v4/federation_resolvers.rst
+++ b/docs/source/api/v4/federation_resolvers.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-federation_resolvers:
+.. _to-api-v4-federation_resolvers:
 
 ************************
 ``federation_resolvers``
@@ -114,7 +114,7 @@ Request Structure
 
 	.. caution:: This field should only ever be an identifier for one of the :term:`Types` "RESOLVE4" or "RESOLVE6", but there is **no protection for this built into Traffic Ops** and therefore **any valid** :term:`Type` **identifier will be silently accepted by Traffic Ops** and so care should be taken to ensure that these :term:`Types` are properly identified. If any :term:`Type` besides "RESOLVE4" or "RESOLVE6" is identified, the resulting resolver *will* **not** *work*.
 
-	.. seealso:: :ref:`to-api-types` is the endpoint that can be used to determine the identifier for various :term:`Types`
+	.. seealso:: :ref:`to-api-v4-types` is the endpoint that can be used to determine the identifier for various :term:`Types`
 
 .. code-block:: http
 	:caption: Request Example
diff --git a/docs/source/api/v4/federations.rst b/docs/source/api/v4/federations.rst
index daabb48c5f..a44c68351b 100644
--- a/docs/source/api/v4/federations.rst
+++ b/docs/source/api/v4/federations.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-federations:
+.. _to-api-v4-federations:
 
 ***************
 ``federations``
@@ -80,9 +80,9 @@ Response Structure
 ========
 Allows a user to create :term:`Federation` Resolvers for :term:`Delivery Services`, providing the :term:`Delivery Service` is within a CDN that has some associated :term:`Federation`.
 
-.. warning:: Confusingly, this method of this endpoint does **not** create a new :term:`Federation`; to do that, the :ref:`to-api-cdns-name-federations` endpoint must be used. Furthermore, the :term:`Federation` must properly be assigned to a :term:`Delivery Service` using the :ref:`to-api-federations-id-deliveryservices` and assigned to the user creating Resolvers using :ref:`to-api-federations-id-users`.
+.. warning:: Confusingly, this method of this endpoint does **not** create a new :term:`Federation`; to do that, the :ref:`to-api-v4-cdns-name-federations` endpoint must be used. Furthermore, the :term:`Federation` must properly be assigned to a :term:`Delivery Service` using the :ref:`to-api-v4-federations-id-deliveryservices` and assigned to the user creating Resolvers using :ref:`to-api-v4-federations-id-users`.
 
-.. seealso:: The :ref:`to-api-federations-id-federation_resolvers` endpoint duplicates this functionality.
+.. seealso:: The :ref:`to-api-v4-federations-id-federation_resolvers` endpoint duplicates this functionality.
 
 :Auth. Required: Yes
 :Roles Required: "admin", "Federation", "operations", "Portal", or "Steering"
diff --git a/docs/source/api/v4/federations_all.rst b/docs/source/api/v4/federations_all.rst
index 53d0e00501..7a3ae5044f 100644
--- a/docs/source/api/v4/federations_all.rst
+++ b/docs/source/api/v4/federations_all.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-federations-all:
+.. _to-api-v4-federations-all:
 
 *******************
 ``federations/all``
diff --git a/docs/source/api/v4/federations_id_deliveryservices.rst b/docs/source/api/v4/federations_id_deliveryservices.rst
index a1a1f47d5a..a0c67978f2 100644
--- a/docs/source/api/v4/federations_id_deliveryservices.rst
+++ b/docs/source/api/v4/federations_id_deliveryservices.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-federations-id-deliveryservices:
+.. _to-api-v4-federations-id-deliveryservices:
 
 ***************************************
 ``federations/{{ID}}/deliveryservices``
@@ -172,4 +172,3 @@ Response Structure
 		],
 		"replace": true
 	}}
-
diff --git a/docs/source/api/v4/federations_id_deliveryservices_id.rst b/docs/source/api/v4/federations_id_deliveryservices_id.rst
index 22035435dd..43bc893b63 100644
--- a/docs/source/api/v4/federations_id_deliveryservices_id.rst
+++ b/docs/source/api/v4/federations_id_deliveryservices_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-federations-id-deliveryservices-id:
+.. _to-api-v4-federations-id-deliveryservices-id:
 
 ************************************************
 ``federations/{{ID}}/deliveryservices/{{dsID}}``
diff --git a/docs/source/api/v4/federations_id_federation_resolvers.rst b/docs/source/api/v4/federations_id_federation_resolvers.rst
index 1bfa79958b..1496ec522f 100644
--- a/docs/source/api/v4/federations_id_federation_resolvers.rst
+++ b/docs/source/api/v4/federations_id_federation_resolvers.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-federations-id-federation_resolvers:
+.. _to-api-v4-federations-id-federation_resolvers:
 
 *******************************************
 ``federations/{{ID}}/federation_resolvers``
diff --git a/docs/source/api/v4/federations_id_users.rst b/docs/source/api/v4/federations_id_users.rst
index b7d87191f1..8738cf047b 100644
--- a/docs/source/api/v4/federations_id_users.rst
+++ b/docs/source/api/v4/federations_id_users.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-federations-id-users:
+.. _to-api-v4-federations-id-users:
 
 ****************************
 ``federations/{{ID}}/users``
diff --git a/docs/source/api/v4/federations_id_users_id.rst b/docs/source/api/v4/federations_id_users_id.rst
index 4296fa396c..d576e4a41b 100644
--- a/docs/source/api/v4/federations_id_users_id.rst
+++ b/docs/source/api/v4/federations_id_users_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-federations-id-users-id:
+.. _to-api-v4-federations-id-users-id:
 
 ***************************************
 ``federations/{{ID}}/users/{{userID}}``
diff --git a/docs/source/api/v4/isos.rst b/docs/source/api/v4/isos.rst
index c24ca44e69..9ad54eb91f 100644
--- a/docs/source/api/v4/isos.rst
+++ b/docs/source/api/v4/isos.rst
@@ -14,7 +14,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-isos:
+.. _to-api-v4-isos:
 
 ********
 ``isos``
@@ -53,7 +53,7 @@ Request Structure
 :ipNetmask:    An optional\ [1]_ string specifying the subnet mask of the generated system image
 :osversionDir: The name of the directory containing the ISO source
 
-	.. seealso:: :ref:`to-api-osversions`
+	.. seealso:: :ref:`to-api-v4-osversions`
 
 :rootPass: The password used by the generated system image's ``root`` user
 
@@ -107,4 +107,3 @@ ISO image as a streaming download.
 	Transfer-Encoding: chunked
 	Whole-Content-sha512: sLSVQGrLCQ4hGQhv2reragQHWNi2aKMcz2c/HMAH45tLcZ1LenPyOzWRcRfHUNbV4PEEKOoiTfwE2HlA+WtRIQ==
 	X-Server-Name: traffic_ops_golang/
-
diff --git a/docs/source/api/v4/jobs.rst b/docs/source/api/v4/jobs.rst
index ed1eaeebd6..f69651ae37 100644
--- a/docs/source/api/v4/jobs.rst
+++ b/docs/source/api/v4/jobs.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-jobs:
+.. _to-api-v4-jobs:
 
 ********
 ``jobs``
diff --git a/docs/source/api/v4/letsencrypt_autorenew.rst b/docs/source/api/v4/letsencrypt_autorenew.rst
index d79a3673f6..ed6c8c475b 100644
--- a/docs/source/api/v4/letsencrypt_autorenew.rst
+++ b/docs/source/api/v4/letsencrypt_autorenew.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-letsencrypt-autorenew:
+.. _to-api-v4-letsencrypt-autorenew:
 
 *************************
 ``letsencrypt/autorenew``
diff --git a/docs/source/api/v4/letsencrypt_dnsrecords.rst b/docs/source/api/v4/letsencrypt_dnsrecords.rst
index 1295cff547..1d50f90afc 100644
--- a/docs/source/api/v4/letsencrypt_dnsrecords.rst
+++ b/docs/source/api/v4/letsencrypt_dnsrecords.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-letsencrypt-dnsrecord:
+.. _to-api-v4-letsencrypt-dnsrecord:
 
 **************************
 ``letsencrypt/dnsrecords``
diff --git a/docs/source/api/v4/logs.rst b/docs/source/api/v4/logs.rst
index c714ebb9bc..4b4151069b 100644
--- a/docs/source/api/v4/logs.rst
+++ b/docs/source/api/v4/logs.rst
@@ -12,13 +12,13 @@
 .. See the License for the specific language governing permissions and
 .. limitations under the License.
 ..
-.. _to-api-logs:
+.. _to-api-v4-logs:
 
 ********
 ``logs``
 ********
 
-.. note:: This endpoint's responses will contain a cookie (``last_seen_log``) that is used by :ref:`to-api-logs-newcount` to determine the time of last access. Be sure your client uses cookies properly if you intend to use :ref:`to-api-logs-newcount` in concert with this endpoint!
+.. note:: This endpoint's responses will contain a cookie (``last_seen_log``) that is used by :ref:`to-api-v4-logs-newcount` to determine the time of last access. Be sure your client uses cookies properly if you intend to use :ref:`to-api-v4-logs-newcount` in concert with this endpoint!
 
 ``GET``
 =======
diff --git a/docs/source/api/v4/logs_newcount.rst b/docs/source/api/v4/logs_newcount.rst
index b74573f09d..ceda9650e6 100644
--- a/docs/source/api/v4/logs_newcount.rst
+++ b/docs/source/api/v4/logs_newcount.rst
@@ -14,7 +14,7 @@
 ..
 
 
-.. _to-api-logs-newcount:
+.. _to-api-v4-logs-newcount:
 
 *****************
 ``logs/newcount``
@@ -22,9 +22,9 @@
 
 ``GET``
 =======
-Gets the number of new changes made to the Traffic Control system - "new" being defined as the last time the client requested either :ref:`to-api-logs`
+Gets the number of new changes made to the Traffic Control system - "new" being defined as the last time the client requested either :ref:`to-api-v4-logs`
 
-.. note:: This endpoint's functionality is implemented by the :ref:`to-api-logs` endpoint's response setting cookies for the client to use when requesting _this_ endpoint. Take care that your client respects cookies!
+.. note:: This endpoint's functionality is implemented by the :ref:`to-api-v4-logs` endpoint's response setting cookies for the client to use when requesting _this_ endpoint. Take care that your client respects cookies!
 
 :Auth. Required: Yes
 :Roles Required: None
diff --git a/docs/source/api/v4/multiple_server_capabilities.rst b/docs/source/api/v4/multiple_server_capabilities.rst
index 37f56b1549..fed438bdac 100644
--- a/docs/source/api/v4/multiple_server_capabilities.rst
+++ b/docs/source/api/v4/multiple_server_capabilities.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-multiple_server_capabilities:
+.. _to-api-v4-multiple_server_capabilities:
 
 ********************************
 ``multiple_server_capabilities``
diff --git a/docs/source/api/v4/oc_ci_configuration.rst b/docs/source/api/v4/oc_ci_configuration.rst
index c497785b98..0f5cb0a994 100644
--- a/docs/source/api/v4/oc_ci_configuration.rst
+++ b/docs/source/api/v4/oc_ci_configuration.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-oc-fci-configuration:
+.. _to-api-v4-oc-fci-configuration:
 
 ***********************
 ``OC/CI/configuration``
diff --git a/docs/source/api/v4/oc_ci_configuration_host.rst b/docs/source/api/v4/oc_ci_configuration_host.rst
index 688e2bf523..07822d803b 100644
--- a/docs/source/api/v4/oc_ci_configuration_host.rst
+++ b/docs/source/api/v4/oc_ci_configuration_host.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-oc-fci-configuration-host:
+.. _to-api-v4-oc-fci-configuration-host:
 
 ********************************
 ``OC/CI/configuration/{{host}}``
diff --git a/docs/source/api/v4/oc_ci_configuration_request_id_approved.rst b/docs/source/api/v4/oc_ci_configuration_request_id_approved.rst
index 7c4ab4cf71..61b9cb75ef 100644
--- a/docs/source/api/v4/oc_ci_configuration_request_id_approved.rst
+++ b/docs/source/api/v4/oc_ci_configuration_request_id_approved.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-oc-fci-configuration-request-id-approved:
+.. _to-api-v4-oc-fci-configuration-request-id-approved:
 
 ***************************************************
 ``OC/CI/configuration/request/{{id}}/{{approved}}``
diff --git a/docs/source/api/v4/oc_ci_configuration_requests.rst b/docs/source/api/v4/oc_ci_configuration_requests.rst
index cab8c5e20f..5e52337566 100644
--- a/docs/source/api/v4/oc_ci_configuration_requests.rst
+++ b/docs/source/api/v4/oc_ci_configuration_requests.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-oc-ci-configuration_requests:
+.. _to-api-v4-oc-ci-configuration_requests:
 
 ********************************
 ``OC/CI/configuration/requests``
diff --git a/docs/source/api/v4/oc_fci_advertisement.rst b/docs/source/api/v4/oc_fci_advertisement.rst
index beb3bbc81f..a71588ba0d 100644
--- a/docs/source/api/v4/oc_fci_advertisement.rst
+++ b/docs/source/api/v4/oc_fci_advertisement.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-oc-fci-advertisement:
+.. _to-api-v4-oc-fci-advertisement:
 
 ************************
 ``OC/FCI/advertisement``
@@ -135,4 +135,3 @@ Response Structure
 			}
 		]
 	}
-
diff --git a/docs/source/api/v4/origins.rst b/docs/source/api/v4/origins.rst
index 6003859719..835e940a0c 100644
--- a/docs/source/api/v4/origins.rst
+++ b/docs/source/api/v4/origins.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-origins:
+.. _to-api-v4-origins:
 
 ***********
 ``origins``
diff --git a/docs/source/api/v4/osversions.rst b/docs/source/api/v4/osversions.rst
index e4b4cfb589..a8581e8fc9 100644
--- a/docs/source/api/v4/osversions.rst
+++ b/docs/source/api/v4/osversions.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-osversions:
+.. _to-api-v4-osversions:
 
 **************
 ``osversions``
diff --git a/docs/source/api/v4/parameterprofile.rst b/docs/source/api/v4/parameterprofile.rst
index 47a41667fb..65f15af9d4 100644
--- a/docs/source/api/v4/parameterprofile.rst
+++ b/docs/source/api/v4/parameterprofile.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-parameterprofile:
+.. _to-api-v4-parameterprofile:
 
 ********************
 ``parameterprofile``
diff --git a/docs/source/api/v4/parameters.rst b/docs/source/api/v4/parameters.rst
index 90ba968c52..cc25d94ac6 100644
--- a/docs/source/api/v4/parameters.rst
+++ b/docs/source/api/v4/parameters.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-parameters:
+.. _to-api-v4-parameters:
 
 **************
 ``parameters``
diff --git a/docs/source/api/v4/parameters_id.rst b/docs/source/api/v4/parameters_id.rst
index 24d8b0f9a9..57ef1cdadb 100644
--- a/docs/source/api/v4/parameters_id.rst
+++ b/docs/source/api/v4/parameters_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-parameters-id:
+.. _to-api-v4-parameters-id:
 
 *********************
 ``parameters/{{ID}}``
diff --git a/docs/source/api/v4/phys_locations.rst b/docs/source/api/v4/phys_locations.rst
index fe163bd1f4..2d3d2fcab1 100644
--- a/docs/source/api/v4/phys_locations.rst
+++ b/docs/source/api/v4/phys_locations.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-phys_locations:
+.. _to-api-v4-phys_locations:
 
 ******************
 ``phys_locations``
diff --git a/docs/source/api/v4/phys_locations_id.rst b/docs/source/api/v4/phys_locations_id.rst
index fff3232c3c..a73a8cdb86 100644
--- a/docs/source/api/v4/phys_locations_id.rst
+++ b/docs/source/api/v4/phys_locations_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-phys_locations-id:
+.. _to-api-v4-phys_locations-id:
 
 *************************
 ``phys_locations/{{ID}}``
diff --git a/docs/source/api/v4/ping.rst b/docs/source/api/v4/ping.rst
index 60176bc475..61699096c2 100644
--- a/docs/source/api/v4/ping.rst
+++ b/docs/source/api/v4/ping.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-ping:
+.. _to-api-v4-ping:
 
 ********
 ``ping``
diff --git a/docs/source/api/v4/plugins.rst b/docs/source/api/v4/plugins.rst
index 95e24af091..5e1a48ac0c 100644
--- a/docs/source/api/v4/plugins.rst
+++ b/docs/source/api/v4/plugins.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-plugins:
+.. _to-api-v4-plugins:
 
 ***********
 ``plugins``
diff --git a/docs/source/api/v4/profileparameter.rst b/docs/source/api/v4/profileparameter.rst
index cbe652adf5..a27af757bf 100644
--- a/docs/source/api/v4/profileparameter.rst
+++ b/docs/source/api/v4/profileparameter.rst
@@ -13,12 +13,12 @@
 .. limitations under the License.
 ..
 
-.. _to-api-profileparameter:
+.. _to-api-v4-profileparameter:
 
 ********************
 ``profileparameter``
 ********************
-.. seealso:: :ref:`to-api-profileparameters`.
+.. seealso:: :ref:`to-api-v4-profileparameters`.
 
 ``POST``
 ========
diff --git a/docs/source/api/v4/profileparameters.rst b/docs/source/api/v4/profileparameters.rst
index 5ca1adb198..e72c3c78d0 100644
--- a/docs/source/api/v4/profileparameters.rst
+++ b/docs/source/api/v4/profileparameters.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-profileparameters:
+.. _to-api-v4-profileparameters:
 
 *********************
 ``profileparameters``
diff --git a/docs/source/api/v4/profileparameters_profileID_parameterID.rst b/docs/source/api/v4/profileparameters_profileID_parameterID.rst
index a48e20cd2a..b0481f01f6 100644
--- a/docs/source/api/v4/profileparameters_profileID_parameterID.rst
+++ b/docs/source/api/v4/profileparameters_profileID_parameterID.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-profileparameters-profileID-parameterID:
+.. _to-api-v4-profileparameters-profileID-parameterID:
 
 ***************************************************
 ``profileparameters/{{profileID}}/{{parameterID}}``
diff --git a/docs/source/api/v4/profiles.rst b/docs/source/api/v4/profiles.rst
index 2b61218cbc..fd030a7d31 100644
--- a/docs/source/api/v4/profiles.rst
+++ b/docs/source/api/v4/profiles.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-profiles:
+.. _to-api-v4-profiles:
 
 ************
 ``profiles``
diff --git a/docs/source/api/v4/profiles_id.rst b/docs/source/api/v4/profiles_id.rst
index 3b901d4066..e5ff9d122e 100644
--- a/docs/source/api/v4/profiles_id.rst
+++ b/docs/source/api/v4/profiles_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-profiles-id:
+.. _to-api-v4-profiles-id:
 
 *******************
 ``profiles/{{ID}}``
diff --git a/docs/source/api/v4/profiles_id_export.rst b/docs/source/api/v4/profiles_id_export.rst
index bd28ad230d..0412e6165d 100644
--- a/docs/source/api/v4/profiles_id_export.rst
+++ b/docs/source/api/v4/profiles_id_export.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-profiles-id-export:
+.. _to-api-v4-profiles-id-export:
 
 **************************
 ``profiles/{{ID}}/export``
diff --git a/docs/source/api/v4/profiles_id_parameters.rst b/docs/source/api/v4/profiles_id_parameters.rst
index da2c84e2ef..6ac42e2ad3 100644
--- a/docs/source/api/v4/profiles_id_parameters.rst
+++ b/docs/source/api/v4/profiles_id_parameters.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-profiles-id-parameters:
+.. _to-api-v4-profiles-id-parameters:
 
 ******************************
 ``profiles/{{ID}}/parameters``
diff --git a/docs/source/api/v4/profiles_import.rst b/docs/source/api/v4/profiles_import.rst
index 0422314a31..2e3cbb1fe9 100644
--- a/docs/source/api/v4/profiles_import.rst
+++ b/docs/source/api/v4/profiles_import.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-profiles-import:
+.. _to-api-v4-profiles-import:
 
 *******************
 ``profiles/import``
@@ -22,7 +22,7 @@
 ``POST``
 ========
 
-Imports a :term:`Profile` that was exported via :ref:`to-api-profiles-id-export`
+Imports a :term:`Profile` that was exported via :ref:`to-api-v4-profiles-id-export`
 
 .. note:: On import of the :term:`Profile` :term:`Parameters` if a :term:`Parameter` already exists with the same :ref:`parameter-name`, :ref:`parameter-config-file` and :ref:`parameter-value` it will link that to the :term:`Profile` instead of creating it.
 
diff --git a/docs/source/api/v4/profiles_name_name_copy_copy.rst b/docs/source/api/v4/profiles_name_name_copy_copy.rst
index 2426e545d2..c8ea6ef23e 100644
--- a/docs/source/api/v4/profiles_name_name_copy_copy.rst
+++ b/docs/source/api/v4/profiles_name_name_copy_copy.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-profiles-name-name-copy-copy:
+.. _to-api-v4-profiles-name-name-copy-copy:
 
 ****************************************
 ``profiles/name/{{name}}/copy/{{copy}}``
diff --git a/docs/source/api/v4/profiles_name_name_parameters.rst b/docs/source/api/v4/profiles_name_name_parameters.rst
index 6f3711e9c5..146254e1ba 100644
--- a/docs/source/api/v4/profiles_name_name_parameters.rst
+++ b/docs/source/api/v4/profiles_name_name_parameters.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-profiles-name-name-parameters:
+.. _to-api-v4-profiles-name-name-parameters:
 
 *************************************
 ``profiles/name/{{name}}/parameters``
diff --git a/docs/source/api/v4/regions.rst b/docs/source/api/v4/regions.rst
index 9b0f0ccffa..056dca40ab 100644
--- a/docs/source/api/v4/regions.rst
+++ b/docs/source/api/v4/regions.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-regions:
+.. _to-api-v4-regions:
 
 ***********
 ``regions``
@@ -97,7 +97,7 @@ Response Structure
 		}
 	]}
 
-.. _to-api-regions-post:
+.. _to-api-v4-regions-post:
 
 ``POST``
 ========
diff --git a/docs/source/api/v4/regions_id.rst b/docs/source/api/v4/regions_id.rst
index ce7dcb297d..abb3ceb65c 100644
--- a/docs/source/api/v4/regions_id.rst
+++ b/docs/source/api/v4/regions_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-regions-id:
+.. _to-api-v4-regions-id:
 
 ******************
 ``regions/{{ID}}``
diff --git a/docs/source/api/v4/roles.rst b/docs/source/api/v4/roles.rst
index 87bc34db74..8d0e15ad2b 100644
--- a/docs/source/api/v4/roles.rst
+++ b/docs/source/api/v4/roles.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-roles:
+.. _to-api-v4-roles:
 
 *********
 ``roles``
diff --git a/docs/source/api/v4/server_capabilities.rst b/docs/source/api/v4/server_capabilities.rst
index 048d4899a1..2f8915ea9d 100644
--- a/docs/source/api/v4/server_capabilities.rst
+++ b/docs/source/api/v4/server_capabilities.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-server_capabilities:
+.. _to-api-v4-server_capabilities:
 
 ***********************
 ``server_capabilities``
diff --git a/docs/source/api/v4/server_server_capabilities.rst b/docs/source/api/v4/server_server_capabilities.rst
index 9c37b23983..1fcb139573 100644
--- a/docs/source/api/v4/server_server_capabilities.rst
+++ b/docs/source/api/v4/server_server_capabilities.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-server-server-capabilities:
+.. _to-api-v4-server-server-capabilities:
 
 ******************************
 ``server_server_capabilities``
diff --git a/docs/source/api/v4/servercheck.rst b/docs/source/api/v4/servercheck.rst
index ec96cbe686..47f6d61e24 100644
--- a/docs/source/api/v4/servercheck.rst
+++ b/docs/source/api/v4/servercheck.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-servercheck:
+.. _to-api-v4-servercheck:
 
 ***************
 ``servercheck``
@@ -149,4 +149,3 @@ Response Structure
 	]}
 
 .. [1] No roles are required to use this endpoint, however access is controlled by username. Only the reserved user ``extension`` is permitted the use of this endpoint.
-
diff --git a/docs/source/api/v4/servercheck_extensions.rst b/docs/source/api/v4/servercheck_extensions.rst
index 3406dbf4b4..2619d79b8b 100644
--- a/docs/source/api/v4/servercheck_extensions.rst
+++ b/docs/source/api/v4/servercheck_extensions.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-servercheck_extensions:
+.. _to-api-v4-servercheck_extensions:
 
 **************************
 ``servercheck/extensions``
diff --git a/docs/source/api/v4/servercheck_extensions_id.rst b/docs/source/api/v4/servercheck_extensions_id.rst
index dfaa581846..23f1fde1a6 100644
--- a/docs/source/api/v4/servercheck_extensions_id.rst
+++ b/docs/source/api/v4/servercheck_extensions_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-servercheck_extensions-id:
+.. _to-api-v4-servercheck_extensions-id:
 
 *********************************
 ``servercheck/extensions/{{ID}}``
diff --git a/docs/source/api/v4/servers.rst b/docs/source/api/v4/servers.rst
index 1a57951d0a..313a00bf15 100644
--- a/docs/source/api/v4/servers.rst
+++ b/docs/source/api/v4/servers.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-servers:
+.. _to-api-v4-servers:
 
 ***********
 ``servers``
@@ -40,7 +40,7 @@ Request Structure
 	| cachegroupName | no       | Return only those servers within the :term:`Cache Group` that has this :ref:`cache-group-name`                    |
 	+----------------+----------+-------------------------------------------------------------------------------------------------------------------+
 	| dsId           | no       | Return only those servers assigned to the :term:`Delivery Service` identified by this integral, unique identifier.|
-	|                |          | If the Delivery Service has a :term:`Topology` assigned to it, the :ref:`to-api-servers` endpoint will return     |
+	|                |          | If the Delivery Service has a :term:`Topology` assigned to it, the :ref:`to-api-v4-servers` endpoint will return  |
 	|                |          | each server whose :term:`Cache Group` is associated with a :term:`Topology Node` of that Topology and has the     |
 	|                |          | :term:`Server Capabilities` that are                                                                              |
 	|                |          | :term:`required by the Delivery Service <Delivery Service required capabilities>` but excluding                   |
diff --git a/docs/source/api/v4/servers_hostname_update.rst b/docs/source/api/v4/servers_hostname_update.rst
index cde4c32ff3..cfea9f8142 100644
--- a/docs/source/api/v4/servers_hostname_update.rst
+++ b/docs/source/api/v4/servers_hostname_update.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-servers-hostname-update:
+.. _to-api-v4-servers-hostname-update:
 
 *************************************
 ``servers/{{HostName-Or-ID}}/update``
diff --git a/docs/source/api/v4/servers_hostname_update_status.rst b/docs/source/api/v4/servers_hostname_update_status.rst
index 0ea35732b9..5c13dbd3a9 100644
--- a/docs/source/api/v4/servers_hostname_update_status.rst
+++ b/docs/source/api/v4/servers_hostname_update_status.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-servers-hostname-update_status:
+.. _to-api-v4-servers-hostname-update_status:
 
 **************************************
 ``servers/{{hostname}}/update_status``
@@ -67,7 +67,7 @@ Each object in the returned array\ [#uniqueness]_ will contain the following fie
 :revalApplyTime:       The last time a content invalidation/revalidation request was applied by this server. This field defaults to standard epoch
 :status:               The name of the status of this server
 
-	.. seealso:: :ref:`health-proto` gives more information on how these statuses are used, and the ``GET`` method of the :ref:`to-api-statuses` endpoint can be used to retrieve information about all server statuses configured in Traffic Ops.
+	.. seealso:: :ref:`health-proto` gives more information on how these statuses are used, and the ``GET`` method of the :ref:`to-api-v4-statuses` endpoint can be used to retrieve information about all server statuses configured in Traffic Ops.
 
 :upd_pending:       ``true`` if the server has pending updates, ``false`` otherwise
 :use_reval_pending: A boolean which tells :term:`ORT` whether or not this version of Traffic Ops should use pending :term:`Content Invalidation Jobs`
diff --git a/docs/source/api/v4/servers_id.rst b/docs/source/api/v4/servers_id.rst
index e2a005b6ff..881323b709 100644
--- a/docs/source/api/v4/servers_id.rst
+++ b/docs/source/api/v4/servers_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-servers-id:
+.. _to-api-v4-servers-id:
 
 ******************
 ``servers/{{ID}}``
diff --git a/docs/source/api/v4/servers_id_deliveryservices.rst b/docs/source/api/v4/servers_id_deliveryservices.rst
index a04d7fcf2c..3f584811c1 100644
--- a/docs/source/api/v4/servers_id_deliveryservices.rst
+++ b/docs/source/api/v4/servers_id_deliveryservices.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-servers-id-deliveryservices:
+.. _to-api-v4-servers-id-deliveryservices:
 
 ***********************************
 ``servers/{{ID}}/deliveryservices``
diff --git a/docs/source/api/v4/servers_id_queue_update.rst b/docs/source/api/v4/servers_id_queue_update.rst
index ff28ec0961..c059472cde 100644
--- a/docs/source/api/v4/servers_id_queue_update.rst
+++ b/docs/source/api/v4/servers_id_queue_update.rst
@@ -13,12 +13,12 @@
 .. limitations under the License.
 ..
 
-.. _to-api-servers-id-queue_update:
+.. _to-api-v4-servers-id-queue_update:
 
 *******************************
 ``servers/{{ID}}/queue_update``
 *******************************
-.. caution:: In the vast majority of cases, it is advisable that the ``PUT`` method of the :ref:`to-api-servers-id` endpoint be used instead.
+.. caution:: In the vast majority of cases, it is advisable that the ``PUT`` method of the :ref:`to-api-v4-servers-id` endpoint be used instead.
 
 ``POST``
 ========
diff --git a/docs/source/api/v4/servers_id_status.rst b/docs/source/api/v4/servers_id_status.rst
index 40f7171a0b..a07e537690 100644
--- a/docs/source/api/v4/servers_id_status.rst
+++ b/docs/source/api/v4/servers_id_status.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-servers-id-status:
+.. _to-api-v4-servers-id-status:
 
 *************************
 ``servers/{{ID}}/status``
diff --git a/docs/source/api/v4/service_categories.rst b/docs/source/api/v4/service_categories.rst
index a65a08677b..24e1b71f39 100644
--- a/docs/source/api/v4/service_categories.rst
+++ b/docs/source/api/v4/service_categories.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-service-categories:
+.. _to-api-v4-service-categories:
 
 **********************
 ``service_categories``
diff --git a/docs/source/api/v4/service_categories_name.rst b/docs/source/api/v4/service_categories_name.rst
index b739ca3a19..ecbedd619a 100644
--- a/docs/source/api/v4/service_categories_name.rst
+++ b/docs/source/api/v4/service_categories_name.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-service-categories-name:
+.. _to-api-v4-service-categories-name:
 
 *******************************
 ``service_categories/{{name}}``
diff --git a/docs/source/api/v4/snapshot.rst b/docs/source/api/v4/snapshot.rst
index b0a7001bcc..53e0013ae7 100644
--- a/docs/source/api/v4/snapshot.rst
+++ b/docs/source/api/v4/snapshot.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-snapshot:
+.. _to-api-v4-snapshot:
 
 ************
 ``snapshot``
@@ -21,8 +21,8 @@
 
 ``PUT``
 =======
-Performs a CDN :term:`Snapshot`. Effectively, this propagates the new *configuration* of the CDN to its *operating state*, which replaces the output of the :ref:`to-api-cdns-name-snapshot` endpoint with the output of the :ref:`to-api-cdns-name-snapshot-new` endpoint.
-This also changes the output of the :ref:`to-api-cdns-name-configs-monitoring` endpoint since that endpoint returns the latest monitoring information from the *operating state*.
+Performs a CDN :term:`Snapshot`. Effectively, this propagates the new *configuration* of the CDN to its *operating state*, which replaces the output of the :ref:`to-api-v4-cdns-name-snapshot` endpoint with the output of the :ref:`to-api-v4-cdns-name-snapshot-new` endpoint.
+This also changes the output of the :ref:`to-api-v4-cdns-name-configs-monitoring` endpoint since that endpoint returns the latest monitoring information from the *operating state*.
 
 .. Note:: By default, snapshotting the CDN also deletes all HTTPS certificates for every :term:`Delivery Service` which has been deleted since the last :term:`Snapshot`. In order to disable this behavior, set ``disable_auto_cert_deletion`` in :ref:`cdn.conf` to ``true``.
 
diff --git a/docs/source/api/v4/sslkey_expirations.rst b/docs/source/api/v4/sslkey_expirations.rst
index f299c87f89..21083ba187 100644
--- a/docs/source/api/v4/sslkey_expirations.rst
+++ b/docs/source/api/v4/sslkey_expirations.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-sslkey_expirations:
+.. _to-api-v4-sslkey_expirations:
 
 **********************
 ``sslkey_expirations``
diff --git a/docs/source/api/v4/staticdnsentries.rst b/docs/source/api/v4/staticdnsentries.rst
index 04a8e6280c..b392f30fc5 100644
--- a/docs/source/api/v4/staticdnsentries.rst
+++ b/docs/source/api/v4/staticdnsentries.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-staticdnsentries:
+.. _to-api-v4-staticdnsentries:
 
 ********************
 ``staticdnsentries``
diff --git a/docs/source/api/v4/stats_summary.rst b/docs/source/api/v4/stats_summary.rst
index 1d8dd45d89..9010b300fd 100644
--- a/docs/source/api/v4/stats_summary.rst
+++ b/docs/source/api/v4/stats_summary.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-stats-summary:
+.. _to-api-v4-stats-summary:
 
 *****************
 ``stats_summary``
diff --git a/docs/source/api/v4/statuses.rst b/docs/source/api/v4/statuses.rst
index 02833d4aad..fb3d8207e3 100644
--- a/docs/source/api/v4/statuses.rst
+++ b/docs/source/api/v4/statuses.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-statuses:
+.. _to-api-v4-statuses:
 
 ************
 ``statuses``
diff --git a/docs/source/api/v4/statuses_id.rst b/docs/source/api/v4/statuses_id.rst
index a48d790bc9..28d6d2d3bb 100644
--- a/docs/source/api/v4/statuses_id.rst
+++ b/docs/source/api/v4/statuses_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-statuses-id:
+.. _to-api-v4-statuses-id:
 
 *********************
 ``statuses/{{ID}}``
diff --git a/docs/source/api/v4/steering.rst b/docs/source/api/v4/steering.rst
index 8c36fe463a..a1c94a6edf 100644
--- a/docs/source/api/v4/steering.rst
+++ b/docs/source/api/v4/steering.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-steering:
+.. _to-api-v4-steering:
 
 ************
 ``steering``
diff --git a/docs/source/api/v4/steering_id_targets.rst b/docs/source/api/v4/steering_id_targets.rst
index 890248b4be..fe83fe4fa9 100644
--- a/docs/source/api/v4/steering_id_targets.rst
+++ b/docs/source/api/v4/steering_id_targets.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-steering-id-targets:
+.. _to-api-v4-steering-id-targets:
 
 ***************************
 ``steering/{{ID}}/targets``
diff --git a/docs/source/api/v4/steering_id_targets_targetID.rst b/docs/source/api/v4/steering_id_targets_targetID.rst
index ec036fbfbf..60774cb147 100644
--- a/docs/source/api/v4/steering_id_targets_targetID.rst
+++ b/docs/source/api/v4/steering_id_targets_targetID.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-steering-id-targets-targetID:
+.. _to-api-v4-steering-id-targets-targetID:
 
 ****************************************
 ``steering/{{ID}}/targets/{{targetID}}``
diff --git a/docs/source/api/v4/system_info.rst b/docs/source/api/v4/system_info.rst
index 2531a5e8f6..a4e5fe83cd 100644
--- a/docs/source/api/v4/system_info.rst
+++ b/docs/source/api/v4/system_info.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-system-info:
+.. _to-api-v4-system-info:
 
 ***************
 ``system/info``
diff --git a/docs/source/api/v4/tenants.rst b/docs/source/api/v4/tenants.rst
index 2b15f361b5..ecabc5ce34 100644
--- a/docs/source/api/v4/tenants.rst
+++ b/docs/source/api/v4/tenants.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-tenants:
+.. _to-api-v4-tenants:
 
 ***********
 ``tenants``
diff --git a/docs/source/api/v4/tenants_id.rst b/docs/source/api/v4/tenants_id.rst
index 046c4cb0af..3acf5f3d54 100644
--- a/docs/source/api/v4/tenants_id.rst
+++ b/docs/source/api/v4/tenants_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-tenants-id:
+.. _to-api-v4-tenants-id:
 
 ******************
 ``tenants/{{ID}}``
diff --git a/docs/source/api/v4/topologies.rst b/docs/source/api/v4/topologies.rst
index 8ad3a572b0..b28cdedcab 100644
--- a/docs/source/api/v4/topologies.rst
+++ b/docs/source/api/v4/topologies.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-topologies:
+.. _to-api-v4-topologies:
 
 **************
 ``topologies``
diff --git a/docs/source/api/v4/topologies_name_queue_update.rst b/docs/source/api/v4/topologies_name_queue_update.rst
index 904dcdd9c9..5667341c56 100644
--- a/docs/source/api/v4/topologies_name_queue_update.rst
+++ b/docs/source/api/v4/topologies_name_queue_update.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-topologies-name-queue_update:
+.. _to-api-v4-topologies-name-queue_update:
 
 ************************************
 ``topologies/{{name}}/queue_update``
diff --git a/docs/source/api/v4/types.rst b/docs/source/api/v4/types.rst
index a6592657e1..cb95cceabd 100644
--- a/docs/source/api/v4/types.rst
+++ b/docs/source/api/v4/types.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-types:
+.. _to-api-v4-types:
 
 *********
 ``types``
diff --git a/docs/source/api/v4/types_id.rst b/docs/source/api/v4/types_id.rst
index 2a8a14baac..2bda381ddc 100644
--- a/docs/source/api/v4/types_id.rst
+++ b/docs/source/api/v4/types_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-types-id:
+.. _to-api-v4-types-id:
 
 ****************
 ``types/{{ID}}``
diff --git a/docs/source/api/v4/user_current.rst b/docs/source/api/v4/user_current.rst
index b1e8e16c85..ac2191b6ce 100644
--- a/docs/source/api/v4/user_current.rst
+++ b/docs/source/api/v4/user_current.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-user-current:
+.. _to-api-v4-user-current:
 
 ****************
 ``user/current``
@@ -21,7 +21,7 @@
 
 ``GET``
 =======
-.. caution:: As a username is needed to log in, any administrator or application must necessarily know the current username at any given time. Thus it's generally better to use the ``username`` query parameter of a ``GET`` request to :ref:`to-api-users` instead.
+.. caution:: As a username is needed to log in, any administrator or application must necessarily know the current username at any given time. Thus it's generally better to use the ``username`` query parameter of a ``GET`` request to :ref:`to-api-v4-users` instead.
 
 Retrieves the details of the authenticated user.
 
@@ -67,7 +67,7 @@ Response Structure
 :phoneNumber:       The user's phone number
 :postalCode:        The postal code of the area in which the user resides
 :publicSshKey:      The user's public key used for the SSH protocol
-:registrationSent:  If the user was created using the :ref:`to-api-users-register` endpoint, this will be the date and time at which the registration email was sent - otherwise it will be ``null``
+:registrationSent:  If the user was created using the :ref:`to-api-v4-users-register` endpoint, this will be the date and time at which the registration email was sent - otherwise it will be ``null``
 :role:              The name of the :term:`Role` assigned to this user
 :stateOrProvince:   The name of the state or province where this user resides
 :tenant:            The name of the :term:`Tenant` to which this user belongs
@@ -126,7 +126,7 @@ Response Structure
 
 ``PUT``
 =======
-.. warning:: Assuming the current user's integral, unique identifier is known, it's generally better to use the ``PUT`` method of the :ref:`to-api-users` instead.
+.. warning:: Assuming the current user's integral, unique identifier is known, it's generally better to use the ``PUT`` method of the :ref:`to-api-v4-users` instead.
 
 .. warning:: Users that login via LDAP pass-back cannot be modified
 
@@ -233,7 +233,7 @@ Response Structure
 :phoneNumber:      The user's phone number
 :postalCode:       The postal code of the area in which the user resides
 :publicSshKey:     The user's public key used for the SSH protocol
-:registrationSent: If the user was created using the :ref:`to-api-users-register` endpoint, this will be the date and time at which the registration email was sent - otherwise it will be ``null``
+:registrationSent: If the user was created using the :ref:`to-api-v4-users-register` endpoint, this will be the date and time at which the registration email was sent - otherwise it will be ``null``
 :role:             The name of the :term:`Role` assigned to this user
 :stateOrProvince:  The name of the state or province where this user resides
 :tenant:           The name of the :term:`Tenant` to which this user belongs
diff --git a/docs/source/api/v4/user_login.rst b/docs/source/api/v4/user_login.rst
index e2ef28b991..50a395043d 100644
--- a/docs/source/api/v4/user_login.rst
+++ b/docs/source/api/v4/user_login.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-user-login:
+.. _to-api-v4-user-login:
 
 **************
 ``user/login``
diff --git a/docs/source/api/v4/user_login_oauth.rst b/docs/source/api/v4/user_login_oauth.rst
index 90a2db6b6d..d4d864a629 100644
--- a/docs/source/api/v4/user_login_oauth.rst
+++ b/docs/source/api/v4/user_login_oauth.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-user-login-oauth:
+.. _to-api-v4-user-login-oauth:
 
 ********************
 ``user/login/oauth``
diff --git a/docs/source/api/v4/user_login_token.rst b/docs/source/api/v4/user_login_token.rst
index d5fb2502cd..8a09a1491f 100644
--- a/docs/source/api/v4/user_login_token.rst
+++ b/docs/source/api/v4/user_login_token.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-user-login-token:
+.. _to-api-v4-user-login-token:
 
 ********************
 ``user/login/token``
@@ -21,7 +21,7 @@
 
 ``POST``
 ========
-Authentication of a user using a token. Normally, the token is obtained via a call to either :ref:`to-api-user-reset_password` or :ref:`to-api-users-register`.
+Authentication of a user using a token. Normally, the token is obtained via a call to either :ref:`to-api-v4-user-reset_password` or :ref:`to-api-v4-users-register`.
 
 :Auth. Required: No
 :Roles Required: None
diff --git a/docs/source/api/v4/user_logout.rst b/docs/source/api/v4/user_logout.rst
index c6efff0cd1..68bc1b3b43 100644
--- a/docs/source/api/v4/user_logout.rst
+++ b/docs/source/api/v4/user_logout.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-user-logout:
+.. _to-api-v4-user-logout:
 
 ***************
 ``user/logout``
diff --git a/docs/source/api/v4/user_reset_password.rst b/docs/source/api/v4/user_reset_password.rst
index 6b6bedcbee..41b3a4122c 100644
--- a/docs/source/api/v4/user_reset_password.rst
+++ b/docs/source/api/v4/user_reset_password.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-user-reset_password:
+.. _to-api-v4-user-reset_password:
 
 ***********************
 ``user/reset_password``
diff --git a/docs/source/api/v4/users.rst b/docs/source/api/v4/users.rst
index aa8f8cd40a..c78e9add4e 100644
--- a/docs/source/api/v4/users.rst
+++ b/docs/source/api/v4/users.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-users:
+.. _to-api-v4-users:
 
 *********
 ``users``
@@ -91,7 +91,7 @@ Response Structure
 :phoneNumber:       The user's phone number
 :postalCode:        The postal code of the area in which the user resides
 :publicSshKey:      The user's public key used for the SSH protocol
-:registrationSent:  If the user was created using the :ref:`to-api-users-register` endpoint, this will be the date and time at which the registration email was sent - otherwise it will be ``null``
+:registrationSent:  If the user was created using the :ref:`to-api-v4-users-register` endpoint, this will be the date and time at which the registration email was sent - otherwise it will be ``null``
 :role:              The name of the role assigned to this user
 :stateOrProvince:   The name of the state or province where this user resides
 :tenant:            The name of the tenant to which this user belongs
@@ -238,7 +238,7 @@ Response Structure
 :phoneNumber:       The user's phone number
 :postalCode:        The postal code of the area in which the user resides
 :publicSshKey:      The user's public key used for the SSH protocol
-:registrationSent:  If the user was created using the :ref:`to-api-users-register` endpoint, this will be the date and time at which the registration email was sent - otherwise it will be ``null``
+:registrationSent:  If the user was created using the :ref:`to-api-v4-users-register` endpoint, this will be the date and time at which the registration email was sent - otherwise it will be ``null``
 :role:              The name of the role assigned to this user
 :stateOrProvince:   The name of the state or province where this user resides
 :tenant:            The name of the tenant to which this user belongs
diff --git a/docs/source/api/v4/users_id.rst b/docs/source/api/v4/users_id.rst
index be49381bf1..a5dc2c8851 100644
--- a/docs/source/api/v4/users_id.rst
+++ b/docs/source/api/v4/users_id.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-users-id:
+.. _to-api-v4-users-id:
 
 ****************
 ``users/{{ID}}``
@@ -71,7 +71,7 @@ Response Structure
 :phoneNumber:       The user's phone number
 :postalCode:        The postal code of the area in which the user resides
 :publicSshKey:      The user's public key used for the SSH protocol
-:registrationSent:  If the user was created using the :ref:`to-api-users-register` endpoint, this will be the date and time at which the registration email was sent - otherwise it will be ``null``
+:registrationSent:  If the user was created using the :ref:`to-api-v4-users-register` endpoint, this will be the date and time at which the registration email was sent - otherwise it will be ``null``
 :role:              The name of the role assigned to this user
 :stateOrProvince:   The name of the state or province where this user resides
 :tenant:            The name of the tenant to which this user belongs
@@ -230,7 +230,7 @@ Response Structure
 :phoneNumber:      The user's phone number
 :postalCode:       The postal code of the area in which the user resides
 :publicSshKey:     The user's public key used for the SSH protocol
-:registrationSent: If the user was created using the :ref:`to-api-users-register` endpoint, this will be the date and time at which the registration email was sent - otherwise it will be ``null``
+:registrationSent: If the user was created using the :ref:`to-api-v4-users-register` endpoint, this will be the date and time at which the registration email was sent - otherwise it will be ``null``
 :role:             The name of the role assigned to this user
 :stateOrProvince:  The name of the state or province where this user resides
 :tenant:           The name of the tenant to which this user belongs
diff --git a/docs/source/api/v4/users_register.rst b/docs/source/api/v4/users_register.rst
index 376d2cd022..97ca295141 100644
--- a/docs/source/api/v4/users_register.rst
+++ b/docs/source/api/v4/users_register.rst
@@ -13,7 +13,7 @@
 .. limitations under the License.
 ..
 
-.. _to-api-users-register:
+.. _to-api-v4-users-register:
 
 ******************
 ``users/register``
diff --git a/docs/source/api/v4/vault_ping.rst b/docs/source/api/v4/vault_ping.rst
index e5d86ee41d..c07d390492 100644
--- a/docs/source/api/v4/vault_ping.rst
+++ b/docs/source/api/v4/vault_ping.rst
@@ -12,7 +12,7 @@
 .. See the License for the specific language governing permissions and
 .. limitations under the License.
 ..
-.. _to-api-vault-ping:
+.. _to-api-v4-vault-ping:
 
 **************
 ``vault/ping``
diff --git a/docs/source/api/v5/about.rst b/docs/source/api/v5/about.rst
new file mode 100644
index 0000000000..7841e66921
--- /dev/null
+++ b/docs/source/api/v5/about.rst
@@ -0,0 +1,80 @@
+..
+..
+.. Licensed under the Apache License, Version 2.0 (the "License");
+.. you may not use this file except in compliance with the License.
+.. You may obtain a copy of the License at
+..
+..     http://www.apache.org/licenses/LICENSE-2.0
+..
+.. Unless required by applicable law or agreed to in writing, software
+.. distributed under the License is distributed on an "AS IS" BASIS,
+.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+.. See the License for the specific language governing permissions and
+.. limitations under the License.
+..
+
+.. _to-api-about:
+
+***********
+``about``
+***********
+
+``GET``
+=======
+
+Returns info about the Traffic Ops build that is currently running, generated at startup. The output will be the same until the Traffic Ops :ref:`version changes <to-upgrading>`.
+
+:Auth. Required: Yes
+:Roles Required: None
+:Permissions Required: None
+:Response Type:  Object
+
+Request Structure
+-----------------
+No parameters available.
+
+.. code-block:: http
+	:caption: Request Example
+
+	GET /api/5.0/about HTTP/1.1
+	User-Agent: python-requests/2.22.0
+	Accept-Encoding: gzip, deflate
+	Accept: */*
+	Connection: keep-alive
+	Cookie: mojolicious=...
+
+Response Structure
+------------------
+:commitHash:    The `Git <https://git-scm.com/>`_ commit hash that Traffic Ops was built at.
+:commits:       The number of commits in the branch of the commit that Traffic Ops was built at, including that commit. Calculated by running ``git rev-list HEAD | wc -l``.
+:goVersion:     The version of `Go <https://golang.org/>`_ that was used to build Traffic Ops.
+:release:       The major version of CentOS or Red Hat Enterprise Linux that the build environment was running.
+:name:          The human-readable name of the `RPM <https://rpm-packaging-guide.github.io/#packaging-software>`_ file.
+:RPMVersion:    The entire name of the RPM file, excluding the file extension.
+:Version:       The version of :abbr:`ATC (Apache Traffic Control)` that this version of Traffic Control belongs to.
+
+.. code-block:: http
+	:caption: Response Example
+
+	HTTP/1.1 200 OK
+	Access-Control-Allow-Credentials: true
+	Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Set-Cookie, Cookie
+	Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
+	Access-Control-Allow-Origin: *
+	Content-Encoding: gzip
+	Content-Type: application/json
+	Set-Cookie: mojolicious=...; Path=/; Expires=Mon, 24 Feb 2020 19:35:28 GMT; Max-Age=3600; HttpOnly
+	Whole-Content-Sha512: 7SVQsddCUVRs+sineziRGR6OyMli7XLZbjxyMQgW6E506bh5thMOuttPFT7aJckDcgT45PlhexycwlApOHI4Vw==
+	X-Server-Name: traffic_ops_golang/
+	Date: Mon, 24 Feb 2020 18:35:28 GMT
+	Content-Length: 145
+
+	{
+		"commitHash": "1c9a2e9c",
+		"commits": "10555",
+		"goVersion": "go1.11.13",
+		"release": "el7",
+		"name": "traffic_ops",
+		"RPMVersion": "traffic_ops-4.0.0-10555.1c9a2e9c.el7",
+		"Version": "4.0.0"
+	}
diff --git a/docs/source/api/v4/acme_accounts.rst b/docs/source/api/v5/acme_accounts.rst
similarity index 98%
copy from docs/source/api/v4/acme_accounts.rst
copy to docs/source/api/v5/acme_accounts.rst
index 391f521253..cf33837496 100644
--- a/docs/source/api/v4/acme_accounts.rst
+++ b/docs/source/api/v5/acme_accounts.rst
@@ -79,7 +79,7 @@ The request body must be a single :term:`ACME Account` object with the following
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/acme_accounts HTTP/1.1
+	POST /api/5.0/acme_accounts HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -151,7 +151,7 @@ The request body must be a single :term:`ACME Account` object with the following
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/acme_accounts HTTP/1.1
+	PUT /api/5.0/acme_accounts HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/acme_accounts_provider_email.rst b/docs/source/api/v5/acme_accounts_provider_email.rst
similarity index 100%
copy from docs/source/api/v4/acme_accounts_provider_email.rst
copy to docs/source/api/v5/acme_accounts_provider_email.rst
diff --git a/docs/source/api/v4/acme_accounts_providers.rst b/docs/source/api/v5/acme_accounts_providers.rst
similarity index 98%
copy from docs/source/api/v4/acme_accounts_providers.rst
copy to docs/source/api/v5/acme_accounts_providers.rst
index 8dfc1c3170..e08e38c116 100644
--- a/docs/source/api/v4/acme_accounts_providers.rst
+++ b/docs/source/api/v5/acme_accounts_providers.rst
@@ -19,8 +19,6 @@
 ``acme_accounts/providers``
 ***************************
 
-.. versionadded:: 4.0
-
 ``GET``
 =======
 Gets a list of all :abbr:`ACME (Automatic Certificate Management Environment)` providers set up in :ref:`cdn.conf` and Let's Encrypt.
diff --git a/docs/source/api/v4/acme_autorenew.rst b/docs/source/api/v5/acme_autorenew.rst
similarity index 95%
copy from docs/source/api/v4/acme_autorenew.rst
copy to docs/source/api/v5/acme_autorenew.rst
index 0ac7171f26..82fbd6cd09 100644
--- a/docs/source/api/v4/acme_autorenew.rst
+++ b/docs/source/api/v5/acme_autorenew.rst
@@ -44,7 +44,7 @@ Response Structure
 
 	{ "alerts": [
 		{
-			"text": "Beginning async call to renew certificates. This may take a few minutes. Status updates can be found here: /api/4.0/async_status/1",
+			"text": "Beginning async call to renew certificates. This may take a few minutes. Status updates can be found here: /api/5.0/async_status/1",
 			"level": "success"
 		}
 	]}
diff --git a/docs/source/api/v4/asns.rst b/docs/source/api/v5/asns.rst
similarity index 99%
copy from docs/source/api/v4/asns.rst
copy to docs/source/api/v5/asns.rst
index cdb37e064e..76b4782043 100644
--- a/docs/source/api/v4/asns.rst
+++ b/docs/source/api/v5/asns.rst
@@ -61,7 +61,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/asns HTTP/1.1
+	GET /api/5.0/asns HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -127,7 +127,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/asns HTTP/1.1
+	POST /api/5.0/asns HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -194,7 +194,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/asns?id=1 HTTP/1.1
+	PUT /api/5.0/asns?id=1 HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -263,7 +263,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/asns?id=1 HTTP/1.1
+	DELETE /api/5.0/asns?id=1 HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/asns_id.rst b/docs/source/api/v5/asns_id.rst
similarity index 99%
copy from docs/source/api/v4/asns_id.rst
copy to docs/source/api/v5/asns_id.rst
index 72cb4b1a05..687ed06e87 100644
--- a/docs/source/api/v4/asns_id.rst
+++ b/docs/source/api/v5/asns_id.rst
@@ -52,7 +52,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/asns/1 HTTP/1.1
+	PUT /api/5.0/asns/1 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -121,7 +121,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/asns/1 HTTP/1.1
+	DELETE /api/5.0/asns/1 HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/async_status.rst b/docs/source/api/v5/async_status.rst
similarity index 100%
copy from docs/source/api/v4/async_status.rst
copy to docs/source/api/v5/async_status.rst
diff --git a/docs/source/api/v4/cache_stats.rst b/docs/source/api/v5/cache_stats.rst
similarity index 99%
copy from docs/source/api/v4/cache_stats.rst
copy to docs/source/api/v5/cache_stats.rst
index 297205b60d..3975d1e3b9 100644
--- a/docs/source/api/v4/cache_stats.rst
+++ b/docs/source/api/v5/cache_stats.rst
@@ -69,7 +69,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/cache_stats?cdnName=CDN&endDate=2019-10-28T20:49:00Z&metricType=bandwidth&startDate=2019-10-28T20:45:00Z HTTP/1.1
+	GET /api/5.0/cache_stats?cdnName=CDN&endDate=2019-10-28T20:49:00Z&metricType=bandwidth&startDate=2019-10-28T20:45:00Z HTTP/1.1
 	User-Agent: python-requests/2.20.1
 	Accept-Encoding: gzip, deflate
 	Accept: application/json;timestamp=unix, application/json;timestamp=rfc;q=0.9, application/json;q=0.8, */*;q=0.7
diff --git a/docs/source/api/v4/cachegroups.rst b/docs/source/api/v5/cachegroups.rst
similarity index 99%
copy from docs/source/api/v4/cachegroups.rst
copy to docs/source/api/v5/cachegroups.rst
index 561776d9a2..5c56b51f74 100644
--- a/docs/source/api/v4/cachegroups.rst
+++ b/docs/source/api/v5/cachegroups.rst
@@ -59,7 +59,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/cachegroups?type=23 HTTP/1.1
+	GET /api/5.0/cachegroups?type=23 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -155,7 +155,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/cachegroups HTTP/1.1
+	POST /api/5.0/cachegroups HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/cachegroups_id.rst b/docs/source/api/v5/cachegroups_id.rst
similarity index 99%
copy from docs/source/api/v4/cachegroups_id.rst
copy to docs/source/api/v5/cachegroups_id.rst
index 284e3477fd..eb14b0df63 100644
--- a/docs/source/api/v4/cachegroups_id.rst
+++ b/docs/source/api/v5/cachegroups_id.rst
@@ -60,7 +60,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/cachegroups/8 HTTP/1.1
+	PUT /api/5.0/cachegroups/8 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -161,7 +161,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/cachegroups/42 HTTP/1.1
+	DELETE /api/5.0/cachegroups/42 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/cachegroups_id_deliveryservices.rst b/docs/source/api/v5/cachegroups_id_deliveryservices.rst
similarity index 98%
copy from docs/source/api/v4/cachegroups_id_deliveryservices.rst
copy to docs/source/api/v5/cachegroups_id_deliveryservices.rst
index d014e9cf1b..777a215ec5 100644
--- a/docs/source/api/v4/cachegroups_id_deliveryservices.rst
+++ b/docs/source/api/v5/cachegroups_id_deliveryservices.rst
@@ -45,7 +45,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/cachegroups/8/deliveryservices HTTP/1.1
+	POST /api/5.0/cachegroups/8/deliveryservices HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -91,4 +91,3 @@ Response Structure
 			2
 		]
 	}}
-
diff --git a/docs/source/api/v4/cachegroups_id_queue_update.rst b/docs/source/api/v5/cachegroups_id_queue_update.rst
similarity index 98%
copy from docs/source/api/v4/cachegroups_id_queue_update.rst
copy to docs/source/api/v5/cachegroups_id_queue_update.rst
index ced0e56484..6f1ff3362e 100644
--- a/docs/source/api/v4/cachegroups_id_queue_update.rst
+++ b/docs/source/api/v5/cachegroups_id_queue_update.rst
@@ -45,7 +45,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/cachegroups/8/queue_update HTTP/1.1
+	POST /api/5.0/cachegroups/8/queue_update HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/caches_stats.rst b/docs/source/api/v5/caches_stats.rst
similarity index 100%
copy from docs/source/api/v4/caches_stats.rst
copy to docs/source/api/v5/caches_stats.rst
diff --git a/docs/source/api/v4/cdn_locks.rst b/docs/source/api/v5/cdn_locks.rst
similarity index 98%
copy from docs/source/api/v4/cdn_locks.rst
copy to docs/source/api/v5/cdn_locks.rst
index 0bd4619974..4645746d56 100644
--- a/docs/source/api/v4/cdn_locks.rst
+++ b/docs/source/api/v5/cdn_locks.rst
@@ -19,8 +19,6 @@
 ``cdn_locks``
 *****************
 
-.. versionadded:: 4.0
-
 ``GET``
 =======
 Gets information for all CDN locks.
@@ -90,7 +88,7 @@ The request body must be a single ``CDN Lock`` object with the following keys:
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/cdn_locks HTTP/2
+	POST /api/5.0/cdn_locks HTTP/2
 	Host: localhost:8443
 	User-Agent: curl/7.64.2
 	Accept: */*
@@ -170,7 +168,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/cdn_locks?cdn=bar HTTP/2
+	DELETE /api/5.0/cdn_locks?cdn=bar HTTP/2
 	Host: localhost:8443
 	User-Agent: curl/7.64.1
 	Accept: */*
diff --git a/docs/source/api/v4/cdn_notifications.rst b/docs/source/api/v5/cdn_notifications.rst
similarity index 98%
copy from docs/source/api/v4/cdn_notifications.rst
copy to docs/source/api/v5/cdn_notifications.rst
index c056192786..f37108b83c 100644
--- a/docs/source/api/v4/cdn_notifications.rst
+++ b/docs/source/api/v5/cdn_notifications.rst
@@ -46,7 +46,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/cdn_notifications HTTP/1.1
+	GET /api/5.0/cdn_notifications HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -106,7 +106,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/cdn_notifications HTTP/1.1
+	POST /api/5.0/cdn_notifications HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -181,7 +181,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/cdn_notifications?id=42 HTTP/1.1
+	DELETE /api/5.0/cdn_notifications?id=42 HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/cdns.rst b/docs/source/api/v5/cdns.rst
similarity index 99%
copy from docs/source/api/v4/cdns.rst
copy to docs/source/api/v5/cdns.rst
index 219625ecb3..d76df84255 100644
--- a/docs/source/api/v4/cdns.rst
+++ b/docs/source/api/v5/cdns.rst
@@ -119,7 +119,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Structure
 
-	POST /api/4.0/cdns HTTP/1.1
+	POST /api/5.0/cdns HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/cdns_capacity.rst b/docs/source/api/v5/cdns_capacity.rst
similarity index 100%
copy from docs/source/api/v4/cdns_capacity.rst
copy to docs/source/api/v5/cdns_capacity.rst
diff --git a/docs/source/api/v4/cdns_dnsseckeys_generate.rst b/docs/source/api/v5/cdns_dnsseckeys_generate.rst
similarity index 98%
copy from docs/source/api/v4/cdns_dnsseckeys_generate.rst
copy to docs/source/api/v5/cdns_dnsseckeys_generate.rst
index 243a75fa0e..a89ae202c2 100644
--- a/docs/source/api/v4/cdns_dnsseckeys_generate.rst
+++ b/docs/source/api/v5/cdns_dnsseckeys_generate.rst
@@ -39,7 +39,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/cdns/dnsseckeys/generate HTTP/1.1
+	POST /api/5.0/cdns/dnsseckeys/generate HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/cdns_dnsseckeys_refresh.rst b/docs/source/api/v5/cdns_dnsseckeys_refresh.rst
similarity index 97%
copy from docs/source/api/v4/cdns_dnsseckeys_refresh.rst
copy to docs/source/api/v5/cdns_dnsseckeys_refresh.rst
index 314e750a30..1dd23aeece 100644
--- a/docs/source/api/v4/cdns_dnsseckeys_refresh.rst
+++ b/docs/source/api/v5/cdns_dnsseckeys_refresh.rst
@@ -43,7 +43,7 @@ Response Structure
 	Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
 	Access-Control-Allow-Origin: *
 	Content-Type: application/json
-	Location: /api/4.0/async_status/3
+	Location: /api/5.0/async_status/3
 	Permissions-Policy: interest-cohort=()
 	Set-Cookie: mojolicious=...; Path=/; Expires=Tue, 20 Jul 2021 23:55:11 GMT; Max-Age=3600; HttpOnly
 	Vary: Accept-Encoding
@@ -55,7 +55,7 @@ Response Structure
 	{
 		"alerts": [
 			{
-				"text": "Starting DNSSEC key refresh in the background. This may take a few minutes. Status updates can be found here: /api/4.0/async_status/3",
+				"text": "Starting DNSSEC key refresh in the background. This may take a few minutes. Status updates can be found here: /api/5.0/async_status/3",
 				"level": "success"
 			}
 		]
diff --git a/docs/source/api/v4/cdns_domains.rst b/docs/source/api/v5/cdns_domains.rst
similarity index 100%
copy from docs/source/api/v4/cdns_domains.rst
copy to docs/source/api/v5/cdns_domains.rst
diff --git a/docs/source/api/v4/cdns_health.rst b/docs/source/api/v5/cdns_health.rst
similarity index 100%
copy from docs/source/api/v4/cdns_health.rst
copy to docs/source/api/v5/cdns_health.rst
diff --git a/docs/source/api/v4/cdns_id.rst b/docs/source/api/v5/cdns_id.rst
similarity index 99%
copy from docs/source/api/v4/cdns_id.rst
copy to docs/source/api/v5/cdns_id.rst
index 90d1e20fcf..87949dd742 100644
--- a/docs/source/api/v4/cdns_id.rst
+++ b/docs/source/api/v5/cdns_id.rst
@@ -45,7 +45,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/cdns/3 HTTP/1.1
+	PUT /api/5.0/cdns/3 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -134,4 +134,3 @@ Response Structure
 			"level": "success"
 		}
 	]}
-
diff --git a/docs/source/api/v4/cdns_id_queue_update.rst b/docs/source/api/v5/cdns_id_queue_update.rst
similarity index 98%
copy from docs/source/api/v4/cdns_id_queue_update.rst
copy to docs/source/api/v5/cdns_id_queue_update.rst
index 3f179e6352..17e457e070 100644
--- a/docs/source/api/v4/cdns_id_queue_update.rst
+++ b/docs/source/api/v5/cdns_id_queue_update.rst
@@ -53,7 +53,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/cdns/2/queue_update?type=EDGE HTTP/1.1
+	POST /api/5.0/cdns/2/queue_update?type=EDGE HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/cdns_name_configs_monitoring.rst b/docs/source/api/v5/cdns_name_configs_monitoring.rst
similarity index 100%
copy from docs/source/api/v4/cdns_name_configs_monitoring.rst
copy to docs/source/api/v5/cdns_name_configs_monitoring.rst
diff --git a/docs/source/api/v4/cdns_name_dnsseckeys_ksk_generate.rst b/docs/source/api/v5/cdns_name_dnsseckeys_ksk_generate.rst
similarity index 100%
copy from docs/source/api/v4/cdns_name_dnsseckeys_ksk_generate.rst
copy to docs/source/api/v5/cdns_name_dnsseckeys_ksk_generate.rst
diff --git a/docs/source/api/v4/cdns_name_federations.rst b/docs/source/api/v5/cdns_name_federations.rst
similarity index 98%
copy from docs/source/api/v4/cdns_name_federations.rst
copy to docs/source/api/v5/cdns_name_federations.rst
index 2f391c2a10..9bb5a00b52 100644
--- a/docs/source/api/v4/cdns_name_federations.rst
+++ b/docs/source/api/v5/cdns_name_federations.rst
@@ -62,7 +62,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/cdns/CDN-in-a-Box/federations HTTP/1.1
+	GET /api/5.0/cdns/CDN-in-a-Box/federations HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
@@ -141,7 +141,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/cdns/CDN-in-a-Box/federations HTTP/1.1
+	POST /api/5.0/cdns/CDN-in-a-Box/federations HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
diff --git a/docs/source/api/v4/cdns_name_federations_id.rst b/docs/source/api/v5/cdns_name_federations_id.rst
similarity index 97%
copy from docs/source/api/v4/cdns_name_federations_id.rst
copy to docs/source/api/v5/cdns_name_federations_id.rst
index 4b934f266c..6fee0b5b72 100644
--- a/docs/source/api/v4/cdns_name_federations_id.rst
+++ b/docs/source/api/v5/cdns_name_federations_id.rst
@@ -50,7 +50,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/cdns/CDN-in-a-Box/federations/1 HTTP/1.1
+	PUT /api/5.0/cdns/CDN-in-a-Box/federations/1 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
@@ -129,7 +129,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/cdns/CDN-in-a-Box/federations/1 HTTP/1.1
+	DELETE /api/5.0/cdns/CDN-in-a-Box/federations/1 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
diff --git a/docs/source/api/v4/cdns_name_health.rst b/docs/source/api/v5/cdns_name_health.rst
similarity index 98%
copy from docs/source/api/v4/cdns_name_health.rst
copy to docs/source/api/v5/cdns_name_health.rst
index bcf3e6caf9..6d2f506ed1 100644
--- a/docs/source/api/v4/cdns_name_health.rst
+++ b/docs/source/api/v5/cdns_name_health.rst
@@ -41,7 +41,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/cdns/CDN-in-a-Box/health HTTP/1.1
+	GET /api/5.0/cdns/CDN-in-a-Box/health HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/cdns_name_name.rst b/docs/source/api/v5/cdns_name_name.rst
similarity index 100%
copy from docs/source/api/v4/cdns_name_name.rst
copy to docs/source/api/v5/cdns_name_name.rst
diff --git a/docs/source/api/v4/cdns_name_name_dnsseckeys.rst b/docs/source/api/v5/cdns_name_name_dnsseckeys.rst
similarity index 100%
copy from docs/source/api/v4/cdns_name_name_dnsseckeys.rst
copy to docs/source/api/v5/cdns_name_name_dnsseckeys.rst
diff --git a/docs/source/api/v4/cdns_name_name_sslkeys.rst b/docs/source/api/v5/cdns_name_name_sslkeys.rst
similarity index 100%
copy from docs/source/api/v4/cdns_name_name_sslkeys.rst
copy to docs/source/api/v5/cdns_name_name_sslkeys.rst
diff --git a/docs/source/api/v4/cdns_name_snapshot.rst b/docs/source/api/v5/cdns_name_snapshot.rst
similarity index 99%
copy from docs/source/api/v4/cdns_name_snapshot.rst
copy to docs/source/api/v5/cdns_name_snapshot.rst
index 0309995139..39b0b8d7c4 100644
--- a/docs/source/api/v4/cdns_name_snapshot.rst
+++ b/docs/source/api/v5/cdns_name_snapshot.rst
@@ -42,7 +42,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/cdns/CDN-in-a-Box/snapshot HTTP/1.1
+	GET /api/5.0/cdns/CDN-in-a-Box/snapshot HTTP/1.1
 	User-Agent: python-requests/2.23.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -370,7 +370,7 @@ Response Structure
 				"dnssec.enabled": "false",
 				"domain_name": "mycdn.ciab.test",
 				"federationmapping.polling.interval": "60000",
-				"federationmapping.polling.url": "https://${toHostname}/api/4.0/federations/all",
+				"federationmapping.polling.url": "https://${toHostname}/api/5.0/federations/all",
 				"geolocation.polling.interval": "86400000",
 				"geolocation.polling.url": "https://static.infra.ciab.test:443/GeoLite2-City.mmdb.gz",
 				"keystore.maintenance.interval": "300",
diff --git a/docs/source/api/v4/cdns_name_snapshot_new.rst b/docs/source/api/v5/cdns_name_snapshot_new.rst
similarity index 99%
copy from docs/source/api/v4/cdns_name_snapshot_new.rst
copy to docs/source/api/v5/cdns_name_snapshot_new.rst
index 911f1ee73d..bbea4f55f9 100644
--- a/docs/source/api/v4/cdns_name_snapshot_new.rst
+++ b/docs/source/api/v5/cdns_name_snapshot_new.rst
@@ -41,7 +41,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/cdns/CDN-in-a-Box/snapshot/new HTTP/1.1
+	GET /api/5.0/cdns/CDN-in-a-Box/snapshot/new HTTP/1.1
 	User-Agent: python-requests/2.23.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -370,7 +370,7 @@ Response Structure
 				"dnssec.enabled": "false",
 				"domain_name": "mycdn.ciab.test",
 				"federationmapping.polling.interval": "60000",
-				"federationmapping.polling.url": "https://${toHostname}/api/4.0/federations/all",
+				"federationmapping.polling.url": "https://${toHostname}/api/5.0/federations/all",
 				"geolocation.polling.interval": "86400000",
 				"geolocation.polling.url": "https://static.infra.ciab.test:443/GeoLite2-City.mmdb.gz",
 				"keystore.maintenance.interval": "300",
diff --git a/docs/source/api/v4/cdns_routing.rst b/docs/source/api/v5/cdns_routing.rst
similarity index 100%
copy from docs/source/api/v4/cdns_routing.rst
copy to docs/source/api/v5/cdns_routing.rst
diff --git a/docs/source/api/v4/consistenthash.rst b/docs/source/api/v5/consistenthash.rst
similarity index 98%
copy from docs/source/api/v4/consistenthash.rst
copy to docs/source/api/v5/consistenthash.rst
index 3bd31cc891..ecc6abbfc3 100644
--- a/docs/source/api/v4/consistenthash.rst
+++ b/docs/source/api/v5/consistenthash.rst
@@ -38,7 +38,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/consistenthash HTTP/1.1
+	POST /api/5.0/consistenthash HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.54.0
 	Accept: */*
diff --git a/docs/source/api/v4/coordinates.rst b/docs/source/api/v5/coordinates.rst
similarity index 99%
copy from docs/source/api/v4/coordinates.rst
copy to docs/source/api/v5/coordinates.rst
index 6cda66f3c8..6f624cad50 100644
--- a/docs/source/api/v4/coordinates.rst
+++ b/docs/source/api/v5/coordinates.rst
@@ -146,7 +146,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/coordinates HTTP/1.1
+	POST /api/5.0/coordinates HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -220,7 +220,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/coordinates?id=9 HTTP/1.1
+	PUT /api/5.0/coordinates?id=9 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/current_stats.rst b/docs/source/api/v5/current_stats.rst
similarity index 98%
copy from docs/source/api/v4/current_stats.rst
copy to docs/source/api/v5/current_stats.rst
index 467775c846..2ccf0c5685 100644
--- a/docs/source/api/v4/current_stats.rst
+++ b/docs/source/api/v5/current_stats.rst
@@ -37,7 +37,7 @@ No parameters available.
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/current_stats HTTP/1.1
+	GET /api/5.0/current_stats HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/dbdump.rst b/docs/source/api/v5/dbdump.rst
similarity index 98%
copy from docs/source/api/v4/dbdump.rst
copy to docs/source/api/v5/dbdump.rst
index e622cab685..fc7ea53edc 100644
--- a/docs/source/api/v4/dbdump.rst
+++ b/docs/source/api/v5/dbdump.rst
@@ -40,7 +40,7 @@ No parameters available
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/dbdump HTTP/1.1
+	GET /api/5.0/dbdump HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/deliveryservice_request_comments.rst b/docs/source/api/v5/deliveryservice_request_comments.rst
similarity index 98%
copy from docs/source/api/v4/deliveryservice_request_comments.rst
copy to docs/source/api/v5/deliveryservice_request_comments.rst
index 49d67a87fc..d546ecbcc1 100644
--- a/docs/source/api/v4/deliveryservice_request_comments.rst
+++ b/docs/source/api/v5/deliveryservice_request_comments.rst
@@ -48,7 +48,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/deliveryservice_request_comments HTTP/1.1
+	GET /api/5.0/deliveryservice_request_comments HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -122,7 +122,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/deliveryservice_request_comments HTTP/1.1
+	POST /api/5.0/deliveryservice_request_comments HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -207,7 +207,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/deliveryservice_request_comments?id=6 HTTP/1.1
+	PUT /api/5.0/deliveryservice_request_comments?id=6 HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -288,7 +288,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/deliveryservice_request_comments?id=6 HTTP/1.1
+	DELETE /api/5.0/deliveryservice_request_comments?id=6 HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/deliveryservice_requests.rst b/docs/source/api/v5/deliveryservice_requests.rst
similarity index 99%
copy from docs/source/api/v4/deliveryservice_requests.rst
copy to docs/source/api/v5/deliveryservice_requests.rst
index bb9ca7a2a8..a3c62ddc35 100644
--- a/docs/source/api/v4/deliveryservice_requests.rst
+++ b/docs/source/api/v5/deliveryservice_requests.rst
@@ -72,7 +72,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/deliveryservice_requests?status=draft HTTP/1.1
+	GET /api/5.0/deliveryservice_requests?status=draft HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -212,7 +212,7 @@ The request must be a well-formed representation of a :term:`Delivery Service Re
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/deliveryservice_requests HTTP/1.1
+	POST /api/5.0/deliveryservice_requests HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -326,7 +326,7 @@ The response will be a representation of the created :term:`Delivery Service Req
 	Content-Encoding: gzip
 	Content-Type: application/json
 	Set-Cookie: mojolicious=...; Path=/; Expires=Mon, 24 Feb 2020 20:11:12 GMT; Max-Age=3600; HttpOnly
-	Location: /api/4.0/deliveryservice_requests/2
+	Location: /api/5.0/deliveryservice_requests/2
 	X-Server-Name: traffic_ops_golang/
 	Date: Mon, 24 Feb 2020 19:11:12 GMT
 	Content-Length: 901
@@ -546,7 +546,7 @@ The request body must be a representation of a :term:`Delivery Service Request`
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/deliveryservice_requests?id=1 HTTP/1.1
+	PUT /api/5.0/deliveryservice_requests?id=1 HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -793,7 +793,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/deliveryservice_requests?id=1 HTTP/1.1
+	DELETE /api/5.0/deliveryservice_requests?id=1 HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/deliveryservice_requests_id_assign.rst b/docs/source/api/v5/deliveryservice_requests_id_assign.rst
similarity index 95%
copy from docs/source/api/v4/deliveryservice_requests_id_assign.rst
copy to docs/source/api/v5/deliveryservice_requests_id_assign.rst
index a8e14b2aa9..660c05a737 100644
--- a/docs/source/api/v4/deliveryservice_requests_id_assign.rst
+++ b/docs/source/api/v5/deliveryservice_requests_id_assign.rst
@@ -22,8 +22,6 @@ Assign a :term:`Delivery Service Request` to a user.
 
 ``GET``
 =======
-.. versionadded:: 4.0
-
 :Auth. Required: Yes
 :Roles Required: "admin" or "operations"
 :Permissions Required: DS-REQUEST:READ, USER:READ
@@ -42,7 +40,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/deliveryservice_requests/1/assign HTTP/1.1
+	GET /api/5.0/deliveryservice_requests/1/assign HTTP/1.1
 	User-Agent: python-requests/2.24.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -89,21 +87,16 @@ Request Structure
 	|  ID  | The integral, unique identifier of the :term:`Delivery Service Request` being assigned |
 	+------+----------------------------------------------------------------------------------------+
 
-:assignee: The username of the user to whom the :term:`Delivery Service Request` is assigned
-
-	.. versionadded:: 4.0
-
+:assignee:   The username of the user to whom the :term:`Delivery Service Request` is assigned
 :assigneeId: The integral, unique identifier of the user to whom the :term:`Delivery Service Request` is assigned
 
-	.. versionchanged:: 4.0
-		Prior to APIv4.0, this was the only property that could be used to change a :term:`Delivery Service Request`'s Assignee - and thus was a required field.
-
+	.. note::
 		It is not required to send both of these; either property is sufficient to determine an :ref:`dsr-assignee`. In most cases, it's easier to use just `assignee`. If both *are* given, then `assigneeId` will take precedence in the event that the two properties do not refer to the same user. Sending a request that sets the assignee to ``null`` un-assigns the :term:`DSR` from any assignees it previously had\ [#implicit-null]_.
 
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/deliveryservice_requests/1/assign HTTP/1.1
+	PUT /api/5.0/deliveryservice_requests/1/assign HTTP/1.1
 	User-Agent: python-requests/2.24.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/deliveryservice_requests_id_status.rst b/docs/source/api/v5/deliveryservice_requests_id_status.rst
similarity index 98%
copy from docs/source/api/v4/deliveryservice_requests_id_status.rst
copy to docs/source/api/v5/deliveryservice_requests_id_status.rst
index a61b58aa34..c01cc9c77b 100644
--- a/docs/source/api/v4/deliveryservice_requests_id_status.rst
+++ b/docs/source/api/v5/deliveryservice_requests_id_status.rst
@@ -24,8 +24,6 @@ Get or set the status of a :term:`Delivery Service Request`.
 =======
 Gets the status of a :term:`DSR`.
 
-.. versionadded:: 4.0
-
 :Auth. Required: Yes
 :Roles Required: "admin", "Federation", "operations", "Portal", or "Steering"
 :Permissions Required: DS-REQUEST:READ
@@ -45,7 +43,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/deliveryservice_requests/1/status HTTP/1.1
+	GET /api/5.0/deliveryservice_requests/1/status HTTP/1.1
 	User-Agent: python-requests/2.24.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -98,7 +96,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/deliveryservice_requests/1/status HTTP/1.1
+	PUT /api/5.0/deliveryservice_requests/1/status HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/deliveryservice_stats.rst b/docs/source/api/v5/deliveryservice_stats.rst
similarity index 96%
copy from docs/source/api/v4/deliveryservice_stats.rst
copy to docs/source/api/v5/deliveryservice_stats.rst
index 895d02ecc6..ddd59803f0 100644
--- a/docs/source/api/v4/deliveryservice_stats.rst
+++ b/docs/source/api/v5/deliveryservice_stats.rst
@@ -81,7 +81,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/deliveryservice_stats?deliveryServiceName=demo1&startDate=2019-07-22T17:55:00Z&endDate=2019-07-22T17:56:00.000Z&metricType=tps_total HTTP/1.1
+	GET /api/5.0/deliveryservice_stats?deliveryServiceName=demo1&startDate=2019-07-22T17:55:00Z&endDate=2019-07-22T17:56:00.000Z&metricType=tps_total HTTP/1.1
 	User-Agent: python-requests/2.20.1
 	Accept-Encoding: gzip, deflate
 	Accept: application/json;timestamp=unix, application/json;timestamp=rfc;q=0.9, application/json;q=0.8, */*;q=0.7
@@ -115,11 +115,6 @@ Response Structure
 		:time:  The time at which the measurement was taken. This corresponds to the *beginning* of the interval. This time comes in the format of either an :rfc:`3339`-formatted string, or a number containing the number of nanoseconds since the Unix Epoch depending on the "Accept" header sent by the client, according to the rules outlined in `Content Format`_.
 		:value: The value of the requested ``metricType`` at the time given by ``time``. This will always be a floating point number, unless no data is available for the data interval, in which case it will be ``null``
 
-:source:  A legacy field meant only for plugins that override this endpoint to name themselves. Should always be "TrafficStats".
-
-	.. deprecated:: 1.4
-		As this has no known purpose, developers are advised it will be removed in the future.
-
 :summary: An object containing summary statistics describing the data series
 
 	:average:                The arithmetic mean of the data's values
@@ -132,11 +127,6 @@ Response Structure
 	:totalBytes:             When the ``metricType`` requested is ``kbps``, this will contain the total number of bytes transferred by the :term:`Delivery Service` within the requested time window. Note that fractional amounts are possible, as the data transfer rate will almost certainly not be cleanly divided by the requested time range.
 	:totalTransactions:      When the ``metricType`` requested is **not** ``kbps``, this will contain the total number of transactions completed by the :term:`Delivery Service` within the requested time window. Note that fractional amounts are possible, as the transaction rate will almost certainly not be cleanly divided by the requested time range.
 
-:version: A legacy field that seems to have been meant to indicate the API version used. Will always be "1.2"
-
-	.. deprecated:: 1.4
-		As this has no known purpose, developers are advised it will be removed in the future.
-
 .. code-block:: http
 	:caption: Response Example
 
@@ -175,7 +165,6 @@ Response Structure
 				]
 			]
 		},
-		"source": "TrafficStats",
 		"summary": {
 			"average": 0,
 			"count": 2,
@@ -186,8 +175,7 @@ Response Structure
 			"ninetyFifthPercentile": 0,
 			"totalBytes": null,
 			"totalTransactions": 0
-		},
-		"version": "1.2"
+		}
 	}}
 
 .. [#tenancy] This endpoint respects :term:`Tenancy`, and users whose :term:`Tenant` does not have access to a :term:`Delivery Service` will be unable to view the statistics of said :term:`Delivery Service`.
diff --git a/docs/source/api/v4/deliveryservices.rst b/docs/source/api/v5/deliveryservices.rst
similarity index 91%
copy from docs/source/api/v4/deliveryservices.rst
copy to docs/source/api/v5/deliveryservices.rst
index 9996bcf1ed..35e592ee2a 100644
--- a/docs/source/api/v4/deliveryservices.rst
+++ b/docs/source/api/v5/deliveryservices.rst
@@ -73,7 +73,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/deliveryservices?xmlId=demo2 HTTP/1.1
+	GET /api/5.0/deliveryservices?xmlId=demo2 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: python-requests/2.24.0
 	Accept-Encoding: gzip, deflate
@@ -117,13 +117,9 @@ Response Structure
 :ipv6RoutingEnabled:        A boolean that defines the :ref:`ds-ipv6-routing` setting on this :term:`Delivery Service`
 :lastHeaderRewrite:         A set of :ref:`ds-last-header-rw-rules`
 :lastUpdated:               The date and time at which this :term:`Delivery Service` was last updated, in :rfc:3339 format
-
-	.. versionchanged:: 4.0
-		Prior to API version 4.0, this property used :ref:`non-rfc-datetime`.
-
-:logsEnabled: A boolean that defines the :ref:`ds-logs-enabled` setting on this :term:`Delivery Service`
-:longDesc:    The :ref:`ds-longdesc` of this :term:`Delivery Service`
-:matchList:   The :term:`Delivery Service`'s :ref:`ds-matchlist`
+:logsEnabled:               A boolean that defines the :ref:`ds-logs-enabled` setting on this :term:`Delivery Service`
+:longDesc:                  The :ref:`ds-longdesc` of this :term:`Delivery Service`
+:matchList:                 The :term:`Delivery Service`'s :ref:`ds-matchlist`
 
 	:pattern:   A regular expression - the use of this pattern is dependent on the ``type`` field (backslashes are escaped)
 	:setNumber: An integer that provides explicit ordering of :ref:`ds-matchlist` items - this is used as a priority ranking by Traffic Router, and is not guaranteed to correspond to the ordering of items in the array.
@@ -154,15 +150,12 @@ Response Structure
 :sslKeyVersion:         This integer indicates the :ref:`ds-ssl-key-version`
 :tenantId:              The integral, unique identifier of the :ref:`ds-tenant` who owns this :term:`Delivery Service`
 :tlsVersions:           A list of explicitly supported :ref:`ds-tls-versions`
-
-	.. versionadded:: 4.0
-
-:topology:          The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
-:trRequestHeaders:  If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
-:trResponseHeaders: If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
-:type:              The :ref:`ds-types` of this :term:`Delivery Service`
-:typeId:            The integral, unique identifier of the :ref:`ds-types` of this :term:`Delivery Service`
-:xmlId:             This :term:`Delivery Service`'s :ref:`ds-xmlid`
+:topology:              The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
+:trRequestHeaders:      If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
+:trResponseHeaders:     If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
+:type:                  The :ref:`ds-types` of this :term:`Delivery Service`
+:typeId:                The integral, unique identifier of the :ref:`ds-types` of this :term:`Delivery Service`
+:xmlId:                 This :term:`Delivery Service`'s :ref:`ds-xmlid`
 
 .. code-block:: http
 	:caption: Response Example
@@ -332,20 +325,17 @@ Request Structure
 :sslKeyVersion:             This integer indicates the :ref:`ds-ssl-key-version`
 :tenantId:                  The integral, unique identifier of the :ref:`ds-tenant` who owns this :term:`Delivery Service`
 :tlsVersions:               An array of explicitly supported :ref:`ds-tls-versions`
-
-	.. versionadded:: 4.0
-
-:topology:          The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
-:trRequestHeaders:  If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
-:trResponseHeaders: If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
-:type:              The :ref:`ds-types` of this :term:`Delivery Service`
-:typeId:            The integral, unique identifier of the :ref:`ds-types` of this :term:`Delivery Service`
-:xmlId:             This :term:`Delivery Service`'s :ref:`ds-xmlid`
+:topology:                  The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
+:trRequestHeaders:          If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
+:trResponseHeaders:         If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
+:type:                      The :ref:`ds-types` of this :term:`Delivery Service`
+:typeId:                    The integral, unique identifier of the :ref:`ds-types` of this :term:`Delivery Service`
+:xmlId:                     This :term:`Delivery Service`'s :ref:`ds-xmlid`
 
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/deliveryservices HTTP/1.1
+	POST /api/5.0/deliveryservices HTTP/1.1
 	User-Agent: python-requests/2.24.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -460,13 +450,9 @@ Response Structure
 :ipv6RoutingEnabled:        A boolean that defines the :ref:`ds-ipv6-routing` setting on this :term:`Delivery Service`
 :lastHeaderRewrite:         A set of :ref:`ds-last-header-rw-rules`
 :lastUpdated:               The date and time at which this :term:`Delivery Service` was last updated, in :rfc:3339 format
-
-	.. versionchanged:: 4.0
-		Prior to API version 4.0, this property used :ref:`non-rfc-datetime`.
-
-:logsEnabled: A boolean that defines the :ref:`ds-logs-enabled` setting on this :term:`Delivery Service`
-:longDesc:    The :ref:`ds-longdesc` of this :term:`Delivery Service`
-:matchList:   The :term:`Delivery Service`'s :ref:`ds-matchlist`
+:logsEnabled:               A boolean that defines the :ref:`ds-logs-enabled` setting on this :term:`Delivery Service`
+:longDesc:                  The :ref:`ds-longdesc` of this :term:`Delivery Service`
+:matchList:                 The :term:`Delivery Service`'s :ref:`ds-matchlist`
 
 	:pattern:   A regular expression - the use of this pattern is dependent on the ``type`` field (backslashes are escaped)
 	:setNumber: An integer that provides explicit ordering of :ref:`ds-matchlist` items - this is used as a priority ranking by Traffic Router, and is not guaranteed to correspond to the ordering of items in the array.
@@ -497,15 +483,12 @@ Response Structure
 :sslKeyVersion:         This integer indicates the :ref:`ds-ssl-key-version`
 :tenantId:              The integral, unique identifier of the :ref:`ds-tenant` who owns this :term:`Delivery Service`
 :tlsVersions:           An array of explicitly supported :ref:`ds-tls-versions`
-
-	.. versionadded:: 4.0
-
-:topology:          The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
-:trRequestHeaders:  If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
-:trResponseHeaders: If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
-:type:              The :ref:`ds-types` of this :term:`Delivery Service`
-:typeId:            The integral, unique identifier of the :ref:`ds-types` of this :term:`Delivery Service`
-:xmlId:             This :term:`Delivery Service`'s :ref:`ds-xmlid`
+:topology:              The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
+:trRequestHeaders:      If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
+:trResponseHeaders:     If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
+:type:                  The :ref:`ds-types` of this :term:`Delivery Service`
+:typeId:                The integral, unique identifier of the :ref:`ds-types` of this :term:`Delivery Service`
+:xmlId:                 This :term:`Delivery Service`'s :ref:`ds-xmlid`
 
 .. code-block:: http
 	:caption: Response Example
@@ -517,7 +500,7 @@ Response Structure
 	Access-Control-Allow-Origin: *
 	Content-Encoding: gzip
 	Content-Type: application/json
-	Location: /api/4.0/deliveryservices?id=6
+	Location: /api/5.0/deliveryservices?id=6
 	Permissions-Policy: interest-cohort=()
 	Set-Cookie: mojolicious=...; Path=/; Expires=Mon, 07 Jun 2021 23:37:37 GMT; Max-Age=3600; HttpOnly
 	Vary: Accept-Encoding
diff --git a/docs/source/api/v4/deliveryservices_id.rst b/docs/source/api/v5/deliveryservices_id.rst
similarity index 91%
copy from docs/source/api/v4/deliveryservices_id.rst
copy to docs/source/api/v5/deliveryservices_id.rst
index 3ba01c06f6..97f66e9205 100644
--- a/docs/source/api/v4/deliveryservices_id.rst
+++ b/docs/source/api/v5/deliveryservices_id.rst
@@ -90,22 +90,18 @@ Request Structure
 :sslKeyVersion:       This integer indicates the :ref:`ds-ssl-key-version`
 :tenantId:            The integral, unique identifier of the :ref:`ds-tenant` who owns this :term:`Delivery Service`
 :tlsVersions:         An array of explicitly supported :ref:`ds-tls-versions`
-
-	.. versionadded:: 4.0
-
-:topology:          The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
-:trRequestHeaders:  If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
-:trResponseHeaders: If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
-:typeId:            The integral, unique identifier of the :ref:`ds-types` of this :term:`Delivery Service`
-:xmlId:             This :term:`Delivery Service`'s :ref:`ds-xmlid`
+:topology:            The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
+:trRequestHeaders:    If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
+:trResponseHeaders:   If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
+:typeId:              The integral, unique identifier of the :ref:`ds-types` of this :term:`Delivery Service`
+:xmlId:               This :term:`Delivery Service`'s :ref:`ds-xmlid`
 
 	.. note:: While this field **must** be present, it is **not** allowed to change; this must be the same as the ``xml_id`` the :term:`Delivery Service` already has. This should almost never be different from the :term:`Delivery Service`'s ``displayName``.
 
-
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/deliveryservices/6 HTTP/1.1
+	PUT /api/5.0/deliveryservices/6 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: python-requests/2.24.0
 	Accept-Encoding: gzip, deflate
@@ -217,13 +213,9 @@ Response Structure
 :ipv6RoutingEnabled:        A boolean that defines the :ref:`ds-ipv6-routing` setting on this :term:`Delivery Service`
 :lastHeaderRewrite:         A set of :ref:`ds-last-header-rw-rules`
 :lastUpdated:               The date and time at which this :term:`Delivery Service` was last updated, in :rfc:3339 format
-
-	.. versionchanged:: 4.0
-		Prior to API version 4.0, this property used :ref:`non-rfc-datetime`.
-
-:logsEnabled: A boolean that defines the :ref:`ds-logs-enabled` setting on this :term:`Delivery Service`
-:longDesc:    The :ref:`ds-longdesc` of this :term:`Delivery Service`
-:matchList:   The :term:`Delivery Service`'s :ref:`ds-matchlist`
+:logsEnabled:               A boolean that defines the :ref:`ds-logs-enabled` setting on this :term:`Delivery Service`
+:longDesc:                  The :ref:`ds-longdesc` of this :term:`Delivery Service`
+:matchList:                 The :term:`Delivery Service`'s :ref:`ds-matchlist`
 
 	:pattern:   A regular expression - the use of this pattern is dependent on the ``type`` field (backslashes are escaped)
 	:setNumber: An integer that provides explicit ordering of :ref:`ds-matchlist` items - this is used as a priority ranking by Traffic Router, and is not guaranteed to correspond to the ordering of items in the array.
@@ -254,15 +246,12 @@ Response Structure
 :sslKeyVersion:         This integer indicates the :ref:`ds-ssl-key-version`
 :tenantId:              The integral, unique identifier of the :ref:`ds-tenant` who owns this :term:`Delivery Service`
 :tlsVersions:           An array of explicitly supported :ref:`ds-tls-versions`
-
-	.. versionadded:: 4.0
-
-:topology:          The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
-:trRequestHeaders:  If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
-:trResponseHeaders: If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
-:type:              The :ref:`ds-types` of this :term:`Delivery Service`
-:typeId:            The integral, unique identifier of the :ref:`ds-types` of this :term:`Delivery Service`
-:xmlId:             This :term:`Delivery Service`'s :ref:`ds-xmlid`
+:topology:              The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
+:trRequestHeaders:      If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
+:trResponseHeaders:     If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
+:type:                  The :ref:`ds-types` of this :term:`Delivery Service`
+:typeId:                The integral, unique identifier of the :ref:`ds-types` of this :term:`Delivery Service`
+:xmlId:                 This :term:`Delivery Service`'s :ref:`ds-xmlid`
 
 .. code-block:: http
 	:caption: Response Example
@@ -390,7 +379,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/deliveryservices/2 HTTP/1.1
+	DELETE /api/5.0/deliveryservices/2 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/deliveryservices_id_capacity.rst b/docs/source/api/v5/deliveryservices_id_capacity.rst
similarity index 100%
copy from docs/source/api/v4/deliveryservices_id_capacity.rst
copy to docs/source/api/v5/deliveryservices_id_capacity.rst
diff --git a/docs/source/api/v4/deliveryservices_id_health.rst b/docs/source/api/v5/deliveryservices_id_health.rst
similarity index 100%
copy from docs/source/api/v4/deliveryservices_id_health.rst
copy to docs/source/api/v5/deliveryservices_id_health.rst
diff --git a/docs/source/api/v4/deliveryservices_id_regexes.rst b/docs/source/api/v5/deliveryservices_id_regexes.rst
similarity index 98%
copy from docs/source/api/v4/deliveryservices_id_regexes.rst
copy to docs/source/api/v5/deliveryservices_id_regexes.rst
index 4c7d3ad719..9106efb12d 100644
--- a/docs/source/api/v4/deliveryservices_id_regexes.rst
+++ b/docs/source/api/v5/deliveryservices_id_regexes.rst
@@ -56,7 +56,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/deliveryservices/1/regexes HTTP/1.1
+	GET /api/5.0/deliveryservices/1/regexes HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -125,7 +125,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/deliveryservices/1/regexes HTTP/1.1
+	POST /api/5.0/deliveryservices/1/regexes HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/deliveryservices_id_regexes_rid.rst b/docs/source/api/v5/deliveryservices_id_regexes_rid.rst
similarity index 98%
copy from docs/source/api/v4/deliveryservices_id_regexes_rid.rst
copy to docs/source/api/v5/deliveryservices_id_regexes_rid.rst
index 781a20db4c..1b8b909f15 100644
--- a/docs/source/api/v4/deliveryservices_id_regexes_rid.rst
+++ b/docs/source/api/v5/deliveryservices_id_regexes_rid.rst
@@ -50,7 +50,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/deliveryservices/1/regexes/2 HTTP/1.1
+	PUT /api/5.0/deliveryservices/1/regexes/2 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -127,7 +127,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/deliveryservices/1/regexes/2 HTTP/1.1
+	DELETE /api/5.0/deliveryservices/1/regexes/2 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/deliveryservices_id_routing.rst b/docs/source/api/v5/deliveryservices_id_routing.rst
similarity index 98%
copy from docs/source/api/v4/deliveryservices_id_routing.rst
copy to docs/source/api/v5/deliveryservices_id_routing.rst
index 0d92b7b789..132cf1aae2 100644
--- a/docs/source/api/v4/deliveryservices_id_routing.rst
+++ b/docs/source/api/v5/deliveryservices_id_routing.rst
@@ -43,7 +43,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/deliveryservices/1/routing HTTP/1.1
+	GET /api/5.0/deliveryservices/1/routing HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/deliveryservices_id_safe.rst b/docs/source/api/v5/deliveryservices_id_safe.rst
similarity index 97%
copy from docs/source/api/v4/deliveryservices_id_safe.rst
copy to docs/source/api/v5/deliveryservices_id_safe.rst
index c6a529b437..84b3edc629 100644
--- a/docs/source/api/v4/deliveryservices_id_safe.rst
+++ b/docs/source/api/v5/deliveryservices_id_safe.rst
@@ -45,7 +45,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/deliveryservices/1/safe HTTP/1.1
+	PUT /api/5.0/deliveryservices/1/safe HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -96,10 +96,6 @@ Response Structure
 :ipv6RoutingEnabled:        A boolean that defines the :ref:`ds-ipv6-routing` setting on this :term:`Delivery Service`
 :lastHeaderRewrite:         A set of :ref:`ds-last-header-rw-rules`
 :lastUpdated:               The date and time at which this :term:`Delivery Service` was last updated, in :rfc:3339 format
-
-	.. versionchanged:: 4.0
-		Prior to API version 4.0, this property used :ref:`non-rfc-datetime`.
-
 :logsEnabled:               A boolean that defines the :ref:`ds-logs-enabled` setting on this :term:`Delivery Service`
 :longDesc:                  The :ref:`ds-longdesc` of this :term:`Delivery Service`
 :matchList:                 The :term:`Delivery Service`'s :ref:`ds-matchlist`
@@ -127,13 +123,10 @@ Response Structure
 :remapText:            :ref:`ds-raw-remap`
 :signed:               ``true`` if  and only if ``signingAlgorithm`` is not ``null``, ``false`` otherwise
 :signingAlgorithm:     Either a :ref:`ds-signing-algorithm` or ``null`` to indicate URL/URI signing is not implemented on this :term:`Delivery Service`
-:rangeSliceBlockSize: An integer that defines the byte block size for the ATS Slice Plugin. It can only and must be set if ``rangeRequestHandling`` is set to 3.
+:rangeSliceBlockSize:  An integer that defines the byte block size for the ATS Slice Plugin. It can only and must be set if ``rangeRequestHandling`` is set to 3.
 :sslKeyVersion:        This integer indicates the :ref:`ds-ssl-key-version`
 :tenantId:             The integral, unique identifier of the :ref:`ds-tenant` who owns this :term:`Delivery Service`
 :tlsVersions:           A list of explicitly supported :ref:`ds-tls-versions`
-
-	.. versionadded:: 4.0
-
 :topology:             The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
 :trRequestHeaders:     If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
 :trResponseHeaders:    If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
diff --git a/docs/source/api/v4/deliveryservices_id_servers.rst b/docs/source/api/v5/deliveryservices_id_servers.rst
similarity index 100%
copy from docs/source/api/v4/deliveryservices_id_servers.rst
copy to docs/source/api/v5/deliveryservices_id_servers.rst
diff --git a/docs/source/api/v4/deliveryservices_id_servers_eligible.rst b/docs/source/api/v5/deliveryservices_id_servers_eligible.rst
similarity index 100%
copy from docs/source/api/v4/deliveryservices_id_servers_eligible.rst
copy to docs/source/api/v5/deliveryservices_id_servers_eligible.rst
diff --git a/docs/source/api/v4/deliveryservices_id_urlkeys.rst b/docs/source/api/v5/deliveryservices_id_urlkeys.rst
similarity index 98%
copy from docs/source/api/v4/deliveryservices_id_urlkeys.rst
copy to docs/source/api/v5/deliveryservices_id_urlkeys.rst
index cd1b51f174..6a227c4812 100644
--- a/docs/source/api/v4/deliveryservices_id_urlkeys.rst
+++ b/docs/source/api/v5/deliveryservices_id_urlkeys.rst
@@ -45,7 +45,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/deliveryservices/1/urlkeys HTTP/1.1
+	GET /api/5.0/deliveryservices/1/urlkeys HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/deliveryservices_regexes.rst b/docs/source/api/v5/deliveryservices_regexes.rst
similarity index 100%
copy from docs/source/api/v4/deliveryservices_regexes.rst
copy to docs/source/api/v5/deliveryservices_regexes.rst
diff --git a/docs/source/api/v4/deliveryservices_required_capabilities.rst b/docs/source/api/v5/deliveryservices_required_capabilities.rst
similarity index 98%
copy from docs/source/api/v4/deliveryservices_required_capabilities.rst
copy to docs/source/api/v5/deliveryservices_required_capabilities.rst
index 92561630d9..6761728b5f 100644
--- a/docs/source/api/v4/deliveryservices_required_capabilities.rst
+++ b/docs/source/api/v5/deliveryservices_required_capabilities.rst
@@ -58,7 +58,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/deliveryservices_required_capabilities HTTP/1.1
+	GET /api/5.0/deliveryservices_required_capabilities HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -122,7 +122,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/deliveryservices_required_capabilities HTTP/1.1
+	POST /api/5.0/deliveryservices_required_capabilities HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -187,7 +187,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/deliveryservices_required_capabilities HTTP/1.1
+	POST /api/5.0/deliveryservices_required_capabilities HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/deliveryservices_sslkeys_add.rst b/docs/source/api/v5/deliveryservices_sslkeys_add.rst
similarity index 97%
copy from docs/source/api/v4/deliveryservices_sslkeys_add.rst
copy to docs/source/api/v5/deliveryservices_sslkeys_add.rst
index 2e68d1c869..3f1840fc9a 100644
--- a/docs/source/api/v4/deliveryservices_sslkeys_add.rst
+++ b/docs/source/api/v5/deliveryservices_sslkeys_add.rst
@@ -45,7 +45,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/deliveryservices/sslkeys/add HTTP/1.1
+	POST /api/5.0/deliveryservices/sslkeys/add HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	Content-Type: application/json
 
diff --git a/docs/source/api/v4/deliveryservices_sslkeys_generate.rst b/docs/source/api/v5/deliveryservices_sslkeys_generate.rst
similarity index 97%
copy from docs/source/api/v4/deliveryservices_sslkeys_generate.rst
copy to docs/source/api/v5/deliveryservices_sslkeys_generate.rst
index 282e31efc3..a383fd79a9 100644
--- a/docs/source/api/v4/deliveryservices_sslkeys_generate.rst
+++ b/docs/source/api/v5/deliveryservices_sslkeys_generate.rst
@@ -45,7 +45,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/deliveryservices/sslkeys/generate HTTP/1.1
+	POST /api/5.0/deliveryservices/sslkeys/generate HTTP/1.1
 	Content-Type: application/json
 
 	{
diff --git a/docs/source/api/v4/deliveryservices_sslkeys_generate_acme.rst b/docs/source/api/v5/deliveryservices_sslkeys_generate_acme.rst
similarity index 95%
copy from docs/source/api/v4/deliveryservices_sslkeys_generate_acme.rst
copy to docs/source/api/v5/deliveryservices_sslkeys_generate_acme.rst
index 9a1b185291..35827e22c9 100644
--- a/docs/source/api/v4/deliveryservices_sslkeys_generate_acme.rst
+++ b/docs/source/api/v5/deliveryservices_sslkeys_generate_acme.rst
@@ -19,8 +19,6 @@
 ``deliveryservices/sslkeys/generate/acme``
 ******************************************
 
-.. versionadded:: 4.0
-
 ``POST``
 ========
 Generates an SSL certificate and private key using :abbr:`ACME (Automatic Certificate Management Environment)` protocol for a :term:`Delivery Service`
@@ -45,7 +43,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/deliveryservices/sslkeys/generate/acme HTTP/1.1
+	POST /api/5.0/deliveryservices/sslkeys/generate/acme HTTP/1.1
 	Content-Type: application/json
 
 	{
@@ -65,7 +63,7 @@ Response Structure
 
 	{ "alerts": [{
 		"level": "success",
-		"text": "Beginning async ACME call for demo1 using Lets Encrypt. This may take a few minutes. Status updates can be found here: /api/4.0/async_status/1"
+		"text": "Beginning async ACME call for demo1 using Lets Encrypt. This may take a few minutes. Status updates can be found here: /api/5.0/async_status/1"
 	}]}
 
 .. [#needOne] Either the ``key`` or the ``deliveryservice`` field must be provided. If both are provided, then they must match.
diff --git a/docs/source/api/v4/deliveryservices_sslkeys_generate_letsencrypt.rst b/docs/source/api/v5/deliveryservices_sslkeys_generate_letsencrypt.rst
similarity index 96%
copy from docs/source/api/v4/deliveryservices_sslkeys_generate_letsencrypt.rst
copy to docs/source/api/v5/deliveryservices_sslkeys_generate_letsencrypt.rst
index e4599b3924..424f6988e2 100644
--- a/docs/source/api/v4/deliveryservices_sslkeys_generate_letsencrypt.rst
+++ b/docs/source/api/v5/deliveryservices_sslkeys_generate_letsencrypt.rst
@@ -44,7 +44,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/deliveryservices/sslkeys/generate/letsencrypt HTTP/1.1
+	POST /api/5.0/deliveryservices/sslkeys/generate/letsencrypt HTTP/1.1
 	Content-Type: application/json
 
 	{
@@ -66,7 +66,7 @@ Response Structure
 		"text": "This endpoint is deprecated, please use /deliveryservices/sslkeys/generate/acme instead."
 	},{
 		"level": "success",
-		"text": "Beginning async ACME call for demo1 using Lets Encrypt. This may take a few minutes. Status updates can be found here: /api/4.0/async_status/1"
+		"text": "Beginning async ACME call for demo1 using Lets Encrypt. This may take a few minutes. Status updates can be found here: /api/5.0/async_status/1"
 	}]}
 
 .. [#needOne] Either the ``key`` or the ``deliveryservice`` field must be provided. If both are provided, then they must match.
diff --git a/docs/source/api/v4/deliveryservices_xmlid_servers.rst b/docs/source/api/v5/deliveryservices_xmlid_servers.rst
similarity index 98%
copy from docs/source/api/v4/deliveryservices_xmlid_servers.rst
copy to docs/source/api/v5/deliveryservices_xmlid_servers.rst
index d824467e72..7790933b04 100644
--- a/docs/source/api/v4/deliveryservices_xmlid_servers.rst
+++ b/docs/source/api/v5/deliveryservices_xmlid_servers.rst
@@ -43,7 +43,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/deliveryservices/test/servers HTTP/1.1
+	POST /api/5.0/deliveryservices/test/servers HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/deliveryservices_xmlid_urisignkeys.rst b/docs/source/api/v5/deliveryservices_xmlid_urisignkeys.rst
similarity index 100%
copy from docs/source/api/v4/deliveryservices_xmlid_urisignkeys.rst
copy to docs/source/api/v5/deliveryservices_xmlid_urisignkeys.rst
diff --git a/docs/source/api/v4/deliveryservices_xmlid_xmlid_sslkeys.rst b/docs/source/api/v5/deliveryservices_xmlid_xmlid_sslkeys.rst
similarity index 99%
copy from docs/source/api/v4/deliveryservices_xmlid_xmlid_sslkeys.rst
copy to docs/source/api/v5/deliveryservices_xmlid_xmlid_sslkeys.rst
index 992cb063ce..bd00ddd4ec 100644
--- a/docs/source/api/v4/deliveryservices_xmlid_xmlid_sslkeys.rst
+++ b/docs/source/api/v5/deliveryservices_xmlid_xmlid_sslkeys.rst
@@ -66,14 +66,12 @@ Response Structure
 :city:            An optional field which, if present, contains the city entered by the user when generating the SSL certificate\ [1]_
 :country:         An optional field which, if present, contains the country entered by the user when generating the SSL certificate\ [1]_
 :deliveryservice: The 'xml_id' of the :term:`Delivery Service` for which the certificate was generated
+:expiration:      The expiration date of the certificate for the :term:`Delivery Service` in :rfc:`3339` format
 :hostname:        The hostname generated by Traffic Ops that is used as the common name when generating the certificate - this will be a FQDN for DNS :term:`Delivery Services` and a wildcard URL for HTTP :term:`Delivery Services`
 :organization:    An optional field which, if present, contains the organization entered by the user when generating certificate\ [1]_
+:sans:            The :abbr:`SANs (Subject Alternate Names)` from the SSL certificate.
 :state:           An optional field which, if present, contains the state entered by the user when generating certificate\ [1]_
 :version:         An integer that defines the "version" of the key - which may be thought of as the sequential generation; that is, the higher the number the more recent the key
-:expiration:      The expiration date of the certificate for the :term:`Delivery Service` in :rfc:`3339` format
-:sans:            The :abbr:`SANs (Subject Alternate Names)` from the SSL certificate.
-
-	.. versionadded:: 4.0
 
 .. code-block:: http
 	:caption: Response Example
diff --git a/docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys.rst b/docs/source/api/v5/deliveryservices_xmlid_xmlid_urlkeys.rst
similarity index 100%
copy from docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys.rst
copy to docs/source/api/v5/deliveryservices_xmlid_xmlid_urlkeys.rst
diff --git a/docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys_copyfromxmlid_copyfromxmlid.rst b/docs/source/api/v5/deliveryservices_xmlid_xmlid_urlkeys_copyfromxmlid_copyfromxmlid.rst
similarity index 100%
copy from docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys_copyfromxmlid_copyfromxmlid.rst
copy to docs/source/api/v5/deliveryservices_xmlid_xmlid_urlkeys_copyfromxmlid_copyfromxmlid.rst
diff --git a/docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys_generate.rst b/docs/source/api/v5/deliveryservices_xmlid_xmlid_urlkeys_generate.rst
similarity index 100%
copy from docs/source/api/v4/deliveryservices_xmlid_xmlid_urlkeys_generate.rst
copy to docs/source/api/v5/deliveryservices_xmlid_xmlid_urlkeys_generate.rst
diff --git a/docs/source/api/v4/deliveryserviceserver.rst b/docs/source/api/v5/deliveryserviceserver.rst
similarity index 98%
copy from docs/source/api/v4/deliveryserviceserver.rst
copy to docs/source/api/v5/deliveryserviceserver.rst
index e3c3f94272..e8269574b1 100644
--- a/docs/source/api/v4/deliveryserviceserver.rst
+++ b/docs/source/api/v5/deliveryserviceserver.rst
@@ -47,7 +47,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/deliveryserviceserver?page=1&limit=2&orderby=lastUpdated HTTP/1.1
+	GET /api/5.0/deliveryserviceserver?page=1&limit=2&orderby=lastUpdated HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -118,7 +118,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/deliveryserviceserver HTTP/1.1
+	POST /api/5.0/deliveryserviceserver HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/deliveryserviceserver_dsid_serverid.rst b/docs/source/api/v5/deliveryserviceserver_dsid_serverid.rst
similarity index 100%
copy from docs/source/api/v4/deliveryserviceserver_dsid_serverid.rst
copy to docs/source/api/v5/deliveryserviceserver_dsid_serverid.rst
diff --git a/docs/source/api/v4/divisions.rst b/docs/source/api/v5/divisions.rst
similarity index 99%
copy from docs/source/api/v4/divisions.rst
copy to docs/source/api/v5/divisions.rst
index 77e6627043..ba6edf6188 100644
--- a/docs/source/api/v4/divisions.rst
+++ b/docs/source/api/v5/divisions.rst
@@ -104,7 +104,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/divisions HTTP/1.1
+	POST /api/5.0/divisions HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/divisions_id.rst b/docs/source/api/v5/divisions_id.rst
similarity index 98%
copy from docs/source/api/v4/divisions_id.rst
copy to docs/source/api/v5/divisions_id.rst
index 4096468513..b6e18cc697 100644
--- a/docs/source/api/v4/divisions_id.rst
+++ b/docs/source/api/v5/divisions_id.rst
@@ -44,7 +44,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/divisions/3 HTTP/1.1
+	PUT /api/5.0/divisions/3 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -110,7 +110,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/divisions/3 HTTP/1.1
+	DELETE /api/5.0/divisions/3 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/federation_resolvers.rst b/docs/source/api/v5/federation_resolvers.rst
similarity index 98%
copy from docs/source/api/v4/federation_resolvers.rst
copy to docs/source/api/v5/federation_resolvers.rst
index 0e14ba97b4..5753dc5b88 100644
--- a/docs/source/api/v4/federation_resolvers.rst
+++ b/docs/source/api/v5/federation_resolvers.rst
@@ -59,7 +59,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/federation_resolvers?type=RESOLVE6 HTTP/1.1
+	GET /api/5.0/federation_resolvers?type=RESOLVE6 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.63.0
 	Accept: */*
@@ -119,7 +119,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/federation_resolvers HTTP/1.1
+	POST /api/5.0/federation_resolvers HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.63.0
 	Accept: */*
@@ -190,7 +190,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/federation_resolvers?id=4 HTTP/1.1
+	DELETE /api/5.0/federation_resolvers?id=4 HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/federations.rst b/docs/source/api/v5/federations.rst
similarity index 98%
copy from docs/source/api/v4/federations.rst
copy to docs/source/api/v5/federations.rst
index daabb48c5f..cfe218c6e2 100644
--- a/docs/source/api/v4/federations.rst
+++ b/docs/source/api/v5/federations.rst
@@ -103,7 +103,7 @@ The request payload is an array of objects that describe Delivery Service :term:
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/federations HTTP/1.1
+	POST /api/5.0/federations HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -163,7 +163,7 @@ No parameters available
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/federations HTTP/1.1
+	DELETE /api/5.0/federations HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -217,7 +217,7 @@ The request payload is an array of objects that describe Delivery Service :term:
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/federations HTTP/1.1
+	PUT /api/5.0/federations HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/federations_all.rst b/docs/source/api/v5/federations_all.rst
similarity index 98%
copy from docs/source/api/v4/federations_all.rst
copy to docs/source/api/v5/federations_all.rst
index 53d0e00501..d0e7acc265 100644
--- a/docs/source/api/v4/federations_all.rst
+++ b/docs/source/api/v5/federations_all.rst
@@ -35,7 +35,7 @@ No parameters available.
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/federations/all HTTP/1.1
+	GET /api/5.0/federations/all HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/federations_id_deliveryservices.rst b/docs/source/api/v5/federations_id_deliveryservices.rst
similarity index 98%
copy from docs/source/api/v4/federations_id_deliveryservices.rst
copy to docs/source/api/v5/federations_id_deliveryservices.rst
index a1a1f47d5a..2bf70f5b10 100644
--- a/docs/source/api/v4/federations_id_deliveryservices.rst
+++ b/docs/source/api/v5/federations_id_deliveryservices.rst
@@ -61,7 +61,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/federations/1/deliveryservices HTTP/1.1
+	GET /api/5.0/federations/1/deliveryservices HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
@@ -127,7 +127,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/federations/1/deliveryservices HTTP/1.1
+	POST /api/5.0/federations/1/deliveryservices HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
@@ -172,4 +172,3 @@ Response Structure
 		],
 		"replace": true
 	}}
-
diff --git a/docs/source/api/v4/federations_id_deliveryservices_id.rst b/docs/source/api/v5/federations_id_deliveryservices_id.rst
similarity index 98%
copy from docs/source/api/v4/federations_id_deliveryservices_id.rst
copy to docs/source/api/v5/federations_id_deliveryservices_id.rst
index 22035435dd..88154e5cf0 100644
--- a/docs/source/api/v4/federations_id_deliveryservices_id.rst
+++ b/docs/source/api/v5/federations_id_deliveryservices_id.rst
@@ -43,7 +43,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/federations/1/deliveryservices/1 HTTP/1.1
+	DELETE /api/5.0/federations/1/deliveryservices/1 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
diff --git a/docs/source/api/v4/federations_id_federation_resolvers.rst b/docs/source/api/v5/federations_id_federation_resolvers.rst
similarity index 97%
copy from docs/source/api/v4/federations_id_federation_resolvers.rst
copy to docs/source/api/v5/federations_id_federation_resolvers.rst
index 1bfa79958b..9847cbbb97 100644
--- a/docs/source/api/v4/federations_id_federation_resolvers.rst
+++ b/docs/source/api/v5/federations_id_federation_resolvers.rst
@@ -41,7 +41,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/federations/1/federation_resolvers HTTP/1.1
+	GET /api/5.0/federations/1/federation_resolvers HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
@@ -110,7 +110,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/federations/1/federation_resolvers HTTP/1.1
+	POST /api/5.0/federations/1/federation_resolvers HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
diff --git a/docs/source/api/v4/federations_id_users.rst b/docs/source/api/v5/federations_id_users.rst
similarity index 99%
copy from docs/source/api/v4/federations_id_users.rst
copy to docs/source/api/v5/federations_id_users.rst
index b7d87191f1..9eccda0d31 100644
--- a/docs/source/api/v4/federations_id_users.rst
+++ b/docs/source/api/v5/federations_id_users.rst
@@ -117,7 +117,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/federations/1/users HTTP/1.1
+	POST /api/5.0/federations/1/users HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
diff --git a/docs/source/api/v4/federations_id_users_id.rst b/docs/source/api/v5/federations_id_users_id.rst
similarity index 98%
copy from docs/source/api/v4/federations_id_users_id.rst
copy to docs/source/api/v5/federations_id_users_id.rst
index 4296fa396c..4df1bff953 100644
--- a/docs/source/api/v4/federations_id_users_id.rst
+++ b/docs/source/api/v5/federations_id_users_id.rst
@@ -43,7 +43,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Structure
 
-	DELETE /api/4.0/federations/1/users/2 HTTP/1.1
+	DELETE /api/5.0/federations/1/users/2 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
diff --git a/docs/source/api/v4/isos.rst b/docs/source/api/v5/isos.rst
similarity index 99%
copy from docs/source/api/v4/isos.rst
copy to docs/source/api/v5/isos.rst
index c24ca44e69..4b04d62cdd 100644
--- a/docs/source/api/v4/isos.rst
+++ b/docs/source/api/v5/isos.rst
@@ -60,7 +60,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/isos HTTP/1.1
+	POST /api/5.0/isos HTTP/1.1
 	Host: some.trafficops.host
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -107,4 +107,3 @@ ISO image as a streaming download.
 	Transfer-Encoding: chunked
 	Whole-Content-sha512: sLSVQGrLCQ4hGQhv2reragQHWNi2aKMcz2c/HMAH45tLcZ1LenPyOzWRcRfHUNbV4PEEKOoiTfwE2HlA+WtRIQ==
 	X-Server-Name: traffic_ops_golang/
-
diff --git a/docs/source/api/v4/jobs.rst b/docs/source/api/v5/jobs.rst
similarity index 98%
copy from docs/source/api/v4/jobs.rst
copy to docs/source/api/v5/jobs.rst
index ed1eaeebd6..5fc8aba2e9 100644
--- a/docs/source/api/v4/jobs.rst
+++ b/docs/source/api/v5/jobs.rst
@@ -57,7 +57,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/jobs?id=1&dsId=1&userId=2 HTTP/1.1
+	GET /api/5.0/jobs?id=1&dsId=1&userId=2 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: python-requests/2.20.1
 	Accept-Encoding: gzip, deflate
@@ -126,7 +126,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/jobs HTTP/1.1
+	POST /api/5.0/jobs HTTP/1.1
 	User-Agent: python-requests/2.25.1
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -160,7 +160,7 @@ Response Structure
 	HTTP/1.1 200 OK
 	Content-Encoding: gzip
 	Content-Type: application/json
-	Location: https://localhost:6443/api/4.0/jobs?id=1
+	Location: https://localhost:6443/api/5.0/jobs?id=1
 	Permissions-Policy: interest-cohort=()
 	Set-Cookie: mojolicious=...
 	Vary: Accept-Encoding
@@ -220,7 +220,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/jobs?id=1 HTTP/1.1
+	PUT /api/5.0/jobs?id=1 HTTP/1.1
 	User-Agent: python-requests/2.25.1
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -305,7 +305,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/jobs?id=1 HTTP/1.1
+	DELETE /api/5.0/jobs?id=1 HTTP/1.1
 	User-Agent: python-requests/2.25.1
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/letsencrypt_autorenew.rst b/docs/source/api/v5/letsencrypt_autorenew.rst
similarity index 100%
copy from docs/source/api/v4/letsencrypt_autorenew.rst
copy to docs/source/api/v5/letsencrypt_autorenew.rst
diff --git a/docs/source/api/v4/letsencrypt_dnsrecords.rst b/docs/source/api/v5/letsencrypt_dnsrecords.rst
similarity index 97%
copy from docs/source/api/v4/letsencrypt_dnsrecords.rst
copy to docs/source/api/v5/letsencrypt_dnsrecords.rst
index 1295cff547..6db008ab83 100644
--- a/docs/source/api/v4/letsencrypt_dnsrecords.rst
+++ b/docs/source/api/v5/letsencrypt_dnsrecords.rst
@@ -41,7 +41,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/letsencrypt/dnsrecord?fqdn=_acme-challenge.demo1.example.com. HTTP/1.1
+	GET /api/5.0/letsencrypt/dnsrecord?fqdn=_acme-challenge.demo1.example.com. HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/logs.rst b/docs/source/api/v5/logs.rst
similarity index 98%
copy from docs/source/api/v4/logs.rst
copy to docs/source/api/v5/logs.rst
index c714ebb9bc..84f7afe912 100644
--- a/docs/source/api/v4/logs.rst
+++ b/docs/source/api/v5/logs.rst
@@ -54,7 +54,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/logs?days=1&limit=2&username=admin HTTP/1.1
+	GET /api/5.0/logs?days=1&limit=2&username=admin HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/logs_newcount.rst b/docs/source/api/v5/logs_newcount.rst
similarity index 100%
copy from docs/source/api/v4/logs_newcount.rst
copy to docs/source/api/v5/logs_newcount.rst
diff --git a/docs/source/api/v4/multiple_server_capabilities.rst b/docs/source/api/v5/multiple_server_capabilities.rst
similarity index 97%
copy from docs/source/api/v4/multiple_server_capabilities.rst
copy to docs/source/api/v5/multiple_server_capabilities.rst
index 37f56b1549..b631807553 100644
--- a/docs/source/api/v4/multiple_server_capabilities.rst
+++ b/docs/source/api/v5/multiple_server_capabilities.rst
@@ -19,8 +19,6 @@
 ``multiple_server_capabilities``
 ********************************
 
-.. versionadded:: 4.1
-
 ``PUT``
 ========
 Associates a list of :term:`Server Capability` to a server. The API call replaces all the server capabilities assigned to a server with the ones specified in the serverCapabilities field.
@@ -38,7 +36,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.1/multiple_server_capabilities/ HTTP/1.1
+	PUT /api/5.0/multiple_server_capabilities/ HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/oc_ci_configuration.rst b/docs/source/api/v5/oc_ci_configuration.rst
similarity index 97%
copy from docs/source/api/v4/oc_ci_configuration.rst
copy to docs/source/api/v5/oc_ci_configuration.rst
index c497785b98..ad2127be01 100644
--- a/docs/source/api/v4/oc_ci_configuration.rst
+++ b/docs/source/api/v5/oc_ci_configuration.rst
@@ -55,7 +55,7 @@ This requires authorization using a :abbr:`JWT (JSON Web Token)` provided by the
 .. code-block:: http
 	:caption: Example /OC/CI/configuration Request
 
-	PUT /api/4.0/oc/ci/configuration HTTP/1.1
+	PUT /api/5.0/oc/ci/configuration HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -101,7 +101,7 @@ Response Structure
 
 	{ "alerts": [
 		{
-			"text": "CDNi configuration update request received. Status updates can be found here: /api/4.0/async_status/1",
+			"text": "CDNi configuration update request received. Status updates can be found here: /api/5.0/async_status/1",
 			"level": "success"
 		}
 	]}
diff --git a/docs/source/api/v4/oc_ci_configuration_host.rst b/docs/source/api/v5/oc_ci_configuration_host.rst
similarity index 97%
copy from docs/source/api/v4/oc_ci_configuration_host.rst
copy to docs/source/api/v5/oc_ci_configuration_host.rst
index 688e2bf523..48f1919341 100644
--- a/docs/source/api/v4/oc_ci_configuration_host.rst
+++ b/docs/source/api/v5/oc_ci_configuration_host.rst
@@ -62,7 +62,7 @@ This requires authorization using a :abbr:`JWT (JSON Web Token)` provided by the
 .. code-block:: http
 	:caption: Example /OC/CI/configuration Request
 
-	PUT /api/4.0/oc/ci/configuration/example.com HTTP/1.1
+	PUT /api/5.0/oc/ci/configuration/example.com HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -107,7 +107,7 @@ Response Structure
 
 	{ "alerts": [
 		{
-			"text": "CDNi configuration update request received. Status updates can be found here: /api/4.0/async_status/1",
+			"text": "CDNi configuration update request received. Status updates can be found here: /api/5.0/async_status/1",
 			"level": "success"
 		}
 	]}
diff --git a/docs/source/api/v4/oc_ci_configuration_request_id_approved.rst b/docs/source/api/v5/oc_ci_configuration_request_id_approved.rst
similarity index 100%
copy from docs/source/api/v4/oc_ci_configuration_request_id_approved.rst
copy to docs/source/api/v5/oc_ci_configuration_request_id_approved.rst
diff --git a/docs/source/api/v4/oc_ci_configuration_requests.rst b/docs/source/api/v5/oc_ci_configuration_requests.rst
similarity index 100%
copy from docs/source/api/v4/oc_ci_configuration_requests.rst
copy to docs/source/api/v5/oc_ci_configuration_requests.rst
diff --git a/docs/source/api/v4/oc_fci_advertisement.rst b/docs/source/api/v5/oc_fci_advertisement.rst
similarity index 100%
copy from docs/source/api/v4/oc_fci_advertisement.rst
copy to docs/source/api/v5/oc_fci_advertisement.rst
diff --git a/docs/source/api/v4/origins.rst b/docs/source/api/v5/origins.rst
similarity index 99%
copy from docs/source/api/v4/origins.rst
copy to docs/source/api/v5/origins.rst
index 6003859719..c503ae8258 100644
--- a/docs/source/api/v4/origins.rst
+++ b/docs/source/api/v5/origins.rst
@@ -70,7 +70,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/origins?name=demo1 HTTP/1.1
+	GET /api/5.0/origins?name=demo1 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -169,7 +169,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/origins HTTP/1.1
+	POST /api/5.0/origins HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -288,7 +288,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/origins?id=2 HTTP/1.1
+	PUT /api/5.0/origins?id=2 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -394,7 +394,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/origins?id=2 HTTP/1.1
+	DELETE /api/5.0/origins?id=2 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/osversions.rst b/docs/source/api/v5/osversions.rst
similarity index 100%
copy from docs/source/api/v4/osversions.rst
copy to docs/source/api/v5/osversions.rst
diff --git a/docs/source/api/v4/parameterprofile.rst b/docs/source/api/v5/parameterprofile.rst
similarity index 98%
copy from docs/source/api/v4/parameterprofile.rst
copy to docs/source/api/v5/parameterprofile.rst
index 47a41667fb..9a930534e0 100644
--- a/docs/source/api/v4/parameterprofile.rst
+++ b/docs/source/api/v5/parameterprofile.rst
@@ -37,7 +37,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/parameterprofile HTTP/1.1
+	POST /api/5.0/parameterprofile HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/parameters.rst b/docs/source/api/v5/parameters.rst
similarity index 98%
copy from docs/source/api/v4/parameters.rst
copy to docs/source/api/v5/parameters.rst
index 90ba968c52..803c6e1573 100644
--- a/docs/source/api/v4/parameters.rst
+++ b/docs/source/api/v5/parameters.rst
@@ -60,7 +60,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/parameters?configFile=records.config&name=location HTTP/1.1
+	GET /api/5.0/parameters?configFile=records.config&name=location HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -127,7 +127,7 @@ The request body may be in one of two formats, a single :term:`Parameter` object
 .. code-block:: http
 	:caption: Request Example - Single Object Format
 
-	POST /api/4.0/parameters HTTP/1.1
+	POST /api/5.0/parameters HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -145,7 +145,7 @@ The request body may be in one of two formats, a single :term:`Parameter` object
 .. code-block:: http
 	:caption: Request Example - Array Format
 
-	POST /api/4.0/parameters HTTP/1.1
+	POST /api/5.0/parameters HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/parameters_id.rst b/docs/source/api/v5/parameters_id.rst
similarity index 98%
copy from docs/source/api/v4/parameters_id.rst
copy to docs/source/api/v5/parameters_id.rst
index 24d8b0f9a9..592673e098 100644
--- a/docs/source/api/v4/parameters_id.rst
+++ b/docs/source/api/v5/parameters_id.rst
@@ -46,7 +46,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/parameters/124 HTTP/1.1
+	PUT /api/5.0/parameters/124 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -124,7 +124,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/parameters/124 HTTP/1.1
+	DELETE /api/5.0/parameters/124 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/phys_locations.rst b/docs/source/api/v5/phys_locations.rst
similarity index 99%
copy from docs/source/api/v4/phys_locations.rst
copy to docs/source/api/v5/phys_locations.rst
index fe163bd1f4..9aae8be2b8 100644
--- a/docs/source/api/v4/phys_locations.rst
+++ b/docs/source/api/v5/phys_locations.rst
@@ -58,7 +58,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/phys_locations?name=CDN_in_a_Box HTTP/1.1
+	GET /api/5.0/phys_locations?name=CDN_in_a_Box HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -142,7 +142,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/phys_locations HTTP/1.1
+	POST /api/5.0/phys_locations HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/phys_locations_id.rst b/docs/source/api/v5/phys_locations_id.rst
similarity index 98%
copy from docs/source/api/v4/phys_locations_id.rst
copy to docs/source/api/v5/phys_locations_id.rst
index fff3232c3c..b945bf2177 100644
--- a/docs/source/api/v4/phys_locations_id.rst
+++ b/docs/source/api/v5/phys_locations_id.rst
@@ -54,7 +54,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Structure
 
-	PUT /api/4.0/phys_locations/2 HTTP/1.1
+	PUT /api/5.0/phys_locations/2 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -155,7 +155,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/phys_locations/3 HTTP/1.1
+	DELETE /api/5.0/phys_locations/3 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/ping.rst b/docs/source/api/v5/ping.rst
similarity index 98%
copy from docs/source/api/v4/ping.rst
copy to docs/source/api/v5/ping.rst
index 60176bc475..24e6d4b788 100644
--- a/docs/source/api/v4/ping.rst
+++ b/docs/source/api/v5/ping.rst
@@ -32,7 +32,7 @@ No parameters available.
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/ping HTTP/1.1
+	GET /api/5.0/ping HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/plugins.rst b/docs/source/api/v5/plugins.rst
similarity index 98%
copy from docs/source/api/v4/plugins.rst
copy to docs/source/api/v5/plugins.rst
index 95e24af091..677fcce25c 100644
--- a/docs/source/api/v4/plugins.rst
+++ b/docs/source/api/v5/plugins.rst
@@ -34,7 +34,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/plugins HTTP/1.1
+	GET /api/5.0/plugins HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/profileparameter.rst b/docs/source/api/v5/profileparameter.rst
similarity index 98%
copy from docs/source/api/v4/profileparameter.rst
copy to docs/source/api/v5/profileparameter.rst
index cbe652adf5..594be261f7 100644
--- a/docs/source/api/v4/profileparameter.rst
+++ b/docs/source/api/v5/profileparameter.rst
@@ -38,7 +38,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/profileparameter HTTP/1.1
+	POST /api/5.0/profileparameter HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/profileparameters.rst b/docs/source/api/v5/profileparameters.rst
similarity index 98%
copy from docs/source/api/v4/profileparameters.rst
copy to docs/source/api/v5/profileparameters.rst
index 5ca1adb198..58e184d3ae 100644
--- a/docs/source/api/v4/profileparameters.rst
+++ b/docs/source/api/v5/profileparameters.rst
@@ -112,7 +112,7 @@ Single Object Format
 .. code-block:: http
 	:caption: Request Example - Single Object Format
 
-	POST /api/4.0/profileparameters HTTP/1.1
+	POST /api/5.0/profileparameters HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -133,7 +133,7 @@ Array Format
 .. code-block:: http
 	:caption: Request Example - Array Format
 
-	POST /api/4.0/profileparameters HTTP/1.1
+	POST /api/5.0/profileparameters HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/profileparameters_profileID_parameterID.rst b/docs/source/api/v5/profileparameters_profileID_parameterID.rst
similarity index 98%
copy from docs/source/api/v4/profileparameters_profileID_parameterID.rst
copy to docs/source/api/v5/profileparameters_profileID_parameterID.rst
index a48e20cd2a..18fd0aff2d 100644
--- a/docs/source/api/v4/profileparameters_profileID_parameterID.rst
+++ b/docs/source/api/v5/profileparameters_profileID_parameterID.rst
@@ -43,7 +43,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/profileparameters/18/129 HTTP/1.1
+	DELETE /api/5.0/profileparameters/18/129 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/profiles.rst b/docs/source/api/v5/profiles.rst
similarity index 98%
copy from docs/source/api/v4/profiles.rst
copy to docs/source/api/v5/profiles.rst
index 2b61218cbc..d00c2febec 100644
--- a/docs/source/api/v4/profiles.rst
+++ b/docs/source/api/v5/profiles.rst
@@ -45,7 +45,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/profiles?name=ATS_EDGE_TIER_CACHE HTTP/1.1
+	GET /api/5.0/profiles?name=ATS_EDGE_TIER_CACHE HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
@@ -110,7 +110,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/profiles HTTP/1.1
+	POST /api/5.0/profiles HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
diff --git a/docs/source/api/v4/profiles_id.rst b/docs/source/api/v5/profiles_id.rst
similarity index 98%
copy from docs/source/api/v4/profiles_id.rst
copy to docs/source/api/v5/profiles_id.rst
index 3b901d4066..29f970774f 100644
--- a/docs/source/api/v4/profiles_id.rst
+++ b/docs/source/api/v5/profiles_id.rst
@@ -49,7 +49,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/profiles/16 HTTP/1.1
+	PUT /api/5.0/profiles/16 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
@@ -131,7 +131,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/profiles/16 HTTP/1.1
+	DELETE /api/5.0/profiles/16 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
diff --git a/docs/source/api/v4/profiles_id_export.rst b/docs/source/api/v5/profiles_id_export.rst
similarity index 98%
copy from docs/source/api/v4/profiles_id_export.rst
copy to docs/source/api/v5/profiles_id_export.rst
index bd28ad230d..fd851433e2 100644
--- a/docs/source/api/v4/profiles_id_export.rst
+++ b/docs/source/api/v5/profiles_id_export.rst
@@ -40,7 +40,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/profiles/3/export HTTP/1.1
+	GET /api/5.0/profiles/3/export HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
diff --git a/docs/source/api/v4/profiles_id_parameters.rst b/docs/source/api/v5/profiles_id_parameters.rst
similarity index 98%
copy from docs/source/api/v4/profiles_id_parameters.rst
copy to docs/source/api/v5/profiles_id_parameters.rst
index da2c84e2ef..3181404734 100644
--- a/docs/source/api/v4/profiles_id_parameters.rst
+++ b/docs/source/api/v5/profiles_id_parameters.rst
@@ -42,7 +42,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/parameters/profile/GLOBAL HTTP/1.1
+	GET /api/5.0/parameters/profile/GLOBAL HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -139,7 +139,7 @@ Single Parameter Format
 .. code-block:: http
 	:caption: Response Example - Single Parameter Format
 
-	POST /api/4.0/profiles/18/parameters HTTP/1.1
+	POST /api/5.0/profiles/18/parameters HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -165,7 +165,7 @@ Parameter Array Format
 .. code-block:: http
 	:caption: Request Example - Parameter Array Format
 
-	POST /api/4.0/profiles/18/parameters HTTP/1.1
+	POST /api/5.0/profiles/18/parameters HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/profiles_import.rst b/docs/source/api/v5/profiles_import.rst
similarity index 98%
copy from docs/source/api/v4/profiles_import.rst
copy to docs/source/api/v5/profiles_import.rst
index 0422314a31..85b6d2e3ca 100644
--- a/docs/source/api/v4/profiles_import.rst
+++ b/docs/source/api/v5/profiles_import.rst
@@ -50,7 +50,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/profiles/import HTTP/1.1
+	POST /api/5.0/profiles/import HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
diff --git a/docs/source/api/v4/profiles_name_name_copy_copy.rst b/docs/source/api/v5/profiles_name_name_copy_copy.rst
similarity index 98%
copy from docs/source/api/v4/profiles_name_name_copy_copy.rst
copy to docs/source/api/v5/profiles_name_name_copy_copy.rst
index 2426e545d2..ad24a258a7 100644
--- a/docs/source/api/v4/profiles_name_name_copy_copy.rst
+++ b/docs/source/api/v5/profiles_name_name_copy_copy.rst
@@ -43,7 +43,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/profiles/name/GLOBAL_copy/copy/GLOBAL HTTP/1.1
+	POST /api/5.0/profiles/name/GLOBAL_copy/copy/GLOBAL HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.62.0
 	Accept: */*
diff --git a/docs/source/api/v4/profiles_name_name_parameters.rst b/docs/source/api/v5/profiles_name_name_parameters.rst
similarity index 98%
copy from docs/source/api/v4/profiles_name_name_parameters.rst
copy to docs/source/api/v5/profiles_name_name_parameters.rst
index 6f3711e9c5..0ad2ff7a52 100644
--- a/docs/source/api/v4/profiles_name_name_parameters.rst
+++ b/docs/source/api/v5/profiles_name_name_parameters.rst
@@ -41,7 +41,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/profiles/name/GLOBAL/parameters HTTP/1.1
+	GET /api/5.0/profiles/name/GLOBAL/parameters HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -137,7 +137,7 @@ Single Parameter Format
 .. code-block:: http
 	:caption: Request Example - Single Parameter Format
 
-	POST /api/4.0/profiles/name/test/parameters HTTP/1.1
+	POST /api/5.0/profiles/name/test/parameters HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -162,7 +162,7 @@ Parameter Array Format
 .. code-block:: http
 	:caption: Request Example - Parameter Array Format
 
-	POST /api/4.0/profiles/name/test/parameters HTTP/1.1
+	POST /api/5.0/profiles/name/test/parameters HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/regions.rst b/docs/source/api/v5/regions.rst
similarity index 98%
copy from docs/source/api/v4/regions.rst
copy to docs/source/api/v5/regions.rst
index 9b0f0ccffa..6f13234871 100644
--- a/docs/source/api/v4/regions.rst
+++ b/docs/source/api/v5/regions.rst
@@ -58,7 +58,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/regions?division=1 HTTP/1.1
+	GET /api/5.0/regions?division=1 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -117,7 +117,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/regions HTTP/1.1
+	POST /api/5.0/regions HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -195,7 +195,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/regions?name=Manchester HTTP/1.1
+	DELETE /api/5.0/regions?name=Manchester HTTP/1.1
 	User-Agent: curl/7.29.0
 	Host: trafficops.infra.ciab.test
 	Accept: */*
diff --git a/docs/source/api/v4/regions_id.rst b/docs/source/api/v5/regions_id.rst
similarity index 99%
copy from docs/source/api/v4/regions_id.rst
copy to docs/source/api/v5/regions_id.rst
index ce7dcb297d..ed92a29d8c 100644
--- a/docs/source/api/v4/regions_id.rst
+++ b/docs/source/api/v5/regions_id.rst
@@ -45,7 +45,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/regions/5 HTTP/1.1
+	PUT /api/5.0/regions/5 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/roles.rst b/docs/source/api/v5/roles.rst
similarity index 98%
copy from docs/source/api/v4/roles.rst
copy to docs/source/api/v5/roles.rst
index 87bc34db74..9c66fcc11b 100644
--- a/docs/source/api/v4/roles.rst
+++ b/docs/source/api/v5/roles.rst
@@ -56,7 +56,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/roles?name=read-only HTTP/1.1
+	GET /api/5.0/roles?name=read-only HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -150,7 +150,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/roles HTTP/1.1
+	POST /api/5.0/roles HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -228,7 +228,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/roles?name=test HTTP/1.1
+	PUT /api/5.0/roles?name=test HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -304,7 +304,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/roles?name=test HTTP/1.1
+	DELETE /api/5.0/roles?name=test HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/server_capabilities.rst b/docs/source/api/v5/server_capabilities.rst
similarity index 97%
copy from docs/source/api/v4/server_capabilities.rst
copy to docs/source/api/v5/server_capabilities.rst
index 048d4899a1..a6d99a6145 100644
--- a/docs/source/api/v4/server_capabilities.rst
+++ b/docs/source/api/v5/server_capabilities.rst
@@ -41,7 +41,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Structure
 
-	GET /api/4.0/server_capabilities?name=RAM HTTP/1.1
+	GET /api/5.0/server_capabilities?name=RAM HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -92,7 +92,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/server_capabilities HTTP/1.1
+	POST /api/5.0/server_capabilities HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -153,7 +153,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/server_capabilities?name=RAM HTTP/1.1
+	PUT /api/5.0/server_capabilities?name=RAM HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -221,7 +221,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/server_capabilities?name=RAM HTTP/1.1
+	DELETE /api/5.0/server_capabilities?name=RAM HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/server_server_capabilities.rst b/docs/source/api/v5/server_server_capabilities.rst
similarity index 98%
copy from docs/source/api/v4/server_server_capabilities.rst
copy to docs/source/api/v5/server_server_capabilities.rst
index 9c37b23983..07af380aec 100644
--- a/docs/source/api/v4/server_server_capabilities.rst
+++ b/docs/source/api/v5/server_server_capabilities.rst
@@ -56,7 +56,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/server_server_capabilities HTTP/1.1
+	GET /api/5.0/server_server_capabilities HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -120,7 +120,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/server_server_capabilities HTTP/1.1
+	POST /api/5.0/server_server_capabilities HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -194,7 +194,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/server_server_capabilities?serverId=1&serverCapability=disk HTTP/1.1
+	DELETE /api/5.0/server_server_capabilities?serverId=1&serverCapability=disk HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/servercheck.rst b/docs/source/api/v5/servercheck.rst
similarity index 97%
copy from docs/source/api/v4/servercheck.rst
copy to docs/source/api/v5/servercheck.rst
index ec96cbe686..93f7483810 100644
--- a/docs/source/api/v4/servercheck.rst
+++ b/docs/source/api/v5/servercheck.rst
@@ -45,7 +45,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example with ``hostName`` query param
 
-	GET /api/4.0/servercheck?hostName=edge HTTP/1.1
+	GET /api/5.0/servercheck?hostName=edge HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -54,7 +54,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example with ``id`` query param
 
-	GET /api/4.0/servercheck?id=12 HTTP/1.1
+	GET /api/5.0/servercheck?id=12 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -121,7 +121,7 @@ The request only requires to have either ``host_name`` or ``id`` defined.
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/servercheck HTTP/1.1
+	POST /api/5.0/servercheck HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -149,4 +149,3 @@ Response Structure
 	]}
 
 .. [1] No roles are required to use this endpoint, however access is controlled by username. Only the reserved user ``extension`` is permitted the use of this endpoint.
-
diff --git a/docs/source/api/v4/servercheck_extensions.rst b/docs/source/api/v5/servercheck_extensions.rst
similarity index 99%
copy from docs/source/api/v4/servercheck_extensions.rst
copy to docs/source/api/v5/servercheck_extensions.rst
index 3406dbf4b4..e46f93f709 100644
--- a/docs/source/api/v4/servercheck_extensions.rst
+++ b/docs/source/api/v5/servercheck_extensions.rst
@@ -59,7 +59,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/servercheck/extensions HTTP/1.1
+	GET /api/5.0/servercheck/extensions HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -164,7 +164,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/servercheck/extensions HTTP/1.1
+	POST /api/5.0/servercheck/extensions HTTP/1.1
 	Host: cache1.example.com:6443
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/servercheck_extensions_id.rst b/docs/source/api/v5/servercheck_extensions_id.rst
similarity index 98%
copy from docs/source/api/v4/servercheck_extensions_id.rst
copy to docs/source/api/v5/servercheck_extensions_id.rst
index dfaa581846..9e567b6462 100644
--- a/docs/source/api/v4/servercheck_extensions_id.rst
+++ b/docs/source/api/v5/servercheck_extensions_id.rst
@@ -41,7 +41,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/servercheck/extensions/16 HTTP/1.1
+	DELETE /api/5.0/servercheck/extensions/16 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/servers.rst b/docs/source/api/v5/servers.rst
similarity index 97%
copy from docs/source/api/v4/servers.rst
copy to docs/source/api/v5/servers.rst
index 1a57951d0a..ed9024fe6d 100644
--- a/docs/source/api/v4/servers.rst
+++ b/docs/source/api/v5/servers.rst
@@ -69,16 +69,11 @@ Request Structure
 	|                |          | the first page is 1. If ``offset`` was defined, this query parameter has no effect. ``limit`` must be defined to  |
 	|                |          | make use of ``page``.                                                                                             |
 	+----------------+----------+-------------------------------------------------------------------------------------------------------------------+
-	| asn            | no       | Return only the servers that have a cachegroup matching the provided ASN.                                         |
-	|                |          |                                                                                                                   |
-	|                |          | .. versionadded:: 4.1                                                                                             |
-	+----------------+----------+-------------------------------------------------------------------------------------------------------------------+
-
 
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/servers?hostName=mid HTTP/1.1
+	GET /api/5.0/servers?hostName=mid HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -86,9 +81,6 @@ Request Structure
 
 Response Structure
 ------------------
-:asns:             The :abbr:`ASN (Autonomous System Number)` associated with the cachegroups of the current server.
-
-	.. versionadded:: 4.1
 :cachegroup:       A string that is the :ref:`name of the Cache Group <cache-group-name>` to which the server belongs
 :cachegroupId:     An integer that is the :ref:`ID of the Cache Group <cache-group-id>` to which the server belongs
 :cdnId:            The integral, unique identifier of the CDN to which the server belongs
@@ -233,10 +225,6 @@ Response Structure
 				"routerHostName": "",
 				"routerPortName": ""
 			}
-		],
-		"asns": [
-			1,
-			2
 		]
 	}],
 	"summary": {
@@ -319,7 +307,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/servers HTTP/1.1
+	POST /api/5.0/servers HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/servers_hostname_update.rst b/docs/source/api/v5/servers_hostname_update.rst
similarity index 98%
copy from docs/source/api/v4/servers_hostname_update.rst
copy to docs/source/api/v5/servers_hostname_update.rst
index cde4c32ff3..6caf870f41 100644
--- a/docs/source/api/v4/servers_hostname_update.rst
+++ b/docs/source/api/v5/servers_hostname_update.rst
@@ -57,7 +57,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/servers/my-edge/update?config_apply_time=2022-01-31T12%3A00%3A00.123456-07%3A00&revalidate_apply_time=2022-01-31T12%3A00%3A00.123456-07%3A00 HTTP/1.1
+	POST /api/5.0/servers/my-edge/update?config_apply_time=2022-01-31T12%3A00%3A00.123456-07%3A00&revalidate_apply_time=2022-01-31T12%3A00%3A00.123456-07%3A00 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/servers_hostname_update_status.rst b/docs/source/api/v5/servers_hostname_update_status.rst
similarity index 96%
copy from docs/source/api/v4/servers_hostname_update_status.rst
copy to docs/source/api/v5/servers_hostname_update_status.rst
index 0ea35732b9..5e35da9d75 100644
--- a/docs/source/api/v4/servers_hostname_update_status.rst
+++ b/docs/source/api/v5/servers_hostname_update_status.rst
@@ -30,9 +30,6 @@ Retrieves information regarding pending updates and :term:`Content Invalidation
 :Permissions Required: SERVER:READ
 :Response Type: Array
 
-.. versionchanged:: 4.0
-	Prior to API version 4.0, the response was a top-level array rather than the normal ``response`` object.
-
 Request Structure
 -----------------
 .. table:: Request Path Parameters
@@ -46,7 +43,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/servers/edge/update_status HTTP/1.1
+	GET /api/5.0/servers/edge/update_status HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/servers_id.rst b/docs/source/api/v5/servers_id.rst
similarity index 99%
copy from docs/source/api/v4/servers_id.rst
copy to docs/source/api/v5/servers_id.rst
index e2a005b6ff..712b1fb209 100644
--- a/docs/source/api/v4/servers_id.rst
+++ b/docs/source/api/v5/servers_id.rst
@@ -99,7 +99,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/servers/14 HTTP/1.1
+	PUT /api/5.0/servers/14 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -347,7 +347,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/servers/14 HTTP/1.1
+	DELETE /api/5.0/servers/14 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/servers_id_deliveryservices.rst b/docs/source/api/v5/servers_id_deliveryservices.rst
similarity index 92%
copy from docs/source/api/v4/servers_id_deliveryservices.rst
copy to docs/source/api/v5/servers_id_deliveryservices.rst
index a04d7fcf2c..e6f1d74f6f 100644
--- a/docs/source/api/v4/servers_id_deliveryservices.rst
+++ b/docs/source/api/v5/servers_id_deliveryservices.rst
@@ -60,7 +60,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/servers/10/deliveryservices HTTP/1.1
+	GET /api/5.0/servers/10/deliveryservices HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: python-requests/2.24.0
 	Accept-Encoding: gzip, deflate
@@ -104,13 +104,9 @@ Response Structure
 :ipv6RoutingEnabled:        A boolean that defines the :ref:`ds-ipv6-routing` setting on this :term:`Delivery Service`
 :lastHeaderRewrite:         A set of :ref:`ds-last-header-rw-rules`
 :lastUpdated:               The date and time at which this :term:`Delivery Service` was last updated, in :rfc:3339 format
-
-	.. versionchanged:: 4.0
-		Prior to API version 4.0, this property used :ref:`non-rfc-datetime`.
-
-:logsEnabled: A boolean that defines the :ref:`ds-logs-enabled` setting on this :term:`Delivery Service`
-:longDesc:    The :ref:`ds-longdesc` of this :term:`Delivery Service`
-:matchList:   The :term:`Delivery Service`'s :ref:`ds-matchlist`
+:logsEnabled:               A boolean that defines the :ref:`ds-logs-enabled` setting on this :term:`Delivery Service`
+:longDesc:                  The :ref:`ds-longdesc` of this :term:`Delivery Service`
+:matchList:                 The :term:`Delivery Service`'s :ref:`ds-matchlist`
 
 	:pattern:   A regular expression - the use of this pattern is dependent on the ``type`` field (backslashes are escaped)
 	:setNumber: An integer that provides explicit ordering of :ref:`ds-matchlist` items - this is used as a priority ranking by Traffic Router, and is not guaranteed to correspond to the ordering of items in the array.
@@ -135,19 +131,16 @@ Response Structure
 :remapText:            :ref:`ds-raw-remap`
 :signed:               ``true`` if  and only if ``signingAlgorithm`` is not ``null``, ``false`` otherwise
 :signingAlgorithm:     Either a :ref:`ds-signing-algorithm` or ``null`` to indicate URL/URI signing is not implemented on this :term:`Delivery Service`
-:rangeSliceBlockSize: An integer that defines the byte block size for the ATS Slice Plugin. It can only and must be set if ``rangeRequestHandling`` is set to 3.
+:rangeSliceBlockSize:  An integer that defines the byte block size for the ATS Slice Plugin. It can only and must be set if ``rangeRequestHandling`` is set to 3.
 :sslKeyVersion:        This integer indicates the :ref:`ds-ssl-key-version`
 :tenantId:             The integral, unique identifier of the :ref:`ds-tenant` who owns this :term:`Delivery Service`
-:tlsVersions:           A list of explicitly supported :ref:`ds-tls-versions`
-
-	.. versionadded:: 4.0
-
-:topology:          The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
-:trRequestHeaders:  If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
-:trResponseHeaders: If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
-:type:              The :ref:`ds-types` of this :term:`Delivery Service`
-:typeId:            The integral, unique identifier of the :ref:`ds-types` of this :term:`Delivery Service`
-:xmlId:             This :term:`Delivery Service`'s :ref:`ds-xmlid`
+:tlsVersions:          A list of explicitly supported :ref:`ds-tls-versions`
+:topology:             The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
+:trRequestHeaders:     If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
+:trResponseHeaders:    If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
+:type:                 The :ref:`ds-types` of this :term:`Delivery Service`
+:typeId:               The integral, unique identifier of the :ref:`ds-types` of this :term:`Delivery Service`
+:xmlId:                This :term:`Delivery Service`'s :ref:`ds-xmlid`
 
 .. code-block:: http
 	:caption: Response Example
@@ -283,7 +276,7 @@ The request body is an array of IDs of :term:`Delivery Services` that you want t
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/servers/6/deliveryservices?replace=1 HTTP/1.1
+	POST /api/5.0/servers/6/deliveryservices?replace=1 HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/servers_id_queue_update.rst b/docs/source/api/v5/servers_id_queue_update.rst
similarity index 98%
copy from docs/source/api/v4/servers_id_queue_update.rst
copy to docs/source/api/v5/servers_id_queue_update.rst
index ff28ec0961..abf0aa6866 100644
--- a/docs/source/api/v4/servers_id_queue_update.rst
+++ b/docs/source/api/v5/servers_id_queue_update.rst
@@ -49,7 +49,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/servers/13/queue_update HTTP/1.1
+	POST /api/5.0/servers/13/queue_update HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/servers_id_status.rst b/docs/source/api/v5/servers_id_status.rst
similarity index 98%
copy from docs/source/api/v4/servers_id_status.rst
copy to docs/source/api/v5/servers_id_status.rst
index 40f7171a0b..5575267968 100644
--- a/docs/source/api/v4/servers_id_status.rst
+++ b/docs/source/api/v5/servers_id_status.rst
@@ -44,7 +44,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/servers/13/status HTTP/1.1
+	PUT /api/5.0/servers/13/status HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/service_categories.rst b/docs/source/api/v5/service_categories.rst
similarity index 98%
copy from docs/source/api/v4/service_categories.rst
copy to docs/source/api/v5/service_categories.rst
index a65a08677b..7f6aa563b3 100644
--- a/docs/source/api/v4/service_categories.rst
+++ b/docs/source/api/v5/service_categories.rst
@@ -55,7 +55,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/service_categories?name=SERVICE_CATEGORY_NAME HTTP/1.1
+	GET /api/5.0/service_categories?name=SERVICE_CATEGORY_NAME HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -106,7 +106,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/service_categories HTTP/1.1
+	POST /api/5.0/service_categories HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/service_categories_name.rst b/docs/source/api/v5/service_categories_name.rst
similarity index 97%
copy from docs/source/api/v4/service_categories_name.rst
copy to docs/source/api/v5/service_categories_name.rst
index b739ca3a19..ba16efd3d2 100644
--- a/docs/source/api/v4/service_categories_name.rst
+++ b/docs/source/api/v5/service_categories_name.rst
@@ -43,7 +43,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/service_categories/sc-name HTTP/1.1
+	PUT /api/5.0/service_categories/sc-name HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -111,7 +111,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/service_categories/my-service-category HTTP/1.1
+	DELETE /api/5.0/service_categories/my-service-category HTTP/1.1
 	User-Agent: python-requests/2.23.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/snapshot.rst b/docs/source/api/v5/snapshot.rst
similarity index 98%
copy from docs/source/api/v4/snapshot.rst
copy to docs/source/api/v5/snapshot.rst
index b0a7001bcc..043fa2059c 100644
--- a/docs/source/api/v4/snapshot.rst
+++ b/docs/source/api/v5/snapshot.rst
@@ -48,7 +48,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/snapshot?cdn=CDN-in-a-Box HTTP/1.1
+	PUT /api/5.0/snapshot?cdn=CDN-in-a-Box HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/sslkey_expirations.rst b/docs/source/api/v5/sslkey_expirations.rst
similarity index 98%
copy from docs/source/api/v4/sslkey_expirations.rst
copy to docs/source/api/v5/sslkey_expirations.rst
index f299c87f89..704947df34 100644
--- a/docs/source/api/v4/sslkey_expirations.rst
+++ b/docs/source/api/v5/sslkey_expirations.rst
@@ -41,7 +41,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/sslkey_expirations?days=30 HTTP/1.1
+	GET /api/5.0/sslkey_expirations?days=30 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	Accept: */*
 	Connection: keep-alive
diff --git a/docs/source/api/v4/staticdnsentries.rst b/docs/source/api/v5/staticdnsentries.rst
similarity index 99%
copy from docs/source/api/v4/staticdnsentries.rst
copy to docs/source/api/v5/staticdnsentries.rst
index 04a8e6280c..7c0a35fe42 100644
--- a/docs/source/api/v4/staticdnsentries.rst
+++ b/docs/source/api/v5/staticdnsentries.rst
@@ -68,7 +68,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/staticdnsentries?address=foo.bar HTTP/1.1
+	GET /api/5.0/staticdnsentries?address=foo.bar HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -148,7 +148,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/staticdnsentries HTTP/1.1
+	POST /api/5.0/staticdnsentries HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -250,7 +250,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/staticdnsentries?id=2 HTTP/1.1
+	PUT /api/5.0/staticdnsentries?id=2 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -343,7 +343,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/staticdnsentries?id=2 HTTP/1.1
+	DELETE /api/5.0/staticdnsentries?id=2 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/stats_summary.rst b/docs/source/api/v5/stats_summary.rst
similarity index 98%
copy from docs/source/api/v4/stats_summary.rst
copy to docs/source/api/v5/stats_summary.rst
index 1d8dd45d89..60a45ee582 100644
--- a/docs/source/api/v4/stats_summary.rst
+++ b/docs/source/api/v5/stats_summary.rst
@@ -66,7 +66,7 @@ Summary Stats
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/stats_summary HTTP/1.1
+	GET /api/5.0/stats_summary HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -88,7 +88,7 @@ Last Updated Summary Stat
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/stats_summary?lastSummaryDate=true HTTP/1.1
+	GET /api/5.0/stats_summary?lastSummaryDate=true HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -209,7 +209,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/stats_summary HTTP/1.1
+	POST /api/5.0/stats_summary HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/statuses.rst b/docs/source/api/v5/statuses.rst
similarity index 98%
copy from docs/source/api/v4/statuses.rst
copy to docs/source/api/v5/statuses.rst
index 02833d4aad..3ccf081e72 100644
--- a/docs/source/api/v4/statuses.rst
+++ b/docs/source/api/v5/statuses.rst
@@ -59,7 +59,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/statuses?name=REPORTED HTTP/1.1
+	GET /api/5.0/statuses?name=REPORTED HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -113,7 +113,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/statuses HTTP/1.1
+	POST /api/5.0/statuses HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/statuses_id.rst b/docs/source/api/v5/statuses_id.rst
similarity index 98%
copy from docs/source/api/v4/statuses_id.rst
copy to docs/source/api/v5/statuses_id.rst
index a48d790bc9..159bd43bca 100644
--- a/docs/source/api/v4/statuses_id.rst
+++ b/docs/source/api/v5/statuses_id.rst
@@ -59,7 +59,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/statuses/3 HTTP/1.1
+	GET /api/5.0/statuses/3 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -113,7 +113,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/statuses/3 HTTP/1.1
+	POST /api/5.0/statuses/3 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/steering.rst b/docs/source/api/v5/steering.rst
similarity index 99%
copy from docs/source/api/v4/steering.rst
copy to docs/source/api/v5/steering.rst
index 8c36fe463a..dadfaa20fe 100644
--- a/docs/source/api/v4/steering.rst
+++ b/docs/source/api/v5/steering.rst
@@ -35,7 +35,7 @@ No parameters available.
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/steering HTTP/1.1
+	GET /api/5.0/steering HTTP/1.1
 	User-Agent: python-requests/2.22.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/steering_id_targets.rst b/docs/source/api/v5/steering_id_targets.rst
similarity index 98%
copy from docs/source/api/v4/steering_id_targets.rst
copy to docs/source/api/v5/steering_id_targets.rst
index 890248b4be..c91cc7d83e 100644
--- a/docs/source/api/v4/steering_id_targets.rst
+++ b/docs/source/api/v5/steering_id_targets.rst
@@ -61,7 +61,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Structure
 
-	GET /api/4.0/steering/2/targets?target=1 HTTP/1.1
+	GET /api/5.0/steering/2/targets?target=1 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -130,7 +130,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/steering/2/targets HTTP/1.1
+	POST /api/5.0/steering/2/targets HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/steering_id_targets_targetID.rst b/docs/source/api/v5/steering_id_targets_targetID.rst
similarity index 98%
copy from docs/source/api/v4/steering_id_targets_targetID.rst
copy to docs/source/api/v5/steering_id_targets_targetID.rst
index ec036fbfbf..70bbda77fb 100644
--- a/docs/source/api/v4/steering_id_targets_targetID.rst
+++ b/docs/source/api/v5/steering_id_targets_targetID.rst
@@ -46,7 +46,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/steering/2/targets/1 HTTP/1.1
+	PUT /api/5.0/steering/2/targets/1 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -124,7 +124,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/steering/2/targets/1 HTTP/1.1
+	DELETE /api/5.0/steering/2/targets/1 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/system_info.rst b/docs/source/api/v5/system_info.rst
similarity index 100%
copy from docs/source/api/v4/system_info.rst
copy to docs/source/api/v5/system_info.rst
diff --git a/docs/source/api/v4/tenants.rst b/docs/source/api/v5/tenants.rst
similarity index 98%
copy from docs/source/api/v4/tenants.rst
copy to docs/source/api/v5/tenants.rst
index 2b15f361b5..2d07db1664 100644
--- a/docs/source/api/v4/tenants.rst
+++ b/docs/source/api/v5/tenants.rst
@@ -61,7 +61,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/tenants?name=root HTTP/1.1
+	GET /api/5.0/tenants?name=root HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -118,7 +118,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/tenants HTTP/1.1
+	POST /api/5.0/tenants HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/tenants_id.rst b/docs/source/api/v5/tenants_id.rst
similarity index 98%
copy from docs/source/api/v4/tenants_id.rst
copy to docs/source/api/v5/tenants_id.rst
index 046c4cb0af..3746a4577c 100644
--- a/docs/source/api/v4/tenants_id.rst
+++ b/docs/source/api/v5/tenants_id.rst
@@ -45,7 +45,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/tenants/9 HTTP/1.1
+	PUT /api/5.0/tenants/9 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -118,7 +118,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/tenants/9 HTTP/1.1
+	DELETE /api/5.0/tenants/9 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/topologies.rst b/docs/source/api/v5/topologies.rst
similarity index 98%
copy from docs/source/api/v4/topologies.rst
copy to docs/source/api/v5/topologies.rst
index 8ad3a572b0..a0eb11e5b8 100644
--- a/docs/source/api/v4/topologies.rst
+++ b/docs/source/api/v5/topologies.rst
@@ -41,7 +41,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/topologies HTTP/1.1
+	GET /api/5.0/topologies HTTP/1.1
 	User-Agent: python-requests/2.23.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -168,7 +168,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/topologies HTTP/1.1
+	POST /api/5.0/topologies HTTP/1.1
 	User-Agent: python-requests/2.23.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -377,7 +377,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/topologies?name=my-topology HTTP/1.1
+	PUT /api/5.0/topologies?name=my-topology HTTP/1.1
 	User-Agent: python-requests/2.23.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -564,7 +564,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	DELETE /api/4.0/topologies?name=my-topology HTTP/1.1
+	DELETE /api/5.0/topologies?name=my-topology HTTP/1.1
 	User-Agent: python-requests/2.23.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/topologies_name_queue_update.rst b/docs/source/api/v5/topologies_name_queue_update.rst
similarity index 98%
copy from docs/source/api/v4/topologies_name_queue_update.rst
copy to docs/source/api/v5/topologies_name_queue_update.rst
index 904dcdd9c9..43b1255a99 100644
--- a/docs/source/api/v4/topologies_name_queue_update.rst
+++ b/docs/source/api/v5/topologies_name_queue_update.rst
@@ -44,7 +44,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/topologies/demo1-top/queue_update HTTP/1.1
+	POST /api/5.0/topologies/demo1-top/queue_update HTTP/1.1
 	User-Agent: python-requests/2.24.0
 	Accept-Encoding: gzip, deflate
 	Accept: */*
diff --git a/docs/source/api/v4/types.rst b/docs/source/api/v5/types.rst
similarity index 98%
copy from docs/source/api/v4/types.rst
copy to docs/source/api/v5/types.rst
index a6592657e1..d45201d789 100644
--- a/docs/source/api/v4/types.rst
+++ b/docs/source/api/v5/types.rst
@@ -45,7 +45,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Structure
 
-	GET /api/4.0/types?name=TC_LOC HTTP/1.1
+	GET /api/5.0/types?name=TC_LOC HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -105,7 +105,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Structure
 
-	POST /api/4.0/type HTTP/1.1
+	POST /api/5.0/type HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/types_id.rst b/docs/source/api/v5/types_id.rst
similarity index 98%
copy from docs/source/api/v4/types_id.rst
copy to docs/source/api/v5/types_id.rst
index 2a8a14baac..598476d81c 100644
--- a/docs/source/api/v4/types_id.rst
+++ b/docs/source/api/v5/types_id.rst
@@ -47,7 +47,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Structure
 
-	PUT /api/4.0/type/3004 HTTP/1.1
+	PUT /api/5.0/type/3004 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -125,7 +125,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Structure
 
-	DELETE /api/4.0/type/3004 HTTP/1.1
+	DELETE /api/5.0/type/3004 HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/user_current.rst b/docs/source/api/v5/user_current.rst
similarity index 94%
copy from docs/source/api/v4/user_current.rst
copy to docs/source/api/v5/user_current.rst
index b1e8e16c85..903582064b 100644
--- a/docs/source/api/v4/user_current.rst
+++ b/docs/source/api/v5/user_current.rst
@@ -37,7 +37,7 @@ No parameters available.
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/user/current HTTP/1.1
+	GET /api/5.0/user/current HTTP/1.1
 	User-Agent: python-requests/2.25.1
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -73,10 +73,7 @@ Response Structure
 :tenant:            The name of the :term:`Tenant` to which this user belongs
 :tenantId:          The integral, unique identifier of the :term:`Tenant` to which this user belongs
 :ucdn:              The name of the :abbr:`uCDN (Upstream Content Delivery Network)` to which the user belongs
-
-	.. versionadded:: 4.0
-
-:uid: A deprecated field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user
+:uid:               A deprecated field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user
 
 	.. deprecated:: 4.0
 		This field is serves no known purpose, and shouldn't be used for anything so it can be removed in the future.
@@ -160,23 +157,17 @@ Request Structure
 :stateOrProvince: The state or province in which the user resides
 :tenantId:        The integral, unique identifier of the :term:`Tenant` to which the new user shall belong\ [#tenancy]_\ [#notnull]_
 :ucdn:            The name of the :abbr:`uCDN (Upstream Content Delivery Network)` to which the user belongs
-
-	.. versionadded:: 4.0
-
-:uid: A legacy field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user - please don't use this
+:uid:             A legacy field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user - please don't use this
 
 	.. deprecated:: 4.0
 		This field is serves no known purpose, and shouldn't be used for anything so it can be removed in the future.
 
 :username: The user's new username\ [#notnull]_
 
-.. versionchanged:: 4.0
-	In all earlier versions of the API, all of these objects needed to be properties of the "user" property of the JSON object request body.
-
 .. code-block:: http
 	:caption: Request Example
 
-	PUT /api/4.0/user/current HTTP/1.1
+	PUT /api/5.0/user/current HTTP/1.1
 	User-Agent: python-requests/2.25.1
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -239,10 +230,7 @@ Response Structure
 :tenant:           The name of the :term:`Tenant` to which this user belongs
 :tenantId:         The integral, unique identifier of the :term:`Tenant` to which this user belongs
 :ucdn:             The name of the :abbr:`uCDN (Upstream Content Delivery Network)` to which the user belongs
-
-	.. versionadded:: 4.0
-
-:uid: A legacy field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user
+:uid:              A legacy field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user
 
 	.. deprecated:: 4.0
 		This field is serves no known purpose, and shouldn't be used for anything so it can be removed in the future.
diff --git a/docs/source/api/v4/user_login.rst b/docs/source/api/v5/user_login.rst
similarity index 98%
copy from docs/source/api/v4/user_login.rst
copy to docs/source/api/v5/user_login.rst
index e2ef28b991..671331e567 100644
--- a/docs/source/api/v4/user_login.rst
+++ b/docs/source/api/v5/user_login.rst
@@ -36,7 +36,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/user/login HTTP/1.1
+	POST /api/5.0/user/login HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/user_login_oauth.rst b/docs/source/api/v5/user_login_oauth.rst
similarity index 98%
copy from docs/source/api/v4/user_login_oauth.rst
copy to docs/source/api/v5/user_login_oauth.rst
index 90a2db6b6d..5a3c5ece95 100644
--- a/docs/source/api/v4/user_login_oauth.rst
+++ b/docs/source/api/v5/user_login_oauth.rst
@@ -38,7 +38,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/user/login/oauth HTTP/1.1
+	POST /api/5.0/user/login/oauth HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/user_login_token.rst b/docs/source/api/v5/user_login_token.rst
similarity index 98%
copy from docs/source/api/v4/user_login_token.rst
copy to docs/source/api/v5/user_login_token.rst
index d5fb2502cd..fcdca87bf3 100644
--- a/docs/source/api/v4/user_login_token.rst
+++ b/docs/source/api/v5/user_login_token.rst
@@ -37,7 +37,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/user/login/token HTTP/1.1
+	POST /api/5.0/user/login/token HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/user_logout.rst b/docs/source/api/v5/user_logout.rst
similarity index 100%
copy from docs/source/api/v4/user_logout.rst
copy to docs/source/api/v5/user_logout.rst
diff --git a/docs/source/api/v4/user_reset_password.rst b/docs/source/api/v5/user_reset_password.rst
similarity index 97%
copy from docs/source/api/v4/user_reset_password.rst
copy to docs/source/api/v5/user_reset_password.rst
index 6b6bedcbee..712d2b3c86 100644
--- a/docs/source/api/v4/user_reset_password.rst
+++ b/docs/source/api/v5/user_reset_password.rst
@@ -35,7 +35,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/user/reset_password HTTP/1.1
+	POST /api/5.0/user/reset_password HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/users.rst b/docs/source/api/v5/users.rst
similarity index 95%
copy from docs/source/api/v4/users.rst
copy to docs/source/api/v5/users.rst
index aa8f8cd40a..d6fad87ece 100644
--- a/docs/source/api/v4/users.rst
+++ b/docs/source/api/v5/users.rst
@@ -61,7 +61,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/users?username=mike HTTP/1.1
+	GET /api/5.0/users?username=mike HTTP/1.1
 	User-Agent: python-requests/2.25.1
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -97,10 +97,7 @@ Response Structure
 :tenant:            The name of the tenant to which this user belongs
 :tenantId:          The integral, unique identifier of the tenant to which this user belongs
 :ucdn:              The name of the :abbr:`uCDN (Upstream Content Delivery Network)` to which the user belongs
-
-	.. versionadded:: 4.0
-
-:uid: A deprecated field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user - now it is always ``null``
+:uid:               A deprecated field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user - now it is always ``null``
 
 	.. deprecated:: 4.0
 		This field is serves no known purpose, and shouldn't be used for anything so it can be removed in the future.
@@ -181,10 +178,7 @@ Request Structure
 :stateOrProvince: An optional field which should contain the name of the state or province in which the user resides
 :tenantId:        The integral, unique identifier of the tenant to which the new user shall belong
 :ucdn:            The name of the :abbr:`uCDN (Upstream Content Delivery Network)` to which the user belongs
-
-	.. versionadded:: 4.0
-
-:uid: A deprecated field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user
+:uid:             A deprecated field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user
 
 	.. deprecated:: 4.0
 		This field is serves no known purpose, and shouldn't be used for anything so it can be removed in the future.
@@ -194,7 +188,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/users HTTP/1.1
+	POST /api/5.0/users HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
@@ -244,10 +238,7 @@ Response Structure
 :tenant:            The name of the tenant to which this user belongs
 :tenantId:          The integral, unique identifier of the tenant to which this user belongs
 :ucdn:              The name of the :abbr:`uCDN (Upstream Content Delivery Network)` to which the user belongs
-
-	.. versionadded:: 4.0
-
-:uid: A deprecated field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user - now it is always ``null``
+:uid:               A deprecated field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user - now it is always ``null``
 
 	.. deprecated:: 4.0
 		This field is serves no known purpose, and shouldn't be used for anything so it can be removed in the future.
@@ -261,7 +252,7 @@ Response Structure
 	HTTP/1.1 201 Created
 	Content-Encoding: gzip
 	Content-Type: application/json
-	Location: /api/4.0/users?id=3
+	Location: /api/5.0/users?id=3
 	Permissions-Policy: interest-cohort=()
 	Set-Cookie: mojolicious=...; Path=/; Expires=Fri, 13 May 2022 23:13:54 GMT; Max-Age=3600; HttpOnly
 	Vary: Accept-Encoding
diff --git a/docs/source/api/v4/users_id.rst b/docs/source/api/v5/users_id.rst
similarity index 87%
copy from docs/source/api/v4/users_id.rst
copy to docs/source/api/v5/users_id.rst
index be49381bf1..3c2aa5378b 100644
--- a/docs/source/api/v4/users_id.rst
+++ b/docs/source/api/v5/users_id.rst
@@ -41,7 +41,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	GET /api/4.0/users/3 HTTP/1.1
+	GET /api/5.0/users/3 HTTP/1.1
 	User-Agent: python-requests/2.25.1
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -77,10 +77,7 @@ Response Structure
 :tenant:            The name of the tenant to which this user belongs
 :tenantId:          The integral, unique identifier of the tenant to which this user belongs
 :ucdn:              The name of the :abbr:`uCDN (Upstream Content Delivery Network)` to which the user belongs
-
-	.. versionadded:: 4.0
-
-:uid: A deprecated field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user - now it is always ``null``
+:uid:               A deprecated field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user - now it is always ``null``
 
 	.. deprecated:: 4.0
 		This field is serves no known purpose, and shouldn't be used for anything so it can be removed in the future.
@@ -169,10 +166,7 @@ Request Structure
 :stateOrProvince: An optional field which should contain the name of the state or province in which the user resides
 :tenantId:        The integral, unique identifier of the tenant to which the new user shall belong
 :ucdn:            The name of the :abbr:`uCDN (Upstream Content Delivery Network)` to which the user belongs
-
-	.. versionadded:: 4.0
-
-:uid: A deprecated field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user - now it is always ``null``
+:uid:             A deprecated field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user - now it is always ``null``
 
 	.. deprecated:: 4.0
 		This field is serves no known purpose, and shouldn't be used for anything so it can be removed in the future.
@@ -182,7 +176,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Structure
 
-	PUT /api/4.0/users/3 HTTP/1.1
+	PUT /api/5.0/users/3 HTTP/1.1
 	User-Agent: python-requests/2.25.1
 	Accept-Encoding: gzip, deflate
 	Accept: */*
@@ -223,23 +217,20 @@ Response Structure
 	.. deprecated:: 4.0
 		This field is serves no known purpose, and shouldn't be used for anything so it can be removed in the future.
 
-:id:               An integral, unique identifier for this user
+:id:                An integral, unique identifier for this user
 :lastAuthenticated: The date and time at which the user was last authenticated, in :rfc:`3339`
-:lastUpdated:      The date and time at which the user was last modified, in :ref:`non-rfc-datetime`
-:newUser:          A meta field with no apparent purpose that is usually ``null`` unless explicitly set during creation or modification of a user via some API endpoint
-:phoneNumber:      The user's phone number
-:postalCode:       The postal code of the area in which the user resides
-:publicSshKey:     The user's public key used for the SSH protocol
-:registrationSent: If the user was created using the :ref:`to-api-users-register` endpoint, this will be the date and time at which the registration email was sent - otherwise it will be ``null``
-:role:             The name of the role assigned to this user
-:stateOrProvince:  The name of the state or province where this user resides
-:tenant:           The name of the tenant to which this user belongs
-:tenantId:         The integral, unique identifier of the tenant to which this user belongs
+:lastUpdated:       The date and time at which the user was last modified, in :ref:`non-rfc-datetime`
+:newUser:           A meta field with no apparent purpose that is usually ``null`` unless explicitly set during creation or modification of a user via some API endpoint
+:phoneNumber:       The user's phone number
+:postalCode:        The postal code of the area in which the user resides
+:publicSshKey:      The user's public key used for the SSH protocol
+:registrationSent:  If the user was created using the :ref:`to-api-users-register` endpoint, this will be the date and time at which the registration email was sent - otherwise it will be ``null``
+:role:              The name of the role assigned to this user
+:stateOrProvince:   The name of the state or province where this user resides
+:tenant:            The name of the tenant to which this user belongs
+:tenantId:          The integral, unique identifier of the tenant to which this user belongs
 :ucdn:              The name of the :abbr:`uCDN (Upstream Content Delivery Network)` to which the user belongs
-
-	.. versionadded:: 4.0
-
-:uid: A deprecated field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user - now it is always ``null``
+:uid:               A deprecated field only kept for legacy compatibility reasons that used to contain the UNIX user ID of the user - now it is always ``null``
 
 	.. deprecated:: 4.0
 		This field is serves no known purpose, and shouldn't be used for anything so it can be removed in the future.
diff --git a/docs/source/api/v4/users_register.rst b/docs/source/api/v5/users_register.rst
similarity index 98%
copy from docs/source/api/v4/users_register.rst
copy to docs/source/api/v5/users_register.rst
index 376d2cd022..3fc72bf1ce 100644
--- a/docs/source/api/v4/users_register.rst
+++ b/docs/source/api/v5/users_register.rst
@@ -37,7 +37,7 @@ Request Structure
 .. code-block:: http
 	:caption: Request Example
 
-	POST /api/4.0/users/register HTTP/1.1
+	POST /api/5.0/users/register HTTP/1.1
 	Host: trafficops.infra.ciab.test
 	User-Agent: curl/7.47.0
 	Accept: */*
diff --git a/docs/source/api/v4/vault_ping.rst b/docs/source/api/v5/vault_ping.rst
similarity index 100%
copy from docs/source/api/v4/vault_ping.rst
copy to docs/source/api/v5/vault_ping.rst
diff --git a/docs/source/development/traffic_ops.rst b/docs/source/development/traffic_ops.rst
index 859e542e16..f79ce8d709 100644
--- a/docs/source/development/traffic_ops.rst
+++ b/docs/source/development/traffic_ops.rst
@@ -169,6 +169,7 @@ Traffic Ops Project Tree Overview
 
 	- v3-client - The official Traffic Ops Go client package for working with the version 3 :ref:`to-api`.
 	- v4-client - The official Traffic Ops Go client package for working with the version 4 :ref:`to-api`.
+	- v5-client - The official Traffic Ops Go client package for working with the version 5 :ref:`to-api`.
 	- vendor/ - contains "vendored" Go packages from third party sources
 
 .. _database-management:
diff --git a/docs/source/overview/delivery_services.rst b/docs/source/overview/delivery_services.rst
index 42743ac876..79be7168f2 100644
--- a/docs/source/overview/delivery_services.rst
+++ b/docs/source/overview/delivery_services.rst
@@ -1018,7 +1018,7 @@ The following :term:`Parameters` must have the :ref:`Config File <parameter-conf
 - ``merge_parent_groups`` - on a Deliver Service :term:`Profile`, if this exists, moves each of the space-separated :term:`Cache Groups` named in the :ref:`parameter-value` from the secondary parent list into the primary parent list. This can be used to combine all parents into a single consistent hash ring.
 
 	.. deprecated:: ATCv6.2
-		In :ref:`to-api` version 4 (unstable at the time of this writing), TLS versions should be configured using the `TLS Versions`_ property of the Delivery Service, and support for this :term:`Parameter` will be removed at some point after the stabilization of :ref:`to-api` version 4.
+		In :ref:`to-api` version 4, TLS versions should be configured using the `TLS Versions`_ property of the Delivery Service, and support for this :term:`Parameter` will be removed at some point after the stabilization of :ref:`to-api` version 4.
 
 Parameters that Affect Multi-Site Origin and Parent Down Behavior
 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
diff --git a/infrastructure/cdn-in-a-box/traffic_ops_integration_test/Dockerfile b/infrastructure/cdn-in-a-box/traffic_ops_integration_test/Dockerfile
index 3e02bae3ba..da17faa844 100644
--- a/infrastructure/cdn-in-a-box/traffic_ops_integration_test/Dockerfile
+++ b/infrastructure/cdn-in-a-box/traffic_ops_integration_test/Dockerfile
@@ -45,6 +45,7 @@ COPY ./lib/ /go/src/github.com/apache/trafficcontrol/lib/
 COPY ./traffic_ops/toclientlib/ /go/src/github.com/apache/trafficcontrol/traffic_ops/toclientlib/
 COPY ./traffic_ops/v3-client/ /go/src/github.com/apache/trafficcontrol/traffic_ops/v3-client/
 COPY ./traffic_ops/v4-client/ /go/src/github.com/apache/trafficcontrol/traffic_ops/v4-client/
+COPY ./traffic_ops/v5-client/ /go/src/github.com/apache/trafficcontrol/traffic_ops/v5-client/
 COPY ./traffic_ops/testing/api /go/src/github.com/apache/trafficcontrol/traffic_ops/testing/api
 COPY ./traffic_ops/traffic_ops_golang /go/src/github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang
 
diff --git a/traffic_control/clients/python/to_access/__init__.py b/traffic_control/clients/python/to_access/__init__.py
index 1be9a15cf8..a264e8811a 100644
--- a/traffic_control/clients/python/to_access/__init__.py
+++ b/traffic_control/clients/python/to_access/__init__.py
@@ -53,7 +53,7 @@ Arguments and Flags
 .. option:: -a API_VERSION, --api-version API_VERSION
 
 	Specifies the version of the Traffic Ops API that will be used for the request. Has no effect if
-	:option:`--raw-path` is used. (Default: 2.0)
+	:option:`--raw-path` is used. (Default: 4.1)
 
 .. option:: -f, --full
 
@@ -271,7 +271,7 @@ def parse_arguments(program):
 	                    help="Request exactly PATH; it won't be prefaced with '/api/{{api-version}}/")
 	parser.add_argument("-a", "--api-version",
 	                    type=float,
-	                    default=3.0,
+	                    default=4.1,
 	                    help="Specify the API version to request against")
 	parser.add_argument("-p", "--pretty",
 	                    action="store_true",
diff --git a/traffic_control/clients/python/trafficops/__version__.py b/traffic_control/clients/python/trafficops/__version__.py
index d9790231f7..bf833c56fe 100644
--- a/traffic_control/clients/python/trafficops/__version__.py
+++ b/traffic_control/clients/python/trafficops/__version__.py
@@ -21,10 +21,9 @@ gives the version of this *Apache-TrafficControl package* and **not** the versio
 client to grow in a version-controlled manner without being tied to the release cadence of Apache
 Traffic Control as a whole.
 
-Version 3.0 is supported for use with Apache Traffic Control versions 5.1 and 6.1 (release pending
-at the time of this writing). New functionality will be added as the :ref:`to-api` evolves, but
-changes to this client will remain non-breaking for existing code using it until the next major
-version is released.
+Version 3.0 is supported for use with Apache Traffic Control versions 7.0 and 6.1. New functionality
+will be added as the :ref:`to-api` evolves, but changes to this client will remain non-breaking for
+existing code using it until the next major version is released.
 """
 
-__version__ = '3.0.0'
+__version__ = '3.1.0'
diff --git a/traffic_control/clients/python/trafficops/tosession.py b/traffic_control/clients/python/trafficops/tosession.py
index 17b575f569..dc26294f75 100644
--- a/traffic_control/clients/python/trafficops/tosession.py
+++ b/traffic_control/clients/python/trafficops/tosession.py
@@ -112,7 +112,7 @@ class TOSession(RestApiSession):
 	.. note:: Only a small subset of the API endpoints are implemented. More can be implemented as needed.
 	"""
 
-	def __init__(self, host_ip, host_port=443, api_version='3.0', ssl=True, headers=None,
+	def __init__(self, host_ip, host_port=443, api_version='4.1', ssl=True, headers=None,
 	             verify_cert=True):
 		"""
 		The class initializer.
@@ -266,7 +266,7 @@ class TOSession(RestApiSession):
 	#
 	# ASN
 	#
-	@api_request('get', 'asns', ('3.0',))
+	@api_request('get', 'asns', ('3.0', '4.0', '4.1', '5.0'))
 	def get_asns(self, query_params=None):
 		"""
 		Get ASNs.
@@ -275,7 +275,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'asns', ('3.0',))
+	@api_request('post', 'asns', ('3.0', '4.0', '4.1', '5.0'))
 	def create_asn(self, data=None):
 		"""
 		Create ASN
@@ -286,7 +286,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'asns', ('3.0',))
+	@api_request('put', 'asns', ('3.0', '4.0', '4.1', '5.0'))
 	def update_asn(self, query_params=None):
 		"""
 		Update ASN
@@ -297,7 +297,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'asns', ('3.0',))
+	@api_request('delete', 'asns', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_asn(self, query_params=None):
 		"""
 		Delete ASN
@@ -311,7 +311,7 @@ class TOSession(RestApiSession):
 	#
 	# Cache Statistics
 	#
-	@api_request('get', 'cache_stats', ('3.0',))
+	@api_request('get', 'cache_stats', ('3.0', '4.0', '4.1', '5.0'))
 	def get_cache_stats(self, query_params=None):
 		"""
 		Retrieves statistics about the CDN.
@@ -322,7 +322,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'caches/stats', ('3.0',))
+	@api_request('get', 'caches/stats', ('3.0', '4.0', '4.1', '5.0'))
 	def get_traffic_monitor_cache_stats(self):
 		"""
 		Retrieves cache stats from Traffic Monitor. Also includes rows for aggregates
@@ -334,7 +334,7 @@ class TOSession(RestApiSession):
 	#
 	# Cache Groups
 	#
-	@api_request('get', 'cachegroups', ('3.0',))
+	@api_request('get', 'cachegroups', ('3.0', '4.0', '4.1', '5.0'))
 	def get_cachegroups(self, query_params=None):
 		"""
 		Get Cache Groups.
@@ -365,7 +365,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'cachegroups', ('3.0',))
+	@api_request('post', 'cachegroups', ('4.0', '4.1', '5.0',))
 	def create_cachegroups(self, data=None):
 		"""
 		Create a Cache Group
@@ -376,7 +376,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'cachegroups/{cache_group_id:d}', ('3.0',))
+	@api_request('put', 'cachegroups/{cache_group_id:d}', ('4.0', '4.1', '5.0',))
 	def update_cachegroups(self, cache_group_id=None, data=None):
 		"""
 		Update a cache group
@@ -389,7 +389,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'cachegroups/{cache_group_id:d}', ('3.0',))
+	@api_request('delete', 'cachegroups/{cache_group_id:d}', ('4.0', '4.1', '5.0',))
 	def delete_cachegroups(self, cache_group_id=None):
 		"""
 		Delete a cache group
@@ -400,7 +400,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'cachegroups/{cache_group_id:d}/queue_update', ('3.0',))
+	@api_request('post', 'cachegroups/{cache_group_id:d}/queue_update', ('4.0', '4.1', '5.0',))
 	def cachegroups_queue_update(self, cache_group_id=None, data=None):
 		"""
 		Queue Updates by Cache Group ID
@@ -444,7 +444,7 @@ class TOSession(RestApiSession):
 	#
 	# CDN
 	#
-	@api_request('get', 'cdns', ('3.0',))
+	@api_request('get', 'cdns', ('3.0', '4.0', '4.1', '5.0'))
 	def get_cdns(self, query_params=None):
 		"""
 		Get all CDNs.
@@ -455,7 +455,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'cdns', ('3.0',))
+	@api_request('post', 'cdns', ('3.0', '4.0', '4.1', '5.0'))
 	def create_cdn(self, data=None):
 		"""
 		Create a new CDN.
@@ -466,7 +466,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'cdns/{cdn_id:d}', ('3.0',))
+	@api_request('put', 'cdns/{cdn_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def update_cdn_by_id(self, cdn_id=None, data=None):
 		"""
 		Update a CDN by Id.
@@ -479,7 +479,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'cdns/{cdn_id:d}', ('3.0',))
+	@api_request('delete', 'cdns/{cdn_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_cdn_by_id(self, cdn_id=None):
 		"""
 		Delete a CDN by Id.
@@ -490,7 +490,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'cdns/{cdn_id:d}/queue_update', ('3.0',))
+	@api_request('post', 'cdns/{cdn_id:d}/queue_update', ('3.0', '4.0', '4.1', '5.0'))
 	def cdns_queue_update(self, cdn_id=None, data=None):
 		"""
 		Queue Updates by CDN Id.
@@ -506,7 +506,7 @@ class TOSession(RestApiSession):
 	#
 	# CDN Health/Usage
 	#
-	@api_request('get', 'cdns/health', ('3.0',))
+	@api_request('get', 'cdns/health', ('3.0', '4.0', '4.1', '5.0'))
 	def get_cdns_health(self):
 		"""
 		Retrieves the health of all locations (cache groups) for all CDNs
@@ -516,7 +516,7 @@ class TOSession(RestApiSession):
 		"""
 
 
-	@api_request('get', 'cdns/{cdn_name:s}/health', ('3.0',))
+	@api_request('get', 'cdns/{cdn_name:s}/health', ('3.0', '4.0', '4.1', '5.0'))
 	def get_cdn_health_by_name(self, cdn_name=None):
 		"""
 		Retrieves the health of all locations (cache groups) for a given CDN
@@ -527,7 +527,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'cdns/capacity', ('3.0',))
+	@api_request('get', 'cdns/capacity', ('3.0', '4.0', '4.1', '5.0'))
 	def get_cdns_capacity(self):
 		"""
 		Retrieves the aggregate capacity percentages of all locations (cache groups) for a given CDN.
@@ -539,7 +539,7 @@ class TOSession(RestApiSession):
 	#
 	# CDN Routing
 	#
-	@api_request('get', 'cdns/routing', ('3.0',))
+	@api_request('get', 'cdns/routing', ('3.0', '4.0', '4.1', '5.0'))
 	def get_cdns_routing(self):
 		"""
 		Retrieves the aggregate routing percentages of all locations (cache groups) for a given CDN.
@@ -551,7 +551,7 @@ class TOSession(RestApiSession):
 	#
 	# CDN Domains
 	#
-	@api_request('get', 'cdns/domains', ('3.0',))
+	@api_request('get', 'cdns/domains', ('3.0', '4.0', '4.1', '5.0'))
 	def get_cdns_domains(self):
 		"""
 		Retrieves the different CDN domains
@@ -564,7 +564,7 @@ class TOSession(RestApiSession):
 	# CDN Topology
 	#
 
-	@api_request('get', 'cdns/{cdn_name:s}/configs/monitoring', ('3.0',))
+	@api_request('get', 'cdns/{cdn_name:s}/configs/monitoring', ('3.0', '4.0', '4.1', '5.0'))
 	def get_cdn_monitoring_info(self, cdn_name=None):
 		"""
 		Retrieves CDN monitoring information
@@ -578,7 +578,7 @@ class TOSession(RestApiSession):
 	#
 	# DNSSEC Keys
 	#
-	@api_request('get', 'cdns/name/{cdn_name:s}/dnsseckeys', ('3.0',))
+	@api_request('get', 'cdns/name/{cdn_name:s}/dnsseckeys', ('3.0', '4.0', '4.1', '5.0'))
 	def get_cdn_dns_sec_keys(self, cdn_name=None):
 		"""
 		Gets a list of dnsseckeys for a CDN and all associated Delivery Services
@@ -589,7 +589,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'cdns/name/{cdn_name:s}/dnsseckeys', ('3.0',))
+	@api_request('delete', 'cdns/name/{cdn_name:s}/dnsseckeys', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_cdn_dns_sec_keys(self, cdn_name=None):
 		"""
 		Delete dnssec keys for a cdn and all associated delivery services
@@ -600,7 +600,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'cnds/dnsseckeys/generate', ('3.0',))
+	@api_request('post', 'cnds/dnsseckeys/generate', ('3.0', '4.0', '4.1', '5.0'))
 	def create_cdn_dns_sec_keys(self, data=None):
 		"""
 		Generates ZSK and KSK keypairs for a CDN and all associated Delivery Services
@@ -614,7 +614,7 @@ class TOSession(RestApiSession):
 	#
 	# CDN SSL Keys
 	#
-	@api_request('get', 'cdns/name/{cdn_name:s}/sslkeys', ('3.0',))
+	@api_request('get', 'cdns/name/{cdn_name:s}/sslkeys', ('3.0', '4.0', '4.1', '5.0'))
 	def get_cdn_ssl_keys(self, cdn_name=None):
 		"""
 		Returns ssl certificates for all Delivery Services that are a part of the CDN.
@@ -628,7 +628,7 @@ class TOSession(RestApiSession):
 	#
 	# Change Logs
 	#
-	@api_request('get', 'logs', ('3.0',))
+	@api_request('get', 'logs', ('3.0', '4.0', '4.1', '5.0'))
 	def get_change_logs(self, query_params=None):
 		"""
 		Retrieve all change logs from traffic ops
@@ -637,7 +637,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'logs/newcount', ('3.0',))
+	@api_request('get', 'logs/newcount', ('3.0', '4.0', '4.1', '5.0'))
 	def get_change_logs_newcount(self):
 		"""
 		Get amount of new logs from traffic ops
@@ -649,7 +649,7 @@ class TOSession(RestApiSession):
 	#
 	# Delivery Service
 	#
-	@api_request('get', 'deliveryservices', ('3.0',))
+	@api_request('get', 'deliveryservices', ('3.0', '4.0', '4.1', '5.0'))
 	def get_deliveryservices(self, query_params=None):
 		"""
 		Retrieves all delivery services (if admin or ops) or all delivery services assigned to user.
@@ -658,7 +658,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'deliveryservices', ('3.0',))
+	@api_request('post', 'deliveryservices', ('3.0', '4.0', '4.1', '5.0'))
 	def create_deliveryservice(self, data=None):
 		"""
 		Allows user to create a delivery service.
@@ -669,7 +669,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'deliveryservices/{delivery_service_id:d}', ('3.0',))
+	@api_request('put', 'deliveryservices/{delivery_service_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def update_deliveryservice_by_id(self, delivery_service_id=None, data=None):
 		"""
 		Update a Delivery Service by Id.
@@ -682,7 +682,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'deliveryservices/{delivery_service_id:d}/safe', ('3.0',))
+	@api_request('put', 'deliveryservices/{delivery_service_id:d}/safe', ('3.0', '4.0', '4.1', '5.0'))
 	def update_deliveryservice_safe(self, delivery_service_id=None, data=None):
 		"""
 		Allows a user to edit limited fields of a Delivery Service.
@@ -696,7 +696,7 @@ class TOSession(RestApiSession):
 		"""
 
 
-	@api_request('delete', 'deliveryservices/{delivery_service_id:d}', ('3.0',))
+	@api_request('delete', 'deliveryservices/{delivery_service_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_deliveryservice_by_id(self, delivery_service_id=None):
 		"""
 		Allows user to delete a delivery service.
@@ -710,7 +710,7 @@ class TOSession(RestApiSession):
 	#
 	# Delivery Service Health
 	#
-	@api_request('get', 'deliveryservices/{delivery_service_id:d}/health', ('3.0',))
+	@api_request('get', 'deliveryservices/{delivery_service_id:d}/health', ('3.0', '4.0', '4.1', '5.0'))
 	def get_delivery_service_health(self, delivery_service_id=None):
 		"""
 		Retrieves the health of all locations (cache groups) for a delivery service. Delivery
@@ -722,7 +722,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'deliveryservices/{delivery_service_id:d}/capacity', ('3.0',))
+	@api_request('get', 'deliveryservices/{delivery_service_id:d}/capacity', ('3.0', '4.0', '4.1', '5.0'))
 	def get_delivery_service_capacity(self, delivery_service_id=None):
 		"""
 		Retrieves the capacity percentages of a delivery service. Delivery service must be assigned
@@ -737,7 +737,7 @@ class TOSession(RestApiSession):
 	#
 	# Delivery Service Server
 	#
-	@api_request('get', 'deliveryserviceserver', ('3.0',))
+	@api_request('get', 'deliveryserviceserver', ('3.0', '4.0', '4.1', '5.0'))
 	def get_deliveryserviceserver(self, query_params=None):
 		"""
 		Retrieves delivery service / server assignments. (Allows pagination and limits)
@@ -748,7 +748,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'deliveryserviceserver', ('3.0',))
+	@api_request('post', 'deliveryserviceserver', ('3.0', '4.0', '4.1', '5.0'))
 	def assign_deliveryservice_servers_by_ids(self, data=None):
 		"""
 		Assign servers by id to a Delivery Service. (New Method)
@@ -759,7 +759,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'deliveryservices/{xml_id}/servers', ('3.0',))
+	@api_request('post', 'deliveryservices/{xml_id}/servers', ('3.0', '4.0', '4.1', '5.0'))
 	def assign_deliveryservice_servers_by_names(self, xml_id=None, data=None):
 		"""
 		Assign servers by name to a Delivery Service by xmlId.
@@ -772,7 +772,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'deliveryserviceserver/{delivery_service_id:d}/{server_id:d}',('3.0',))
+	@api_request('delete', 'deliveryserviceserver/{delivery_service_id:d}/{server_id:d}',('3.0', '4.0', '4.1', '5.0'))
 	def delete_deliveryservice_servers_by_id(self, delivery_service_id=None, server_id=None):
 		"""
 		Removes a server (cache) from a delivery service.
@@ -785,7 +785,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'deliveryservices/{delivery_service_id:d}/servers', ('3.0',))
+	@api_request('get', 'deliveryservices/{delivery_service_id:d}/servers', ('3.0', '4.0', '4.1', '5.0'))
 	def get_deliveryservice_servers(self, delivery_service_id=None):
 		"""
 		Retrieves properties of CDN EDGE or ORG servers assigned to a delivery service.
@@ -796,7 +796,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'deliveryservices/{delivery_service_id:d}/servers/eligible', ('3.0',))
+	@api_request('get', 'deliveryservices/{delivery_service_id:d}/servers/eligible', ('3.0', '4.0', '4.1', '5.0'))
 	def get_deliveryservice_ineligible_servers(self, delivery_service_id=None):
 		"""
 		Retrieves properties of CDN EDGE or ORG servers not eligible for assignment to a delivery
@@ -811,7 +811,7 @@ class TOSession(RestApiSession):
 	#
 	# Delivery Service SSL Keys
 	#
-	@api_request('get', 'deliveryservices/xmlId/{xml_id}/sslkeys', ('3.0',))
+	@api_request('get', 'deliveryservices/xmlId/{xml_id}/sslkeys', ('3.0', '4.0', '4.1', '5.0'))
 	def get_deliveryservice_ssl_keys_by_xml_id(self, xml_id=None, query_params=None):
 		"""
 		Get SSL keys for a Delivery Service by xmlId.
@@ -824,7 +824,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'deliveryservices/xmlId/{xml_id}/sslkeys', ('3.0',))
+	@api_request('delete', 'deliveryservices/xmlId/{xml_id}/sslkeys', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_deliveryservice_ssl_keys_by_xml_id(self, xml_id=None, query_params=None):
 		"""
 		Delete SSL keys for a Delivery Service by xmlId.
@@ -837,7 +837,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'deliveryservices/sslkeys/generate', ('3.0',))
+	@api_request('post', 'deliveryservices/sslkeys/generate', ('3.0', '4.0', '4.1', '5.0'))
 	def generate_deliveryservice_ssl_keys(self, data=None):
 		"""
 		Generate an SSL certificate. (self-signed)
@@ -848,7 +848,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'deliveryservices/sslkeys/add', ('3.0',))
+	@api_request('post', 'deliveryservices/sslkeys/add', ('3.0', '4.0', '4.1', '5.0'))
 	def add_ssl_keys_to_deliveryservice(self, data=None):
 		"""
 		Add SSL keys to a Delivery Service.
@@ -862,7 +862,7 @@ class TOSession(RestApiSession):
 	#
 	# Delivery Service URL Sig Keys
 	#
-	@api_request('post', 'deliveryservices/xmlId/{xml_id}/urlkeys/generate', ('3.0',))
+	@api_request('post', 'deliveryservices/xmlId/{xml_id}/urlkeys/generate', ('3.0', '4.0', '4.1', '5.0'))
 	def generate_deliveryservice_url_signature_keys(self, xml_id=None):
 		"""
 		Generate URL Signature Keys for a Delivery Service by xmlId.
@@ -876,7 +876,7 @@ class TOSession(RestApiSession):
 	#
 	# Delivery Service Regexes
 	#
-	@api_request('get', 'deliveryservices_regexes', ('3.0',))
+	@api_request('get', 'deliveryservices_regexes', ('3.0', '4.0', '4.1', '5.0'))
 	def get_deliveryservices_regexes(self):
 		"""
 		Get RegExes for all Delivery Services.
@@ -885,7 +885,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'deliveryservices/{delivery_service_id:d}/regexes', ('3.0',))
+	@api_request('get', 'deliveryservices/{delivery_service_id:d}/regexes', ('3.0', '4.0', '4.1', '5.0'))
 	def get_deliveryservice_regexes_by_id(self, delivery_service_id=None, query_params=None):
 		"""
 		Get RegExes for a Delivery Service by Id.
@@ -898,7 +898,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'deliveryservices/{delivery_service_id:d}/regexes', ('3.0',))
+	@api_request('post', 'deliveryservices/{delivery_service_id:d}/regexes', ('3.0', '4.0', '4.1', '5.0'))
 	def create_deliveryservice_regexes(self, delivery_service_id=None, data=None):
 		"""
 		Create a regex for a delivery service
@@ -911,7 +911,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'deliveryservices/{delivery_service_id:d}/regexes/{regex_id:d}', ('3.0',))
+	@api_request('put', 'deliveryservices/{delivery_service_id:d}/regexes/{regex_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def update_deliveryservice_regexes(self, delivery_service_id=None, regex_id=None,
 	                                   query_params=None):
 		"""
@@ -928,7 +928,7 @@ class TOSession(RestApiSession):
 		"""
 
 	@api_request('delete', 'deliveryservices/{delivery_service_id:d}/regexes/'
-	                        '{delivery_service_regex_id:d}', ('3.0',))
+	                        '{delivery_service_regex_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_deliveryservice_regex_by_regex_id(self, delivery_service_id=None,
 	                                             delivery_service_regex_id=None):
 		"""
@@ -945,7 +945,7 @@ class TOSession(RestApiSession):
 	#
 	# Delivery Service Statistics
 	#
-	@api_request('get', 'deliveryservice_stats', ('3.0',))
+	@api_request('get', 'deliveryservice_stats', ('3.0', '4.0', '4.1', '5.0'))
 	def get_delivery_service_stats(self, query_params=None):
 		"""
 		Retrieves statistics on the delivery services.
@@ -959,7 +959,7 @@ class TOSession(RestApiSession):
 	#
 	# Divisions
 	#
-	@api_request('get', 'divisions', ('3.0',))
+	@api_request('get', 'divisions', ('3.0', '4.0', '4.1', '5.0'))
 	def get_divisions(self, query_params=None):
 		"""
 		Get all divisions.
@@ -968,7 +968,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'divisions/{division_id:d}', ('3.0',))
+	@api_request('put', 'divisions/{division_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def update_division(self, division_id=None, query_params=None):
 		"""
 		Update a division by division id
@@ -981,7 +981,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'divisions', ('3.0',))
+	@api_request('post', 'divisions', ('3.0', '4.0', '4.1', '5.0'))
 	def create_division(self, data=None):
 		"""
 		Create a division
@@ -992,7 +992,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'divisions/{division_id:d}', ('3.0',))
+	@api_request('delete', 'divisions/{division_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_division(self, division_id=None, query_params=None):
 		"""
 		Delete a division by division id
@@ -1008,7 +1008,7 @@ class TOSession(RestApiSession):
 	#
 	# Federation
 	#
-	@api_request('get', 'federations', ('3.0',))
+	@api_request('get', 'federations', ('3.0', '4.0', '4.1', '5.0'))
 	def get_federations(self):
 		"""
 		Retrieves a list of federation mappings (aka federation resolvers) for a the current user
@@ -1018,7 +1018,7 @@ class TOSession(RestApiSession):
 		"""
 
 
-	@api_request('post', 'federations', ('3.0',))
+	@api_request('post', 'federations', ('3.0', '4.0', '4.1', '5.0'))
 	def create_federation(self, data=None):
 		"""
 		Allows a user to add federations for their delivery service(s).
@@ -1030,7 +1030,7 @@ class TOSession(RestApiSession):
 		"""
 
 
-	@api_request('get', 'cdns/{cdn_name:s}/federations', ('3.0',))
+	@api_request('get', 'cdns/{cdn_name:s}/federations', ('3.0', '4.0', '4.1', '5.0'))
 	def get_federations_for_cdn(self, cdn_name=None, query_params=None):
 		"""
 		Retrieves a list of federations for a cdn.
@@ -1044,7 +1044,7 @@ class TOSession(RestApiSession):
 		"""
 
 
-	@api_request('post', 'cdns/{cdn_name:s}/federations', ('3.0',))
+	@api_request('post', 'cdns/{cdn_name:s}/federations', ('3.0', '4.0', '4.1', '5.0'))
 	def create_federation_in_cdn(self, cdn_name=None, data=None):
 		"""
 		Create a federation.
@@ -1055,7 +1055,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'cdns/{cdn_name:s}/federations/{federation_id:d}', ('3.0',))
+	@api_request('put', 'cdns/{cdn_name:s}/federations/{federation_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def update_federation_in_cdn(self, cdn_name=None, federation_id=None, query_params=None):
 		"""
 		Update a federation.
@@ -1068,7 +1068,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'cdns/{cdn_name:s}/federations/{federation_id:d}', ('3.0',))
+	@api_request('delete', 'cdns/{cdn_name:s}/federations/{federation_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_federation_in_cdn(self, cdn_name=None, federation_id=None):
 		"""
 		Delete a federation.
@@ -1084,7 +1084,7 @@ class TOSession(RestApiSession):
 	#
 	# Federation Delivery Service
 	#
-	@api_request('get', 'federations/{federation_id:d}/deliveryservices', ('3.0',))
+	@api_request('get', 'federations/{federation_id:d}/deliveryservices', ('3.0', '4.0', '4.1', '5.0'))
 	def get_federation_delivery_services(self, federation_id=None):
 		"""
 		Retrieves delivery services assigned to a federation
@@ -1098,7 +1098,7 @@ class TOSession(RestApiSession):
 		"""
 
 
-	@api_request('post', 'federations/{federation_id:d}/deliveryservices', ('3.0',))
+	@api_request('post', 'federations/{federation_id:d}/deliveryservices', ('3.0', '4.0', '4.1', '5.0'))
 	def assign_delivery_services_to_federations(self, federation_id=None, data=None):
 		"""
 		Create one or more federation / delivery service assignments.
@@ -1114,7 +1114,7 @@ class TOSession(RestApiSession):
 	#
 	# Federation Federation Resolver
 	#
-	@api_request('get', 'federations/{federation_id:d}/federation_resolvers', ('3.0',))
+	@api_request('get', 'federations/{federation_id:d}/federation_resolvers', ('3.0', '4.0', '4.1', '5.0'))
 	def get_federation_resolvers_by_id(self, federation_id=None):
 		"""
 		:ref:`to-api-federations-id-federation_resolvers`
@@ -1126,7 +1126,7 @@ class TOSession(RestApiSession):
 		"""
 
 
-	@api_request('post', 'federations/{federation_id:d}/federation_resolvers', ('3.0',))
+	@api_request('post', 'federations/{federation_id:d}/federation_resolvers', ('3.0', '4.0', '4.1', '5.0'))
 	def assign_federation_resolver_to_federations(self, federation_id=None, data=None):
 		"""
 		Create one or more federation / federation resolver assignments.
@@ -1142,7 +1142,7 @@ class TOSession(RestApiSession):
 	#
 	# Federation Resolver
 	#
-	@api_request('get', 'federation_resolvers', ('3.0',))
+	@api_request('get', 'federation_resolvers', ('3.0', '4.0', '4.1', '5.0'))
 	def get_federation_resolvers(self, query_params=None):
 		"""
 		Get federation resolvers.
@@ -1152,7 +1152,7 @@ class TOSession(RestApiSession):
 		"""
 
 
-	@api_request('post', 'federation_resolvers', ('3.0',))
+	@api_request('post', 'federation_resolvers', ('3.0', '4.0', '4.1', '5.0'))
 	def create_federation_resolver(self, data=None):
 		"""
 		Create a federation resolver.
@@ -1162,7 +1162,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'federation_resolvers/{federation_resolver_id:d}', ('3.0',))
+	@api_request('delete', 'federation_resolvers/{federation_resolver_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_federation_resolver(self, federation_resolver_id=None):
 		"""
 		Delete a federation resolver.
@@ -1175,7 +1175,7 @@ class TOSession(RestApiSession):
 	#
 	# Federation User
 	#
-	@api_request('get', 'federations/{federation_id:d}/users', ('3.0',))
+	@api_request('get', 'federations/{federation_id:d}/users', ('3.0', '4.0', '4.1', '5.0'))
 	def get_federation_users(self, federation_id=None):
 		"""
 		Retrieves users assigned to a federation.
@@ -1184,7 +1184,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'federations/{federation_id:d}/users', ('3.0',))
+	@api_request('post', 'federations/{federation_id:d}/users', ('3.0', '4.0', '4.1', '5.0'))
 	def create_federation_user(self, federation_id=None, data=None):
 		"""
 		Create one or more federation / user assignments.
@@ -1197,7 +1197,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'federations/{federation_id:d}/users/{user_id:d}', ('3.0',))
+	@api_request('delete', 'federations/{federation_id:d}/users/{user_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_federation_user(self, federation_id=None, user_id=None):
 		"""
 		Delete one or more federation / user assignments.
@@ -1213,7 +1213,7 @@ class TOSession(RestApiSession):
 	#
 	# ISO
 	#
-	@api_request('get', 'osversions', ('3.0',))
+	@api_request('get', 'osversions', ('3.0', '4.0', '4.1', '5.0'))
 	def get_osversions(self):
 		"""
 		Get all OS versions for ISO generation and the directory where the kickstarter files are
@@ -1225,7 +1225,7 @@ class TOSession(RestApiSession):
 		"""
 
 	#TODO: this currently doesn't work, as /isos wasn't rewritten yet
-	@api_request('post', 'isos', ('3.0',))
+	@api_request('post', 'isos', ('3.0', '4.0', '4.1', '5.0'))
 	def generate_iso(self, data=None):
 		"""
 		Generate an ISO
@@ -1239,7 +1239,7 @@ class TOSession(RestApiSession):
 	#
 	# Jobs
 	#
-	@api_request('get', 'jobs', ('3.0',))
+	@api_request('get', 'jobs', ('3.0', '4.0', '4.1', '5.0'))
 	def get_jobs(self, query_params=None):
 		"""
 		Get all content-invalidation jobs (tenancy permitting).
@@ -1248,7 +1248,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'jobs', ('3.0',))
+	@api_request('post', 'jobs', ('3.0', '4.0', '4.1', '5.0'))
 	def create_job(self, data=None):
 		"""
 		Creates a new content-invalidation job sorted by start time.
@@ -1259,7 +1259,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'jobs', ('3.0',))
+	@api_request('get', 'jobs', ('3.0', '4.0', '4.1', '5.0'))
 	def update_job(self, data=None, query_params=None):
 		"""
 		Replaces a content-invalidation job with the one passed.
@@ -1271,7 +1271,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'jobs', ('3.0',))
+	@api_request('delete', 'jobs', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_job(self, query_params=None):
 		"""
 		Deletes a content-invalidation job.
@@ -1284,7 +1284,7 @@ class TOSession(RestApiSession):
 	#
 	# Parameter
 	#
-	@api_request('get', 'parameters', ('3.0',))
+	@api_request('get', 'parameters', ('3.0', '4.0', '4.1', '5.0'))
 	def get_parameters(self, query_params=None):
 		"""
 		Get all Parameters.
@@ -1293,7 +1293,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'profiles/{profile_id:d}/parameters', ('3.0',))
+	@api_request('get', 'profiles/{profile_id:d}/parameters', ('3.0', '4.0', '4.1', '5.0'))
 	def get_parameters_by_profile_id(self, profile_id=None):
 		"""
 		Get all Parameters associated with a Profile by Id.
@@ -1304,7 +1304,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'profiles/name/{profile_name}/parameters', ('3.0',))
+	@api_request('get', 'profiles/name/{profile_name}/parameters', ('3.0', '4.0', '4.1', '5.0'))
 	def get_parameters_by_profile_name(self, profile_name=None):
 		"""
 		Get all Parameters associated with a Profile by Name.
@@ -1315,7 +1315,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'parameters', ('3.0',))
+	@api_request('post', 'parameters', ('3.0', '4.0', '4.1', '5.0'))
 	def create_parameter(self, data=None):
 		"""
 		Create Parameter
@@ -1326,7 +1326,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'parameters/{parameter_id:d}', ('3.0',))
+	@api_request('put', 'parameters/{parameter_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def update_parameter(self, parameter_id=None, query_params=None):
 		"""
 		Update Parameter
@@ -1338,7 +1338,7 @@ class TOSession(RestApiSession):
 		"""
 
 
-	@api_request('delete', 'parameters/{parameter_id:d}', ('3.0',))
+	@api_request('delete', 'parameters/{parameter_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_parameter(self, parameter_id=None):
 		"""
 		Delete Parameter
@@ -1352,7 +1352,7 @@ class TOSession(RestApiSession):
 	#
 	# Physical Location
 	#
-	@api_request('get', 'phys_locations', ('3.0',))
+	@api_request('get', 'phys_locations', ('3.0', '4.0', '4.1', '5.0'))
 	def get_physical_locations(self, query_params=None):
 		"""
 		Get Physical Locations.
@@ -1361,7 +1361,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'phys_locations/{physical_location_id:d}', ('3.0',))
+	@api_request('put', 'phys_locations/{physical_location_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def update_physical_location(self, physical_location_id=None, query_params=None):
 		"""
 		Update Physical Location by id
@@ -1372,7 +1372,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'phys_locations/{physical_location_id:d}', ('3.0',))
+	@api_request('delete', 'phys_locations/{physical_location_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_physical_location(self, physical_location_id=None, query_params=None):
 		"""
 		Delete Physical Location by id
@@ -1386,7 +1386,7 @@ class TOSession(RestApiSession):
 	#
 	# Plugins
 	#
-	@api_request('get', 'plugins', ('3.0',))
+	@api_request('get', 'plugins', ('3.0', '4.0', '4.1', '5.0'))
 	def get_plugins(self):
 		"""
 		Retrieves the list of plugins.
@@ -1398,7 +1398,7 @@ class TOSession(RestApiSession):
 	#
 	# Profiles
 	#
-	@api_request('get', 'profiles', ('3.0',))
+	@api_request('get', 'profiles', ('3.0', '4.0', '4.1', '5.0'))
 	def get_profiles(self, query_params=None):
 		"""
 		Get Profiles.
@@ -1407,7 +1407,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'profiles', ('3.0',))
+	@api_request('post', 'profiles', ('3.0', '4.0', '4.1', '5.0'))
 	def create_profile(self, data=None):
 		"""
 		Create a profile
@@ -1418,7 +1418,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'profiles/name/{new_profile_name:s}/copy/{copy_profile_name:s}', ('3.0',))
+	@api_request('post', 'profiles/name/{new_profile_name:s}/copy/{copy_profile_name:s}', ('3.0', '4.0', '4.1', '5.0'))
 	def copy_profile(self, new_profile_name=None, copy_profile_name=None, data=None):
 		"""
 		Copy profile to a new profile. The new profile name must not exist
@@ -1433,7 +1433,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'profiles/{profile_id:d}', ('3.0',))
+	@api_request('put', 'profiles/{profile_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def update_profile_by_id(self, profile_id=None, data=None):
 		"""
 		Update Profile by Id.
@@ -1446,7 +1446,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'profiles/{profile_id:d}', ('3.0',))
+	@api_request('delete', 'profiles/{profile_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_profile_by_id(self, profile_id=None):
 		"""
 		Delete Profile by Id.
@@ -1460,7 +1460,7 @@ class TOSession(RestApiSession):
 	#
 	# Profile Parameters
 	#
-	@api_request('post', 'profileparameters', ('3.0',))
+	@api_request('post', 'profileparameters', ('3.0', '4.0', '4.1', '5.0'))
 	def associate_paramater_to_profile(self, data=None):
 		"""
 		Associate parameter to profile.
@@ -1470,7 +1470,7 @@ class TOSession(RestApiSession):
 		"""
 
 
-	@api_request('post', 'profiles/{profile_id:d}/parameters', ('3.0',))
+	@api_request('post', 'profiles/{profile_id:d}/parameters', ('3.0', '4.0', '4.1', '5.0'))
 	def associate_parameters_by_profile_id(self, profile_id=None, data=None):
 		"""
 		Associate Parameters to a Profile by Id.
@@ -1483,7 +1483,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'profileparameter', ('3.0',))
+	@api_request('post', 'profileparameter', ('3.0', '4.0', '4.1', '5.0'))
 	def assign_profile_to_parameter_ids(self, data=None):
 		"""
 		Create one or more profile / parameter assignments.
@@ -1494,7 +1494,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'parameterprofile', ('3.0',))
+	@api_request('post', 'parameterprofile', ('3.0', '4.0', '4.1', '5.0'))
 	def assign_parameter_to_profile_ids(self, data=None):
 		"""
 		Create one or more parameter / profile assignments.
@@ -1506,7 +1506,7 @@ class TOSession(RestApiSession):
 		"""
 
 
-	@api_request('post', 'profiles/name/{profile_name}/parameters', ('3.0',))
+	@api_request('post', 'profiles/name/{profile_name}/parameters', ('3.0', '4.0', '4.1', '5.0'))
 	def associate_parameters_by_profile_name(self, profile_name=None, data=None):
 		"""
 		Associate Parameters to a Profile by Name.
@@ -1519,7 +1519,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'profileparameters/{profile_id:d}/{parameter_id:d}', ('3.0',))
+	@api_request('delete', 'profileparameters/{profile_id:d}/{parameter_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_profile_parameter_association_by_id(self, profile_id=None, parameter_id=None):
 		"""
 		Delete Parameter association by Id for a Profile by Id.
@@ -1535,7 +1535,7 @@ class TOSession(RestApiSession):
 	#
 	# Regions
 	#
-	@api_request('get', 'regions', ('3.0',))
+	@api_request('get', 'regions', ('3.0', '4.0', '4.1', '5.0'))
 	def get_regions(self, query_params=None):
 		"""
 		Get Regions.
@@ -1546,7 +1546,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'regions', ('3.0',))
+	@api_request('post', 'regions', ('3.0', '4.0', '4.1', '5.0'))
 	def create_region(self, query_params=None, data=None):
 		"""
 		Create a region
@@ -1557,7 +1557,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'regions', ('3.0',))
+	@api_request('delete', 'regions', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_region(self, query_params=None):
 		"""
 		Delete a region by name or ID as a query parameter
@@ -1568,7 +1568,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'regions/{region_id:d}', ('3.0',))
+	@api_request('put', 'regions/{region_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def update_region(self, region_id=None):
 		"""
 		Update a region
@@ -1582,7 +1582,7 @@ class TOSession(RestApiSession):
 	#
 	# Roles
 	#
-	@api_request('get', 'roles', ('3.0',))
+	@api_request('get', 'roles', ('3.0', '4.0', '4.1', '5.0'))
 	def get_roles(self):
 		"""
 		Get Roles.
@@ -1591,7 +1591,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'roles', ('3.0',))
+	@api_request('post', 'roles', ('3.0', '4.0', '4.1', '5.0'))
 	def create_role(self, data=None):
 		"""
 		Create a new Role.
@@ -1602,7 +1602,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'roles', ('3.0',))
+	@api_request('put', 'roles', ('3.0', '4.0', '4.1', '5.0'))
 	def update_role(self, data=None, query_params=None):
 		"""
 		Get Roles.
@@ -1614,7 +1614,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'roles', ('3.0',))
+	@api_request('delete', 'roles', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_role(self, query_params=None):
 		"""
 		Delete a Role.
@@ -1626,7 +1626,7 @@ class TOSession(RestApiSession):
 	#
 	# Server
 	#
-	@api_request('get', 'servers', ('3.0',))
+	@api_request('get', 'servers', ('3.0', '4.0', '4.1', '5.0'))
 	def get_servers(self, query_params=None):
 		"""
 		Get Servers.
@@ -1637,7 +1637,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'servers/{server_id:d}/deliveryservices', ('3.0',))
+	@api_request('get', 'servers/{server_id:d}/deliveryservices', ('3.0', '4.0', '4.1', '5.0'))
 	def get_server_delivery_services(self, server_id=None):
 		"""
 		Retrieves all delivery services assigned to the server
@@ -1660,7 +1660,7 @@ class TOSession(RestApiSession):
 			The endpoint this represents has been removed from APIv4 and clients should use get_servers instead.
 		"""
 
-	@api_request('post', 'servercheck', ('3.0',))
+	@api_request('post', 'servercheck', ('3.0', '4.0', '4.1', '5.0'))
 	def create_servercheck(self, data=None):
 		"""
 		Post a server check result to the serverchecks table.
@@ -1671,7 +1671,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'servers', ('3.0',))
+	@api_request('post', 'servers', ('3.0', '4.0', '4.1', '5.0'))
 	def create_server(self, data=None):
 		"""
 		Create a new Server.
@@ -1682,7 +1682,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'servers/{server_id:d}', ('3.0',))
+	@api_request('put', 'servers/{server_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def update_server_by_id(self, server_id=None, data=None):
 		"""
 		Update a Server by Id.
@@ -1694,7 +1694,7 @@ class TOSession(RestApiSession):
 		:rtype: Tuple[Union[Dict[str, Any], List[Dict[str, Any]]], requests.Response]
 		:raises: Union[LoginError, OperationError]
 		"""
-	@api_request('put', 'servers/{server_id:d}/status', ('3.0',))
+	@api_request('put', 'servers/{server_id:d}/status', ('3.0', '4.0', '4.1', '5.0'))
 	def update_server_status_by_id(self, server_id=None, data=None):
 		"""
 		Update server_status by Id.
@@ -1706,7 +1706,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'servers/{server_id:d}', ('3.0',))
+	@api_request('delete', 'servers/{server_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_server_by_id(self, server_id=None):
 		"""
 		Delete a Server by Id.
@@ -1717,7 +1717,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'servers/{server_id:d}/queue_update', ('3.0',))
+	@api_request('post', 'servers/{server_id:d}/queue_update', ('3.0', '4.0', '4.1', '5.0'))
 	def servers_queue_update(self, server_id=None, data=None):
 		"""
 		Queue Updates by Server Id.
@@ -1730,7 +1730,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'servers/{server_name}/update_status', ('3.0',))
+	@api_request('get', 'servers/{server_name}/update_status', ('3.0', '4.0', '4.1', '5.0'))
 	def get_server_update_status(self, server_name=None):
 		"""
 		Gets the current update status of a server named ``server_name``.
@@ -1743,7 +1743,7 @@ class TOSession(RestApiSession):
 	#
 	# Static DNS Entries
 	#
-	@api_request('get', 'staticdnsentries', ('3.0',))
+	@api_request('get', 'staticdnsentries', ('3.0', '4.0', '4.1', '5.0'))
 	def get_staticdnsentries(self, query_params=None):
 		"""
 		Get static DNS entries associated with the delivery service
@@ -1754,7 +1754,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'staticdnsentries', ('3.0',))
+	@api_request('post', 'staticdnsentries', ('3.0', '4.0', '4.1', '5.0'))
 	def create_staticdnsentries(self, data=None):
 		"""
 		Create static DNS entries associated with the delivery service
@@ -1765,7 +1765,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'staticdnsentries', ('3.0',))
+	@api_request('put', 'staticdnsentries', ('3.0', '4.0', '4.1', '5.0'))
 	def update_staticdnsentries(self, data=None, query_params=None):
 		"""
 		Update static DNS entries associated with the delivery service
@@ -1778,7 +1778,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'staticdnsentries', ('3.0',))
+	@api_request('delete', 'staticdnsentries', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_staticdnsentries(self, query_params=None):
 		"""
 		Delete static DNS entries associated with the delivery service
@@ -1792,7 +1792,7 @@ class TOSession(RestApiSession):
 	#
 	# Status
 	#
-	@api_request('get', 'statuses', ('3.0',))
+	@api_request('get', 'statuses', ('3.0', '4.0', '4.1', '5.0'))
 	def get_statuses(self, query_params=None):
 		"""
 		Retrieves a list of the server status codes available.
@@ -1804,7 +1804,7 @@ class TOSession(RestApiSession):
 	#
 	# System
 	#
-	@api_request('get', 'system/info', ('3.0',))
+	@api_request('get', 'system/info', ('3.0', '4.0', '4.1', '5.0'))
 	def get_system_info(self):
 		"""
 		Get information on the traffic ops system.
@@ -1817,7 +1817,7 @@ class TOSession(RestApiSession):
 	#
 	# Tenants
 	#
-	@api_request('get', 'tenants', ('3.0',))
+	@api_request('get', 'tenants', ('3.0', '4.0', '4.1', '5.0'))
 	def get_tenants(self, query_params=None):
 		"""
 		Get all tenants.
@@ -1826,7 +1826,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'tenants/{tenant_id:d}', ('3.0',))
+	@api_request('put', 'tenants/{tenant_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def update_tenant(self, tenant_id=None):
 		"""
 		Update a tenant
@@ -1837,7 +1837,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'tenants', ('3.0',))
+	@api_request('post', 'tenants', ('3.0', '4.0', '4.1', '5.0'))
 	def create_tenant(self, data=None):
 		"""
 		Create a tenant
@@ -1852,7 +1852,7 @@ class TOSession(RestApiSession):
 	#
 	# TO Extensions
 	#
-	@api_request('get', 'servercheck/extensions', ('3.0',))
+	@api_request('get', 'servercheck/extensions', ('3.0', '4.0', '4.1', '5.0'))
 	def get_servercheck_extensions(self):
 		"""
 		Retrieves the list of extensions.
@@ -1861,7 +1861,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'servercheck/extensions', ('3.0',))
+	@api_request('post', 'servercheck/extensions', ('3.0', '4.0', '4.1', '5.0'))
 	def create_to_extension(self, data=None):
 		"""
 		Creates a Traffic Ops extension.
@@ -1872,7 +1872,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'servercheck/extensions/{extension_id:d}', ('3.0',))
+	@api_request('delete', 'servercheck/extensions/{extension_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_to_extension(self, extension_id=None):
 		"""
 		Deletes a Traffic Ops extension.
@@ -1886,7 +1886,7 @@ class TOSession(RestApiSession):
 	#
 	# Topologies
 	#
-	@api_request('post', 'topologies', ('3.0',))
+	@api_request('post', 'topologies', ('3.0', '4.0', '4.1', '5.0'))
 	def create_topology(self, data: Dict[str, Any]=None) -> Tuple[Union[Dict[str, Any], List[Dict[str, Any]]], Response]:
 		"""
 		Create a topology
@@ -1897,7 +1897,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'topologies', ('3.0',))
+	@api_request('get', 'topologies', ('3.0', '4.0', '4.1', '5.0'))
 	def get_topologies(self, query_params: Dict[str, Any]=None) -> Tuple[Union[Dict[str, Any], List[Dict[str, Any]]], Response]:
 		"""
 		Get Topologies.
@@ -1908,7 +1908,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'topologies?name={name:s}', ('3.0',))
+	@api_request('put', 'topologies?name={name:s}', ('3.0', '4.0', '4.1', '5.0'))
 	def update_topology(self, name: str=None, data: Dict[str, Any]=None) -> Tuple[Union[Dict[str, Any], List[Dict[str, Any]]], Response]:
 		"""
 		Update a Topology
@@ -1921,7 +1921,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'topologies?name={name:s}', ('3.0',))
+	@api_request('delete', 'topologies?name={name:s}', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_topology(self, name: str=None) -> Tuple[Union[Dict[str, Any], List[Dict[str, Any]]], Response]:
 		"""
 		Delete a Topology
@@ -1932,7 +1932,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'topologies/{name:s}/queue_update', ('3.0',))
+	@api_request('post', 'topologies/{name:s}/queue_update', ('3.0', '4.0', '4.1', '5.0'))
 	def topologies_queue_update(self, name=None, data=None):
 		"""
 		Queue Updates by Topology name.
@@ -1948,7 +1948,7 @@ class TOSession(RestApiSession):
 	#
 	# Types
 	#
-	@api_request('get', 'types', ('3.0',))
+	@api_request('get', 'types', ('3.0', '4.0', '4.1', '5.0'))
 	def get_types(self, query_params=None):
 		"""
 		Get Data Types.
@@ -1960,7 +1960,7 @@ class TOSession(RestApiSession):
 	#
 	# Users
 	#
-	@api_request('get', 'users', ('3.0',))
+	@api_request('get', 'users', ('3.0', '4.0', '4.1', '5.0'))
 	def get_users(self):
 		"""
 		Retrieves all users.
@@ -1969,7 +1969,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'users/{user_id:d}', ('3.0',))
+	@api_request('get', 'users/{user_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def get_user_by_id(self, user_id=None):
 		"""
 		Retrieves user by ID.
@@ -1980,7 +1980,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'users', ('3.0',))
+	@api_request('post', 'users', ('3.0', '4.0', '4.1', '5.0'))
 	def create_user(self, data=None):
 		"""
 		Create a user.
@@ -1991,7 +1991,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'users/{user_id:d}', ('3.0',))
+	@api_request('put', 'users/{user_id:d}', ('3.0', '4.0', '4.1', '5.0'))
 	def update_user_by_id(self, user_id=None, data=None):
 		"""
 		Update a user.
@@ -2002,7 +2002,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'users/register', ('3.0',))
+	@api_request('post', 'users/register', ('3.0', '4.0', '4.1', '5.0'))
 	def create_user_with_registration(self, data=None):
 		"""
 		Register a user and send registration email
@@ -2013,7 +2013,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'user/current', ('3.0',))
+	@api_request('get', 'user/current', ('3.0', '4.0', '4.1', '5.0'))
 	def get_authenticated_user(self):
 		"""
 		Retrieves the profile for the authenticated user.
@@ -2022,7 +2022,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'user/current', ('3.0',))
+	@api_request('put', 'user/current', ('3.0', '4.0', '4.1', '5.0'))
 	def replace_authenticated_user(self, data=None):
 		"""
 		Updates the currently authenticated user.
@@ -2036,7 +2036,7 @@ class TOSession(RestApiSession):
 	#
 	# Snapshot CRConfig
 	#
-	@api_request('get', 'cdns/{cdn_name}/snapshot', ('3.0',))
+	@api_request('get', 'cdns/{cdn_name}/snapshot', ('3.0', '4.0', '4.1', '5.0'))
 	def get_current_snapshot_crconfig(self, cdn_name=None):
 		"""
 		Retrieves the CURRENT snapshot for a CDN which doesn't necessarily represent the current
@@ -2049,7 +2049,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('get', 'cdns/{cdn_name}/snapshot/new', ('3.0',))
+	@api_request('get', 'cdns/{cdn_name}/snapshot/new', ('3.0', '4.0', '4.1', '5.0'))
 	def get_pending_snapshot_crconfig(self, cdn_name=None):
 		"""
 		Retrieves a PENDING snapshot for a CDN which represents the current state of the CDN. The
@@ -2063,7 +2063,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'snapshot', ('3.0',))
+	@api_request('put', 'snapshot', ('3.0', '4.0', '4.1', '5.0'))
 	def snapshot_crconfig(self, query_params=None):
 		"""
 		Snapshot CRConfig by CDN Name or ID.
@@ -2077,7 +2077,7 @@ class TOSession(RestApiSession):
 	#
 	# Coordinate
 	#
-	@api_request('get', 'coordinates', ('3.0',))
+	@api_request('get', 'coordinates', ('3.0', '4.0', '4.1', '5.0'))
 	def get_coordinates(self, query_params=None):
 		"""
 		Get all coordinates associated with the cdn
@@ -2088,7 +2088,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'coordinates', ('3.0',))
+	@api_request('post', 'coordinates', ('3.0', '4.0', '4.1', '5.0'))
 	def create_coordinates(self, data=None):
 		"""
 		Create coordinates
@@ -2099,7 +2099,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'coordinates', ('3.0',))
+	@api_request('put', 'coordinates', ('3.0', '4.0', '4.1', '5.0'))
 	def update_coordinates(self, query_params=None, data=None):
 		"""
 		Update coordinates
@@ -2112,7 +2112,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'coordinates', ('3.0',))
+	@api_request('delete', 'coordinates', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_coordinates(self, query_params=None):
 		"""
 		Delete coordinates
@@ -2126,7 +2126,7 @@ class TOSession(RestApiSession):
 	#
 	# Origin
 	#
-	@api_request('get', 'origins', ('3.0',))
+	@api_request('get', 'origins', ('3.0', '4.0', '4.1', '5.0'))
 	def get_origins(self, query_params=None):
 		"""
 		Get origins associated with the delivery service
@@ -2137,7 +2137,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('post', 'origins', ('3.0',))
+	@api_request('post', 'origins', ('3.0', '4.0', '4.1', '5.0'))
 	def create_origins(self, data=None):
 		"""
 		Creates origins associated with a delivery service
@@ -2148,7 +2148,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('put', 'origins', ('3.0',))
+	@api_request('put', 'origins', ('3.0', '4.0', '4.1', '5.0'))
 	def update_origins(self, query_params=None):
 		"""
 		Updates origins associated with a delivery service
@@ -2161,7 +2161,7 @@ class TOSession(RestApiSession):
 		:raises: Union[LoginError, OperationError]
 		"""
 
-	@api_request('delete', 'origins', ('3.0',))
+	@api_request('delete', 'origins', ('3.0', '4.0', '4.1', '5.0'))
 	def delete_origins(self, query_params=None):
 		"""
 		Updates origins associated with a delivery service
diff --git a/traffic_ops/testing/api/utils/utils.go b/traffic_ops/testing/api/utils/utils.go
index fb69e73573..13481a087e 100644
--- a/traffic_ops/testing/api/utils/utils.go
+++ b/traffic_ops/testing/api/utils/utils.go
@@ -29,6 +29,7 @@ import (
 	"github.com/apache/trafficcontrol/traffic_ops/toclientlib"
 	v3client "github.com/apache/trafficcontrol/traffic_ops/v3-client"
 	v4client "github.com/apache/trafficcontrol/traffic_ops/v4-client"
+	v5client "github.com/apache/trafficcontrol/traffic_ops/v5-client"
 )
 
 type ErrorAndMessage struct {
@@ -98,13 +99,11 @@ func CreateV4Session(t *testing.T, TrafficOpsURL string, username string, passwo
 	return userSession
 }
 
-// V3TestCase is the type of the V3TestData struct.
-// Uses nested map to represent the method being tested and the test's description.
-type V3TestCase map[string]map[string]V3TestData
-
-// V4TestCase is the type of the V4TestData struct.
-// Uses nested map to represent the method being tested and the test's description.
-type V4TestCase map[string]map[string]V4TestData
+func CreateV5Session(t *testing.T, TrafficOpsURL, username, password string, toReqTimeout int) *v5client.Session {
+	userSession, _, err := v5client.LoginWithAgent(TrafficOpsURL, username, password, true, "to-api-v5-client-tests", false, time.Second*time.Duration(toReqTimeout))
+	assert.RequireNoError(t, err, "Could not login with user %v: %v", username, err)
+	return userSession
+}
 
 // V3TestData represents the data needed for testing the v3 api endpoints.
 type V3TestData struct {
@@ -125,6 +124,28 @@ type V4TestData struct {
 	Expectations  []CkReqFunc
 }
 
+// V5TestData represents the data needed for testing the v5 api endpoints.
+type V5TestData struct {
+	EndpointId    func() int
+	ClientSession *v5client.Session
+	RequestOpts   v5client.RequestOptions
+	RequestBody   map[string]interface{}
+	Expectations  []CkReqFunc
+}
+
+// V3TestCase is the type of the V3TestData struct.
+// Uses nested map to represent the method being tested and the test's description.
+type V3TestCase map[string]map[string]V3TestData
+
+// V4TestCase is the type of the V4TestData struct.
+// Uses nested map to represent the method being tested and the test's description.
+type V4TestCase map[string]map[string]V4TestData
+
+// V5TestCase is a map of test names to maps of HTTP request method descriptions
+// to V5TestData structures.
+// Uses nested map to represent the method being tested and the test's description.
+type V5TestCase map[string]map[string]V5TestData
+
 // CkReqFunc defines the reusable signature for all other functions that perform checks.
 // Common parameters that are checked include the request's info, response, alerts, and errors.
 type CkReqFunc func(*testing.T, toclientlib.ReqInf, interface{}, tc.Alerts, error)
diff --git a/traffic_ops/testing/api/v5/.gitignore b/traffic_ops/testing/api/v5/.gitignore
new file mode 100644
index 0000000000..9d8757a3c8
--- /dev/null
+++ b/traffic_ops/testing/api/v5/.gitignore
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+traffic-ops-test*.conf
diff --git a/traffic_ops/testing/api/v5/about_test.go b/traffic_ops/testing/api/v5/about_test.go
new file mode 100644
index 0000000000..2eea4de3cc
--- /dev/null
+++ b/traffic_ops/testing/api/v5/about_test.go
@@ -0,0 +1,53 @@
+package v5
+
+/*
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+import (
+	"net/http"
+	"testing"
+
+	"github.com/apache/trafficcontrol/lib/go-tc"
+	"github.com/apache/trafficcontrol/traffic_ops/testing/api/utils"
+)
+
+func TestAbout(t *testing.T) {
+
+	methodTests := utils.V5TestCase{
+		"GET": {
+			"OK when VALID request": {
+				ClientSession: TOSession, Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+			},
+			"UNAUTHORIZED when NOT LOGGED IN": {
+				ClientSession: NoAuthTOSession, Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusUnauthorized)),
+			},
+		},
+	}
+	for method, testCases := range methodTests {
+		t.Run(method, func(t *testing.T) {
+			for name, testCase := range testCases {
+				switch method {
+				case "GET":
+					t.Run(name, func(t *testing.T) {
+						resp, reqInf, err := testCase.ClientSession.GetAbout(testCase.RequestOpts)
+						for _, check := range testCase.Expectations {
+							check(t, reqInf, resp, tc.Alerts{}, err)
+						}
+					})
+				}
+			}
+		})
+	}
+}
diff --git a/traffic_ops/testing/api/v5/acme_test.go b/traffic_ops/testing/api/v5/acme_test.go
new file mode 100644
index 0000000000..f83e5b277a
--- /dev/null
+++ b/traffic_ops/testing/api/v5/acme_test.go
@@ -0,0 +1,49 @@
+package v5
+
+/*
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+import (
+	"net/http"
+	"testing"
+
+	"github.com/apache/trafficcontrol/traffic_ops/testing/api/utils"
+)
+
+func TestAcmeAutoRenew(t *testing.T) {
+
+	methodTests := utils.V5TestCase{
+		"POST": {
+			"OK when VALID request": {
+				ClientSession: TOSession, Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusAccepted)),
+			},
+		},
+	}
+	for method, testCases := range methodTests {
+		t.Run(method, func(t *testing.T) {
+			for name, testCase := range testCases {
+				switch method {
+				case "POST":
+					t.Run(name, func(t *testing.T) {
+						alerts, reqInf, err := testCase.ClientSession.AutoRenew(testCase.RequestOpts)
+						for _, check := range testCase.Expectations {
+							check(t, reqInf, nil, alerts, err)
+						}
+					})
+				}
+			}
+		})
+	}
+}
diff --git a/traffic_ops/testing/api/v5/asns_test.go b/traffic_ops/testing/api/v5/asns_test.go
new file mode 100644
index 0000000000..bef797f8c5
--- /dev/null
+++ b/traffic_ops/testing/api/v5/asns_test.go
@@ -0,0 +1,187 @@
+package v5
+
+/*
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+import (
+	"encoding/json"
+	"net/http"
+	"net/url"
+	"sort"
+	"strconv"
+	"testing"
+	"time"
+
+	"github.com/apache/trafficcontrol/lib/go-rfc"
+	"github.com/apache/trafficcontrol/lib/go-tc"
+	"github.com/apache/trafficcontrol/traffic_ops/testing/api/assert"
+	"github.com/apache/trafficcontrol/traffic_ops/testing/api/utils"
+	"github.com/apache/trafficcontrol/traffic_ops/toclientlib"
+	client "github.com/apache/trafficcontrol/traffic_ops/v5-client"
+)
+
+func TestASN(t *testing.T) {
+	WithObjs(t, []TCObj{Types, CacheGroups, ASN}, func() {
+		tomorrow := time.Now().AddDate(0, 0, 1).Format(time.RFC1123)
+		currentTime := time.Now().UTC().Add(-5 * time.Second)
+		currentTimeRFC := currentTime.Format(time.RFC1123)
+
+		methodTests := utils.V5TestCase{
+			"GET": {
+				"NOT MODIFIED when NO CHANGES made": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{Header: http.Header{rfc.IfModifiedSince: {tomorrow}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusNotModified)),
+				},
+				"OK when VALID request": {
+					ClientSession: TOSession, Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), validateSorted()),
+				},
+				"OK when VALID ASN PARAMETER": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"asn": {"9999"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(1)),
+				},
+			},
+			"PUT": {
+				"OK when VALID request": {
+					ClientSession: TOSession, EndpointId: GetASNId(t, "8888"),
+					RequestBody: map[string]interface{}{
+						"asn":            7777,
+						"cachegroupName": "originCachegroup",
+						"cachegroupId":   -1,
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+			},
+			"GET AFTER CHANGES": {
+				"OK when CHANGES made": {
+					ClientSession: TOSession,
+					RequestOpts: client.RequestOptions{
+						Header: http.Header{
+							rfc.IfModifiedSince: {currentTimeRFC}, rfc.IfUnmodifiedSince: {currentTimeRFC},
+						},
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+			},
+		}
+
+		for method, testCases := range methodTests {
+			t.Run(method, func(t *testing.T) {
+				for name, testCase := range testCases {
+					asn := tc.ASN{}
+
+					if testCase.RequestBody != nil {
+						if cgId, ok := testCase.RequestBody["cachegroupId"]; ok {
+							if cgId == -1 {
+								if cgName, ok := testCase.RequestBody["cachegroupName"]; ok {
+									testCase.RequestBody["cachegroupId"] = GetCacheGroupId(t, cgName.(string))()
+								}
+							}
+						}
+						dat, err := json.Marshal(testCase.RequestBody)
+						assert.NoError(t, err, "Error occurred when marshalling request body: %v", err)
+						err = json.Unmarshal(dat, &asn)
+						assert.NoError(t, err, "Error occurred when unmarshalling request body: %v", err)
+					}
+
+					switch method {
+					case "GET", "GET AFTER CHANGES":
+						t.Run(name, func(t *testing.T) {
+							resp, reqInf, err := testCase.ClientSession.GetASNs(testCase.RequestOpts)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, resp.Response, resp.Alerts, err)
+							}
+						})
+					case "PUT":
+						t.Run(name, func(t *testing.T) {
+							alerts, reqInf, err := testCase.ClientSession.UpdateASN(testCase.EndpointId(), asn, testCase.RequestOpts)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, nil, alerts, err)
+							}
+						})
+					}
+				}
+			})
+		}
+	})
+}
+
+func validateSorted() utils.CkReqFunc {
+	return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, alerts tc.Alerts, _ error) {
+		asnResp := resp.([]tc.ASN)
+		var sortedList []string
+		assert.RequireGreaterOrEqual(t, len(asnResp), 2, "Need at least 2 ASNs in Traffic Ops to test sorted, found: %d", len(asnResp))
+
+		for _, asn := range asnResp {
+			sortedList = append(sortedList, strconv.Itoa(asn.ASN))
+		}
+
+		res := sort.SliceIsSorted(sortedList, func(p, q int) bool {
+			return sortedList[p] < sortedList[q]
+		})
+		assert.Equal(t, res, true, "List is not sorted by their names: %v", sortedList)
+	}
+}
+
+func GetASNId(t *testing.T, ASN string) func() int {
+	return func() int {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("asn", ASN)
+
+		resp, _, err := TOSession.GetASNs(opts)
+		assert.RequireNoError(t, err, "Get ASNs Request failed with error: %v", err)
+		assert.RequireEqual(t, len(resp.Response), 1, "Expected response object length 1, but got %d", len(resp.Response))
+		assert.RequireNotNil(t, &resp.Response[0].ID, "Expected id to not be nil")
+
+		return resp.Response[0].ID
+	}
+}
+
+func CreateTestASNs(t *testing.T) {
+	assert.RequireGreaterOrEqual(t, len(testData.CacheGroups), 1, "Need at least one Cache Group to test creating ASNs")
+
+	cg := testData.CacheGroups[0]
+	assert.RequireNotNil(t, cg.Name, "Cache Group found in the test data with null or undefined name")
+
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", *cg.Name)
+	resp, _, err := TOSession.GetCacheGroups(opts)
+	assert.RequireNoError(t, err, "Unable to get cachgroup ID: %v - alerts: %+v", err, resp.Alerts)
+	assert.RequireEqual(t, 1, len(resp.Response), "Expected exactly one Cache Group with Name '%s', got: %d", *cg.Name, len(resp.Response))
+	assert.RequireNotNil(t, resp.Response[0].ID, "Cache Group '%s' had no ID in Traffic Ops response", *cg.Name)
+
+	id := *resp.Response[0].ID
+	for _, asn := range testData.ASNs {
+		asn.CachegroupID = id
+		resp, _, err := TOSession.CreateASN(asn, client.RequestOptions{})
+		assert.NoError(t, err, "Could not create ASN: %v - alerts: %+v", err, resp)
+	}
+}
+
+func DeleteTestASNs(t *testing.T) {
+	opts := client.NewRequestOptions()
+	// Retrieve the ASNs to delete
+	asns, _, err := TOSession.GetASNs(opts)
+	assert.NoError(t, err, "Error trying to fetch ASNs for deletion: %v - alerts: %+v", err, asns.Alerts)
+	for _, asn := range asns.Response {
+		alerts, _, err := TOSession.DeleteASN(asn.ID, client.RequestOptions{})
+		assert.NoError(t, err, "Cannot delete ASN %d: %v - alerts: %+v", asn.ASN, err, alerts)
+
+		// Retrieve the ASN to see if it got deleted
+		opts.QueryParameters.Set("asn", strconv.Itoa(asn.ASN))
+		asns, _, err := TOSession.GetASNs(opts)
+		assert.NoError(t, err, "Error trying to fetch ASN after deletion: %v - alerts: %+v", err, asns.Alerts)
+		assert.Equal(t, 0, len(asns.Response), "Expected ASN %d to be deleted, but it was found in Traffic Ops's response", asn.ASN)
+	}
+}
diff --git a/traffic_ops/testing/api/v5/cachegroups_test.go b/traffic_ops/testing/api/v5/cachegroups_test.go
new file mode 100644
index 0000000000..b0301bb1e6
--- /dev/null
+++ b/traffic_ops/testing/api/v5/cachegroups_test.go
@@ -0,0 +1,453 @@
+package v5
+
+/*
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+import (
+	"encoding/json"
+	"net/http"
+	"net/url"
+	"strconv"
+	"testing"
+	"time"
+
+	"github.com/apache/trafficcontrol/lib/go-rfc"
+	"github.com/apache/trafficcontrol/lib/go-tc"
+	"github.com/apache/trafficcontrol/traffic_ops/testing/api/assert"
+	"github.com/apache/trafficcontrol/traffic_ops/testing/api/utils"
+	"github.com/apache/trafficcontrol/traffic_ops/toclientlib"
+	client "github.com/apache/trafficcontrol/traffic_ops/v5-client"
+)
+
+func TestCacheGroups(t *testing.T) {
+	WithObjs(t, []TCObj{Types, Parameters, CacheGroups, CDNs, Profiles, Statuses, Divisions, Regions, PhysLocations, Servers, Topologies}, func() {
+
+		tomorrow := time.Now().AddDate(0, 0, 1).Format(time.RFC1123)
+		currentTime := time.Now().UTC().Add(-15 * time.Second)
+		currentTimeRFC := currentTime.Format(time.RFC1123)
+
+		methodTests := utils.V5TestCase{
+			"GET": {
+				"OK when VALID NAME parameter AND Lat/Long are 0": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"name": {"nullLatLongCG"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(1), ValidateResponseFields()),
+				},
+				"NOT MODIFIED when NO CHANGES made": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{Header: http.Header{rfc.IfModifiedSince: {tomorrow}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusNotModified)),
+				},
+				"NOT MODIFIED when VALID NAME parameter when NO CHANGES made": {
+					ClientSession: TOSession,
+					RequestOpts: client.RequestOptions{
+						Header:          http.Header{rfc.IfModifiedSince: {tomorrow}},
+						QueryParameters: url.Values{"name": {"originCachegroup"}},
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusNotModified)),
+				},
+				"NOT MODIFIED when VALID SHORTNAME parameter when NO CHANGES made": {
+					ClientSession: TOSession,
+					RequestOpts: client.RequestOptions{
+						Header:          http.Header{rfc.IfModifiedSince: {tomorrow}},
+						QueryParameters: url.Values{"shortName": {"mog1"}},
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusNotModified)),
+				},
+				"OK when VALID request": {
+					ClientSession: TOSession, Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"OK when VALID NAME parameter": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"name": {"parentCachegroup"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(1),
+						ValidateExpectedField("Name", "parentCachegroup")),
+				},
+				"OK when VALID SHORTNAME parameter": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"shortName": {"pg2"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(1),
+						ValidateExpectedField("ShortName", "pg2")),
+				},
+				"OK when VALID TOPOLOGY parameter": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"topology": {"mso-topology"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"OK when VALID TYPE parameter": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"type": {"ORG_LOC"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseLengthGreaterOrEqual(1),
+						ValidateExpectedField("TypeName", "ORG_LOC")),
+				},
+				"EMPTY RESPONSE when INVALID ID parameter": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"id": {"10000"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(0)),
+				},
+				"EMPTY RESPONSE when INVALID TYPE parameter": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"type": {"10000"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(0)),
+				},
+				"FIRST RESULT when LIMIT=1": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"orderby": {"id"}, "limit": {"1"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), ValidatePagination("limit")),
+				},
+				"SECOND RESULT when LIMIT=1 OFFSET=1": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"orderby": {"id"}, "limit": {"1"}, "offset": {"1"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), ValidatePagination("offset")),
+				},
+				"SECOND RESULT when LIMIT=1 PAGE=2": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"orderby": {"id"}, "limit": {"1"}, "page": {"2"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), ValidatePagination("page")),
+				},
+				"BAD REQUEST when INVALID LIMIT parameter": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"limit": {"-2"}}},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"BAD REQUEST when INVALID OFFSET parameter": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"limit": {"1"}, "offset": {"0"}}},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"BAD REQUEST when INVALID PAGE parameter": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"limit": {"1"}, "page": {"0"}}},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"UNAUTHORIZED when NOT LOGGED IN": {
+					ClientSession: NoAuthTOSession, Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusUnauthorized)),
+				},
+			},
+			"POST": {
+				"UNAUTHORIZED when NOT LOGGED IN": {
+					ClientSession: NoAuthTOSession, Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusUnauthorized)),
+				},
+			},
+			"PUT": {
+				"OK when VALID request": {
+					EndpointId: GetCacheGroupId(t, "cachegroup1"), ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"latitude":            17.5,
+						"longitude":           17.5,
+						"name":                "cachegroup1",
+						"shortName":           "newShortName",
+						"localizationMethods": []string{"CZ"},
+						"fallbacks":           []string{"fallback1"},
+						"typeName":            "EDGE_LOC",
+						"typeId":              -1,
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"OK when updating CG with null Lat/Long": {
+					EndpointId: GetCacheGroupId(t, "nullLatLongCG"), ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":      "nullLatLongCG",
+						"shortName": "null-ll",
+						"typeName":  "EDGE_LOC",
+						"fallbacks": []string{"fallback1"},
+						"typeId":    -1,
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"BAD REQUEST when updating TYPE of CG in TOPOLOGY": {
+					EndpointId: GetCacheGroupId(t, "topology-edge-cg-01"), ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"id":        -1,
+						"latitude":  0,
+						"longitude": 0,
+						"name":      "topology-edge-cg-01",
+						"shortName": "te1",
+						"typeName":  "MID_LOC",
+						"typeId":    -1,
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"PRECONDITION FAILED when updating with IMS & IUS Headers": {
+					EndpointId: GetCacheGroupId(t, "cachegroup1"), ClientSession: TOSession,
+					RequestOpts: client.RequestOptions{Header: http.Header{rfc.IfUnmodifiedSince: {currentTimeRFC}}},
+					RequestBody: map[string]interface{}{
+						"name":      "cachegroup1",
+						"shortName": "changeName",
+						"typeName":  "EDGE_LOC",
+						"typeId":    -1,
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusPreconditionFailed)),
+				},
+				"PRECONDITION FAILED when updating with IFMATCH ETAG Header": {
+					EndpointId: GetCacheGroupId(t, "cachegroup1"), ClientSession: TOSession,
+					RequestOpts: client.RequestOptions{Header: http.Header{rfc.IfMatch: {rfc.ETag(currentTime)}}},
+					RequestBody: map[string]interface{}{
+						"name":      "cachegroup1",
+						"shortName": "changeName",
+						"typeName":  "EDGE_LOC",
+						"typeId":    -1,
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusPreconditionFailed)),
+				},
+				"UNAUTHORIZED when NOT LOGGED IN": {
+					EndpointId: GetCacheGroupId(t, "cachegroup1"), ClientSession: NoAuthTOSession,
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusUnauthorized)),
+				},
+			},
+			"DELETE": {
+				"NOT FOUND when INVALID ID parameter": {
+					EndpointId: func() int { return 111111 }, ClientSession: TOSession,
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusNotFound)),
+				},
+				"UNAUTHORIZED when NOT LOGGED IN": {
+					EndpointId: GetCacheGroupId(t, "cachegroup1"), ClientSession: NoAuthTOSession,
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusUnauthorized)),
+				},
+			},
+			"GET AFTER CHANGES": {
+				"OK when CHANGES made": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{Header: http.Header{rfc.IfModifiedSince: {currentTimeRFC}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+			},
+		}
+
+		for method, testCases := range methodTests {
+			t.Run(method, func(t *testing.T) {
+				for name, testCase := range testCases {
+					cg := tc.CacheGroupNullable{}
+
+					if testCase.RequestOpts.QueryParameters.Has("type") {
+						val := testCase.RequestOpts.QueryParameters.Get("type")
+						if _, err := strconv.Atoi(val); err != nil {
+							testCase.RequestOpts.QueryParameters.Set("type", strconv.Itoa(GetTypeId(t, val)))
+						}
+					}
+
+					if testCase.RequestBody != nil {
+						if _, ok := testCase.RequestBody["id"]; ok {
+							testCase.RequestBody["id"] = testCase.EndpointId()
+						}
+						if typeId, ok := testCase.RequestBody["typeId"]; ok {
+							if typeId == -1 {
+								if typeName, ok := testCase.RequestBody["typeName"]; ok {
+									testCase.RequestBody["typeId"] = GetTypeId(t, typeName.(string))
+								}
+							}
+						}
+						dat, err := json.Marshal(testCase.RequestBody)
+						assert.NoError(t, err, "Error occurred when marshalling request body: %v", err)
+						err = json.Unmarshal(dat, &cg)
+						assert.NoError(t, err, "Error occurred when unmarshalling request body: %v", err)
+					}
+
+					switch method {
+					case "GET", "GET AFTER CHANGES":
+						t.Run(name, func(t *testing.T) {
+							resp, reqInf, err := testCase.ClientSession.GetCacheGroups(testCase.RequestOpts)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, resp.Response, resp.Alerts, err)
+							}
+						})
+					case "POST":
+						t.Run(name, func(t *testing.T) {
+							resp, reqInf, err := testCase.ClientSession.CreateCacheGroup(cg, testCase.RequestOpts)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, resp.Response, resp.Alerts, err)
+							}
+						})
+					case "PUT":
+						t.Run(name, func(t *testing.T) {
+							resp, reqInf, err := testCase.ClientSession.UpdateCacheGroup(testCase.EndpointId(), cg, testCase.RequestOpts)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, resp.Response, resp.Alerts, err)
+							}
+						})
+					case "DELETE":
+						t.Run(name, func(t *testing.T) {
+							alerts, reqInf, err := testCase.ClientSession.DeleteCacheGroup(testCase.EndpointId(), testCase.RequestOpts)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, nil, alerts, err)
+							}
+						})
+					}
+				}
+			})
+		}
+	})
+}
+
+func ValidateExpectedField(field string, expected string) utils.CkReqFunc {
+	return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ tc.Alerts, _ error) {
+		cgResp := resp.([]tc.CacheGroupNullable)
+		cg := cgResp[0]
+		switch field {
+		case "Name":
+			assert.Equal(t, expected, *cg.Name, "Expected name to be %v, but got %v", expected, *cg.Name)
+		case "ShortName":
+			assert.Equal(t, expected, *cg.ShortName, "Expected shortName to be %v, but got %v", expected, *cg.ShortName)
+		case "TypeName":
+			assert.Equal(t, expected, *cg.Type, "Expected type to be %v, but got %v", expected, *cg.Type)
+		default:
+			t.Errorf("Expected field: %v, does not exist in response", field)
+		}
+	}
+}
+
+func ValidateResponseFields() utils.CkReqFunc {
+	return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ tc.Alerts, _ error) {
+		cgResp := resp.([]tc.CacheGroupNullable)
+		cg := cgResp[0]
+		assert.NotNil(t, cg.ID, "Expected response id to not be nil")
+		assert.NotNil(t, cg.Latitude, "Expected latitude to not be nil")
+		assert.NotNil(t, cg.Longitude, "Expected longitude to not be nil")
+		assert.Equal(t, 0.0, *cg.Longitude, "Expected Longitude to be 0, but got %v", cg.Longitude)
+		assert.Equal(t, 0.0, *cg.Latitude, "Expected Latitude to be 0, but got %v", cg.Latitude)
+	}
+}
+
+func ValidatePagination(paginationParam string) utils.CkReqFunc {
+	return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ tc.Alerts, _ error) {
+		paginationResp := resp.([]tc.CacheGroupNullable)
+
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("orderby", "id")
+		respBase, _, err := TOSession.GetCacheGroups(opts)
+		assert.RequireNoError(t, err, "cannot get Cache Groups: %v - alerts: %+v", err, respBase.Alerts)
+
+		cachegroup := respBase.Response
+		assert.RequireGreaterOrEqual(t, len(cachegroup), 3, "Need at least 3 Cache Groups in Traffic Ops to test pagination support, found: %d", len(cachegroup))
+		switch paginationParam {
+		case "limit:":
+			assert.Exactly(t, cachegroup[:1], paginationResp, "expected GET Cachegroups with limit = 1 to return first result")
+		case "offset":
+			assert.Exactly(t, cachegroup[1:2], paginationResp, "expected GET cachegroup with limit = 1, offset = 1 to return second result")
+		case "page":
+			assert.Exactly(t, cachegroup[1:2], paginationResp, "expected GET cachegroup with limit = 1, page = 2 to return second result")
+		}
+	}
+}
+
+func GetTypeId(t *testing.T, typeName string) int {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", typeName)
+	resp, _, err := TOSession.GetTypes(opts)
+
+	assert.RequireNoError(t, err, "Get Types Request failed with error: %v", err)
+	assert.RequireEqual(t, 1, len(resp.Response), "Expected response object length 1, but got %d", len(resp.Response))
+	assert.RequireNotNil(t, &resp.Response[0].ID, "Expected id to not be nil")
+
+	return resp.Response[0].ID
+}
+
+func GetCacheGroupId(t *testing.T, cacheGroupName string) func() int {
+	return func() int {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", cacheGroupName)
+
+		resp, _, err := TOSession.GetCacheGroups(opts)
+		assert.RequireNoError(t, err, "Get Cache Groups Request failed with error: %v", err)
+		assert.RequireEqual(t, len(resp.Response), 1, "Expected response object length 1, but got %d", len(resp.Response))
+		assert.RequireNotNil(t, resp.Response[0].ID, "Expected id to not be nil")
+
+		return *resp.Response[0].ID
+	}
+}
+
+func CreateTestCacheGroups(t *testing.T) {
+	for _, cg := range testData.CacheGroups {
+
+		resp, _, err := TOSession.CreateCacheGroup(cg, client.RequestOptions{})
+		if err != nil {
+			t.Errorf("could not create Cache Group: %v - alerts: %+v", err, resp.Alerts)
+			continue
+		}
+
+		// Testing 'join' fields during create
+		if cg.ParentName != nil && resp.Response.ParentName == nil {
+			t.Error("Parent cachegroup is null in response when it should have a value")
+		}
+		if cg.SecondaryParentName != nil && resp.Response.SecondaryParentName == nil {
+			t.Error("Secondary parent cachegroup is null in response when it should have a value")
+		}
+		if cg.Type != nil && resp.Response.Type == nil {
+			t.Error("Type is null in response when it should have a value")
+		}
+		assert.NotNil(t, resp.Response.LocalizationMethods, "Localization methods are null")
+		assert.NotNil(t, resp.Response.Fallbacks, "Fallbacks are null")
+	}
+}
+
+func DeleteTestCacheGroups(t *testing.T) {
+	var parentlessCacheGroups []tc.CacheGroupNullable
+	opts := client.NewRequestOptions()
+
+	// delete the edge caches.
+	for _, cg := range testData.CacheGroups {
+		if cg.Name == nil {
+			t.Error("Found a Cache Group with null or undefined name")
+			continue
+		}
+
+		// Retrieve the CacheGroup by name so we can get the id for Deletion
+		opts.QueryParameters.Set("name", *cg.Name)
+		resp, _, err := TOSession.GetCacheGroups(opts)
+		assert.NoError(t, err, "Cannot GET CacheGroup by name '%s': %v - alerts: %+v", *cg.Name, err, resp.Alerts)
+
+		if len(resp.Response) < 1 {
+			t.Errorf("Could not find test data Cache Group '%s' in Traffic Ops", *cg.Name)
+			continue
+		}
+		cg = resp.Response[0]
+
+		// Cachegroups that are parents (usually mids but sometimes edges)
+		// need to be deleted only after the children cachegroups are deleted.
+		if cg.ParentCachegroupID == nil && cg.SecondaryParentCachegroupID == nil {
+			parentlessCacheGroups = append(parentlessCacheGroups, cg)
+			continue
+		}
+
+		if cg.ID == nil {
+			t.Error("Traffic Ops returned a Cache Group with null or undefined ID")
+			continue
+		}
+
+		alerts, _, err := TOSession.DeleteCacheGroup(*cg.ID, client.RequestOptions{})
+		assert.NoError(t, err, "Cannot delete Cache Group: %v - alerts: %+v", err, alerts)
+
+		// Retrieve the CacheGroup to see if it got deleted
+		opts.QueryParameters.Set("name", *cg.Name)
+		cgs, _, err := TOSession.GetCacheGroups(opts)
+		assert.NoError(t, err, "Error deleting Cache Group by name: %v - alerts: %+v", err, cgs.Alerts)
+		assert.Equal(t, 0, len(cgs.Response), "Expected CacheGroup name: %s to be deleted", *cg.Name)
+	}
+
+	opts = client.NewRequestOptions()
+	// now delete the parentless cachegroups
+	for _, cg := range parentlessCacheGroups {
+		// nil check for cg.Name occurs prior to insertion into parentlessCacheGroups
+		opts.QueryParameters.Set("name", *cg.Name)
+		// Retrieve the CacheGroup by name so we can get the id for Deletion
+		resp, _, err := TOSession.GetCacheGroups(opts)
+		assert.NoError(t, err, "Cannot get Cache Group by name '%s': %v - alerts: %+v", *cg.Name, err, resp.Alerts)
+
+		if len(resp.Response) < 1 {
+			t.Errorf("Cache Group '%s' somehow stopped existing since the last time we ask Traffic Ops about it", *cg.Name)
+			continue
+		}
+
+		respCG := resp.Response[0]
+		if respCG.ID == nil {
+			t.Errorf("Traffic Ops returned Cache Group '%s' with null or undefined ID", *cg.Name)
+			continue
+		}
+		delResp, _, err := TOSession.DeleteCacheGroup(*respCG.ID, client.RequestOptions{})
+		assert.NoError(t, err, "Cannot delete Cache Group '%s': %v - alerts: %+v", *respCG.Name, err, delResp.Alerts)
+
+		// Retrieve the CacheGroup to see if it got deleted
+		opts.QueryParameters.Set("name", *cg.Name)
+		cgs, _, err := TOSession.GetCacheGroups(opts)
+		assert.NoError(t, err, "Error attempting to fetch Cache Group '%s' after deletion: %v - alerts: %+v", *cg.Name, err, cgs.Alerts)
+		assert.Equal(t, 0, len(cgs.Response), "Expected Cache Group '%s' to be deleted", *cg.Name)
+	}
+}
diff --git a/traffic_ops/testing/api/v5/cachegroupsdeliveryservices_test.go b/traffic_ops/testing/api/v5/cachegroupsdeliveryservices_test.go
new file mode 100644
index 0000000000..96f8b16564
--- /dev/null
+++ b/traffic_ops/testing/api/v5/cachegroupsdeliveryservices_test.go
@@ -0,0 +1,163 @@
+package v5
+
+/*
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+import (
+	"net/http"
+	"strconv"
+	"testing"
+
+	"github.com/apache/trafficcontrol/lib/go-tc"
+	"github.com/apache/trafficcontrol/traffic_ops/testing/api/assert"
+	"github.com/apache/trafficcontrol/traffic_ops/testing/api/utils"
+	"github.com/apache/trafficcontrol/traffic_ops/toclientlib"
+	client "github.com/apache/trafficcontrol/traffic_ops/v5-client"
+)
+
+func TestCacheGroupsDeliveryServices(t *testing.T) {
+	WithObjs(t, []TCObj{CDNs, Types, Tenants, Parameters, Profiles, Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, Topologies, ServiceCategories, DeliveryServices, CacheGroupsDeliveryServices}, func() {
+		methodTests := utils.V5TestCase{
+			"POST": {
+				"BAD REQUEST assigning TOPOLOGY-BASED DS to CACHEGROUP": {
+					EndpointId:    GetCacheGroupId(t, "cachegroup3"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"deliveryServices": []int{GetDeliveryServiceId(t, "top-ds-in-cdn1")()},
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"OK when valid request": {
+					EndpointId:    GetCacheGroupId(t, "cachegroup3"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"deliveryServices": []int{
+							GetDeliveryServiceId(t, "ds1")(),
+							GetDeliveryServiceId(t, "ds2")(),
+							GetDeliveryServiceId(t, "ds3")(),
+							GetDeliveryServiceId(t, "ds3")(),
+							GetDeliveryServiceId(t, "DS5")(),
+						},
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), validateCGDSServerAssignments()),
+				},
+			},
+		}
+
+		for method, testCases := range methodTests {
+			t.Run(method, func(t *testing.T) {
+				for name, testCase := range testCases {
+					switch method {
+					case "POST":
+						t.Run(name, func(t *testing.T) {
+							resp, reqInf, err := testCase.ClientSession.SetCacheGroupDeliveryServices(testCase.EndpointId(), testCase.RequestBody["deliveryServices"].([]int), testCase.RequestOpts)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, resp.Response, resp.Alerts, err)
+							}
+						})
+					}
+				}
+			})
+		}
+
+	})
+}
+
+func validateCGDSServerAssignments() utils.CkReqFunc {
+	return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ tc.Alerts, _ error) {
+		cgDsResp := resp.(tc.CacheGroupPostDSResp)
+		opts := client.NewRequestOptions()
+		for _, serverName := range cgDsResp.ServerNames {
+			opts.QueryParameters.Set("hostName", string(serverName))
+			resp, _, err := TOSession.GetServers(opts)
+			assert.NoError(t, err, "Error: Getting server: %v - alerts: %+v", err, resp.Alerts)
+			assert.Equal(t, len(resp.Response), 1, "Error: Getting servers: expected 1 got %v", len(resp.Response))
+
+			serverDSes, _, err := TOSession.GetDeliveryServicesByServer(*resp.Response[0].ID, client.RequestOptions{})
+			assert.NoError(t, err, "Error: Getting Delivery Service Servers #%d: %v - alerts: %+v", *resp.Response[0].ID, err, serverDSes.Alerts)
+			for _, dsID := range cgDsResp.DeliveryServices {
+				found := false
+				for _, serverDS := range serverDSes.Response {
+					if *serverDS.ID == dsID {
+						found = true
+						break
+					}
+				}
+				if !found {
+					t.Errorf("POST succeeded, but didn't assign delivery service %v to server", dsID)
+				}
+			}
+		}
+	}
+}
+
+func CreateTestCachegroupsDeliveryServices(t *testing.T) {
+	dses, _, err := TOSession.GetDeliveryServices(client.RequestOptions{})
+	assert.RequireNoError(t, err, "Cannot GET DeliveryServices: %v - %v", err, dses)
+
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "cachegroup3")
+	clientCGs, _, err := TOSession.GetCacheGroups(opts)
+	assert.RequireNoError(t, err, "Cannot GET cachegroup: %v", err)
+	assert.RequireEqual(t, len(clientCGs.Response), 1, "Getting cachegroup expected 1, got %v", len(clientCGs.Response))
+	assert.RequireNotNil(t, clientCGs.Response[0].ID, "Cachegroup has a nil ID")
+
+	dsIDs := []int{}
+	for _, ds := range dses.Response {
+		if *ds.CDNName == "cdn1" && ds.Topology == nil {
+			dsIDs = append(dsIDs, *ds.ID)
+		}
+	}
+	assert.RequireGreaterOrEqual(t, len(dsIDs), 1, "No Delivery Services found in CDN 'cdn1', cannot continue.")
+	resp, _, err := TOSession.SetCacheGroupDeliveryServices(*clientCGs.Response[0].ID, dsIDs, client.RequestOptions{})
+	assert.RequireNoError(t, err, "Setting cachegroup delivery services returned error: %v", err)
+	assert.RequireGreaterOrEqual(t, len(resp.Response.ServerNames), 1, "Setting cachegroup delivery services returned success, but no servers set")
+}
+
+func setInactive(t *testing.T, dsID int) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(dsID))
+	resp, _, err := TOSession.GetDeliveryServices(opts)
+	assert.RequireNoError(t, err, "Failed to fetch details for Delivery Service #%d: %v - alerts: %+v", dsID, err, resp.Alerts)
+	assert.RequireEqual(t, len(resp.Response), 1, "Expected exactly one Delivery Service to exist with ID %d, found: %d", dsID, len(resp.Response))
+
+	ds := resp.Response[0]
+	if ds.Active == nil {
+		t.Errorf("Deliver Service #%d had null or undefined 'active'", dsID)
+		ds.Active = new(bool)
+	}
+	if *ds.Active {
+		*ds.Active = false
+		_, _, err = TOSession.UpdateDeliveryService(dsID, ds, client.RequestOptions{})
+		assert.NoError(t, err, "Failed to set Delivery Service #%d to inactive: %v", dsID, err)
+	}
+}
+
+func DeleteTestCachegroupsDeliveryServices(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("limit", "1000000")
+	dss, _, err := TOSession.GetDeliveryServiceServers(opts)
+	assert.NoError(t, err, "Unexpected error retrieving server-to-Delivery-Service assignments: %v - alerts: %+v", err, dss.Alerts)
+
+	for _, ds := range dss.Response {
+		setInactive(t, *ds.DeliveryService)
+		alerts, _, err := TOSession.DeleteDeliveryServiceServer(*ds.DeliveryService, *ds.Server, client.RequestOptions{})
+		assert.NoError(t, err, "Error deleting delivery service servers: %v - alerts: %+v", err, alerts.Alerts)
+	}
+
+	dss, _, err = TOSession.GetDeliveryServiceServers(client.RequestOptions{})
+	assert.NoError(t, err, "Unexpected error retrieving server-to-Delivery-Service assignments: %v - alerts: %+v", err, dss.Alerts)
+	assert.Equal(t, len(dss.Response), 0, "Deleting delivery service servers: Expected empty subsequent get, actual %v", len(dss.Response))
+}
diff --git a/traffic_ops/testing/api/v5/cdn_dnsseckeys_test.go b/traffic_ops/testing/api/v5/cdn_dnsseckeys_test.go
new file mode 100644
index 0000000000..daee11cb24
--- /dev/null
+++ b/traffic_ops/testing/api/v5/cdn_dnsseckeys_test.go
@@ -0,0 +1,158 @@
+package v5
+
+/*
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+import (
+	"net/http"
+	"reflect"
+	"strconv"
+	"strings"
+	"testing"
+
+	tc "github.com/apache/trafficcontrol/lib/go-tc"
+	"github.com/apache/trafficcontrol/lib/go-util"
+	"github.com/apache/trafficcontrol/traffic_ops/testing/api/assert"
+	client "github.com/apache/trafficcontrol/traffic_ops/v5-client"
+)
+
+func TestCDNsDNSSEC(t *testing.T) {
+	if !includeSystemTests {
+		t.Skip()
+	}
+	WithObjs(t, []TCObj{CDNs, Types, Tenants, Users, Parameters, Profiles, Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, Topologies, ServerCapabilities, ServiceCategories, DeliveryServices}, func() {
+		t.Run("GENERATE DNSSEC KEYS", func(t *testing.T) { GenerateDNSSECKeys(t) })
+		t.Run("REFRESH DNSSEC KEYS", func(t *testing.T) { RefreshDNSSECKeys(t) }) // NOTE: testing refresh last (while no keys exist) because it's asynchronous and might affect other tests
+	})
+}
+
+func RefreshDNSSECKeys(t *testing.T) {
+	resp, reqInf, err := TOSession.RefreshDNSSECKeys(client.RequestOptions{})
+	assert.NoError(t, err, "Unable to refresh DNSSEC keys: %v - alerts: %+v", err, resp.Alerts)
+	assert.Equal(t, reqInf.StatusCode, http.StatusAccepted, "Refreshing DNSSEC keys - Expected: status code %d, Actual: %d", http.StatusAccepted, reqInf.StatusCode)
+
+	loc := reqInf.RespHeaders.Get("Location")
+	if loc == "" {
+		t.Fatalf("Refreshing DNSSEC keys - Expected: non-empty 'Location' response header, Actual: empty")
+	}
+	locSplit := strings.Split(loc, "/")
+	assert.RequireGreaterOrEqual(t, len(locSplit), 5, "Expected 'Location' response header to split into at least 5 parts, Got: %v", len(locSplit))
+	asyncID, err := strconv.Atoi(locSplit[4])
+	assert.RequireNoError(t, err, "Parsing async_status ID from 'Location' response header - Expected: no error, Actual: %v", err)
+
+	status, _, err := TOSession.GetAsyncStatus(asyncID, client.RequestOptions{})
+	assert.NoError(t, err, "Getting async status id %d - Expected: no error, Actual: %v", asyncID, err)
+	assert.NotNil(t, status.Response.Message, "Getting async status for DNSSEC refresh job - Expected: non-nil message, Actual: nil")
+}
+
+func GenerateDNSSECKeys(t *testing.T) {
+	assert.RequireGreaterOrEqual(t, len(testData.CDNs), 1, "Need at least one CDN to test updating CDNs")
+	firstCDN := testData.CDNs[0]
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", firstCDN.Name)
+	cdns, _, err := TOSession.GetCDNs(opts)
+	assert.RequireNoError(t, err, "Unexpected error getting CDNs filtered by name '%s': %v - alerts: %+v", firstCDN.Name, err, cdns.Alerts)
+	assert.RequireEqual(t, len(cdns.Response), 1, "Expected exactly one CDN named '%s' to exist, found: %d", firstCDN.Name, len(cdns.Response))
+
+	cdn := cdns.Response[0]
+
+	ttl := util.JSONIntStr(60)
+	req := tc.CDNDNSSECGenerateReq{
+		Key:               util.StrPtr(firstCDN.Name),
+		TTL:               &ttl,
+		KSKExpirationDays: &ttl,
+		ZSKExpirationDays: &ttl,
+	}
+	resp, _, err := TOSession.GenerateCDNDNSSECKeys(req, client.RequestOptions{})
+	assert.RequireNoError(t, err, "Unexpected error generating CDN DNSSEC keys: %v - alerts: %+v", err, resp.Alerts)
+
+	res, _, err := TOSession.GetCDNDNSSECKeys(firstCDN.Name, client.RequestOptions{})
+	assert.RequireNoError(t, err, "Unexpected error getting CDN DNSSEC keys: %v - alerts: %+v", err, res.Alerts)
+
+	if _, ok := res.Response[firstCDN.Name]; !ok {
+		t.Errorf("getting CDN DNSSEC keys - expected: key %s, actual: missing", firstCDN.Name)
+	}
+	originalKeys := res.Response
+
+	resp, _, err = TOSession.GenerateCDNDNSSECKeys(req, client.RequestOptions{})
+	assert.RequireNoError(t, err, "Unexpected error generating CDN DNSSEC keys: %v - alerts: %+v", err, resp.Alerts)
+
+	res, _, err = TOSession.GetCDNDNSSECKeys(firstCDN.Name, client.RequestOptions{})
+	assert.RequireNoError(t, err, "Unexpected error getting CDN DNSSEC keys: %v - alerts: %+v", err, res.Alerts)
+
+	newKeys := res.Response
+
+	if reflect.DeepEqual(originalKeys, newKeys) {
+		t.Errorf("Generating CDN DNSSEC keys - expected: original keys to differ from new keys, actual: they are the same")
+	}
+
+	kskReq := tc.CDNGenerateKSKReq{
+		ExpirationDays: util.Uint64Ptr(30),
+	}
+	originalKSK := newKeys
+	resp, _, err = TOSession.GenerateCDNDNSSECKSK(firstCDN.Name, kskReq, client.RequestOptions{})
+	assert.NoError(t, err, "Unexpected error generating DNSSEC KSK: %v - alerts: %+v", err, resp.Alerts)
+
+	res, _, err = TOSession.GetCDNDNSSECKeys(firstCDN.Name, client.RequestOptions{})
+	assert.NoError(t, err, "Unexpected error getting CDN DNSSEC keys: %v - alerts: %+v", err, res.Alerts)
+
+	if _, ok := res.Response[firstCDN.Name]; !ok {
+		t.Fatalf("getting CDN DNSSEC keys - expected: key %s, actual: missing", firstCDN.Name)
+	}
+	newKSK := res.Response
+	if reflect.DeepEqual(originalKSK[firstCDN.Name].KSK, newKSK[firstCDN.Name].KSK) {
+		t.Error("Generating CDN DNSSEC KSK - Expected: KSK to be different, Actual: KSK is the same")
+	}
+	if !reflect.DeepEqual(originalKSK[firstCDN.Name].ZSK, newKSK[firstCDN.Name].ZSK) {
+		t.Error("Generating CDN DNSSEC KSK - Expected: ZSK to be equal, Actual: ZSK is different")
+	}
+
+	// ensure that when DNSSEC is enabled on a CDN, creating a new DS will generate DNSSEC keys for that DS:
+	if !cdn.DNSSECEnabled {
+		cdn.DNSSECEnabled = true
+		resp, _, err := TOSession.UpdateCDN(cdn.ID, cdn, client.RequestOptions{})
+		assert.NoError(t, err, "Unexpected error updating CDN: %v - alerts: %+v", err, resp.Alerts)
+
+		defer func() {
+			cdn.DNSSECEnabled = false
+			resp, _, err := TOSession.UpdateCDN(cdn.ID, cdn, client.RequestOptions{})
+			assert.NoError(t, err, "Unexpected error updating CDN: %v - alerts: %+v", err, resp.Alerts)
+		}()
+	}
+
+	opts.QueryParameters.Set("name", "HTTP")
+	types, _, err := TOSession.GetTypes(opts)
+	assert.RequireNoError(t, err, "Unexpected error getting Types filtered by name 'HTTP': %v - alerts: %+v", err, types.Alerts)
+	assert.RequireEqual(t, len(types.Response), 1, "Expected exactly one Type to exist with name 'HTTP', found: %d", len(types.Response))
+
+	dsXMLID := "testdnssecgen"
+	customDS := getCustomDS(cdn.ID, types.Response[0].ID, dsXMLID, "cdn", "https://testdnssecgen.example.com", dsXMLID)
+	ds, _, err := TOSession.CreateDeliveryService(customDS, client.RequestOptions{})
+	assert.NoError(t, err, "Unexpected error creating Delivery Service: %v - alerts: %+v", err, ds.Alerts)
+	assert.RequireEqual(t, len(ds.Response), 1, "Expected creating a Delivery Service to create exactly one Delivery Service, Traffic Ops returned: %d", len(ds.Response))
+	assert.RequireNotNil(t, ds.Response[0].ID, nil, "Traffic Ops returned a representation for a created Delivery Service with null or undefined ID")
+
+	res, _, err = TOSession.GetCDNDNSSECKeys(firstCDN.Name, client.RequestOptions{})
+	assert.RequireNoError(t, err, "Unexpected error getting CDN DNSSEC keys: %v - alerts: %+v", err, res.Alerts)
+
+	if _, ok := res.Response[dsXMLID]; !ok {
+		t.Error("after creating a new delivery service for a DNSSEC-enabled CDN - expected: DNSSEC keys to be found for the delivery service, actual: no DNSSEC keys found for the delivery service")
+	}
+	alerts, _, err := TOSession.DeleteDeliveryService(*ds.Response[0].ID, client.RequestOptions{})
+	assert.NoError(t, err, "Unexpected error deleting Delivery Service: %v - alerts: %+v", err, alerts.Alerts)
+
+	delResp, _, err := TOSession.DeleteCDNDNSSECKeys(firstCDN.Name, client.RequestOptions{})
+	assert.NoError(t, err, "Unexpected error deleting CDN DNSSEC keys: %v - alerts: %+v", err, delResp.Alerts)
+}
diff --git a/traffic_ops/testing/api/v5/cdn_domains_test.go b/traffic_ops/testing/api/v5/cdn_domains_test.go
new file mode 100644
index 0000000000..632695f891
--- /dev/null
+++ b/traffic_ops/testing/api/v5/cdn_domains_test.go
@@ -0,0 +1,62 @@
+package v5
+
+/*
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+import (
+	"net/http"
+	"testing"
+	"time"
+
+	"github.com/apache/trafficcontrol/lib/go-rfc"
+	"github.com/apache/trafficcontrol/traffic_ops/testing/api/utils"
+	client "github.com/apache/trafficcontrol/traffic_ops/v5-client"
+)
+
+func TestCDNDomains(t *testing.T) {
+	WithObjs(t, []TCObj{CDNs, Types, Parameters, Profiles, Statuses}, func() {
+
+		tomorrow := time.Now().AddDate(0, 0, 1).Format(time.RFC1123)
+
+		methodTests := utils.V5TestCase{
+			"GET": {
+				"NOT MODIFIED when NO CHANGES made": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{Header: http.Header{rfc.IfModifiedSince: {tomorrow}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusNotModified)),
+				},
+				"OK when VALID request": {
+					ClientSession: TOSession, Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK),
+						utils.ResponseLengthGreaterOrEqual(1)),
+				},
+			},
+		}
+
+		for method, testCases := range methodTests {
+			t.Run(method, func(t *testing.T) {
+				for name, testCase := range testCases {
+					switch method {
+					case "GET":
+						t.Run(name, func(t *testing.T) {
+							resp, reqInf, err := testCase.ClientSession.GetDomains(testCase.RequestOpts)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, resp.Response, resp.Alerts, err)
+							}
+						})
+					}
+				}
+			})
+		}
+	})
+}
diff --git a/traffic_ops/testing/api/v5/cdn_federations_test.go b/traffic_ops/testing/api/v5/cdn_federations_test.go
new file mode 100644
index 0000000000..7973af3c85
--- /dev/null
+++ b/traffic_ops/testing/api/v5/cdn_federations_test.go
@@ -0,0 +1,301 @@
+package v5
+
+/*
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+import (
+	"encoding/json"
+	"net/http"
+	"net/url"
+	"sort"
+	"strconv"
+	"testing"
+	"time"
+
+	"github.com/apache/trafficcontrol/lib/go-rfc"
+	"github.com/apache/trafficcontrol/lib/go-tc"
+	"github.com/apache/trafficcontrol/traffic_ops/testing/api/assert"
+	"github.com/apache/trafficcontrol/traffic_ops/testing/api/utils"
+	"github.com/apache/trafficcontrol/traffic_ops/toclientlib"
+	client "github.com/apache/trafficcontrol/traffic_ops/v5-client"
+)
+
+var fedIDs = make(map[string]int)
+
+// All prerequisite Federations are associated to this cdn and this xmlID
+var cdnName = "cdn1"
+var xmlId = "ds1"
+
+func TestCDNFederations(t *testing.T) {
+	WithObjs(t, []TCObj{CDNs, Types, Parameters, Profiles, Tenants, CacheGroups, Statuses, Divisions, Regions, PhysLocations, Servers, Topologies, ServiceCategories, DeliveryServices, CDNFederations}, func() {
+
+		currentTime := time.Now().UTC().Add(-15 * time.Second)
+		currentTimeRFC := currentTime.Format(time.RFC1123)
+		tomorrow := currentTime.AddDate(0, 0, 1).Format(time.RFC1123)
+
+		methodTests := utils.V5TestCase{
+			"GET": {
+				"NOT MODIFIED when NO CHANGES made": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{Header: http.Header{rfc.IfModifiedSince: {tomorrow}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusNotModified)),
+				},
+				"OK when VALID ID parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"id": {strconv.Itoa(GetFederationID(t, "the.cname.com.")())}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(1)),
+				},
+				"SORTED by CNAME when ORDERBY=CNAME parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"orderby": {"cname"}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), validateCDNFederationCNameSort()),
+				},
+				"SORTED when ORDERBY=ID and SORTORDER=DESC": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"orderby": {"id"}, "sortOrder": {"desc"}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), validateCDNFederationIDDescSort()),
+				},
+				"FIRST RESULT when LIMIT=1": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"orderby": {"id"}, "limit": {"1"}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), validateCDNFederationPagination("limit")),
+				},
+				"SECOND RESULT when LIMIT=1 OFFSET=1": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"orderby": {"id"}, "limit": {"1"}, "offset": {"1"}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), validateCDNFederationPagination("offset")),
+				},
+				"SECOND RESULT when LIMIT=1 PAGE=2": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"orderby": {"id"}, "limit": {"1"}, "page": {"2"}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), validateCDNFederationPagination("page")),
+				},
+				"BAD REQUEST when INVALID LIMIT parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"limit": {"-2"}}},
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"BAD REQUEST when INVALID OFFSET parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"limit": {"1"}, "offset": {"0"}}},
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"BAD REQUEST when INVALID PAGE parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"limit": {"1"}, "page": {"0"}}},
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+			},
+			"PUT": {
+				"OK when VALID request": {
+					EndpointId:    GetFederationID(t, "google.com."),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"cname":       "new.cname.",
+						"ttl":         34,
+						"description": "updated",
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), validateCDNFederationUpdateFields(map[string]interface{}{"CName": "new.cname."})),
+				},
+				"PRECONDITION FAILED when updating with IMS & IUS Headers": {
+					EndpointId:    GetFederationID(t, "booya.com."),
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{Header: http.Header{rfc.IfUnmodifiedSince: {currentTimeRFC}}},
+					RequestBody: map[string]interface{}{
+						"cname":       "booya.com.",
+						"ttl":         34,
+						"description": "fooya",
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusPreconditionFailed)),
+				},
+				"PRECONDITION FAILED when updating with IFMATCH ETAG Header": {
+					EndpointId:    GetFederationID(t, "booya.com."),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"cname":       "new.cname.",
+						"ttl":         34,
+						"description": "updated",
+					},
+					RequestOpts:  client.RequestOptions{Header: http.Header{rfc.IfMatch: {rfc.ETag(currentTime)}}},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusPreconditionFailed)),
+				},
+			},
+			"GET AFTER CHANGES": {
+				"OK when CHANGES made": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{Header: http.Header{rfc.IfModifiedSince: {currentTimeRFC}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+			},
+		}
+
+		for method, testCases := range methodTests {
+			t.Run(method, func(t *testing.T) {
+				for name, testCase := range testCases {
+					cdnFederation := tc.CDNFederation{}
+
+					if testCase.RequestBody != nil {
+						dat, err := json.Marshal(testCase.RequestBody)
+						assert.NoError(t, err, "Error occurred when marshalling request body: %v", err)
+						err = json.Unmarshal(dat, &cdnFederation)
+						assert.NoError(t, err, "Error occurred when unmarshalling request body: %v", err)
+					}
+
+					switch method {
+					case "GET", "GET AFTER CHANGES":
+						t.Run(name, func(t *testing.T) {
+							resp, reqInf, err := testCase.ClientSession.GetCDNFederationsByName(cdnName, testCase.RequestOpts)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, resp.Response, resp.Alerts, err)
+							}
+						})
+					case "POST":
+						t.Run(name, func(t *testing.T) {
+							resp, reqInf, err := testCase.ClientSession.CreateCDNFederation(cdnFederation, cdnName, testCase.RequestOpts)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, resp.Response, resp.Alerts, err)
+							}
+						})
+					case "PUT":
+						t.Run(name, func(t *testing.T) {
+							resp, reqInf, err := testCase.ClientSession.UpdateCDNFederation(cdnFederation, cdnName, testCase.EndpointId(), testCase.RequestOpts)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, resp.Response, resp.Alerts, err)
+							}
+						})
+					case "DELETE":
+						t.Run(name, func(t *testing.T) {
+							alerts, reqInf, err := testCase.ClientSession.DeleteCDNFederation(cdnName, testCase.EndpointId(), testCase.RequestOpts)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, nil, alerts.Alerts, err)
+							}
+						})
+					}
+				}
+			})
+		}
+	})
+}
+
+func validateCDNFederationUpdateFields(expectedResp map[string]interface{}) utils.CkReqFunc {
+	return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ tc.Alerts, _ error) {
+		assert.RequireNotNil(t, resp, "Expected CDN Federation response to not be nil.")
+		CDNFederationResp := resp.(tc.CDNFederation)
+		for field, expected := range expectedResp {
+			switch field {
+			case "CName":
+				assert.RequireNotNil(t, CDNFederationResp.CName, "Expected CName to not be nil.")
+				assert.Equal(t, expected, *CDNFederationResp.CName, "Expected CName to be %v, but got %s", expected, *CDNFederationResp.CName)
+			default:
+				t.Errorf("Expected field: %v, does not exist in response", field)
+			}
+		}
+	}
+}
+
+func validateCDNFederationPagination(paginationParam string) utils.CkReqFunc {
+	return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ tc.Alerts, _ error) {
+		paginationResp := resp.([]tc.CDNFederation)
+
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("orderby", "id")
+		respBase, _, err := TOSession.GetCDNFederationsByName(cdnName, opts)
+		assert.RequireNoError(t, err, "Cannot get Federation Users: %v - alerts: %+v", err, respBase.Alerts)
+
+		CDNfederations := respBase.Response
+		assert.RequireGreaterOrEqual(t, len(CDNfederations), 3, "Need at least 3 CDN Federations in Traffic Ops to test pagination support, found: %d", len(CDNfederations))
+		switch paginationParam {
+		case "limit:":
+			assert.Exactly(t, CDNfederations[:1], paginationResp, "expected GET CDN Federations with limit = 1 to return first result")
+		case "offset":
+			assert.Exactly(t, CDNfederations[1:2], paginationResp, "expected GET CDN Federations with limit = 1, offset = 1 to return second result")
+		case "page":
+			assert.Exactly(t, CDNfederations[1:2], paginationResp, "expected GET CDN Federations with limit = 1, page = 2 to return second result")
+		}
+	}
+}
+
+func validateCDNFederationCNameSort() utils.CkReqFunc {
+	return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, alerts tc.Alerts, _ error) {
+		assert.RequireNotNil(t, resp, "Expected CDN Federation response to not be nil.")
+		var federationCNames []string
+		CDNFederationResp := resp.([]tc.CDNFederation)
+		for _, CDNFederation := range CDNFederationResp {
+			assert.RequireNotNil(t, CDNFederation.CName, "Expected CDN Federation CName to not be nil.")
+			federationCNames = append(federationCNames, *CDNFederation.CName)
+		}
+		assert.Equal(t, true, sort.StringsAreSorted(federationCNames), "List is not sorted by their names: %v", federationCNames)
+	}
+}
+
+func validateCDNFederationIDDescSort() utils.CkReqFunc {
+	return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, alerts tc.Alerts, _ error) {
+		assert.RequireNotNil(t, resp, "Expected CDN Federation response to not be nil.")
+		var CDNFederationIDs []int
+		CDNFederationResp := resp.([]tc.CDNFederation)
+		for _, federation := range CDNFederationResp {
+			CDNFederationIDs = append([]int{*federation.ID}, CDNFederationIDs...)
+		}
+		assert.Equal(t, true, sort.IntsAreSorted(CDNFederationIDs), "List is not sorted by their ids: %v", CDNFederationIDs)
+	}
+}
+
+func GetFederationID(t *testing.T, cname string) func() int {
+	return func() int {
+		ID, ok := fedIDs[cname]
+		assert.RequireEqual(t, true, ok, "Expected to find Federation CName: %s to have associated ID", cname)
+		return ID
+	}
+}
+
+func setFederationID(t *testing.T, cdnFederation tc.CDNFederation) {
+	assert.RequireNotNil(t, cdnFederation.CName, "Federation CName was nil after posting.")
+	assert.RequireNotNil(t, cdnFederation.ID, "Federation ID was nil after posting.")
+	fedIDs[*cdnFederation.CName] = *cdnFederation.ID
+}
+
+func CreateTestCDNFederations(t *testing.T) {
+	for _, federation := range testData.Federations {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("xmlId", *federation.DeliveryServiceIDs.XmlId)
+		dsResp, _, err := TOSession.GetDeliveryServices(opts)
+		assert.RequireNoError(t, err, "Could not get Delivery Service by XML ID: %v", err)
+		assert.RequireEqual(t, 1, len(dsResp.Response), "Expected one Delivery Service, but got %d", len(dsResp.Response))
+		assert.RequireNotNil(t, dsResp.Response[0].CDNName, "Expected Delivery Service CDN Name to not be nil.")
+
+		resp, _, err := TOSession.CreateCDNFederation(federation, *dsResp.Response[0].CDNName, client.RequestOptions{})
+		assert.NoError(t, err, "Could not create CDN Federations: %v - alerts: %+v", err, resp.Alerts)
+
+		// Need to save the ids, otherwise the other tests won't be able to reference the federations
+		setFederationID(t, resp.Response)
+		assert.RequireNotNil(t, resp.Response.ID, "Federation ID was nil after posting.")
+		assert.RequireNotNil(t, dsResp.Response[0].ID, "Delivery Service ID was nil.")
+		_, _, err = TOSession.CreateFederationDeliveryServices(*resp.Response.ID, []int{*dsResp.Response[0].ID}, false, client.NewRequestOptions())
+		assert.NoError(t, err, "Could not create Federation Delivery Service: %v", err)
+	}
+}
+
+func DeleteTestCDNFederations(t *testing.T) {
+	opts := client.NewRequestOptions()
+	for _, id := range fedIDs {
+		resp, _, err := TOSession.DeleteCDNFederation(cdnName, id, opts)
+		assert.NoError(t, err, "Cannot delete federation #%d: %v - alerts: %+v", id, err, resp.Alerts)
+
+		opts.QueryParameters.Set("id", strconv.Itoa(id))
+		data, _, err := TOSession.GetCDNFederationsByName(cdnName, opts)
+		assert.Equal(t, 0, len(data.Response), "expected federation to be deleted")
+	}
+	fedIDs = make(map[string]int) // reset the global variable for the next test
+}
diff --git a/traffic_ops/testing/api/v5/cdn_locks_test.go b/traffic_ops/testing/api/v5/cdn_locks_test.go
new file mode 100644
index 0000000000..44aa9a5d69
--- /dev/null
+++ b/traffic_ops/testing/api/v5/cdn_locks_test.go
@@ -0,0 +1,726 @@
+package v5
+
+/*
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+import (
+	"encoding/json"
+	"net/http"
+	"net/url"
+	"strconv"
+	"testing"
+
+	"github.com/apache/trafficcontrol/lib/go-tc"
+	"github.com/apache/trafficcontrol/traffic_ops/testing/api/assert"
+	"github.com/apache/trafficcontrol/traffic_ops/testing/api/utils"
+	"github.com/apache/trafficcontrol/traffic_ops/toclientlib"
+	client "github.com/apache/trafficcontrol/traffic_ops/v5-client"
+)
+
+func TestCDNLocks(t *testing.T) {
+	WithObjs(t, []TCObj{Types, CacheGroups, CDNs, Parameters, Profiles, ProfileParameters, Statuses, Divisions, Regions, PhysLocations, Servers, ServiceCategories, Topologies, Tenants, Roles, Users, DeliveryServices, StaticDNSEntries, CDNLocks}, func() {
+
+		opsUserSession := utils.CreateV5Session(t, Config.TrafficOps.URL, "opsuser", "pa$$word", Config.Default.Session.TimeoutInSecs)
+		opsUserWithLockSession := utils.CreateV5Session(t, Config.TrafficOps.URL, "opslockuser", "pa$$word", Config.Default.Session.TimeoutInSecs)
+
+		methodTests := utils.V5TestCase{
+			"GET": {
+				"OK when VALID request": {
+					ClientSession: TOSession, Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK),
+						utils.ResponseLengthGreaterOrEqual(1)),
+				},
+				"OK when VALID CDN parameter": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"cdn": {"cdn2"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(1),
+						validateGetResponseFields(map[string]interface{}{"username": "opslockuser", "cdn": "cdn2", "message": "test lock for updates", "soft": false})),
+				},
+			},
+			"POST": {
+				"CREATED when VALID request": {
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"cdn":     "cdn3",
+						"message": "snapping cdn",
+						"soft":    true,
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusCreated),
+						validateCreateResponseFields(map[string]interface{}{"username": "admin", "cdn": "cdn3", "message": "snapping cdn", "soft": true})),
+				},
+				"NOT CREATED when INVALID shared username": {
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"cdn":             "bar",
+						"message":         "snapping cdn",
+						"soft":            true,
+						"sharedUserNames": []string{"adminuser2"},
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"CREATED when VALID shared username": {
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"cdn":             "bar",
+						"message":         "snapping cdn",
+						"soft":            true,
+						"sharedUserNames": []string{"adminuser"},
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusCreated)),
+				},
+			},
+			"DELETE": {
+				"OK when VALID request": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"cdn": {"cdn1"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when NON-ADMIN USER DOESNT OWN LOCK": {
+					ClientSession: opsUserSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"cdn": {"cdn4"}}},
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+				"OK when ADMIN USER DOESNT OWN LOCK": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"cdn": {"cdn4"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+			},
+			"SNAPSHOT": {
+				"OK when USER OWNS LOCK": {
+					ClientSession: opsUserWithLockSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"cdn": {"cdn2"}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					ClientSession: TOSession, RequestOpts: client.RequestOptions{QueryParameters: url.Values{"cdn": {"cdn2"}}},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"SERVERS QUEUE UPDATES": {
+				"OK when USER OWNS LOCK": {
+					EndpointId: GetServerID(t, "cdn2-test-edge"), ClientSession: opsUserWithLockSession,
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					EndpointId: GetServerID(t, "cdn2-test-edge"), ClientSession: TOSession,
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"TOPOLOGY QUEUE UPDATES": {
+				"OK when USER OWNS LOCK": {
+					ClientSession: opsUserWithLockSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"topology": {"top-for-ds-req"}}},
+					RequestBody: map[string]interface{}{
+						"action": "queue",
+						"cdnId":  GetCDNID(t, "cdn2")(),
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"topology": {"top-for-ds-req"}}},
+					RequestBody: map[string]interface{}{
+						"action": "queue",
+						"cdnId":  GetCDNID(t, "cdn2")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+				"OK when ADMIN USER DOESNT OWN LOCK FOR DEQUEUE": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"topology": {"top-for-ds-req"}}},
+					RequestBody: map[string]interface{}{
+						"action": "dequeue",
+						"cdnId":  GetCDNID(t, "cdn2")(),
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+			},
+			"CDN UPDATE": {
+				"OK when USER OWNS LOCK": {
+					EndpointId: GetCDNID(t, "cdn2"), ClientSession: opsUserWithLockSession,
+					RequestBody: map[string]interface{}{
+						"dnssecEnabled": false,
+						"domainName":    "newdomain",
+						"name":          "cdn2",
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					EndpointId: GetCDNID(t, "cdn2"), ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"dnssecEnabled": false,
+						"domainName":    "newdomaintest",
+						"name":          "cdn2",
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"CDN DELETE": {
+				"OK when USER OWNS LOCK": {
+					EndpointId: GetCDNID(t, "cdndelete"), ClientSession: opsUserWithLockSession,
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					EndpointId: GetCDNID(t, "cdn2"), ClientSession: TOSession,
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"CACHE GROUP UPDATE": {
+				"OK when USER OWNS LOCK": {
+					EndpointId: GetCacheGroupId(t, "cachegroup1"), ClientSession: opsUserWithLockSession,
+					RequestBody: map[string]interface{}{
+						"name":      "cachegroup1",
+						"shortName": "newShortName",
+						"typeName":  "EDGE_LOC",
+						"typeId":    GetTypeId(t, "EDGE_LOC"),
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					EndpointId: GetCacheGroupId(t, "cachegroup1"), ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":      "cachegroup1",
+						"shortName": "newShortName",
+						"typeName":  "EDGE_LOC",
+						"typeId":    GetTypeId(t, "EDGE_LOC"),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"DELIVERY SERVICE POST": {
+				"OK when USER OWNS LOCK": {
+					ClientSession: opsUserWithLockSession, RequestBody: generateDeliveryService(t, map[string]interface{}{"xmlId": "testDSLock"}),
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusCreated)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					ClientSession: TOSession, RequestBody: generateDeliveryService(t, map[string]interface{}{
+						"xmlId": "testDSLock2", "cdnId": GetCDNID(t, "cdn2")()}),
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"DELIVERY SERVICE PUT": {
+				"OK when USER OWNS LOCK": {
+					EndpointId: GetDeliveryServiceId(t, "basic-ds-in-cdn2"), ClientSession: opsUserWithLockSession,
+					RequestBody: generateDeliveryService(t, map[string]interface{}{
+						"xmlId": "basic-ds-in-cdn2", "cdnId": GetCDNID(t, "cdn2")(), "cdnName": "cdn2", "routingName": "cdn"}),
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					EndpointId: GetDeliveryServiceId(t, "basic-ds-in-cdn2"), ClientSession: TOSession,
+					RequestBody:  generateDeliveryService(t, map[string]interface{}{}),
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"DELIVERY SERVICE DELETE": {
+				"OK when USER OWNS LOCK": {
+					EndpointId: GetDeliveryServiceId(t, "ds-forked-topology"), ClientSession: opsUserWithLockSession,
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					EndpointId: GetDeliveryServiceId(t, "top-ds-in-cdn2"), ClientSession: TOSession,
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"PROFILE POST": {
+				"OK when USER OWNS LOCK": {
+					ClientSession: opsUserWithLockSession,
+					RequestBody: map[string]interface{}{
+						"cdn":              GetCDNID(t, "cdn2")(),
+						"cdnName":          "cdn2",
+						"description":      "test cdn locks description",
+						"name":             "TestLocks",
+						"routing_disabled": false,
+						"type":             "ATS_PROFILE",
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"cdn":              GetCDNID(t, "cdn2")(),
+						"cdnName":          "cdn2",
+						"description":      "test cdn locks description",
+						"name":             "TestLocksForbidden",
+						"routing_disabled": false,
+						"type":             "ATS_PROFILE",
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"PROFILE PUT": {
+				"OK when USER OWNS LOCK": {
+					EndpointId:    GetProfileID(t, "CDN2_EDGE"),
+					ClientSession: opsUserWithLockSession,
+					RequestBody: map[string]interface{}{
+						"cdn":              GetCDNID(t, "cdn2")(),
+						"cdnName":          "cdn2",
+						"description":      "cdn2 edge description updated when user owns lock",
+						"name":             "CDN2_EDGE",
+						"routing_disabled": false,
+						"type":             "ATS_PROFILE",
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					EndpointId:    GetProfileID(t, "EDGEInCDN2"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"cdn":              GetCDNID(t, "cdn2")(),
+						"cdnName":          "cdn2",
+						"description":      "should fail",
+						"name":             "EDGEInCDN2",
+						"routing_disabled": false,
+						"type":             "ATS_PROFILE",
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"PROFILE DELETE": {
+				"OK when USER OWNS LOCK": {
+					EndpointId:    GetProfileID(t, "CCR2"),
+					ClientSession: opsUserWithLockSession,
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					EndpointId:    GetProfileID(t, "MID2"),
+					ClientSession: TOSession,
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"PROFILE PARAMETER POST": {
+				"OK when USER OWNS LOCK": {
+					ClientSession: opsUserWithLockSession,
+					RequestBody: map[string]interface{}{
+						"profileId":   GetProfileID(t, "EDGEInCDN2")(),
+						"parameterId": GetParameterID(t, "CONFIG proxy.config.admin.user_id", "records.config", "STRING ats")(),
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"profileId":   GetProfileID(t, "EDGEInCDN2")(),
+						"parameterId": GetParameterID(t, "CONFIG proxy.config.admin.user_id", "records.config", "STRING ats")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"PROFILE PARAMETER DELETE": {
+				"OK when USER OWNS LOCK": {
+					EndpointId:    GetProfileID(t, "OKwhenUserOwnLocks"),
+					ClientSession: opsUserWithLockSession,
+					RequestOpts: client.RequestOptions{QueryParameters: url.Values{
+						"parameterId": {strconv.Itoa(GetParameterID(t, "test.cdnlock.delete", "rascal.properties", "25.0")())},
+					}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					EndpointId:    GetProfileID(t, "FORBIDDENwhenDoesntOwnLock"),
+					ClientSession: TOSession,
+					RequestOpts: client.RequestOptions{QueryParameters: url.Values{
+						"parameterId": {strconv.Itoa(GetParameterID(t, "test.cdnlock.forbidden.delete", "rascal.properties", "25.0")())},
+					}},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"SERVER POST": {
+				"OK when USER OWNS LOCK": {
+					ClientSession: opsUserWithLockSession,
+					RequestBody: generateServer(t, map[string]interface{}{
+						"cdnId":        GetCDNID(t, "cdn2")(),
+						"profileNames": []string{"EDGEInCDN2"},
+					}),
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusCreated)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					ClientSession: TOSession,
+					RequestBody: generateServer(t, map[string]interface{}{
+						"cdnId":        GetCDNID(t, "cdn2")(),
+						"profileNames": []string{"EDGEInCDN2"},
+						"interfaces": []map[string]interface{}{{
+							"ipAddresses": []map[string]interface{}{{
+								"address":        "127.0.0.2/30",
+								"serviceAddress": true,
+							}},
+							"name": "eth0",
+						}},
+					}),
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"SERVER PUT": {
+				"OK when USER OWNS LOCK": {
+					EndpointId:    GetServerID(t, "edge1-cdn2"),
+					ClientSession: opsUserWithLockSession,
+					RequestBody: generateServer(t, map[string]interface{}{
+						"id":           GetServerID(t, "edge1-cdn2")(),
+						"cdnId":        GetCDNID(t, "cdn2")(),
+						"profileNames": []string{"EDGEInCDN2"},
+						"interfaces": []map[string]interface{}{{
+							"ipAddresses": []map[string]interface{}{{
+								"address":        "0.0.0.1",
+								"serviceAddress": true,
+							}},
+							"name": "eth0",
+						}},
+					}),
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					EndpointId:    GetServerID(t, "dtrc-edge-07"),
+					ClientSession: TOSession,
+					RequestBody: generateServer(t, map[string]interface{}{
+						"id":           GetServerID(t, "dtrc-edge-07")(),
+						"cdnId":        GetCDNID(t, "cdn2")(),
+						"cachegroupId": GetCacheGroupId(t, "dtrc2")(),
+						"profileNames": []string{"CDN2_EDGE"},
+						"interfaces": []map[string]interface{}{{
+							"ipAddresses": []map[string]interface{}{{
+								"address":        "192.0.2.11/24",
+								"serviceAddress": true,
+							}},
+							"name": "eth0",
+						}},
+					}),
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"SERVER DELETE": {
+				"OK when USER OWNS LOCK": {
+					EndpointId:    GetServerID(t, "atlanta-mid-17"),
+					ClientSession: opsUserWithLockSession,
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					EndpointId:    GetServerID(t, "denver-mso-org-02"),
+					ClientSession: TOSession,
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"STATIC DNS ENTRIES POST": {
+				"OK when USER OWNS LOCK": {
+					ClientSession: opsUserWithLockSession,
+					RequestBody: map[string]interface{}{
+						"address":         "192.168.0.1",
+						"cachegroup":      "cachegroup1",
+						"deliveryservice": "basic-ds-in-cdn2",
+						"host":            "cdn_locks_test_host",
+						"type":            "A_RECORD",
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+				},
+				"FORBIDDEN when ADMIN USER DOESNT OWN LOCK": {
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"address":         "192.168.0.1",
+						"cachegroup":      "cachegroup1",
+						"deliveryservice": "basic-ds-in-cdn2",
+						"host":            "cdn_locks_test_host",
+						"type":            "A_RECORD",
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+			"STATIC DNS ENTRIES PUT": {
+				"OK when USER OWNS LOCK": {
+					EndpointId:    GetStaticDNSEntryID(t, "host2"),
+					ClientSession: opsUserWithLockSession,
+					RequestBody: map[string]interface{}{
... 29212 lines suppressed ...