Skip to main content

Import configuration

Allows importing Coupa data to your Master Data Hub via the Coupa Code API.

Setup

Create webhook as described in Integration Setup and use the right link from the table below (according the Rossum environment of configured account)

Import endpoints

EnvironmentWebhook URL
EU1 Irelandhttps://elis.rossum.ai/svc/scheduled-imports/api/coupa/v1/import
EU2 Frankfurthttps://shared-eu2.rossum.app/svc/scheduled-imports/api/coupa/v1/import
US east coasthttps://us.app.rossum.ai/svc/scheduled-imports/api/coupa/v1/import
Japan Tokyo

Available configuration options

{
"credentials": {
// Example: "b1946ac92492d2347c6235b4d2611184"
"client_id": "…",
// Example: "https://mycompany-dev.coupahost.com/"
"base_api_url": "…",
// Example: "core.accounting.read"
"client_scope": "…"
},
"import_config": {
// Query parameters to be passed to the Coupa API.
"query": {
// Explicit list of attributes to be imported.
"fields": []
},
// What method to use when inserting data to MDH. Available options: "update", "insert"
"method": "update",
// List of attributes that are used to identify a record (used for method "update").
"id_keys": ["id"],
// Coupa API endpoint.
"endpoint": "api/currencies",
// Name of the dataset in MDH.
"dataset_name": "COUPA_DEV_currencies_v1",
// Number of records that will be imported per request.
"records_per_request": 50
}
}

Adding new fields to query.fields

In case you want to add a new attribute from the Coupa API to be imported to your Master Data Hub, you need to simply add the attribute as a string to the list. Only keep in mind to replace "-" with "_". For example:

  • Original field name: attribute-example
  • New field name: attribute_example

If you need to add a new object to the import you need to specify the name of the object and then list all attributes that are nested within the given object. The following example demonstrates import of a nested object which is named payment-term and from this object, we need attributes id and name.

Keep in mind to also replace "-" with "_" in the name of the object:

{
"fields": [
"id",
"name",
"code",
"allowable_precession",
"active",
"updated_at",
"created_at",
{
"payment_term": ["id", "name"]
}
]
}

Configuration examples

Accounts

See: Accounts API (/accounts)

tip

Query attributes necessary for differential update are highlighted.

{
"credentials": {
"client_id": "…",
"base_api_url": "…",
"client_scope": "core.accounting.read"
},
"import_config": {
"query": {
"order_by": "created_at",
"updated-at[gt_or_eq]": "${last_modified_date}"
},
"method": "update",
"id_keys": ["id"],
"endpoint": "api/accounts",
"dataset_name": "COUPA_DEV_accounts_v1",
"records_per_request": 50
}
}

Account types

See: Account Types API (/account_types)

tip

Query attributes necessary for differential update are highlighted.

{
"credentials": {
"client_id": "…",
"base_api_url": "…",
"client_scope": "core.accounting.read"
},
"import_config": {
"query": {
"fields": [
"id",
"created_at",
"updated_at",
"name",
"active",
"legal_entity_name",
"dynamic_flag",
{
"currency": ["id", "code", "decimals"]
},
{
"primary_contact": [
"id",
"created_at",
"updated_at",
"email",
"name_prefix",
"name_suffix",
"name_additional",
"name_given",
"name_family",
"name_fullname",
"notes",
"active",
"purposes"
]
},
{
"primary_address": [
"id",
"created_at",
"updated_at",
"name",
"location_code",
"street1",
"street2",
"street3",
"street4",
"city",
"state",
"postal_code",
"attention",
"active",
"business_group_name",
"vat_number",
"local_tax_number",
"type",
{
"country": ["id", "code", "name"]
},
{
"vat_country": ["id", "code", "name"]
}
]
}
],
"order_by": "created_at",
"updated-at[gt_or_eq]": "${last_modified_date}"
},
"method": "update",
"id_keys": ["id"],
"endpoint": "api/account_types",
"dataset_name": "COUPA_DEV_account_types_v1",
"records_per_request": 50
}
}

