> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.ovac.councilbox.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.ovac.councilbox.com/_mcp/server.

# Update Appointment External ID

POST https://api.ovac.pre.councilbox.com/graphql/updatecouncil
Content-Type: application/json

# Update Appointment External ID (`mutation`)

Esta mutación permite actualizar de manera dinámica el identificador alfanumérico externo (`externalId`) asignado a una cita existente. Es una herramienta operativa clave para corregir, sincronizar o remapear las claves de correspondencia entre la plataforma y los sistemas de origen del integrador (como CRMs, gestores de expedientes o plataformas de tramitación).

⚠️ **Regla crítica de estado (Business Rule):** Para que la actualización sea procesada con éxito por el backend, la cita debe encontrarse estrictamente en un estado activo o pendiente. El motor de validación de la API denegará la mutación lanzando una excepción si la cita se encuentra en alguno de los siguientes estados de cierre o bloqueo:

- **Cancelado** (`-1`)
    
- **Finalizado** (`60`)
    
- **Incompleto** (`65`)
    

### Detalles de la Solicitud

- **Método HTTP:** `POST`
    
- **URL PRE:** `https://api.ovac.pre.councilbox.com/council/:councilId/act`
    
- **URL PRO:** `https://api.ovac.councilbox.com/council/:councilId/act`
    
- **Content-Type:** `multipart/form-data`
    

### Cabeceras (Headers)

| **Key** | **Value** | **Requerido** | **Descripción** |
| --- | --- | --- | --- |
| **x-jwt-token** | {{token}} | SI | Token JWT de autenticación obtenido previamente en el método de login. |

## Referencia de la API

### Parámetros de entrada (Path parameters)

| Parámetro | Descripción | Requerido | Tipo |
| --- | --- | --- | --- |
| **council** | Objeto contenedor principal con las propiedades de la cita que se desean modificar. | SI | CouncilInput |
| council.**id** | Identificador numérico único de la cita (`councilId`) sobre la cual se aplicará el cambio. | SI | Integer |
| council.**externalId** | Nuevo código o cadena alfanumérica de correspondencia externa aportada por el sistema externo. | SI | String |

### Campos de respuesta (Payload)

La mutación devuelve un objeto de confirmación estructurado bajo el campo raíz `updateCouncil`:

| Parámetro | Descripción | Tipo |
| --- | --- | --- |
| **updateCouncil** | Objeto contenedor con los datos actualizados de la cita. | Object |
| updateCouncil.**id** | Identificador único de la cita procesada. | Integer |
| updateCouncil.**externalId** | Confirmación del nuevo identificador externo persistido de forma correcta en la base de datos. | String |

## Ejemplos de código y peticiones

### 1\. Consulta GraphQL

``` graphql
mutation UpdateCouncil (
    $council: CouncilInput!
){
    updateCouncil(
        council: $council
    ) {
        id
        externalId
    }
}

 ```

### 2\. Variables de la petición (JSON Payload)

``` json
{
    "council": {
        "id": 65245,
        "externalId": "IdExterno000001" 
    }
}

 ```

### 3\. Ejemplo de comando cURL

``` bash
curl --location 'https://api.ovac.pre.councilbox.com/graphql' \
--header 'Content-Type: application/json' \
--header 'x-jwt-token: *****************' \
--data '{"query":"mutation UpdateCouncil ($council: CouncilInput!){ updateCouncil(council: $council) { id externalId } }","variables":{"council":{"id":65245,"externalId":"IdExterno000001"}}}'

 ```

### 4\. Respuesta esperada (200 OK)

``` json
{
    "data": {
        "updateCouncil": {
            "id": 65245,
            "externalId": "IdExterno000001"
        }
    }
}

 ```

### 5\. Respuesta cita Cancelada, Finalizada o Incompleta (400 KO)

