<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://forge.laravel.com/api/orgs/{organization}/servers/{server}/sites/{site}/git",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'source_control_provider' => 'github',
'repository' => 'laravel/forge',
'branch' => 'main',
'source_control_provider_id' => 123,
'per_account_public_key' => '<string>',
'per_account_private_key' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}curl --request PUT \
--url https://forge.laravel.com/api/orgs/{organization}/servers/{server}/sites/{site}/git \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"source_control_provider": "github",
"repository": "laravel/forge",
"branch": "main",
"source_control_provider_id": 123,
"per_account_public_key": "<string>",
"per_account_private_key": "<string>"
}
'const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
source_control_provider: 'github',
repository: 'laravel/forge',
branch: 'main',
source_control_provider_id: 123,
per_account_public_key: '<string>',
per_account_private_key: '<string>'
})
};
fetch('https://forge.laravel.com/api/orgs/{organization}/servers/{server}/sites/{site}/git', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://forge.laravel.com/api/orgs/{organization}/servers/{server}/sites/{site}/git"
payload := strings.NewReader("{\n \"source_control_provider\": \"github\",\n \"repository\": \"laravel/forge\",\n \"branch\": \"main\",\n \"source_control_provider_id\": 123,\n \"per_account_public_key\": \"<string>\",\n \"per_account_private_key\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"data": {
"id": "<string>",
"type": "sites",
"links": {
"self": {
"href": "<string>",
"rel": "<string>",
"describedby": "<string>",
"title": "<string>",
"type": "<string>",
"hreflang": "<string>",
"meta": {}
}
},
"attributes": {
"name": "<string>",
"status": "installed",
"url": "<string>",
"user": "<string>",
"https": true,
"web_directory": "<string>",
"root_directory": "<string>",
"aliases": [
"<unknown>"
],
"php_version": null,
"deployment_status": "<string>",
"quick_deploy": true,
"isolated": true,
"shared_paths": {},
"repository": {
"provider": "<string>",
"url": "<string>",
"branch": "<string>",
"status": "installed"
},
"database": "<string>",
"maintenance_mode": {
"enabled": true,
"status": "disabling"
},
"zero_downtime_deployments": true,
"deployment_retention": 123,
"deployment_script": "<string>",
"wildcards": true,
"app_type": "Statamic",
"uses_envoyer": true,
"deployment_url": "<string>",
"healthcheck_url": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
},
"relationships": {
"server": {
"data": {
"type": "servers",
"id": "<string>"
}
},
"tags": {
"data": [
{
"type": "tags",
"id": "<string>"
}
]
},
"latestDeployment": {
"data": {
"type": "deployments",
"id": "<string>"
}
},
"securityRules": {
"data": [
{
"type": "securityRules",
"id": "<string>"
}
]
},
"redirectRules": {
"data": [
{
"type": "redirect-rules",
"id": "<string>"
}
]
}
}
},
"included": [
{
"id": "<string>",
"type": "servers",
"links": {
"self": {
"href": "<string>",
"rel": "<string>",
"describedby": "<string>",
"title": "<string>",
"type": "<string>",
"hreflang": "<string>",
"meta": {}
}
},
"attributes": {
"id": 123,
"credential_id": 123,
"name": "<string>",
"slug": "<string>",
"type": "app",
"ubuntu_version": "<string>",
"ssh_port": 123,
"provider": "<string>",
"identifier": "<string>",
"size": "<string>",
"region": "<string>",
"php_version": "<string>",
"php_cli_version": "<string>",
"opcache_status": "<string>",
"database_type": "<string>",
"db_status": "<string>",
"redis_status": "<string>",
"ip_address": "<string>",
"private_ip_address": "<string>",
"revoked": true,
"created_at": "2025-07-29T09:00:00Z",
"updated_at": "2025-07-30T09:00:00Z",
"connection_status": "<string>",
"timezone": "<string>",
"local_public_key": "<string>",
"is_ready": true
},
"relationships": {
"tags": {
"data": [
{
"type": "tags",
"id": "<string>"
}
]
}
}
}
]
}{
"message": "<string>"
}{
"message": "<string>"
}{
"message": "<string>",
"errors": {}
}Update Git repository
Change the source control provider, repository or branch the site deploys from.
Processing mode: async
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://forge.laravel.com/api/orgs/{organization}/servers/{server}/sites/{site}/git",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'source_control_provider' => 'github',
'repository' => 'laravel/forge',
'branch' => 'main',
'source_control_provider_id' => 123,
'per_account_public_key' => '<string>',
'per_account_private_key' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}curl --request PUT \
--url https://forge.laravel.com/api/orgs/{organization}/servers/{server}/sites/{site}/git \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"source_control_provider": "github",
"repository": "laravel/forge",
"branch": "main",
"source_control_provider_id": 123,
"per_account_public_key": "<string>",
"per_account_private_key": "<string>"
}
'const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
source_control_provider: 'github',
repository: 'laravel/forge',
branch: 'main',
source_control_provider_id: 123,
per_account_public_key: '<string>',
per_account_private_key: '<string>'
})
};
fetch('https://forge.laravel.com/api/orgs/{organization}/servers/{server}/sites/{site}/git', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://forge.laravel.com/api/orgs/{organization}/servers/{server}/sites/{site}/git"
payload := strings.NewReader("{\n \"source_control_provider\": \"github\",\n \"repository\": \"laravel/forge\",\n \"branch\": \"main\",\n \"source_control_provider_id\": 123,\n \"per_account_public_key\": \"<string>\",\n \"per_account_private_key\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"data": {
"id": "<string>",
"type": "sites",
"links": {
"self": {
"href": "<string>",
"rel": "<string>",
"describedby": "<string>",
"title": "<string>",
"type": "<string>",
"hreflang": "<string>",
"meta": {}
}
},
"attributes": {
"name": "<string>",
"status": "installed",
"url": "<string>",
"user": "<string>",
"https": true,
"web_directory": "<string>",
"root_directory": "<string>",
"aliases": [
"<unknown>"
],
"php_version": null,
"deployment_status": "<string>",
"quick_deploy": true,
"isolated": true,
"shared_paths": {},
"repository": {
"provider": "<string>",
"url": "<string>",
"branch": "<string>",
"status": "installed"
},
"database": "<string>",
"maintenance_mode": {
"enabled": true,
"status": "disabling"
},
"zero_downtime_deployments": true,
"deployment_retention": 123,
"deployment_script": "<string>",
"wildcards": true,
"app_type": "Statamic",
"uses_envoyer": true,
"deployment_url": "<string>",
"healthcheck_url": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
},
"relationships": {
"server": {
"data": {
"type": "servers",
"id": "<string>"
}
},
"tags": {
"data": [
{
"type": "tags",
"id": "<string>"
}
]
},
"latestDeployment": {
"data": {
"type": "deployments",
"id": "<string>"
}
},
"securityRules": {
"data": [
{
"type": "securityRules",
"id": "<string>"
}
]
},
"redirectRules": {
"data": [
{
"type": "redirect-rules",
"id": "<string>"
}
]
}
}
},
"included": [
{
"id": "<string>",
"type": "servers",
"links": {
"self": {
"href": "<string>",
"rel": "<string>",
"describedby": "<string>",
"title": "<string>",
"type": "<string>",
"hreflang": "<string>",
"meta": {}
}
},
"attributes": {
"id": 123,
"credential_id": 123,
"name": "<string>",
"slug": "<string>",
"type": "app",
"ubuntu_version": "<string>",
"ssh_port": 123,
"provider": "<string>",
"identifier": "<string>",
"size": "<string>",
"region": "<string>",
"php_version": "<string>",
"php_cli_version": "<string>",
"opcache_status": "<string>",
"database_type": "<string>",
"db_status": "<string>",
"redis_status": "<string>",
"ip_address": "<string>",
"private_ip_address": "<string>",
"revoked": true,
"created_at": "2025-07-29T09:00:00Z",
"updated_at": "2025-07-30T09:00:00Z",
"connection_status": "<string>",
"timezone": "<string>",
"local_public_key": "<string>",
"is_ready": true
},
"relationships": {
"tags": {
"data": [
{
"type": "tags",
"id": "<string>"
}
]
}
}
}
]
}{
"message": "<string>"
}{
"message": "<string>"
}{
"message": "<string>",
"errors": {}
}Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Path Parameters
The organization slug
The server ID
The site ID
Body
The source control provider the site should deploy from.
github, gitlab, bitbucket, gitlab-custom, custom "github"
The repository to deploy, e.g. "organization/repository" (or an SSH URL for custom Git).
"laravel/forge"
The branch to deploy.
"main"
The ID of the source control connection to deploy through. Required when the organization has more than one connection for the selected provider; otherwise optional (a single connection is resolved automatically, and custom Git needs none).
An existing, provider-verified deploy public key to pin to the site instead of generating a new one. Must be sent together with per_account_private_key.
The private key matching per_account_public_key. Must be sent together with it.
Response
SiteResource
Show child attributes
Show child attributes
- ServerResource
- TagResource
- DeploymentResource
- SecurityRuleResource
- RedirectRuleResource
Show child attributes
Show child attributes
Was this page helpful?