Currencies

See Currencies API (/currencies)

{
"credentials": {
"client_id": "…",
"base_api_url": "…",
"client_scope": "core.common.read"
},
"import_config": {
"query": {
"fields": ["id", "code", "decimals"]
},
"method": "replace",
"endpoint": "api/currencies",
"dataset_name": "COUPA_DEV_currencies_v1",
"records_per_request": 50
}
}

Invoices

See: Invoices API (/invoices)

tip

Query attributes necessary for differential update are highlighted.

{
"credentials": {
"client_id": "…",
"base_api_url": "….coupacloud.com/",
"client_scope": "core.invoice.read"
},
"import_config": {
"query": {
"order_by": "created_at",
"updated-at[gt_or_eq]": "${last_modified_date}"
},
"method": "update",
"id_keys": ["id"],
"endpoint": "api/invoices",
"dataset_name": "COUPA_DEV_invoices_v1",
"records_per_request": 50
}
}

See: Legal Entity API

tip

Query attributes necessary for differential update are highlighted.

{
"credentials": {
"client_id": "…",
"base_api_url": "…",
"client_scope": "core.legal_entity.read"
},
"import_config": {
"query": {
"order_by": "created_at",
"updated-at[gt_or_eq]": "${last_modified_date}"
},
"method": "update",
"id_keys": ["id"],
"endpoint": "api/legal_entities",
"dataset_name": "COUPA_DEV_legal_entities_v1",
"records_per_request": 50
}
}

Lookup values

See: Lookup Values API (/lookup_values)

tip

Query attributes necessary for differential update are highlighted.

For invoices that are not tied to a purchase order (non-PO-backed), Coupa requires default lookup values to ensure the correct categorization and processing of the invoice. These values help populate essential fields that would otherwise be filled by the purchase order, ensuring the invoice is successfully imported and can proceed through the approval and payment workflows without issues.

{
"credentials": {
"client_id": "…",
"base_api_url": "….coupacloud.com/",
"client_scope": "core.common.read"
},
"import_config": {
"query": {
"fields": [
"id",
"name",
"external-ref-num",
"external-ref-code",
"active",
{
"parent": [
"id",
"name",
"active",
{
"custom_fields": {}
},
{
"parent": [
"id",
"name",
"active",
{
"custom_fields": {}
}
]
}
]
},
{
"lookup": ["id", "name", "active"]
},
{
"custom_fields": {}
}
],
"order_by": "created_at",
"updated-at[gt_or_eq]": "${last_modified_date}"
},
"method": "update",
"id_keys": ["id"],
"endpoint": "api/lookup_values",
"dataset_name": "COUPA_DEV_lookup_values_v1",
"records_per_request": 50
}
}

Payment Terms

See: Payment Terms API (/payment_terms)

tip

Query attributes necessary for differential update are highlighted.

{
"credentials": {
"client_id": "…",
"base_api_url": "…",
"client_scope": "core.common.read"
},
"import_config": {
"query": {
"order_by": "created_at",
"updated-at[gt_or_eq]": "${last_modified_date}"
},
"method": "update",
"id_keys": ["id"],
"endpoint": "api/payment_terms",
"dataset_name": "COUPA_DEV_payment_terms_v1",
"records_per_request": 50
}
}

Purchase orders

With this import configuration, you will receive a final collection that includes all Purchase Orders (POs), along with an array of their corresponding PO line items nested within each order. This structure allows for easy access to both the POs and their specific line item details.