``` json
{
    "errors": [
        {
            "message": "The externalId is not available in this company",
            "code": 400,
            "locations": [
                {
                    "line": 4,
                    "column": 5
                }
            ],
            "path": [
                "updateCouncil"
            ],
            "originalError": {
                "name": "UserError",
                "code": 400
            }
        }
    ],
    "data": {
        "updateCouncil": null
    }
}

 ```

> **Nota OpenAPI/Fern:** esta operación GraphQL se documenta como `/graphql/updatecouncil` para que Fern pueda mostrarla como operación independiente. La ruta técnica real de ejecución es `POST /graphql`.


Reference: https://docs.ovac.councilbox.com/metodos-api/03-manage-appointments/update-council

## OpenAPI Specification

```yaml
openapi: 3.1.0
info:
  title: ovac
  version: 1.0.0
paths:
  /graphql/updatecouncil:
    post:
      operationId: update-council
      summary: Update Appointment External ID
      description: >
        # Update Appointment External ID (`mutation`)


        Esta mutación permite actualizar de manera dinámica el identificador
        alfanumérico externo (`externalId`) asignado a una cita existente. Es
        una herramienta operativa clave para corregir, sincronizar o remapear
        las claves de correspondencia entre la plataforma y los sistemas de
        origen del integrador (como CRMs, gestores de expedientes o plataformas
        de tramitación).


        ⚠️ **Regla crítica de estado (Business Rule):** Para que la
        actualización sea procesada con éxito por el backend, la cita debe
        encontrarse estrictamente en un estado activo o pendiente. El motor de
        validación de la API denegará la mutación lanzando una excepción si la
        cita se encuentra en alguno de los siguientes estados de cierre o
        bloqueo:


        - **Cancelado** (`-1`)
            
        - **Finalizado** (`60`)
            
        - **Incompleto** (`65`)
            

        ### Detalles de la Solicitud


        - **Método HTTP:** `POST`
            
        - **URL PRE:**
        `https://api.ovac.pre.councilbox.com/council/:councilId/act`
            
        - **URL PRO:** `https://api.ovac.councilbox.com/council/:councilId/act`
            
        - **Content-Type:** `multipart/form-data`
            

        ### Cabeceras (Headers)


        | **Key** | **Value** | **Requerido** | **Descripción** |

        | --- | --- | --- | --- |

        | **x-jwt-token** | {{token}} | SI | Token JWT de autenticación obtenido
        previamente en el método de login. |


        ## Referencia de la API


        ### Parámetros de entrada (Path parameters)


        | Parámetro | Descripción | Requerido | Tipo |

        | --- | --- | --- | --- |

        | **council** | Objeto contenedor principal con las propiedades de la
        cita que se desean modificar. | SI | CouncilInput |

        | council.**id** | Identificador numérico único de la cita (`councilId`)
        sobre la cual se aplicará el cambio. | SI | Integer |

        | council.**externalId** | Nuevo código o cadena alfanumérica de
        correspondencia externa aportada por el sistema externo. | SI | String |


        ### Campos de respuesta (Payload)


        La mutación devuelve un objeto de confirmación estructurado bajo el
        campo raíz `updateCouncil`:


        | Parámetro | Descripción | Tipo |

        | --- | --- | --- |

        | **updateCouncil** | Objeto contenedor con los datos actualizados de la
        cita. | Object |

        | updateCouncil.**id** | Identificador único de la cita procesada. |
        Integer |

        | updateCouncil.**externalId** | Confirmación del nuevo identificador
        externo persistido de forma correcta en la base de datos. | String |


        ## Ejemplos de código y peticiones


        ### 1\. Consulta GraphQL


        ``` graphql

        mutation UpdateCouncil (
            $council: CouncilInput!
        ){
            updateCouncil(
                council: $council
            ) {
                id
                externalId
            }
        }

         ```

        ### 2\. Variables de la petición (JSON Payload)


        ``` json

        {
            "council": {
                "id": 65245,
                "externalId": "IdExterno000001" 
            }
        }

         ```

        ### 3\. Ejemplo de comando cURL


        ``` bash

        curl --location 'https://api.ovac.pre.councilbox.com/graphql' \

        --header 'Content-Type: application/json' \

        --header 'x-jwt-token: *****************' \

        --data '{"query":"mutation UpdateCouncil ($council: CouncilInput!){
        updateCouncil(council: $council) { id externalId }
        }","variables":{"council":{"id":65245,"externalId":"IdExterno000001"}}}'

         ```

        ### 4\. Respuesta esperada (200 OK)


        ``` json

        {
            "data": {
                "updateCouncil": {
                    "id": 65245,
                    "externalId": "IdExterno000001"
                }
            }
        }

         ```

        ### 5\. Respuesta cita Cancelada, Finalizada o Incompleta (400 KO)


        ``` json

        {
            "errors": [
                {
                    "message": "The externalId is not available in this company",
                    "code": 400,
                    "locations": [
                        {
                            "line": 4,
                            "column": 5
                        }
                    ],
                    "path": [
                        "updateCouncil"
                    ],
                    "originalError": {
                        "name": "UserError",
                        "code": 400
                    }
                }
            ],
            "data": {
                "updateCouncil": null
            }
        }

         ```

        > **Nota OpenAPI/Fern:** esta operación GraphQL se documenta como
        `/graphql/updatecouncil` para que Fern pueda mostrarla como operación
        independiente. La ruta técnica real de ejecución es `POST /graphql`.
      tags:
        - 03ManageAppointments
      parameters:
        - name: x-jwt-token
          in: header
          description: JWT token obtained from Login.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: >-
            Successful response. GraphQL business errors may be returned inside
            the JSON `errors` field while transport status remains HTTP 200.
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/03manageAppointments_updateCouncil_Response_200
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                query:
                  type: string
                  description: GraphQL operation
                variables:
                  $ref: >-
                    #/components/schemas/GraphqlUpdatecouncilPostRequestBodyContentApplicationJsonSchemaVariables
                  description: GraphQL variables
              required:
                - query
