Important: This API is currently in pre-release status and is only available to approved early access partners. The API is under development and might change before being generally released. To become an early access partner, contact your SAP Concur Representative.

If a new or existing project please use version 3.0 of this API.

Concur Request automates the spend request and approval process for both travel and everyday expenses, giving you the data you need to accurately track and better control spending. By increasing visibility into planned expenses and up-to-date budget data, you can make strategic spending decisions before any spending actually occurs. The Request API provides many possibilities, particularly Requests creation and transition into the approval workflow.

Version 4.0 of Request API works only with the new Authentication API.

Get Started

Overview

The Request V4 API exposes four different resources:

Resource Description
Request You can read, create, update or delete a Request and get the list of existing Requests.
Workflow You can perform action in the approval workflow of a Request (submit, approve, cancel…)
Expense You can read, create, update or delete an Expense, and get the list of expected Expenses for a specific Request.
Travel Agency You can get the description of a Travel Agency office.

These resources are used to manage documents used for pre-spend authorizations within Concur Request.

Version

Regional Availability

US Production:    https://us.api.concursolutions.com/travelrequest/v4/
EMEA Production:  https://emea.api.concursolutions.com/travelrequest/v4/
China Production: https://cn.api.concurdc.cn/travelrequest/v4/

Explore the API

Prerequisites

Read the Getting Started section of Authentication API.

Once you have registered your application, read about the API endpoints, or click the button to download a request collection for Postman.

Run in Postman

Retrieve a User Access Token:

Before issuing requests to the API, you must obtain an access token from the Authentication API.

The response will include an access_token field, which contains your access token. For subsequent calls, you will need to include this access token in the Authorization header of your calls. An id_token will be also included in the response. In order to retrieve the unique ID for your user, you will have to decode this id_token at jwt.io. You will need this ID in order to issue requests on the API.

Examples:

cURL

curl -d "client_secret={YOUR SECRET}&client_id={YOUR CLIENT ID}&grant_type=password&username={YOUR USERNAME}&password={YOUR PASSWORD}" https://us.api.concursolutions.com/oauth2/v0/token

HTTPie

http -f POST https://us.api.concursolutions.com/oauth2/v0/token client_secret={YOUR SECRET} client_id={YOUR CLIENT ID} grant_type=password username={YOUR USERNAME} password=P{YOUR PASSWORD}

Explore the API in JavaScript

Below are some simple NodeJS code snippets for getting a token and issuing a request to the API.

Retrieve a User or Company Access Token:

'use strict';
const request = require('request');
request.post({
  url:'https://us.api.concursolutions.com/oauth2/v0/token',
  form: {
    client_secret: 'YOUR VALUE HERE',
    client_id: 'YOUR VALUE HERE',
    username: 'YOUR VALUE HERE',
    password: 'YOUR VALUE HERE',
    grant_type: 'password'
  }},
  (err, httpResponse, body) => {
    if(err) { console.log(err); }
    console.log('Status:', httpResponse.statusCode);
    console.log('Response:', body);
  });

Post a request:

'use strict';
const https = require('https');
const ACCESS_TOKEN = 'YOUR ACCESS TOKEN HERE';
const USER_ID = 'YOUR VALUE HERE';
const request = JSON.stringify(YOUR_REQUEST_HERE);
const options = {
  hostname: 'us.api.concursolutions.com',
  path: `/travelrequest/v4/users/${USER_ID}`,
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${ACCESS_TOKEN}`,
    'Content-Type': 'application/json',
    'Content-Length': Buffer.byteLength(request)
  }
};
const req = https.request(options, (res) => {
  console.log('statusCode:', res.statusCode);
  console.log('headers:', res.headers);

  res.on('data', (data) => {
    process.stdout.write(data);
  });
});

req.write(request);
req.end();

req.on('error', (e) => {
  console.error(e);
});