{
"credentials": {
"client_id": "…",
"base_api_url": "…",
"client_scope": "core.purchase_order.read"
},
"import_config": {
"query": {
"dir": "desc",
"fields": [
"id",
"created_at",
"updated_at",
"po_number",
"status",
"version",
"payment_method",
"ship_to_attention",
{
"ship_to_address": [
"id",
"created_at",
"updated_at",
"name",
"location_code",
"street1",
"street2",
"street3",
"street4",
"city",
"state",
"postal_code",
"attention",
"active",
"business_group_name",
"vat_number",
"local_tax_number",
"type",
{
"country": ["id", "code", "name"]
}
]
},
{
"supplier": ["id", "name", "display_name", "number"]
},
{
"order_lines": [
"id",
"created_at",
"updated_at",
"accounting_total",
{
"accounting_total_currency": ["id", "code", "decimals"]
},
{
"custom_fields": ["start_date", "end_date", "payment_method"]
},
"description",
"line_num",
"order_header_id",
"order_header_number",
"price",
"quantity",
"source_part_num",
"status",
"sub_line_num",
"total",
"type",
"version",
"supplier_order_number",
{
"account": [
"id",
"created_at",
"updated_at",
"name",
"code",
"active",
"account_type_id",
"segment_1",
"segment_2",
"segment_3",
"segment_4",
"segment_5",
"segment_6",
"segment_7",
"segment_8",
"segment_9",
"segment_10",
"segment_11",
"segment_12",
"segment_13",
"segment_14",
"segment_15",
"segment_16",
"segment_17",
"segment_18",
"segment_19",
"segment_20"
]
},
{
"currency": ["id", "code", "decimals"]
},
{
"supplier": ["id", "name", "display_name", "number"]
},
{
"uom": [
"id",
"created_at",
"updated_at",
"code",
"name",
"allowable_precision",
"active"
]
}
]
}
],
"order_by": "created_at",
"updated-at[gt_or_eq]": "${last_modified_date}"
},
"method": "update",
"id_keys": ["id"],
"endpoint": "api/purchase_orders",
"dataset_name": "COUPA_DEV_purchase_orders_v1",
"records_per_request": 50
}
}

Purchase order - Line items

With this import configuration, you will receive a final collection that includes all PO line items, along with basic information about the associated Purchase Order for each line item.

{
"credentials": {
"client_id": "…",
"base_api_url": "…",
"client_scope": "core.purchase_order.read"
},
"import_config": {
"query": {
"dir": "desc",
"fields": [
"id",
"created_at",
"updated_at",
"accounting_total",
{
"accounting_total_currency": ["id", "code", "decimals"]
},
{
"custom_fields": ["start_date", "end_date", "payment_method"]
},
"description",
"line_num",
"order_header_id",
"order_header_number",
"price",
"quantity",
"source_part_num",
"status",
"sub_line_num",
"total",
"type",
"version",
"supplier_order_number",
{
"account": [
"id",
"created_at",
"updated_at",
"name",
"code",
"active",
"account_type_id",
"segment_1",
"segment_2",
"segment_3",
"segment_4",
"segment_5",
"segment_6",
"segment_7",
"segment_8",
"segment_9",
"segment_10",
"segment_11",
"segment_12",
"segment_13",
"segment_14",
"segment_15",
"segment_16",
"segment_17",
"segment_18",
"segment_19",
"segment_20"
]
},
{
"currency": ["id", "code", "decimals"]
},
{
"supplier": ["id", "name", "display_name", "number"]
},
{
"uom": ["id", "created_at", "updated_at", "code", "name", "allowable_precision", "active"]
}
],
"order_by": "created_at",
"updated-at[gt_or_eq]": "${last_modified_date}"
},
"method": "update",
"id_keys": ["id"],
"endpoint": "api/purchase_order_lines",
"dataset_name": "COUPA_DEV_purchase_order_lines_v1",
"records_per_request": 50
}
}

Suppliers

See: Suppliers API (/suppliers)

warning

Do not fetch remit_to_addresses directly on the supplier object. Update to the remit-to addresses in Coupa would not re-trigger the differential import and your supplier data would be inconsistent. Instead, use Supplier remit-to addresses.

tip

Query attributes necessary for differential update are highlighted.