servers:
  - url: https://api.ovac.pre.councilbox.com
    description: Pre-production
  - url: https://api.ovac.councilbox.com
    description: Production
components:
  schemas:
    GraphqlUpdatecouncilPostRequestBodyContentApplicationJsonSchemaVariables:
      type: object
      properties: {}
      description: GraphQL variables
      title: GraphqlUpdatecouncilPostRequestBodyContentApplicationJsonSchemaVariables
    03manageAppointments_updateCouncil_Response_200:
      type: object
      properties: {}
      title: 03manageAppointments_updateCouncil_Response_200
  securitySchemes:
    JwtToken:
      type: apiKey
      in: header
      name: x-jwt-token
      description: JWT token obtained from Login.

```

## Examples



**Request**

```json
{
  "query": "mutation UpdateCouncil (\r\n    $council: CouncilInput!\r\n){\r\n    updateCouncil(\r\n        council: $council\r\n    ) {\r\n        id\r\n        externalId\r\n    }\r\n}",
  "variables": {
    "council": {
      "id": 64919,
      "externalId": "IdExterno000007"
    }
  }
}
```

**Response**

```json
{
  "data": {
    "updateCouncil": {
      "id": 65245,
      "externalId": "IdExterno000001"
    }
  }
}
```

**SDK Code**

```python Update Appointment External ID
import requests

url = "https://api.ovac.pre.councilbox.com/graphql/updatecouncil"

