---
title: "Import a supplier invoice with a file attached"
method: POST
path: "/api/external/v2/supplier_invoices/import"
tags: ["Supplier Invoices"]
---

# Import a supplier invoice with a file attached

`POST /api/external/v2/supplier_invoices/import`

## Request

- Base URL: `https://app.pennylane.com`
- URL: `https://app.pennylane.com/api/external/v2/supplier_invoices/import`
- Auth: OAuth 2
  - Authorization code: `https://app.pennylane.com/oauth/authorize`
  - Token URL: `https://app.pennylane.com/oauth/oauth/token` scopes: `supplier_invoices:all`

This endpoint allows you to import a supplier invoice with a file
attached.


> ℹ️
> This endpoint requires the following scope: `supplier_invoices:all`

## Headers

- `X-Company-Id` string

## Request body

- object
  - `file_attachment_id` integer, required: ID of a previously uploaded file attachment. The attachment must already have a file. If the file is not available yet, the API returns 409; retry after a few seconds.
  - `import_as_incomplete` boolean: This will mark the invoice as incomplete.
  - `supplier_id` integer, required: The ID of the supplier to import the invoice for
  - `date` string, date, required: The date of the invoice (ISO 8601)
  - `deadline` string, date, required: Invoice payment deadline (ISO 8601)
  - `invoice_number` string: The invoice number
  - `currency` 'EUR' | 'USD' | 'GBP' | 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BYR' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CLF' | 'CLP' | 'CNY' | 'COP' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'FJD' | 'FKP' | 'GEL' | 'GGP' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'IMP' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JEP' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LTL' | 'LVL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRO' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLL' | 'SLE' | 'SOS' | 'SRD' | 'STD' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'UYU' | 'UZS' | 'VEF' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAF' | 'XCD' | 'XDR' | 'XOF' | 'XPF' | 'YER' | 'ZAR' | 'ZMK' | 'ZMW' | 'ZWL'
  - `currency_amount_before_tax` string, required: Invoice currency amount before tax (total value before tax of the invoice in the currency of the invoice)
  - `currency_amount` string, required: Invoice currency amount (total value of the invoice in the currency of the invoice)
  - `amount` string: Invoice amount in euros (total value of the invoice in euros). If the currency is euro, `currency_amount` and `amount` are identical.
  - `currency_tax` string, required: Invoice taxable amount (in invoice currency)
  - `tax` string: Invoice taxable amount (in euros). If the currency is euro, `currency_tax` and `tax` are identical.
  - `label` string, nullable: Custom label for the invoice used on accounting (ledger) entries. If not provided, Pennylane generates a label automatically.
  - `transaction_reference` object: By adding this field you can automatically reconcile the newly imported invoice with a transaction. See documentation about [automatic payment matching](https://pennylane.readme.io/v2.0/docs/automating-payment-matching).
    - `banking_provider` 'stripe' | 'gocardless' | 'bank' | 'budgetinsight' | 'helloasso', required: The banking provider for the transaction
    - `provider_field_name` 'payment_id' | 'charge_id' | 'report_id' | 'webid' | 'label' | 'order_id', required: Name of the field that you want to match
    - `provider_field_value` string, required: Value that you want to match. With `banking_provider: stripe` or `gocardless`, the value is matched exactly against the reference with the same `provider_field_name` synced from that provider, on non-archived transactions. With `banking_provider: bank` and `provider_field_name: label`, every non-archived bank transaction whose label contains this value as a whole word is matched, including transactions already matched to other documents. The match is case-sensitive, and a value that does not start and end with a letter, digit or underscore never matches. Use a value that identifies a single payment, such as a card transaction ID: a merchant name or a short generic value groups unrelated documents together. Pass the literal string `invoice_number` to match on this invoice's number instead of a fixed value. Other combinations do not match any transaction. In all cases, matching runs again on every update of this invoice.
  - `invoice_lines` object[], required
    - `label` string: Invoice line label > ⚠️ This attribute is deprecated and will be removed soon.
    - `description` string: Invoice line description > ⚠️ This attribute is deprecated and will be removed soon.
    - `currency_amount` string, required: Invoice line total amount in the currency of the invoice.
    - `amount` string: Invoice line amount in euros. If the currency is euro, `currency_amount` and `amount` are identical.
    - `currency_tax` string, required: Invoice line taxable amount (in invoice currency)
    - `tax` string: Invoice line taxable amount (in euros). If the currency is euro, `currency_tax` and `tax` are identical.
    - `ledger_account_id` integer: The ledger account ID
    - `vat_rate` 'FR_1_05' | 'FR_1_75' | 'FR_09' | 'FR_21' | 'FR_40' | 'FR_50' | 'FR_55' | 'FR_60' | 'FR_65' | 'FR_85' | 'FR_92' | 'FR_100' | 'FR_130' | 'FR_15_385' | 'FR_160' | 'FR_196' | 'FR_200' | 'AD_10' | 'AD_45' | 'AD_95' | 'AT_100' | 'AT_130' | 'AT_190' | 'AT_200' | 'BE_60' | 'BE_120' | 'BE_210' | 'BG_90' | 'BG_200' | 'CH_25' | 'CH_37' | 'CH_77' | 'CH_26' | 'CH_38' | 'CH_81' | 'CY_30' | 'CY_50' | 'CY_80' | 'CY_90' | 'CY_190' | 'CZ_100' | 'CZ_120' | 'CZ_150' | 'CZ_210' | 'DE_70' | 'DE_190' | 'DK_250' | 'EE_90' | 'EE_200' | 'EE_220' | 'EE_240' | 'ES_40' | 'ES_70' | 'ES_100' | 'ES_210' | 'FI_100' | 'FI_135' | 'FI_140' | 'FI_240' | 'FI_255' | 'GB_50' | 'GB_200' | 'GR_60' | 'GR_130' | 'GR_170' | 'GR_240' | 'GR_40' | 'HR_50' | 'HR_130' | 'HR_250' | 'HU_50' | 'HU_180' | 'HU_270' | 'IE_48' | 'IE_90' | 'IE_135' | 'IE_210' | 'IE_230' | 'IT_40' | 'IT_50' | 'IT_100' | 'IT_220' | 'LT_50' | 'LT_90' | 'LT_120' | 'LT_210' | 'LU_30' | 'LU_70' | 'LU_80' | 'LU_120' | 'LU_130' | 'LU_140' | 'LU_160' | 'LU_170' | 'LV_50' | 'LV_120' | 'LV_210' | 'MC_09' | 'MC_21' | 'MC_55' | 'MC_85' | 'MC_100' | 'MC_200' | 'MT_50' | 'MT_70' | 'MT_120' | 'MT_180' | 'MU_150' | 'NL_90' | 'NL_210' | 'PL_50' | 'PL_80' | 'PL_230' | 'PT_60' | 'PT_130' | 'PT_160' | 'PT_180' | 'PT_220' | 'PT_230' | 'RO_50' | 'RO_90' | 'RO_110' | 'RO_190' | 'RO_210' | 'SE_60' | 'SE_120' | 'SE_250' | 'SI_50' | 'SI_95' | 'SI_220' | 'SK_50' | 'SK_100' | 'SK_190' | 'SK_200' | 'SK_230' | 'NO_120' | 'NO_150' | 'NO_250' | 'DE_70_BU0002' | 'DE_190_BU0003' | 'DE_70_BU0008' | 'DE_190_BU0009' | 'DE_intracom_70_BU0012' | 'DE_intracom_190_BU0013' | 'DE_190_electronic_BU0226' | 'exempt' | 'DE_intracom_exempt_BU0011' | 'DE_intracom_exempt_BU0047' | 'DE_intracom_exempt_BU0233' | 'DE_exempt_BU0001' | 'DE_exempt_BU0181' | 'DE_exempt_BU0490' | 'intracom_21' | 'intracom_55' | 'intracom_85' | 'intracom_100' | 'crossborder' | 'ES_intracom_sales_goods' | 'ES_intracom_sales_services' | 'DE_intracom_70_BU0018' | 'DE_intracom_190_BU0019' | 'DE_intracom_190_BU0506' | 'extracom' | 'DE_extracom_BU0173' | 'DE_extracom_BU0191' | 'DE_extracom_190_BU0511' | 'ES_isp_sales' | 'ES_suplido' | 'FR_85_construction' | 'FR_100_construction' | 'FR_200_construction' | 'DE_exempt_construction_BU0046' | 'DE_70_construction_BU0091' | 'DE_190_construction_BU0094' | 'DE_190_construction_BU0526' | 'DE_190_construction_BU0546' | 'ES_isp_purchases_210' | 'ES_isp_purchases_100' | 'mixed', required: Product VAT rate. A 20% VAT in France is FR_200.
    - `imputation_dates` object
      - `start_date` string, date, required: Start date of the imputation period (ISO 8601)
      - `end_date` string, date, required: End date of the imputation period (ISO 8601)
    - `performance_period` object, nullable: Date range during which the service or delivery was performed (ISO 8601). Used for German VAT accounting (Leistungsdatum).
      - `start_date` string, date, nullable: Start date of the performance period (ISO 8601)
      - `end_date` string, date, required: End date of the performance period (ISO 8601)
      - `date_type` 'delivery_date' | 'service_date' | 'delivery_period' | 'service_period', required: Whether the performance period represents a single date or a range, and whether it is a delivery or service. - delivery_date: single delivery date (end_date only) - service_date: single service date (end_date only) - delivery_period: delivery date range (start_date and end_date) - service_period: service date range (start_date and end_date)
    - `ledger_entry_line` object
      - `label` string, required: Ledger entry line label. Ledger entry lines with identical labels, tax, and ledger accounts will be automatically compacted into a single line.
  - `external_reference` string: A unique external reference you can provide to track this supplier. If not provided, Pennylane will generate an identifier for you.

## Response `201`

The imported supplier invoice

- object
  - `id` integer, required: The ID of the supplier invoice
  - `label` string, nullable, required
  - `invoice_number` string, required
  - `currency` 'EUR' | 'USD' | 'GBP' | 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BYR' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CLF' | 'CLP' | 'CNY' | 'COP' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'FJD' | 'FKP' | 'GEL' | 'GGP' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'IMP' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JEP' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LTL' | 'LVL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRO' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLL' | 'SLE' | 'SOS' | 'SRD' | 'STD' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'UYU' | 'UZS' | 'VEF' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAF' | 'XCD' | 'XDR' | 'XOF' | 'XPF' | 'YER' | 'ZAR' | 'ZMK' | 'ZMW' | 'ZWL', required
  - `amount` string, required: Invoice amount (total value of the invoice in euros). If the currency is euro, `currency_amount` and `amount` are identical.
  - `currency_amount` string, required: Invoice currency amount (total value of the invoice in the currency of the invoice)
  - `currency_amount_before_tax` string, required: Invoice currency amount before tax (total value before tax of the invoice in the currency of the invoice)
  - `exchange_rate` string, required: Invoice exchange rate (used to convert the invoice to euros. If the invoice currency is euro it will be 1.0)
  - `date` string, date, nullable, required: Invoice issue date (ISO 8601)
  - `deadline` string, date, nullable, required: Invoice payment deadline (ISO 8601)
  - `performance_date` string, date, nullable, required: End date of the performance period of the first invoice line that has one (ISO 8601). Used for German VAT accounting (Leistungsdatum). Null if the company does not use German accounting, or if no invoice line has a performance period.
  - `currency_tax` string, required: Invoice taxable amount (in invoice currency)
  - `tax` string, required: Invoice taxable amount (in euros). If the currency is euro, `currency_tax` and `tax` are identical.
  - `reconciled` boolean, required: Whether the invoice has been reconciled or not
  - `accounting_status` 'draft' | 'archived' | 'entry' | 'validation_needed' | 'complete', required: The accounting state of the invoice. - `draft`: The invoice is not yet sent to the accountant. - `archived`: The invoice has been archived. - `entry`: The invoice is incomplete. Some information is missing on the invoice and needs to be completed by SME. - `validation_needed`: The invoice is sent to the accountant and needs validation. - `complete`: The invoice has been validated by the accountant.
  - `filename` string, nullable, required: Name of the file attached to the invoice
  - `public_file_url` string, nullable, required: Public URL of the invoice file. The URL will expire after 30 minutes.
  - `remaining_amount_with_tax` string, nullable, required: The remaining amount with VAT to pay for the invoice to be considered paid
  - `remaining_amount_without_tax` string, nullable, required: The remaining amount without VAT to pay for the invoice to be considered paid
  - `ledger_entry` object, required
    - `id` integer, required: Ledger entry identifier
  - `supplier` object, nullable, required
    - `id` integer, required
    - `url` string, required: URL to get the supplier.
  - `payment_method_ledger_account` object, nullable, required: Ledger account used for reconciliation by payment method. When present, the receivable/payable was transferred to this account.
    - `id` integer, required
    - `url` string, required: URL to get the ledger account.
  - `invoice_lines` object, required
    - `url` string, required: URL to get the invoice lines of the invoice.
  - `categories` object, required
    - `url` string, required: URL to get the categories of the invoice.
  - `transaction_reference` object, nullable, required: This reconciles the invoice with a transaction. See documentation about [automatic payment matching](https://pennylane.readme.io/v2.0/docs/automating-payment-matching).
    - `banking_provider` string, required: The banking provider for the transaction
    - `provider_field_name` string, required: Name of the field that you want to match
    - `provider_field_value` string, required: Value that you want to match
  - `payment_status` 'to_be_processed' | 'to_be_paid' | 'partially_paid' | 'payment_error' | 'payment_scheduled' | 'payment_in_progress' | 'payment_emitted' | 'payment_found' | 'paid_offline' | 'fully_paid', required
  - `paid` boolean, required: Invoice paid status (set to true if the invoice is paid)
  - `payments` object, required
    - `url` string, required: URL to get the payments of the invoice.
  - `matched_transactions` object, required
    - `url` string, required: URL to get the transactions of the invoice.
  - `external_reference` string, required: The unique external reference that was assigned during creation either by you or Pennylane
  - `import_source` object, nullable, required: Origin file information for invoices imported via a file connector (Dropbox or Google Drive). Null for invoices created by other means.
    - `source` 'dropbox' | 'gdrive', required: The connector type that imported this invoice.
    - `path` string, required: The file path of the invoice in the connector's storage.
  - `e_invoicing` object, nullable, required: E-invoicing lifecycle information managed by the PA. Contains the current status and associated reason when applicable. This field is only present for invoices received through e-invoicing.
    - `status` union, required
      - 'waiting_for_validation' | 'approved' | 'rejected' | 'disputed' | 'refused' | 'collected' | 'partially_collected'
      - unknown
    - `reason` union, required
      - 'incorrect_vat_rate' | 'incorrect_unit_prices' | 'incorrect_billed_quantity' | 'incorrect_billed_item' | 'defective_delivered_item' | 'delivery_issue' | 'bank_details_error' | 'incorrect_payment_terms' | 'missing_legal_notice' | 'missing_contractual_reference' | 'recipient_error' | 'contract_completed' | 'duplicate_invoice' | 'incorrect_prices' | 'non_compliant_invoice'
      - unknown
    - `flow` object, nullable, required: The AFNOR flow associated with this e-invoice.
      - `id` string, uuid, required
    - `source_file_url` string, nullable, required: URL to download the original e-invoice file as received from the PA (CII, UBL, or Factur-X). Pennylane may replace the main invoice file with a generated PDF; this field preserves the untouched file received from the PA.
    - `electronic_billing_address` string, nullable, required: The electronic billing address (Peppol address) that received this e-invoice. Use it to isolate invoices routed to a specific entity.
  - `archived_at` string, date-time, nullable, required: The time the invoice has been archived
  - `created_at` string, date-time, required: The time the invoice has been created
  - `updated_at` string, date-time, required: The last time the invoice has been updated

## Other responses

- `400`: Bad request
- `401`: Access token is missing or invalid
- `403`: Access to this resource forbidden
- `404`: The resource was not found
- `409`: Conflict with the current state of the target resource, such as when trying to create a resource that already exists.
- `422`: Unprocessable content

## Changes

- **2026-11-03** `871f863307e5`: 1 breaking, 1 warning, 16 info
  - the `transaction_reference/provider_field_value/allOf[subschema #2]/` request property type changed from no type to `string`
  - added the new `VES` enum value to the `currency` response property for the response status `201`
  - added the new optional `header` request parameter `X-Company-Id`
  - added the new optional request property `invoice_lines/items/performance_period`
  - …14 more

[Operation history](https://skmtc.dev/pennylane/apis/company-v2/changes/api/external/v2/supplier_invoices/import/post.md)

---

[API](https://skmtc.dev/pennylane/apis/company-v2.md) - [All operations](https://skmtc.dev/pennylane/apis/company-v2/llms.txt) - [OpenAPI document](https://skmtc.dev/pennylane/apis/company-v2/revisions/871f863307e5?raw)