{
"credentials": {
"client_id": "…",
"base_api_url": "…",
"client_scope": "core.supplier.read"
},
"import_config": {
"query": {
"fields": [
"id",
"created_at",
"updated_at",
"name",
"display_name",
"number",
"status",
"po_email",
"account_number",
"tax_id",
{
"primary_contact": [
"id",
"created_at",
"updated_at",
"email",
"name_prefix",
"name_suffix",
"name_additional",
"name_given",
"name_family",
"name_fullname",
"notes",
"active",
"purposes"
]
},
{
"primary_address": [
"id",
"created_at",
"updated_at",
"name",
"location_code",
"street1",
"street2",
"street3",
"street4",
"city",
"state",
"postal_code",
"attention",
"active",
"business_group_name",
"vat_number",
"local_tax_number",
"type",
{
"country": ["id", "code", "name"]
},
{
"vat_country": ["id", "code", "name"]
}
]
},
{
"remit_to_addresses": [
"id",
"created_at",
"updated_at",
"remit_to_code",
"name",
"street1",
"street2",
"street3",
"street4",
"city",
"state",
"postal_code",
"active",
"vat_number",
"local_tax_number",
"external_src_ref",
"external_src_name",
{
"country": ["id", "code", "name"]
}
]
}
],
"order_by": "created_at",
"updated-at[gt_or_eq]": "${last_modified_date}"
},
"method": "update",
"id_keys": ["id"],
"endpoint": "api/suppliers",
"dataset_name": "COUPA_DEV_suppliers_v1",
"records_per_request": 50
}
}

Supplier remit-to addresses

See: Suppliers API (/suppliers)

Use this configuration to import all supplier remit-to addresses. Note that Coupa (currently) doesn't have any API endpoint to fetch all the remit-to addresses directly. Therefore, we fetch all suppliers and get the remit to addresses from there. It is important to do it in a separate import job (not together with the supplier data) to make sure that last_modified_date works correctly.

tip

Query attributes necessary for differential update are highlighted.

{
"credentials": {
"client_id": "…",
"base_api_url": "…",
"client_scope": "core.supplier.read"
},
"import_config": {
"query": {
"fields": [
"id",
"created_at",
"updated_at",
"name",
"display_name",
{
"remit_to_addresses": [
"id",
"created_at",
"updated_at",
"remit_to_code",
"name",
"street1",
"street2",
"street3",
"street4",
"city",
"state",
"postal_code",
"active",
"vat_number",
"local_tax_number",
"external_src_ref",
"external_src_name",
{
"country": ["id", "code", "name"]
}
]
}
],
"order_by": "created_at",
"remit-to-addresses[updated-at][gt_or_eq]": "${last_modified_date}"
},
"method": "update",
"id_keys": ["id"],
"endpoint": "api/suppliers",
"dataset_name": "COUPA_TEST_suppliers_remit_to_addresses_v1",
"records_per_request": 50
}
}

Supplier information

