@faable/deploy-sdk 2.16.0 → 2.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FaableDeployApi.d.ts +8 -0
- package/dist/FaableDeployApi.d.ts.map +1 -1
- package/dist/api/generated-client.d.ts +26 -1
- package/dist/api/generated-client.d.ts.map +1 -1
- package/dist/api/generated-client.js +1 -0
- package/dist/api/types.d.ts +66 -8
- package/dist/api/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/spec/openapi.json +233 -6
package/package.json
CHANGED
package/spec/openapi.json
CHANGED
|
@@ -856,6 +856,9 @@
|
|
|
856
856
|
"type": "string"
|
|
857
857
|
}
|
|
858
858
|
}
|
|
859
|
+
},
|
|
860
|
+
"dockerfile_ignored": {
|
|
861
|
+
"type": "boolean"
|
|
859
862
|
}
|
|
860
863
|
}
|
|
861
864
|
},
|
|
@@ -963,6 +966,17 @@
|
|
|
963
966
|
],
|
|
964
967
|
"description": "Success deploy emails (first deploy + every promote). Absent/null = enabled; false = muted. Failure emails are never gated by this."
|
|
965
968
|
},
|
|
969
|
+
"http3": {
|
|
970
|
+
"anyOf": [
|
|
971
|
+
{
|
|
972
|
+
"type": "boolean"
|
|
973
|
+
},
|
|
974
|
+
{
|
|
975
|
+
"type": "null"
|
|
976
|
+
}
|
|
977
|
+
],
|
|
978
|
+
"description": "Whether HTTP/3 is advertised for this app. Absent/null = advertised; false = not advertised. Note it controls the advertisement, not the listener: clients that already discovered HTTP/3 may keep using it until the advertisement expires, and the server does not refuse it."
|
|
979
|
+
},
|
|
966
980
|
"status": {
|
|
967
981
|
"$ref": "#/components/schemas/AppStatus"
|
|
968
982
|
},
|
|
@@ -1170,6 +1184,16 @@
|
|
|
1170
1184
|
"type": "null"
|
|
1171
1185
|
}
|
|
1172
1186
|
]
|
|
1187
|
+
},
|
|
1188
|
+
"http3": {
|
|
1189
|
+
"anyOf": [
|
|
1190
|
+
{
|
|
1191
|
+
"type": "boolean"
|
|
1192
|
+
},
|
|
1193
|
+
{
|
|
1194
|
+
"type": "null"
|
|
1195
|
+
}
|
|
1196
|
+
]
|
|
1173
1197
|
}
|
|
1174
1198
|
},
|
|
1175
1199
|
"additionalProperties": false
|
|
@@ -1184,9 +1208,19 @@
|
|
|
1184
1208
|
"type": "boolean"
|
|
1185
1209
|
},
|
|
1186
1210
|
"code": {
|
|
1187
|
-
"
|
|
1188
|
-
|
|
1189
|
-
|
|
1211
|
+
"anyOf": [
|
|
1212
|
+
{
|
|
1213
|
+
"type": "string",
|
|
1214
|
+
"enum": [
|
|
1215
|
+
"repository_already_linked"
|
|
1216
|
+
]
|
|
1217
|
+
},
|
|
1218
|
+
{
|
|
1219
|
+
"type": "string",
|
|
1220
|
+
"enum": [
|
|
1221
|
+
"repository_taken_down"
|
|
1222
|
+
]
|
|
1223
|
+
}
|
|
1190
1224
|
]
|
|
1191
1225
|
},
|
|
1192
1226
|
"message": {
|
|
@@ -1690,6 +1724,76 @@
|
|
|
1690
1724
|
"type": "boolean"
|
|
1691
1725
|
}
|
|
1692
1726
|
}
|
|
1727
|
+
},
|
|
1728
|
+
"images": {
|
|
1729
|
+
"type": "object",
|
|
1730
|
+
"properties": {
|
|
1731
|
+
"deviceSizes": {
|
|
1732
|
+
"type": "array",
|
|
1733
|
+
"items": {
|
|
1734
|
+
"type": "integer",
|
|
1735
|
+
"minimum": 1,
|
|
1736
|
+
"maximum": 16384
|
|
1737
|
+
},
|
|
1738
|
+
"maxItems": 256
|
|
1739
|
+
},
|
|
1740
|
+
"imageSizes": {
|
|
1741
|
+
"type": "array",
|
|
1742
|
+
"items": {
|
|
1743
|
+
"type": "integer",
|
|
1744
|
+
"minimum": 1,
|
|
1745
|
+
"maximum": 16384
|
|
1746
|
+
},
|
|
1747
|
+
"maxItems": 256
|
|
1748
|
+
},
|
|
1749
|
+
"formats": {
|
|
1750
|
+
"type": "array",
|
|
1751
|
+
"items": {
|
|
1752
|
+
"type": "string",
|
|
1753
|
+
"maxLength": 64
|
|
1754
|
+
},
|
|
1755
|
+
"maxItems": 8
|
|
1756
|
+
},
|
|
1757
|
+
"qualities": {
|
|
1758
|
+
"type": "array",
|
|
1759
|
+
"items": {
|
|
1760
|
+
"type": "integer",
|
|
1761
|
+
"minimum": 1,
|
|
1762
|
+
"maximum": 100
|
|
1763
|
+
},
|
|
1764
|
+
"maxItems": 100
|
|
1765
|
+
},
|
|
1766
|
+
"minimumCacheTTL": {
|
|
1767
|
+
"type": "integer",
|
|
1768
|
+
"minimum": 0
|
|
1769
|
+
},
|
|
1770
|
+
"unoptimized": {
|
|
1771
|
+
"type": "boolean"
|
|
1772
|
+
},
|
|
1773
|
+
"loader": {
|
|
1774
|
+
"type": "string",
|
|
1775
|
+
"maxLength": 64
|
|
1776
|
+
},
|
|
1777
|
+
"path": {
|
|
1778
|
+
"type": "string",
|
|
1779
|
+
"maxLength": 512
|
|
1780
|
+
},
|
|
1781
|
+
"basePath": {
|
|
1782
|
+
"type": "string",
|
|
1783
|
+
"maxLength": 512
|
|
1784
|
+
},
|
|
1785
|
+
"assetPrefix": {
|
|
1786
|
+
"type": "boolean"
|
|
1787
|
+
},
|
|
1788
|
+
"dangerouslyAllowSVG": {
|
|
1789
|
+
"type": "boolean"
|
|
1790
|
+
},
|
|
1791
|
+
"remotePatterns": {
|
|
1792
|
+
"type": "integer",
|
|
1793
|
+
"minimum": 0
|
|
1794
|
+
}
|
|
1795
|
+
},
|
|
1796
|
+
"additionalProperties": false
|
|
1693
1797
|
}
|
|
1694
1798
|
}
|
|
1695
1799
|
},
|
|
@@ -1719,6 +1823,9 @@
|
|
|
1719
1823
|
"type": "string"
|
|
1720
1824
|
}
|
|
1721
1825
|
}
|
|
1826
|
+
},
|
|
1827
|
+
"dockerfile_ignored": {
|
|
1828
|
+
"type": "boolean"
|
|
1722
1829
|
}
|
|
1723
1830
|
}
|
|
1724
1831
|
},
|
|
@@ -1941,6 +2048,11 @@
|
|
|
1941
2048
|
},
|
|
1942
2049
|
"detected": {
|
|
1943
2050
|
"$ref": "#/components/schemas/DeploymentDetected"
|
|
2051
|
+
},
|
|
2052
|
+
"plan": {
|
|
2053
|
+
"type": "object",
|
|
2054
|
+
"properties": {},
|
|
2055
|
+
"additionalProperties": true
|
|
1944
2056
|
}
|
|
1945
2057
|
}
|
|
1946
2058
|
},
|
|
@@ -1949,8 +2061,11 @@
|
|
|
1949
2061
|
"required": [
|
|
1950
2062
|
"dns_state",
|
|
1951
2063
|
"dns_checked_at",
|
|
2064
|
+
"dns_last_seen_at",
|
|
2065
|
+
"dns_error_kind",
|
|
1952
2066
|
"dns_expected",
|
|
1953
2067
|
"dns_observed",
|
|
2068
|
+
"dns_expected_ips",
|
|
1954
2069
|
"dns_message",
|
|
1955
2070
|
"dns_warning"
|
|
1956
2071
|
],
|
|
@@ -1966,11 +2081,28 @@
|
|
|
1966
2081
|
"default": "pending"
|
|
1967
2082
|
},
|
|
1968
2083
|
"dns_checked_at": {
|
|
2084
|
+
"type": "string",
|
|
2085
|
+
"description": "ISO timestamp of the last DNS change",
|
|
2086
|
+
"nullable": true,
|
|
2087
|
+
"default": null
|
|
2088
|
+
},
|
|
2089
|
+
"dns_last_seen_at": {
|
|
1969
2090
|
"type": "string",
|
|
1970
2091
|
"description": "ISO timestamp of the last DNS check",
|
|
1971
2092
|
"nullable": true,
|
|
1972
2093
|
"default": null
|
|
1973
2094
|
},
|
|
2095
|
+
"dns_error_kind": {
|
|
2096
|
+
"type": "string",
|
|
2097
|
+
"enum": [
|
|
2098
|
+
"transient",
|
|
2099
|
+
"proxy",
|
|
2100
|
+
null
|
|
2101
|
+
],
|
|
2102
|
+
"description": "Why an `error` verdict could not conclude",
|
|
2103
|
+
"nullable": true,
|
|
2104
|
+
"default": null
|
|
2105
|
+
},
|
|
1974
2106
|
"dns_expected": {
|
|
1975
2107
|
"type": "array",
|
|
1976
2108
|
"items": {
|
|
@@ -1987,6 +2119,14 @@
|
|
|
1987
2119
|
"description": "CNAME target(s) actually resolved for the fqdn",
|
|
1988
2120
|
"default": []
|
|
1989
2121
|
},
|
|
2122
|
+
"dns_expected_ips": {
|
|
2123
|
+
"type": "array",
|
|
2124
|
+
"items": {
|
|
2125
|
+
"type": "string"
|
|
2126
|
+
},
|
|
2127
|
+
"description": "IPv4 address(es) the expected target currently resolves to",
|
|
2128
|
+
"default": []
|
|
2129
|
+
},
|
|
1990
2130
|
"dns_message": {
|
|
1991
2131
|
"type": "string",
|
|
1992
2132
|
"description": "Human-readable diagnostic of the DNS check",
|
|
@@ -3672,6 +3812,12 @@
|
|
|
3672
3812
|
"enum": [
|
|
3673
3813
|
"buildkit"
|
|
3674
3814
|
]
|
|
3815
|
+
},
|
|
3816
|
+
{
|
|
3817
|
+
"type": "string",
|
|
3818
|
+
"enum": [
|
|
3819
|
+
"detector"
|
|
3820
|
+
]
|
|
3675
3821
|
}
|
|
3676
3822
|
]
|
|
3677
3823
|
},
|
|
@@ -4020,6 +4166,12 @@
|
|
|
4020
4166
|
"enum": [
|
|
4021
4167
|
"buildkit"
|
|
4022
4168
|
]
|
|
4169
|
+
},
|
|
4170
|
+
{
|
|
4171
|
+
"type": "string",
|
|
4172
|
+
"enum": [
|
|
4173
|
+
"detector"
|
|
4174
|
+
]
|
|
4023
4175
|
}
|
|
4024
4176
|
]
|
|
4025
4177
|
},
|
|
@@ -4264,7 +4416,7 @@
|
|
|
4264
4416
|
},
|
|
4265
4417
|
"ApiErrorCode": {
|
|
4266
4418
|
"type": "string",
|
|
4267
|
-
"description": "Machine-readable error code. One HTTP status per code.\n\n- `bad_request` (400): The request is malformed. `message` says what is wrong.\n- `validation_error` (400): The body, query or path failed schema validation. `details.issues` lists each failing field.\n- `unauthorized` (401): The request carries no valid credentials.\n- `payment_required` (402): The feature is not included in the current plan.\n- `forbidden` (403): The credentials are valid but do not allow this operation.\n- `not_found` (404): The resource does not exist, or not in the caller’s project.\n- `method_not_allowed` (405): The HTTP method is not supported on this path.\n- `conflict` (409): The request conflicts with the current state of the resource.\n- `payload_too_large` (413): The request body exceeds the size limit.\n- `unsupported_media_type` (415): The `Content-Type` is not accepted by this endpoint.\n- `unprocessable_entity` (422): The request is well-formed but cannot be processed.\n- `too_many_requests` (429): Rate limit exceeded. Honour the `Retry-After` header.\n- `internal_error` (500): Unexpected server error. Retry later; the request id is logged.\n- `gone` (410): The resource existed and is gone for good; retrying will not bring it back.\n- `bad_gateway` (502): An upstream the API depends on failed.\n- `service_unavailable` (503): The feature is not configured on this environment, or is temporarily out of service.\n- `already_exists` (400): A resource with the same unique field already exists. `details.fields` names the field.\n- `invalid_id` (400): The id in the path is not a valid id for this resource.\n- `invalid_query` (400): The `?query=` FaableQL expression could not be parsed.\n- `invalid_expand` (400): An `?expand=` path is not allowed on this resource.\n- `search_not_supported` (400): This resource does not support `?q=`.\n- `access_denied` (401): The row exists but does not belong to the caller.\n- `invalid_token` (401): The bearer token is missing, malformed or expired.\n- `invalid_apikey` (401): The API key does not exist or has been revoked.\n- `apikey_expired` (401): The API key predates projects and must be recreated.\n- `invalid_build_token` (401): The build token is not valid for this deployment.\n- `build_token_expired` (401): The build token is past its lifetime.\n- `build_token_unusable` (401): The deployment reached a terminal phase, so its build token no longer works.\n- `build_token_app_missing` (401): The app the build token was minted for no longer exists.\n- `user_token_required` (401): The endpoint acts on behalf of a person and the credential carries no user (an API key or a service account).\n- `team_required` (400): The operation needs a project: send it in the `x-faable-team` header.\n- `team_or_scope_required` (401): Listing needs either a project in `x-faable-team` or a global scope on the token.\n- `user_suspended` (403): The account is suspended. Contact support@faable.com.\n- `superadmin_only` (403): The operation is restricted to platform staff.\n- `project_not_found` (404): No project with that id for this caller.\n- `owner_only` (403): Only the project owner can manage collaborators.\n- `owner_not_removable` (400): The project owner cannot be removed. Delete the project instead.\n- `collaborator_not_found` (404): That user is not a collaborator on the project.\n- `invalid_project_name` (400): The project name is not acceptable. `message` says why.\n- `moderation_hold` (403): The project contains an app disabled by moderation and cannot be deleted. Contact support@faable.com.\n- `app_not_found` (404): No app with that id or slug in this project.\n- `repository_not_linked` (400): The app has no linked repository.\n- `repository_empty` (400): The repository has no commits on the deploy branch yet.\n- `branch_missing` (400): The deploy branch does not exist on the repository. `message` lists the branches that do.\n- `deploy_mode_conflict` (400): The app deploys from its own workflow, so the platform will not create a deployment for it.\n- `deploy_refused` (409): The deploy was refused by quota, plan or an in-flight deployment. `message` says which.\n- `invalid_root_dir` (400): The Root Directory must be a path inside the repository — no leading `/` and no `..`.\n- `root_dir_not_found` (400): The Root Directory does not exist on that ref of the repository.\n- `root_dir_mismatch` (400): The workflow deploys from one directory and platform builds would run from another. Declare `rootDir` in faable.json.\n- `no_workflows` (400): The repository has no GitHub Actions workflows, so a CI gate would never open.\n- `no_deploy_workflow` (400): No workflow in the repository runs `faable deploy`.\n- `invalid_secret_name` (400): Secret names are 1-255 printable ASCII characters and cannot contain '='.\n- `invalid_secret_context` (400): Secrets are scoped to an app or to a profile, nothing else.\n- `app_secrets_only` (400): Only app secrets can be written in bulk.\n- `secrets_access_denied` (401): The caller may not read or write the secrets of that app or profile.\n- `status_forbidden_resource` (403): Only a platform service writes app or domain status.\n- `status_forbidden_field` (403): That field of a deployment status is platform bookkeeping. `message` names it.\n- `status_forbidden_phase` (403): That phase is set by the platform, not by the client.\n- `github_identity_missing` (412): The user has not connected GitHub. Send them through `connect_github`.\n- `github_installation_missing` (412): The Faable GitHub App is not installed on any repository of theirs.\n- `github_repository_not_found` (404): The repository does not exist or the installation cannot see it.\n- `github_token_invalid` (401): The stored GitHub token was rejected; the user must reconnect.\n- `github_permission_denied` (403): The installation lacks a permission this operation needs.\n- `github_installation_suspended` (403): The GitHub App installation is suspended.\n- `github_installation_not_found` (412): The installation id is unknown or the App was uninstalled.\n- `github_repository_blocked` (403): GitHub refuses to serve the source of that repository (403 or 451).\n- `github_error` (502): GitHub failed upstream. `message` carries what it said.\n- `repository_already_linked` (409): The repository is already linked to another app. `details.app_id` / `details.app_name` name it.\n- `invalid_installation_id` (400): The `installation_id` is not a number.\n- `oidc_untrusted` (401): The GitHub Actions OIDC token was rejected. `message` says why.\n- `app_repository_mismatch` (403): The app does not exist or is not linked to the repository the token comes from.\n- `no_app_for_repository` (404): No app is linked to that repository.\n- `ambiguous_app_for_repository` (400): Several apps are linked to that repository; pass `--app-slug`.\n- `app_disabled` (409): The app is disabled, so it cannot be deployed or provisioned. `message` says why when the reason is public.\n- `app_rate_limited` (429): A new account may only create a few apps in its first 24 hours.\n- `plan_required` (403): The build or feature needs a higher plan. `message` says which.\n- `remote_build_disabled` (409): Remote builds are off for this environment or this app. Deploy with a local build instead.\n- `artifact_deploy_disabled` (409): Artifact deploys are not enabled on this environment.\n- `artifact_too_large` (413): The artifact exceeds the size allowed for the plan.\n- `metrics_unavailable` (503): Traffic metrics are temporarily unavailable — this is not an app with no traffic.\n- `transfer_refused` (409): The app cannot be moved to that project. `message` lists the blockers.\n- `user_not_found` (400): No user with that id in Faable Auth.\n- `waf_rule_not_found` (404): No WAF rule with that pattern on this app.\n- `project_rate_limited` (429): A new account may only create a few projects in its first hours. It opens with time, or with a plan.\n- `project_plan_limited` (402): The Free plan project cap is reached. Upgrade to create more.\n- `domain_invalid` (400): Not a valid hostname. No protocol, port or path.\n- `domain_reserved` (403): Hostnames under that domain are assigned by Faable.\n- `domain_taken` (409): That hostname is already registered on Faable.\n- `invalid_json` (400): The request body is not valid JSON.\n- `missing_github_event` (400): The `x-github-event` header is missing.",
|
|
4419
|
+
"description": "Machine-readable error code. One HTTP status per code.\n\n- `bad_request` (400): The request is malformed. `message` says what is wrong.\n- `validation_error` (400): The body, query or path failed schema validation. `details.issues` lists each failing field.\n- `unauthorized` (401): The request carries no valid credentials.\n- `payment_required` (402): The feature is not included in the current plan.\n- `forbidden` (403): The credentials are valid but do not allow this operation.\n- `not_found` (404): The resource does not exist, or not in the caller’s project.\n- `method_not_allowed` (405): The HTTP method is not supported on this path.\n- `conflict` (409): The request conflicts with the current state of the resource.\n- `payload_too_large` (413): The request body exceeds the size limit.\n- `unsupported_media_type` (415): The `Content-Type` is not accepted by this endpoint.\n- `unprocessable_entity` (422): The request is well-formed but cannot be processed.\n- `too_many_requests` (429): Rate limit exceeded. Honour the `Retry-After` header.\n- `internal_error` (500): Unexpected server error. Retry later; the request id is logged.\n- `gone` (410): The resource existed and is gone for good; retrying will not bring it back.\n- `bad_gateway` (502): An upstream the API depends on failed.\n- `service_unavailable` (503): The feature is not configured on this environment, or is temporarily out of service.\n- `already_exists` (400): A resource with the same unique field already exists. `details.fields` names the field.\n- `invalid_id` (400): The id in the path is not a valid id for this resource.\n- `invalid_query` (400): The `?query=` FaableQL expression could not be parsed.\n- `invalid_expand` (400): An `?expand=` path is not allowed on this resource.\n- `search_not_supported` (400): This resource does not support `?q=`.\n- `access_denied` (401): The row exists but does not belong to the caller.\n- `invalid_token` (401): The bearer token is missing, malformed or expired.\n- `invalid_apikey` (401): The API key does not exist or has been revoked.\n- `apikey_expired` (401): The API key predates projects and must be recreated.\n- `invalid_build_token` (401): The build token is not valid for this deployment.\n- `build_token_expired` (401): The build token is past its lifetime.\n- `build_token_unusable` (401): The deployment reached a terminal phase, so its build token no longer works.\n- `build_token_app_missing` (401): The app the build token was minted for no longer exists.\n- `user_token_required` (401): The endpoint acts on behalf of a person and the credential carries no user (an API key or a service account).\n- `team_required` (400): The operation needs a project: send it in the `x-faable-team` header.\n- `team_or_scope_required` (401): Listing needs either a project in `x-faable-team` or a global scope on the token.\n- `user_suspended` (403): The account is suspended. Contact support@faable.com.\n- `superadmin_only` (403): The operation is restricted to platform staff.\n- `project_not_found` (404): No project with that id for this caller.\n- `owner_only` (403): Only the project owner can manage collaborators.\n- `owner_not_removable` (400): The project owner cannot be removed. Delete the project instead.\n- `collaborator_not_found` (404): That user is not a collaborator on the project.\n- `invalid_project_name` (400): The project name is not acceptable. `message` says why.\n- `moderation_hold` (403): The project contains an app disabled by moderation and cannot be deleted. Contact support@faable.com.\n- `app_not_found` (404): No app with that id or slug in this project.\n- `repository_not_linked` (400): The app has no linked repository.\n- `repository_empty` (400): The repository has no commits on the deploy branch yet.\n- `branch_missing` (400): The deploy branch does not exist on the repository. `message` lists the branches that do.\n- `deploy_mode_conflict` (400): The app deploys from its own workflow, so the platform will not create a deployment for it.\n- `deploy_refused` (409): The deploy was refused by quota, plan or an in-flight deployment. `message` says which.\n- `invalid_root_dir` (400): The Root Directory must be a path inside the repository — no leading `/` and no `..`.\n- `root_dir_not_found` (400): The Root Directory does not exist on that ref of the repository.\n- `root_dir_mismatch` (400): The workflow deploys from one directory and platform builds would run from another. Declare `rootDir` in faable.json.\n- `no_workflows` (400): The repository has no GitHub Actions workflows, so a CI gate would never open.\n- `no_deploy_workflow` (400): No workflow in the repository runs `faable deploy`.\n- `invalid_secret_name` (400): Secret names are 1-255 printable ASCII characters and cannot contain '='.\n- `invalid_secret_context` (400): Secrets are scoped to an app or to a profile, nothing else.\n- `app_secrets_only` (400): Only app secrets can be written in bulk.\n- `secrets_access_denied` (401): The caller may not read or write the secrets of that app or profile.\n- `status_forbidden_resource` (403): Only a platform service writes app or domain status.\n- `status_forbidden_field` (403): That field of a deployment status is platform bookkeeping. `message` names it.\n- `status_forbidden_phase` (403): That phase is set by the platform, not by the client.\n- `github_identity_missing` (412): The user has not connected GitHub. Send them through `connect_github`.\n- `github_installation_missing` (412): The Faable GitHub App is not installed on any repository of theirs.\n- `github_repository_not_found` (404): The repository does not exist or the installation cannot see it.\n- `github_token_invalid` (401): The stored GitHub token was rejected; the user must reconnect.\n- `github_permission_denied` (403): The installation lacks a permission this operation needs.\n- `github_installation_suspended` (403): The GitHub App installation is suspended.\n- `github_installation_not_found` (412): The installation id is unknown or the App was uninstalled.\n- `github_repository_blocked` (403): GitHub refuses to serve the source of that repository (403 or 451).\n- `github_rate_limited` (429): GitHub is rate-limiting Faable. Transient: retry after a short wait.\n- `github_token_refresh_failed` (401): GitHub refused to refresh the stored authorization. The user has to reconnect.\n- `github_error` (502): GitHub failed upstream. `message` carries what it said.\n- `repository_already_linked` (409): The repository is already linked to another app. `details.app_id` / `details.app_name` name it.\n- `repository_taken_down` (409): An app built from this repository was taken down for abuse, so the repository cannot be linked again. Not a plan limit — upgrading does not lift it. Restoring the taken-down app does.\n- `invalid_installation_id` (400): The `installation_id` is not a number.\n- `oidc_untrusted` (401): The GitHub Actions OIDC token was rejected. `message` says why.\n- `app_repository_mismatch` (403): The app does not exist or is not linked to the repository the token comes from.\n- `no_app_for_repository` (404): No app is linked to that repository.\n- `ambiguous_app_for_repository` (400): Several apps are linked to that repository; pass `--app-slug`.\n- `app_disabled` (409): The app is disabled, so it cannot be deployed or provisioned. `message` says why when the reason is public.\n- `app_rate_limited` (429): A new account may only create a few apps in its first 24 hours.\n- `plan_required` (403): The build or feature needs a higher plan. `message` says which.\n- `remote_build_disabled` (409): Remote builds are off for this environment or this app. Deploy with a local build instead.\n- `artifact_deploy_disabled` (409): Artifact deploys are not enabled on this environment.\n- `artifact_too_large` (413): The artifact exceeds the size allowed for the plan.\n- `metrics_unavailable` (503): Traffic metrics are temporarily unavailable — this is not an app with no traffic.\n- `transfer_refused` (409): The app cannot be moved to that project. `message` lists the blockers.\n- `user_not_found` (400): No user with that id in Faable Auth.\n- `waf_rule_not_found` (404): No WAF rule with that pattern on this app.\n- `project_rate_limited` (429): A new account may only create a few projects in its first hours. It opens with time, or with a plan.\n- `project_plan_limited` (402): The Free plan project cap is reached. Upgrade to create more.\n- `domain_invalid` (400): Not a valid hostname. No protocol, port or path.\n- `domain_reserved` (403): Hostnames under that domain are assigned by Faable.\n- `domain_taken` (409): That hostname is already registered on Faable.\n- `invalid_json` (400): The request body is not valid JSON.\n- `missing_github_event` (400): The `x-github-event` header is missing.",
|
|
4268
4420
|
"enum": [
|
|
4269
4421
|
"bad_request",
|
|
4270
4422
|
"validation_error",
|
|
@@ -4332,8 +4484,11 @@
|
|
|
4332
4484
|
"github_installation_suspended",
|
|
4333
4485
|
"github_installation_not_found",
|
|
4334
4486
|
"github_repository_blocked",
|
|
4487
|
+
"github_rate_limited",
|
|
4488
|
+
"github_token_refresh_failed",
|
|
4335
4489
|
"github_error",
|
|
4336
4490
|
"repository_already_linked",
|
|
4491
|
+
"repository_taken_down",
|
|
4337
4492
|
"invalid_installation_id",
|
|
4338
4493
|
"oidc_untrusted",
|
|
4339
4494
|
"app_repository_mismatch",
|
|
@@ -6838,6 +6993,9 @@
|
|
|
6838
6993
|
"type": "string"
|
|
6839
6994
|
}
|
|
6840
6995
|
}
|
|
6996
|
+
},
|
|
6997
|
+
"dockerfile_ignored": {
|
|
6998
|
+
"type": "boolean"
|
|
6841
6999
|
}
|
|
6842
7000
|
}
|
|
6843
7001
|
},
|
|
@@ -6945,6 +7103,17 @@
|
|
|
6945
7103
|
],
|
|
6946
7104
|
"description": "Success deploy emails (first deploy + every promote). Absent/null = enabled; false = muted. Failure emails are never gated by this."
|
|
6947
7105
|
},
|
|
7106
|
+
"http3": {
|
|
7107
|
+
"anyOf": [
|
|
7108
|
+
{
|
|
7109
|
+
"type": "boolean"
|
|
7110
|
+
},
|
|
7111
|
+
{
|
|
7112
|
+
"type": "null"
|
|
7113
|
+
}
|
|
7114
|
+
],
|
|
7115
|
+
"description": "Whether HTTP/3 is advertised for this app. Absent/null = advertised; false = not advertised. Note it controls the advertisement, not the listener: clients that already discovered HTTP/3 may keep using it until the advertisement expires, and the server does not refuse it."
|
|
7116
|
+
},
|
|
6948
7117
|
"status": {
|
|
6949
7118
|
"$ref": "#/components/schemas/AppStatus"
|
|
6950
7119
|
},
|
|
@@ -7332,6 +7501,9 @@
|
|
|
7332
7501
|
"type": "string"
|
|
7333
7502
|
}
|
|
7334
7503
|
}
|
|
7504
|
+
},
|
|
7505
|
+
"dockerfile_ignored": {
|
|
7506
|
+
"type": "boolean"
|
|
7335
7507
|
}
|
|
7336
7508
|
}
|
|
7337
7509
|
},
|
|
@@ -7439,6 +7611,17 @@
|
|
|
7439
7611
|
],
|
|
7440
7612
|
"description": "Success deploy emails (first deploy + every promote). Absent/null = enabled; false = muted. Failure emails are never gated by this."
|
|
7441
7613
|
},
|
|
7614
|
+
"http3": {
|
|
7615
|
+
"anyOf": [
|
|
7616
|
+
{
|
|
7617
|
+
"type": "boolean"
|
|
7618
|
+
},
|
|
7619
|
+
{
|
|
7620
|
+
"type": "null"
|
|
7621
|
+
}
|
|
7622
|
+
],
|
|
7623
|
+
"description": "Whether HTTP/3 is advertised for this app. Absent/null = advertised; false = not advertised. Note it controls the advertisement, not the listener: clients that already discovered HTTP/3 may keep using it until the advertisement expires, and the server does not refuse it."
|
|
7624
|
+
},
|
|
7442
7625
|
"status": {
|
|
7443
7626
|
"$ref": "#/components/schemas/AppStatus"
|
|
7444
7627
|
},
|
|
@@ -7723,6 +7906,16 @@
|
|
|
7723
7906
|
"type": "null"
|
|
7724
7907
|
}
|
|
7725
7908
|
]
|
|
7909
|
+
},
|
|
7910
|
+
"http3": {
|
|
7911
|
+
"anyOf": [
|
|
7912
|
+
{
|
|
7913
|
+
"type": "boolean"
|
|
7914
|
+
},
|
|
7915
|
+
{
|
|
7916
|
+
"type": "null"
|
|
7917
|
+
}
|
|
7918
|
+
]
|
|
7726
7919
|
}
|
|
7727
7920
|
},
|
|
7728
7921
|
"additionalProperties": false
|
|
@@ -7870,6 +8063,9 @@
|
|
|
7870
8063
|
"type": "string"
|
|
7871
8064
|
}
|
|
7872
8065
|
}
|
|
8066
|
+
},
|
|
8067
|
+
"dockerfile_ignored": {
|
|
8068
|
+
"type": "boolean"
|
|
7873
8069
|
}
|
|
7874
8070
|
}
|
|
7875
8071
|
},
|
|
@@ -7977,6 +8173,17 @@
|
|
|
7977
8173
|
],
|
|
7978
8174
|
"description": "Success deploy emails (first deploy + every promote). Absent/null = enabled; false = muted. Failure emails are never gated by this."
|
|
7979
8175
|
},
|
|
8176
|
+
"http3": {
|
|
8177
|
+
"anyOf": [
|
|
8178
|
+
{
|
|
8179
|
+
"type": "boolean"
|
|
8180
|
+
},
|
|
8181
|
+
{
|
|
8182
|
+
"type": "null"
|
|
8183
|
+
}
|
|
8184
|
+
],
|
|
8185
|
+
"description": "Whether HTTP/3 is advertised for this app. Absent/null = advertised; false = not advertised. Note it controls the advertisement, not the listener: clients that already discovered HTTP/3 may keep using it until the advertisement expires, and the server does not refuse it."
|
|
8186
|
+
},
|
|
7980
8187
|
"status": {
|
|
7981
8188
|
"$ref": "#/components/schemas/AppStatus"
|
|
7982
8189
|
},
|
|
@@ -8369,6 +8576,9 @@
|
|
|
8369
8576
|
"type": "string"
|
|
8370
8577
|
}
|
|
8371
8578
|
}
|
|
8579
|
+
},
|
|
8580
|
+
"dockerfile_ignored": {
|
|
8581
|
+
"type": "boolean"
|
|
8372
8582
|
}
|
|
8373
8583
|
}
|
|
8374
8584
|
},
|
|
@@ -8476,6 +8686,17 @@
|
|
|
8476
8686
|
],
|
|
8477
8687
|
"description": "Success deploy emails (first deploy + every promote). Absent/null = enabled; false = muted. Failure emails are never gated by this."
|
|
8478
8688
|
},
|
|
8689
|
+
"http3": {
|
|
8690
|
+
"anyOf": [
|
|
8691
|
+
{
|
|
8692
|
+
"type": "boolean"
|
|
8693
|
+
},
|
|
8694
|
+
{
|
|
8695
|
+
"type": "null"
|
|
8696
|
+
}
|
|
8697
|
+
],
|
|
8698
|
+
"description": "Whether HTTP/3 is advertised for this app. Absent/null = advertised; false = not advertised. Note it controls the advertisement, not the listener: clients that already discovered HTTP/3 may keep using it until the advertisement expires, and the server does not refuse it."
|
|
8699
|
+
},
|
|
8479
8700
|
"status": {
|
|
8480
8701
|
"$ref": "#/components/schemas/AppStatus"
|
|
8481
8702
|
},
|
|
@@ -10501,7 +10722,7 @@
|
|
|
10501
10722
|
}
|
|
10502
10723
|
},
|
|
10503
10724
|
"409": {
|
|
10504
|
-
"description": "`repository_already_linked` — The repository is already linked to another app. `details.app_id` / `details.app_name` name it.",
|
|
10725
|
+
"description": "`repository_already_linked` — The repository is already linked to another app. `details.app_id` / `details.app_name` name it.\n\n`repository_taken_down` — An app built from this repository was taken down for abuse, so the repository cannot be linked again. Not a plan limit — upgrading does not lift it. Restoring the taken-down app does.",
|
|
10505
10726
|
"content": {
|
|
10506
10727
|
"application/json": {
|
|
10507
10728
|
"schema": {
|
|
@@ -10515,7 +10736,8 @@
|
|
|
10515
10736
|
"error_code": {
|
|
10516
10737
|
"type": "string",
|
|
10517
10738
|
"enum": [
|
|
10518
|
-
"repository_already_linked"
|
|
10739
|
+
"repository_already_linked",
|
|
10740
|
+
"repository_taken_down"
|
|
10519
10741
|
]
|
|
10520
10742
|
}
|
|
10521
10743
|
}
|
|
@@ -14524,6 +14746,11 @@
|
|
|
14524
14746
|
},
|
|
14525
14747
|
"detected": {
|
|
14526
14748
|
"$ref": "#/components/schemas/DeploymentDetected"
|
|
14749
|
+
},
|
|
14750
|
+
"plan": {
|
|
14751
|
+
"type": "object",
|
|
14752
|
+
"properties": {},
|
|
14753
|
+
"additionalProperties": true
|
|
14527
14754
|
}
|
|
14528
14755
|
}
|
|
14529
14756
|
}
|