Update VCN (Coming soon)
π§ Coming soon β this endpoint is not available in Sandbox or Production yet. The documentation is published so you can prepare your integration; we will announce it in the changelog when it goes live.
Updates an already-issued CUSTOM VCN without swapping the card β the PAN stays the same. This is where the ceiling top-up and the extension (or shortening) of the validity happen. Send only what you want to change (at least one field); a field you do not send does not change. AERIAL and HOTEL VCNs are not updatable β their controls derive from the booking (409 vcn-not-updatable).
β οΈ limit.value is the window's ACCUMULATED ceiling β not a balance, not an increment. The available amount is computed by the card network (available = ceiling β spent). To add credit, send new total = current ceiling + credit. E.g. ceiling 100.01 and a new R$ 80 sale β send 180.01; sending 80.00 drops the ceiling below what was already spent and every capture starts being declined. The response returns the current ceiling so you can close the loop; with parallel top-ups, use limit.expectedValue.
Each field's rules are documented on the field itself, below; each error's behavior, under Responses.
curl -X PATCH "https://api-sandbox.contasimples.com/credit-cards/v1/vcns/01JQ8ZP4C7D9F1G3H5J7K9L2MN" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-d '{
"limit": {
"value": 350,
"expectedValue": 0.01
}
}'
import requests
import json
url = "https://api-sandbox.contasimples.com/credit-cards/v1/vcns/01JQ8ZP4C7D9F1G3H5J7K9L2MN"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
data = {
"limit": {
"value": 350,
"expectedValue": 0.01
}
}
response = requests.patch(url, headers=headers, json=data)
print(response.json())
const response = await fetch("https://api-sandbox.contasimples.com/credit-cards/v1/vcns/01JQ8ZP4C7D9F1G3H5J7K9L2MN", {
method: "PATCH",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
},
body: JSON.stringify({
"limit": {
"value": 350,
"expectedValue": 0.01
}
})
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
"bytes"
"encoding/json"
)
func main() {
data := []byte(`{
"limit": {
"value": 350,
"expectedValue": 0.01
}
}`)
req, err := http.NewRequest("PATCH", "https://api-sandbox.contasimples.com/credit-cards/v1/vcns/01JQ8ZP4C7D9F1G3H5J7K9L2MN", bytes.NewBuffer(data))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://api-sandbox.contasimples.com/credit-cards/v1/vcns/01JQ8ZP4C7D9F1G3H5J7K9L2MN')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(uri)
request['Content-Type'] = 'application/json'
request['Authorization'] = 'Bearer YOUR_API_TOKEN'
request.body = '{
"limit": {
"value": 350,
"expectedValue": 0.01
}
}'
response = http.request(request)
puts response.body
{
"vcnId": "01JQ8ZP4C7D9F1G3H5J7K9L2MN",
"limit": {
"value": 350,
"currency": "BRL"
},
"endDate": "2026-10-27",
"maxPurchaseQuantity": 10000,
"updatedAt": "2026-08-24T09:15:40.000Z"
}
{
"code": "bad-request-exception",
"message": "Event failed validation",
"errors": [
{
"field": "body",
"message": "at least one updatable field must be provided"
}
]
}
{
"code": "invalid-vcn-request",
"message": "Unable to issue a VCN for this request: validity window must end after it starts"
}
{
"code": "invalid-vcn-request",
"message": "Unable to issue a VCN for this request: end date must fall within the maximum validity window from issuance"
}
{
"error": "Unauthorized",
"message": "Invalid or expired access token.",
"requestId": "123e4567-e89b-12d3-a456-426614174000",
"code": 401
}
{
"error": "Forbidden",
"message": "You do not have permission to perform this operation.",
"requestId": "123e4567-e89b-12d3-a456-426614174000",
"code": 403
}
{
"code": "vcn-not-found",
"message": "VCN not found"
}
{
"code": "vcn-expired",
"message": "The VCN validity window has ended; issue a new VCN."
}
{
"code": "vcn-not-active",
"message": "The VCN is not active and cannot be updated."
}
{
"code": "vcn-limit-conflict",
"message": "The current limit does not match expectedValue; re-read the VCN and retry."
}
{
"code": "vcn-not-updatable",
"message": "This VCN type does not accept updates."
}
{
"code": "internal-exception",
"message": "Aconteceu um erro"
}
{
"code": "vcn-provider-unavailable",
"message": "The VCN update could not be completed; retry the request."
}
/credit-cards/v1/vcns/{vcnId}Target server for requests. Edit to use your own host.
Bearer token from OAuth 2.0 client credentials. Format: Bearer TOKEN
Bearer TOKENVCN identifier returned at issuance (vcnId field).
The media type of the request body
Top-up or adjustment of the spending ceiling.
New end of the usage window, YYYY-MM-DD β the same field name as on issuance. Can go up and down. Must be in the future and never beyond 365 days from issuance β the cap counts from issuance, so top-ups do not push the validity. Changing limit does not change the validity: for both, send both fields.
Maximum number of authorizations, up to 100000.
Request Preview
Response
Response will appear here after sending the request
Authentication
Bearer token. Bearer token from OAuth 2.0 client credentials. Format: Bearer TOKEN
Path Parameters
VCN identifier returned at issuance (vcnId field).
01JQ8ZP4C7D9F1G3H5J7K9L2MNBody
Top-up or adjustment of the spending ceiling.
New end of the usage window, YYYY-MM-DD β the same field name as on issuance. Can go up and down. Must be in the future and never beyond 365 days from issuance β the cap counts from issuance, so top-ups do not push the validity. Changing limit does not change the validity: for both, send both fields.
2026-11-15Responses
Echo of the identifier.
Ceiling in effect after the operation β store it and add the next credit on top of it.
Current end of the usage window, YYYY-MM-DD β the same name and the same format as the field on issuance.
Effective value in effect.
Timestamp of this update (UTC).