---
title: "Dodawanie dokumentu kosztowego"
description: "Jak przesłać PDF lub zdjęcie faktury zakupowej, z którego inFakt utworzy koszt."
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.niebieskiorzel.pl/llms.txt
> Use this file to discover all available pages before exploring further.

# Dodawanie dokumentu kosztowego

Przesłany plik zostaje zapisany jako skan dokumentu, na podstawie którego inFakt tworzy koszt. Jedno żądanie może zawierać wiele plików.

> **Testowanie kosztów na produkcji**
>
> W sandboxie moduł kosztów ma ograniczony dostęp, dlatego przykłady na tej stronie korzystają z adresu produkcyjnego `https://api.infakt.pl/v3`. Testy należy przeprowadzać na własnym koncie, a po ich zakończeniu usunąć testowe dokumenty.

## Wymagania

- Klucz API z zakresem `api:costs:write` w zmiennej `INFAKT_API_KEY`.
- Plik PDF, JPG lub PNG o rozmiarze do 15 MB. Zawartość pliku musi odpowiadać jego rozszerzeniu.

## Żądanie

Każdy plik przesyła się jako osobną część `uploads[]` żądania `multipart/form-data`:

```sh
curl -X POST "https://api.infakt.pl/v3/documents/costs/upload.json" \
  -H "X-inFakt-ApiKey: $INFAKT_API_KEY" \
  -F "uploads[]=@faktura.pdf"
```

```js
import { readFile } from "node:fs/promises";

const form = new FormData();
form.append("uploads[]", new Blob([await readFile("faktura.pdf")], { type: "application/pdf" }), "faktura.pdf");

const res = await fetch("https://api.infakt.pl/v3/documents/costs/upload.json", {
  method: "POST",
  headers: { "X-inFakt-ApiKey": process.env.INFAKT_API_KEY },
  body: form,
});
console.log(res.status, await res.json());
```

```python
import os
import requests

with open("faktura.pdf", "rb") as f:
    res = requests.post(
        "https://api.infakt.pl/v3/documents/costs/upload.json",
        headers={"X-inFakt-ApiKey": os.environ["INFAKT_API_KEY"]},
        files=[("uploads[]", ("faktura.pdf", f, "application/pdf"))],
    )
print(res.status_code, res.json())
```

```php
<?php
$ch = curl_init('https://api.infakt.pl/v3/documents/costs/upload.json');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['X-inFakt-ApiKey: ' . getenv('INFAKT_API_KEY')],
    CURLOPT_POSTFIELDS => ['uploads[]' => new CURLFile('faktura.pdf', 'application/pdf')],
]);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), ' ', curl_exec($ch), PHP_EOL;
```

## Weryfikacja

Odpowiedź `201` zawiera wynik dla każdego pliku:

```json
{
  "entities": [
    {
      "success": true,
      "name": "faktura.pdf",
      "document_scan_uuid": "8b9c0d1e-2f3a-4b5c-8d6e-7f8a9b0c1d2e",
      "download_url": "/app/uploads/c4d5e6f7-8a9b-4c0d-9e1f-2a3b4c5d6e7f"
    }
  ]
}
```

Kod `422` oznacza, że co najmniej jeden plik został odrzucony. Poprawne pliki z tego samego żądania są mimo to zapisywane i mają `success: true`. Koszty zwraca `GET /documents/costs.json`, a nie `/costs.json` ([403 Forbidden przy pobieraniu kosztów](/problemy/403-koszty/)).

## Następne kroki

- [Oznaczanie kosztów jako opłaconych](/poradniki/koszty/oznacz-jako-oplacone/)
- [Operacja w referencji API](/api/cost-documents-upload/)

Source: https://docs.niebieskiorzel.pl/poradniki/koszty/dodaj-dokument/index.mdx