{
"credentials": {
"client_id": "…",
"base_api_url": "…",
"client_scope": "core.supplier.read"
},
"import_config": {
"query": {
"fields": [
"id",
"created_at",
"updated_at",
"supplier_id",
"name",
"display_name",
"supplier_number",
"status",
"industry",
"inco_terms",
"minority_indicator",
"minority_type_id",
"tax_region",
"tax_classification",
"federal_tax_num",
"social_security_number",
"duns_number",
"tax_exempt_other_explanation",
"income_type",
"fed_reportable",
"intl_tax_num",
"intl_tax_classification",
"intl_other_explanation",
"backend_system_invoicing",
"backend_system_catalog",
"supplier_region",
"payment_terms_id",
"payment_term_id",
"govt_agency_interaction_indicator",
"govt_agency_interaction",
"organization_type",
"policy_for_bribery_corruption_indicator",
"policy_for_bribery_corruption",
"govt_allegation_fraud_bribery_indicator",
"govt_allegation_fraud_bribery",
"third_party_interaction_indicator",
"third_party_interaction",
"goods_services_provided",
"pay_group",
"invoice_amount_limit",
"hold_payment_indicator",
"hold_payment",
"separate_remit_to",
"comment_source",
"comment",
"last_exported_at",
"logo_file_name",
"logo_content_type",
"logo_file_size",
"logo_updated_at",
"website",
"allow_cxml_invoicing",
"hold_invoices_for_ap_review",
"send_invoices_to_approvals",
"allow_inv_no_backing_doc_from_connect",
"allow_inv_unbacked_lines_from_connect",
"commodity_id",
"invoice_matching_level",
"shipping_term_id",
"tax_code_id",
"savings_pct",
"allow_inv_from_connect",
"allow_inv_choose_billing_account",
"invoice_inbound_emails",
"default_invoice_email",
"inbound_invoice_domain",
"duplicate_exists",
"estimated_spend_amount",
"currency_id",
"user_id",
"one_time_supplier",
"scope_three_emissions",
"po_email",
"po_method",
"po_change_method",
"buyer_hold",
"cxml_url",
"cxml_domain",
"cxml_identity",
"cxml_supplier_domain",
"cxml_supplier_identity",
"cxml_secret",
"cxml_protocol",
"cxml_ssl_version",
"disable_cert_verify",
{
"custom_fields": [
"primary_subsidiary",
"subs_secondary",
"vendor_region",
"payment_file_format",
"company_registration_number",
"eligibility_1099",
"critical_vs_not_critical_vendor",
"permanent_account_number_pan",
"msmeudyam_registration_number",
"credit_card_vendor",
"credit_card",
"vendor_require_risk_questionnaire",
"risk_review",
"expedited_vendor",
"msme_registration_certificate",
"additional_currency",
"payment_remittance_email",
"wil_be_sued_for_po__backed_purchases"
]
},
{
"supplier_information_addresses": [
"intermediary_bank_name",
"bank_address",
"bank_city",
"bank_state_region",
"bank_postal_code",
"name_on_bank_account",
"bank_name",
"bank_account_number",
"bank_routing_number",
"wire_routing_number",
"international_bank_account_number",
"iban_number",
"sort_code",
"swift_code",
"bsb_number",
"bic",
"bank_code",
"ifsc",
"transit_number_and_institution_number",
"bic_routing_code",
"payment_method_item",
"active",
"csp_rta_id",
"email",
"virtual_card_email"
]
}
],
"updated-at[gt_or_eq]": "${last_modified_date}"
},
"method": "update",
"id_keys": ["id"],
"endpoint": "api/supplier_information",
"dataset_name": "COUPA_DEV_supplier_information_v1",
"records_per_request": 50
}
}

Tax Codes

See: Tax Code API

tip

Query attributes necessary for differential update are highlighted.

{
"credentials": {
"client_id": "…",
"base_api_url": "…",
"client_scope": "core.common.read"
},
"import_config": {
"query": {
"updated-at[gt_or_eq]": "${last_modified_date}"
},
"method": "update",
"id_keys": ["id"],
"endpoint": "api/tax_codes",
"dataset_name": "tax_codes",
"records_per_request": 50
}
}

Tax Registrations

See: Tax Registrations API (/tax_registrations)

tip

Query attributes necessary for differential update are highlighted.

{
"credentials": {
"client_id": "…",
"base_api_url": "…",
"client_scope": "core.invoice.read"
},
"import_config": {
"query": {
"fields": [
"id",
"created_at",
"updated_at",
"number",
"owner-id",
"owner-type",
"active",
"local",
{
"country": ["id", "code", "name"]
}
],
"order_by": "created_at",
"updated-at[gt_or_eq]": "${last_modified_date}"
},
"method": "update",
"id_keys": ["id"],
"endpoint": "api/tax_registrations",
"dataset_name": "COUPA_DEV_tax_registrations_v1",
"records_per_request": 50
}
}

Units of measurement

{
"credentials": {
"client_id": "…",
"base_api_url": "….coupacloud.com/",
"client_scope": "core.common.read"
},
"import_config": {
"query": {
"fields": [
"id",
"name",
"code",
"allowable-precession",
"active",
"updated-at",
"created-at"
],
"order_by": "created_at",
"updated-at[gt_or_eq]": "${last_modified_date}"
},
"method": "update",
"id_keys": ["id"],
"endpoint": "api/uoms",
"dataset_name": "COUPA_DEV_uoms_v1",
"records_per_request": 50
}
}