# Update an invoice

Updates an invoice.

To access this endpoint using an [access token](https://docs.moov.io/api/authentication/access-tokens/) you'll need to specify the `/accounts/{accountID}/invoices.write` scope.

## PATCH

```
/accounts/{accountID}/invoices/{invoiceID}
```

## Ask

```shell
curl -X PATCH "https://api.moov.io/accounts/{accountID}/invoices/{invoiceID}" \
  -H "Authorization: Bearer {token}" \
  -H "X-Moov-Version: v2026.04.00"
```

## Ask

```go
mc, _ := moov.NewClient()

var accountID string
var invoiceID string
now := time.Now().UTC()
update := moov.UpdateInvoice{DueDate: moov.Set(now)}

mc.UpdateInvoice(ctx, accountID, invoiceID, update)
```

## Ask

```typescript
import { Moov } from "@moovio/sdk";

const moov = new Moov({
  security: {
    username: "",
    password: "",
  },
});

async function run() {
  const result = await moov.invoices.updateInvoice({
    accountID: "ce46d65a-8504-4afa-b3f7-303401bd08b3",
    invoiceID: "ef510999-370a-4350-87d5-bc81fc02a2ea",
    updateInvoice: {
      description: "Updated professional services for Q1 2026",
      lineItems: {
        items: [\
          {\
            name: "Professional Services",\
            basePrice: {\
              currency: "USD",\
              valueDecimal: "1000.00",\
            },\
            quantity: 1,\
          },\
        ],
      },
      invoiceDate: new Date("2026-01-16T00:00:00Z"),
      dueDate: new Date("2026-02-16T00:00:00Z"),
    },
  });

console.log(result);
}

run();
```

## Ask

```php
declare(strict_types=1);

require 'vendor/autoload.php';

use Moov\MoovPhp;
use Moov\MoovPhp\Models\Components;
use Moov\MoovPhp\Utils;

$sdk = MoovPhp\Moov::builder()
    ->setSecurity(
        new Components\Security(
            username: '',
            password: '',
        )
    )
    ->build();

$updateInvoice = new Components\UpdateInvoice(
    description: 'Updated professional services for Q1 2026',
    lineItems: new Components\CreateInvoiceLineItemsUpdate(
        items: [\
            new Components\CreateInvoiceLineItem(\
                name: 'Professional Services',\
                basePrice: new Components\AmountDecimal(\
                    currency: 'USD',\
                    valueDecimal: '1000.00',\
                ),\
                quantity: 1,\
            ),\
        ],
    ),
    invoiceDate: Utils\Utils::parseDateTime('2026-01-16T00:00:00Z'),
    dueDate: Utils\Utils::parseDateTime('2026-02-16T00:00:00Z'),
);

$response = $sdk->invoices->updateInvoice(
    accountID: 'ce46d65a-8504-4afa-b3f7-303401bd08b3',
    invoiceID: 'ef510999-370a-4350-87d5-bc81fc02a2ea',
    updateInvoice: $updateInvoice
);

if ($response->invoice !== null) {
    // handle response
}
```

## Ask

```java
package hello.world;

import io.moov.sdk.Moov;
import io.moov.sdk.models.components.*;
import io.moov.sdk.models.errors.GenericError;
import io.moov.sdk.models.errors.UpdateInvoiceError;
import io.moov.sdk.models.operations.UpdateInvoiceResponse;
import java.lang.Exception;
import java.time.OffsetDateTime;
import java.util.List;

public class Application {

public static void main(String[] args) throws GenericError, UpdateInvoiceError, Exception {

Moov sdk = Moov.builder()
                .security(Security.builder()
                    .username("")
                    .password("")
                    .build())
            .build();

UpdateInvoiceResponse res = sdk.invoices().updateInvoice()
                .accountID("ce46d65a-8504-4afa-b3f7-303401bd08b3")
                .invoiceID("ef510999-370a-4350-87d5-bc81fc02a2ea")
                .updateInvoice(UpdateInvoice.builder()
                    .description("Updated professional services for Q1 2026")
                    .lineItems(CreateInvoiceLineItemsUpdate.builder()
                        .items(List.of(
                            CreateInvoiceLineItem.builder()
                                .name("Professional Services")
                                .basePrice(AmountDecimal.builder()
                                    .currency("USD")
                                    .valueDecimal("1000.00")
                                    .build())
                                .quantity(1)
                                .build()))
                        .build())
                    .invoiceDate(OffsetDateTime.parse("2026-01-16T00:00:00Z"))
                    .dueDate(OffsetDateTime.parse("2026-02-16T00:00:00Z"))
                    .build())
                .call();

if (res.invoice().isPresent()) {
            System.out.println(res.invoice().get());
        }
    }
}
```

## Ask

```python
from moovio_sdk import Moov
from moovio_sdk.models import components
from moovio_sdk.utils import parse_datetime

with Moov(
    security=components.Security(
        username="",
        password="",
    ),
) as moov:

res = moov.invoices.update_invoice(account_id="ce46d65a-8504-4afa-b3f7-303401bd08b3", invoice_id="ef510999-370a-4350-87d5-bc81fc02a2ea", description="Updated professional services for Q1 2026", line_items={
        "items": [\
            {\
                "name": "Professional Services",\
                "base_price": {\
                    "currency": "USD",\
                    "value_decimal": "1000.00",\
                },\
                "quantity": 1,\
            },\
        ],
    }, invoice_date=parse_datetime("2026-01-16T00:00:00Z"), due_date=parse_datetime("2026-02-16T00:00:00Z"), tax_amount={
        "currency": "USD",
        "value_decimal": "12.987654321",
    })

# Handle response
    print(res)
```

## Ask

```ruby
require 'moov_ruby'

Models = ::Moov::Models
s = ::Moov::Client.new(
  security: Models::Components::Security.new(
    username: '',
    password: ''
  )
)
res = s.invoices.update_invoice(account_id: 'ce46d65a-8504-4afa-b3f7-303401bd08b3', invoice_id: 'ef510999-370a-4350-87d5-bc81fc02a2ea', update_invoice: Models::Components::UpdateInvoice.new(
  description: 'Updated professional services for Q1 2026',
  line_items: Models::Components::CreateInvoiceLineItemsUpdate.new(
    items: [\
      Models::Components::CreateInvoiceLineItem.new(\
        name: 'Professional Services',\
        base_price: Models::Components::AmountDecimal.new(\
          currency: 'USD',\
          value_decimal: '1000.00'\
        ),\
        quantity: 1\
      ),\
    ]
  ),
  invoice_date: DateTime.iso8601('2026-01-16T00:00:00Z'),
  due_date: DateTime.iso8601('2026-02-16T00:00:00Z')
))

unless res.invoice.nil?
  # handle response
end
```

## Ask

```csharp
using Moov.Sdk;
using Moov.Sdk.Models.Components;
using System;
using System.Collections.Generic;

var sdk = new MoovClient(security: new Security() {
    Username = "",
    Password = "",
});

var res = await sdk.Invoices.UpdateInvoiceAsync(
    accountID: "ce46d65a-8504-4afa-b3f7-303401bd08b3",
    invoiceID: "ef510999-370a-4350-87d5-bc81fc02a2ea",
    body: new UpdateInvoice() {
        Description = "Updated professional services for Q1 2026",
        LineItems = new CreateInvoiceLineItemsUpdate() {
            Items = new List<CreateInvoiceLineItem>() {
                new CreateInvoiceLineItem() {
                    Name = "Professional Services",
                    BasePrice = new AmountDecimal() {
                        Currency = "USD",
                        ValueDecimal = "1000.00",
                    },
                    Quantity = 1,
                },
            },
        },
        InvoiceDate = System.DateTime.Parse("2026-01-16T00:00:00Z").ToUniversalTime(),
        DueDate = System.DateTime.Parse("2026-02-16T00:00:00Z").ToUniversalTime(),
    }
);

// handle response
```

## Updated invoice

```json
{
  "createdOn": "2024-05-06T12:20:38.184Z",
  "customerAccountID": "3dfff852-927d-47e8-822c-2fffc57ff6b9",
  "customerDisplayName": "Acme Corp",
  "customerEmail": "billing@acmecorp.com",
  "description": "Professional services for Q1 2026",
  "disputedAmount": {
    "currency": "USD",
    "valueDecimal": "0.00"
  },
  "dueDate": "2026-02-15T00:00:00Z",
  "invoiceDate": "2026-01-15T00:00:00Z",
  "invoiceID": "ec7e1848-dc80-4ab0-8827-dd7fc0737b43",
  "invoiceNumber": "INV-1001",
  "lineItems": {
    "items": [\
      {\
        "basePrice": {\
          "currency": "USD",\
          "valueDecimal": "1000.00"
        },\
        "name": "Professional Services",\
        "quantity": 1\
      }\
    ]
  },
  "paidAmount": {
    "currency": "USD",
    "valueDecimal": "0.00"
  },
  "partnerAccountID": "5dfff852-927d-47e8-822c-2fffc57ff6b8",
  "paymentLinkCode": "uc7ZYKrMhi",
  "paymentLinkURL": "https://moov.link/p/uc7ZYKrMhi",
  "pendingAmount": {
    "currency": "USD",
    "valueDecimal": "0.00"
  },
  "refundedAmount": {
    "currency": "USD",
    "valueDecimal": "0.00"
  },
  "status": "unpaid",
  "subtotalAmount": {
    "currency": "USD",
    "valueDecimal": "1000.00"
  },
  "taxAmount": {
    "currency": "USD",
    "valueDecimal": "80.00"
  },
  "totalAmount": {
    "currency": "USD",
    "valueDecimal": "1080.00"
  }
}
```

## Response headers

A unique identifier used to trace requests.

The server could not understand the request due to invalid syntax.

## Example

```json
{
  "error": "string"
}
```

## Response headers

A unique identifier used to trace requests.

The request contained missing or expired authentication.

## Response headers

A unique identifier used to trace requests.

The user is not authorized to make the request.

## Response headers

A unique identifier used to trace requests.

The requested resource was not found.

## Response headers

A unique identifier used to trace requests.

The request conflicted with the current state of the target resource.

## Example

```json
{
  "error": "string"
}
```

## Response headers

A unique identifier used to trace requests.

The request was well-formed, but the contents failed validation. Check the request for missing or invalid fields.