payload = {
    "query": "mutation UpdateCouncil (
    $council: CouncilInput!
){
    updateCouncil(
        council: $council
    ) {
        id
        externalId
    }
}",
    "variables": { "council": {
            "id": 64919,
            "externalId": "IdExterno000007"
        } }
}
headers = {
    "x-jwt-token": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Update Appointment External ID
const url = 'https://api.ovac.pre.councilbox.com/graphql/updatecouncil';
const options = {
  method: 'POST',
  headers: {'x-jwt-token': '<apiKey>', 'Content-Type': 'application/json'},
  body: '{"query":"mutation UpdateCouncil (\r\n    $council: CouncilInput!\r\n){\r\n    updateCouncil(\r\n        council: $council\r\n    ) {\r\n        id\r\n        externalId\r\n    }\r\n}","variables":{"council":{"id":64919,"externalId":"IdExterno000007"}}}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Update Appointment External ID
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.ovac.pre.councilbox.com/graphql/updatecouncil"

	payload := strings.NewReader("{\n  \"query\": \"mutation UpdateCouncil (\\r\\n    $council: CouncilInput!\\r\\n){\\r\\n    updateCouncil(\\r\\n        council: $council\\r\\n    ) {\\r\\n        id\\r\\n        externalId\\r\\n    }\\r\\n}\",\n  \"variables\": {\n    \"council\": {\n      \"id\": 64919,\n      \"externalId\": \"IdExterno000007\"\n    }\n  }\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("x-jwt-token", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Update Appointment External ID
require 'uri'
require 'net/http'

url = URI("https://api.ovac.pre.councilbox.com/graphql/updatecouncil")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["x-jwt-token"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"query\": \"mutation UpdateCouncil (\\r\\n    $council: CouncilInput!\\r\\n){\\r\\n    updateCouncil(\\r\\n        council: $council\\r\\n    ) {\\r\\n        id\\r\\n        externalId\\r\\n    }\\r\\n}\",\n  \"variables\": {\n    \"council\": {\n      \"id\": 64919,\n      \"externalId\": \"IdExterno000007\"\n    }\n  }\n}"

response = http.request(request)
puts response.read_body
```

```java Update Appointment External ID
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.ovac.pre.councilbox.com/graphql/updatecouncil")
  .header("x-jwt-token", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"query\": \"mutation UpdateCouncil (\\r\\n    $council: CouncilInput!\\r\\n){\\r\\n    updateCouncil(\\r\\n        council: $council\\r\\n    ) {\\r\\n        id\\r\\n        externalId\\r\\n    }\\r\\n}\",\n  \"variables\": {\n    \"council\": {\n      \"id\": 64919,\n      \"externalId\": \"IdExterno000007\"\n    }\n  }\n}")
  .asString();
```

```php Update Appointment External ID
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.ovac.pre.councilbox.com/graphql/updatecouncil', [
  'body' => '{
  "query": "mutation UpdateCouncil (\\r\\n    $council: CouncilInput!\\r\\n){\\r\\n    updateCouncil(\\r\\n        council: $council\\r\\n    ) {\\r\\n        id\\r\\n        externalId\\r\\n    }\\r\\n}",
  "variables": {
    "council": {
      "id": 64919,
      "externalId": "IdExterno000007"
    }
  }
}',
  'headers' => [
    'Content-Type' => 'application/json',
    'x-jwt-token' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp Update Appointment External ID
using RestSharp;

var client = new RestClient("https://api.ovac.pre.councilbox.com/graphql/updatecouncil");
var request = new RestRequest(Method.POST);
request.AddHeader("x-jwt-token", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"query\": \"mutation UpdateCouncil (\\r\\n    $council: CouncilInput!\\r\\n){\\r\\n    updateCouncil(\\r\\n        council: $council\\r\\n    ) {\\r\\n        id\\r\\n        externalId\\r\\n    }\\r\\n}\",\n  \"variables\": {\n    \"council\": {\n      \"id\": 64919,\n      \"externalId\": \"IdExterno000007\"\n    }\n  }\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Update Appointment External ID
import Foundation

let headers = [
  "x-jwt-token": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [
  "query": "mutation UpdateCouncil (
    $council: CouncilInput!
){
    updateCouncil(
        council: $council
    ) {
        id
        externalId
    }
}",
  "variables": ["council": [
      "id": 64919,
      "externalId": "IdExterno000007"
    ]]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.ovac.pre.councilbox.com/graphql/updatecouncil")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```