SAP Concur Reports API

Operations for creating, retrieving, updating, and deleting expense reports, as well as retrieving reports pending approval.

Documentation

Specifications

Schemas & Data

Other Resources

OpenAPI Specification

sap-concur-reports-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: SAP Concur Expense Report Allocations Reports API
  description: The SAP Concur Expense Report v4 API enables integration with Concur Expense for creating, retrieving, updating, and managing expense reports, expenses (entries), allocations, comments, and workflow actions. This API follows RESTful conventions with JSON Merge Patch (RFC 7386) for partial updates and HATEOAS links for resource navigation.
  version: 4.0.0
  contact:
    name: SAP Concur Developer Support
    url: https://developer.concur.com/support/
  license:
    name: SAP Concur API Terms of Use
    url: https://www.concur.com/terms-of-use
  x-api-id: sap-concur-expense-report-v4
  x-audience: external-partner
servers:
- url: https://us.api.concursolutions.com
  description: US Production Datacenter
- url: https://us2.api.concursolutions.com
  description: US2 Production Datacenter
- url: https://emea.api.concursolutions.com
  description: EMEA Production Datacenter
- url: https://cn.api.concursolutions.com
  description: China Production Datacenter
security:
- bearerAuth: []
tags:
- name: Reports
  description: Operations for creating, retrieving, updating, and deleting expense reports, as well as retrieving reports pending approval.
paths:
  /expensereports/v4/users/{userID}/context/{contextType}/reports:
    post:
      operationId: createReport
      summary: Sap Concur Create a New Expense Report
      description: Creates a new expense report for the specified user. The report is created in an unsubmitted state and can be populated with expenses before submission through the workflow.
      tags:
      - Reports
      parameters:
      - $ref: '#/components/parameters/userID'
      - $ref: '#/components/parameters/contextTypeWritable'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NewReport'
            examples:
              CreatereportRequestExample:
                summary: Default createReport request
                x-microcks-default: true
                value:
                  name: Example Title
                  businessPurpose: example_value
                  reportDate: '2026-01-15'
                  startDate: '2026-01-15'
                  endDate: '2026-01-15'
                  currencyCode: example_value
                  countryCode: example_value
                  countrySubDivisionCode: example_value
                  policyId: '500123'
                  customData:
                  - id: abc123
                    value: example_value
                    isValid: '500123'
      responses:
        '201':
          description: Report created successfully
          headers:
            Location:
              description: URI of the newly created report
              schema:
                type: string
                format: uri
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceCreatedResponse'
              examples:
                Createreport201Example:
                  summary: Default createReport 201 response
                  x-microcks-default: true
                  value:
                    uri: https://www.example.com
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '500':
          $ref: '#/components/responses/InternalServerError'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /expensereports/v4/users/{userID}/context/{contextType}/reports/{reportId}:
    get:
      operationId: getReport
      summary: Sap Concur Retrieve an Expense Report by Id
      description: Returns the full details of a specific expense report including header information, amounts, approval status, and custom data.
      tags:
      - Reports
      parameters:
      - $ref: '#/components/parameters/userID'
      - $ref: '#/components/parameters/contextType'
      - $ref: '#/components/parameters/reportId'
      responses:
        '200':
          description: Report retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReportDetails'
              examples:
                Getreport200Example:
                  summary: Default getReport 200 response
                  x-microcks-default: true
                  value:
                    reportId: '500123'
                    name: Example Title
                    businessPurpose: example_value
                    reportDate: '2026-01-15'
                    startDate: '2026-01-15'
                    endDate: '2026-01-15'
                    countryCode: example_value
                    countrySubDivisionCode: example_value
                    currencyCode: example_value
                    policyId: '500123'
                    reportFormId: '500123'
                    ledgerId: '500123'
                    approvalStatus: example_value
                    approvalStatusId: '500123'
                    paymentStatus: example_value
                    paymentStatusId: '500123'
                    claimedAmount:
                      value: 42.5
                      currencyCode: example_value
                    approvedAmount:
                      value: 42.5
                      currencyCode: example_value
                    reportTotal:
                      value: 42.5
                      currencyCode: example_value
                    amountDueEmployee:
                      value: 42.5
                      currencyCode: example_value
                    userId: '500123'
                    isSubmitted: true
                    isSentBack: true
                    creationDate: '2026-01-15T10:30:00Z'
                    submitDate: '2026-01-15T10:30:00Z'
                    reportVersion: 10
                    customData:
                    - id: abc123
                      value: example_value
                      isValid: '500123'
                    links:
                    - rel: example_value
                      href: https://www.example.com
                      hreflang: example_value
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    patch:
      operationId: updateReport
      summary: Sap Concur Update an Unsubmitted Expense Report
      description: Partially updates an unsubmitted expense report using JSON Merge Patch (RFC 7386). Only fields included in the request body are updated; omitted fields remain unchanged.
      tags:
      - Reports
      parameters:
      - $ref: '#/components/parameters/userID'
      - $ref: '#/components/parameters/contextTypeWritable'
      - $ref: '#/components/parameters/reportId'
      requestBody:
        required: true
        content:
          application/merge-patch+json:
            schema:
              $ref: '#/components/schemas/UpdateReport'
            examples:
              UpdatereportRequestExample:
                summary: Default updateReport request
                x-microcks-default: true
                value:
                  name: Example Title
                  businessPurpose: example_value
                  reportDate: '2026-01-15'
                  startDate: '2026-01-15'
                  endDate: '2026-01-15'
                  countryCode: example_value
                  countrySubDivisionCode: example_value
                  policyId: '500123'
                  customData:
                  - id: abc123
                    value: example_value
                    isValid: '500123'
      responses:
        '204':
          description: Report updated successfully
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /expensereports/v4/reports/{reportId}:
    patch:
      operationId: updateSubmittedReport
      summary: Sap Concur Update a Submitted Expense Report
      description: Partially updates a submitted expense report. Only Company JWT authentication is permitted. Updatable fields are limited to businessPurpose, comment, customData, name, and isPaperReceiptsReceived.
      tags:
      - Reports
      security:
      - bearerAuth: []
      parameters:
      - $ref: '#/components/parameters/reportId'
      requestBody:
        required: true
        content:
          application/merge-patch+json:
            schema:
              $ref: '#/components/schemas/UpdateSubmittedReport'
            examples:
              UpdatesubmittedreportRequestExample:
                summary: Default updateSubmittedReport request
                x-microcks-default: true
                value:
                  name: Example Title
                  businessPurpose: example_value
                  comment: example_value
                  isPaperReceiptsReceived: true
                  customData:
                  - id: abc123
                    value: example_value
                    isValid: '500123'
      responses:
        '204':
          description: Report updated successfully
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    delete:
      operationId: deleteReport
      summary: Sap Concur Delete an Expense Report
      description: Permanently deletes an expense report and all associated expenses, allocations, and comments. Only unsubmitted reports can be deleted.
      tags:
      - Reports
      parameters:
      - $ref: '#/components/parameters/reportId'
      responses:
        '204':
          description: Report deleted successfully
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '500':
          $ref: '#/components/responses/InternalServerError'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /expensereports/v4/reports/{reportId}/formFields:
    get:
      operationId: getReportFormFields
      summary: Sap Concur Retrieve Report Form Field Configuration
      description: Returns the configured form fields for a specific expense report, including field metadata, validation rules, and display properties.
      tags:
      - Reports
      parameters:
      - $ref: '#/components/parameters/reportId'
      - name: policyId
        in: query
        description: Policy identifier to determine applicable form fields
        schema:
          type: string
        example: '500123'
      responses:
        '200':
          description: Form fields retrieved successfully
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/FormField'
              examples:
                Getreportformfields200Example:
                  summary: Default getReportFormFields 200 response
                  x-microcks-default: true
                  value:
                  - id: abc123
                    label: Example Title
                    controlType: example_value
                    dataType: example_value
                    isRequired: true
                    isCustom: true
                    maxLength: 10
                    sequence: 10
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /expensereports/v4/users/{userId}/context/{contextType}/reportsToApprove:
    get:
      operationId: getReportsToApprove
      summary: Sap Concur Retrieve Reports Pending Approval
      description: Returns a list of expense reports awaiting approval for the specified manager, including delegate approvals if requested.
      tags:
      - Reports
      parameters:
      - name: userId
        in: path
        required: true
        description: The unique identifier of the approving manager
        schema:
          type: string
          format: uuid
        example: '500123'
      - name: contextType
        in: path
        required: true
        description: Must be MANAGER for this endpoint
        schema:
          type: string
          enum:
          - MANAGER
        example: MANAGER
      - name: sort
        in: query
        description: Field to sort results by
        schema:
          type: string
        example: example_value
      - name: order
        in: query
        description: Sort order
        schema:
          type: string
          enum:
          - ASC
          - DESC
        example: ASC
      - name: includeDelegateApprovals
        in: query
        description: Whether to include reports delegated for approval
        schema:
          type: boolean
          default: false
        example: true
      responses:
        '200':
          description: Reports to approve retrieved successfully
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ReportToApprove'
              examples:
                Getreportstoapprove200Example:
                  summary: Default getReportsToApprove 200 response
                  x-microcks-default: true
                  value:
                  - reportId: '500123'
                    name: Example Title
                    userId: '500123'
                    approvalStatus: example_value
                    reportTotal:
                      value: 42.5
                      currencyCode: example_value
                    submitDate: '2026-01-15T10:30:00Z'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
components:
  schemas:
    UpdateSubmittedReport:
      type: object
      description: Limited-field JSON Merge Patch for updating a submitted report. Only accessible with Company JWT authentication.
      properties:
        name:
          type: string
          description: The name or title of the expense report
          example: Example Title
        businessPurpose:
          type: string
          description: The business justification
          example: example_value
        comment:
          type: string
          description: A comment to accompany the update
          example: example_value
        isPaperReceiptsReceived:
          type: boolean
          description: Whether physical receipts have been received
          example: true
        customData:
          type: array
          items:
            $ref: '#/components/schemas/CustomData'
          example: []
    FormField:
      type: object
      description: A configured form field with its metadata, display properties, and validation rules.
      properties:
        id:
          type: string
          description: The field identifier
          example: abc123
        label:
          type: string
          description: The localized display label
          example: Example Title
        controlType:
          type: string
          description: The UI control type for rendering
          example: example_value
        dataType:
          type: string
          description: The data type of the field value
          example: example_value
        isRequired:
          type: boolean
          description: Whether the field is mandatory
          example: true
        isCustom:
          type: boolean
          description: Whether this is a customer-configured custom field
          example: true
        maxLength:
          type: integer
          description: Maximum allowed character length
          example: 10
        sequence:
          type: integer
          description: Display order sequence number
          example: 10
    CustomData:
      type: object
      description: A custom field value configured by the organization. Field IDs follow patterns like custom1-custom40 and orgUnit1-orgUnit6.
      required:
      - id
      properties:
        id:
          type: string
          description: The identifier of the custom field (e.g., custom1, orgUnit1)
          examples:
          - custom1
        value:
          type: string
          description: The value assigned to the custom field
          maxLength: 48
          examples:
          - Marketing Department
        isValid:
          type: boolean
          description: Whether the current value passes validation rules
          example: '500123'
    Link:
      type: object
      description: A HATEOAS hypermedia link for resource navigation
      properties:
        rel:
          type: string
          description: The link relation type
          example: example_value
        href:
          type: string
          format: uri
          description: The target URI
          example: https://www.example.com
        hreflang:
          type: string
          description: Language of the target resource
          example: example_value
    ErrorResponse:
      type: object
      description: Standard error response
      properties:
        errorId:
          type: string
          description: Unique identifier for this error occurrence
          example: '500123'
        errorMessage:
          type: string
          description: Human-readable error description
          example: example_value
        httpStatus:
          type: string
          description: The HTTP status code as a string
          example: example_value
        path:
          type: string
          description: The request path that triggered the error
          example: example_value
        timestamp:
          type: string
          format: date-time
          description: When the error occurred
          example: '2026-01-15T10:30:00Z'
        validationErrors:
          type: array
          description: Detailed field-level validation failures
          items:
            type: object
            properties:
              source:
                type: string
                description: The field or parameter that failed validation
              message:
                type: string
                description: Description of the validation failure
          example: []
    NewReport:
      type: object
      description: Request body for creating a new expense report
      required:
      - name
      - currencyCode
      - policyId
      properties:
        name:
          type: string
          description: The name or title of the expense report
          examples:
          - Q1 2026 Business Travel
        businessPurpose:
          type: string
          description: The business justification for the expenses
          examples:
          - Client meetings in New York
        reportDate:
          type: string
          format: date
          description: The date of the report (YYYY-MM-DD)
          example: '2026-01-15'
        startDate:
          type: string
          format: date
          description: The start date of the reporting period
          example: '2026-01-15'
        endDate:
          type: string
          format: date
          description: The end date of the reporting period
          example: '2026-01-15'
        currencyCode:
          type: string
          description: ISO 4217 three-letter currency code for the report
          minLength: 3
          maxLength: 3
          examples:
          - USD
        countryCode:
          type: string
          description: ISO 3166-1 alpha-2 country code
          minLength: 2
          maxLength: 2
          examples:
          - US
        countrySubDivisionCode:
          type: string
          description: ISO 3166-2 subdivision code (state/province)
          example: example_value
        policyId:
          type: string
          description: The identifier of the expense policy to apply
          example: '500123'
        customData:
          type: array
          description: Custom field values for the report header
          items:
            $ref: '#/components/schemas/CustomData'
          example: []
    ReportToApprove:
      type: object
      description: A summary of an expense report awaiting approval
      properties:
        reportId:
          type: string
          description: Unique identifier of the report
          example: '500123'
        name:
          type: string
          description: The report name
          example: Example Title
        userId:
          type: string
          format: uuid
          description: The report owner's user ID
          example: '500123'
        approvalStatus:
          type: string
          description: Current approval status
          example: example_value
        reportTotal:
          $ref: '#/components/schemas/Amount'
        submitDate:
          type: string
          format: date-time
          description: When the report was submitted
          example: '2026-01-15T10:30:00Z'
    Amount:
      type: object
      description: A monetary amount with its currency code
      required:
      - value
      - currencyCode
      properties:
        value:
          type: number
          format: double
          description: The numeric monetary amount
          examples:
          - 250.0
        currencyCode:
          type: string
          description: ISO 4217 three-letter currency code
          minLength: 3
          maxLength: 3
          examples:
          - USD
    UpdateReport:
      type: object
      description: JSON Merge Patch body for updating an unsubmitted report. All fields from NewReport are updatable.
      properties:
        name:
          type: string
          description: The name or title of the expense report
          example: Example Title
        businessPurpose:
          type: string
          description: The business justification for the expenses
          example: example_value
        reportDate:
          type: string
          format: date
          example: '2026-01-15'
        startDate:
          type: string
          format: date
          example: '2026-01-15'
        endDate:
          type: string
          format: date
          example: '2026-01-15'
        countryCode:
          type: string
          minLength: 2
          maxLength: 2
          example: example_value
        countrySubDivisionCode:
          type: string
          example: example_value
        policyId:
          type: string
          example: '500123'
        customData:
          type: array
          items:
            $ref: '#/components/schemas/CustomData'
          example: []
    ResourceCreatedResponse:
      type: object
      description: Response returned when a resource is successfully created
      properties:
        uri:
          type: string
          format: uri
          description: The URI of the newly created resource
          example: https://www.example.com
    ReportDetails:
      type: object
      description: The full representation of an expense report
      required:
      - reportId
      - name
      - currencyCode
      - policyId
      - approvalStatus
      - paymentStatus
      - userId
      - isSubmitted
      - creationDate
      - reportVersion
      properties:
        reportId:
          type: string
          description: Unique identifier of the expense report
          example: '500123'
        name:
          type: string
          description: The name or title of the report
          example: Example Title
        businessPurpose:
          type: string
          description: The business justification for the expenses
          example: example_value
        reportDate:
          type: string
          format: date
          description: The date of the report
          example: '2026-01-15'
        startDate:
          type: string
          format: date
          description: The start date of the reporting period
          example: '2026-01-15'
        endDate:
          type: string
          format: date
          description: The end date of the reporting period
          example: '2026-01-15'
        countryCode:
          type: string
          description: ISO 3166-1 alpha-2 country code
          example: example_value
        countrySubDivisionCode:
          type: string
          description: ISO 3166-2 subdivision code
          example: example_value
        currencyCode:
          type: string
          description: ISO 4217 three-letter currency code
          example: example_value
        policyId:
          type: string
          description: The expense policy applied to this report
          example: '500123'
        reportFormId:
          type: string
          description: The form template used for this report
          example: '500123'
        ledgerId:
          type: string
          description: The financial ledger associated with this report
          example: '500123'
        approvalStatus:
          type: string
          description: Human-readable approval status label
          examples:
          - Not Submitted
          - Submitted & Pending Approval
          - Approved
        approvalStatusId:
          type: string
          description: Machine-readable approval status code
          examples:
          - A_NOTF
          - A_PEND
          - A_APPR
        paymentStatus:
          type: string
          description: Human-readable payment status label
          examples:
          - Not Paid
          - Payment Confirmed
        paymentStatusId:
          type: string
          description: Machine-readable payment status code
          example: '500123'
        claimedAmount:
          $ref: '#/components/schemas/Amount'
        approvedAmount:
          $ref: '#/components/schemas/Amount'
        reportTotal:
          $ref: '#/components/schemas/Amount'
        amountDueEmployee:
          $ref: '#/components/schemas/Amount'
        userId:
          type: string
          format: uuid
          description: The unique identifier of the report owner
          example: '500123'
        isSubmitted:
          type: boolean
          description: Whether the report has been submitted
          example: true
        isSentBack:
          type: boolean
          description: Whether the report was sent back for corrections
          example: true
        creationDate:
          type: string
          format: date-time
          description: When the report was created (ISO 8601)
          example: '2026-01-15T10:30:00Z'
        submitDate:
          type: string
          format: date-time
          description: When the report was last submitted (ISO 8601)
          example: '2026-01-15T10:30:00Z'
        reportVersion:
          type: integer
          format: int32
          description: The version number, incremented on each modification
          example: 10
        customData:
          type: array
          description: Custom field values on the report header
          items:
            $ref: '#/components/schemas/CustomData'
          example: []
        links:
          type: array
          description: HATEOAS navigation links
          items:
            $ref: '#/components/schemas/Link'
          example: []
  responses:
    NotFound:
      description: The requested resource (report, expense, allocation, or user) was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    InternalServerError:
      description: An unexpected server error occurred. Retry the request or contact SAP Concur support with the Concur-CorrelationId header.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Forbidden:
      description: The authenticated user does not have the required scope or permission to perform this operation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Unauthorized:
      description: Authentication failed. The bearer token is missing, expired, or invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Conflict:
      description: The request conflicts with the current state of the resource. For example, attempting to delete a submitted report or approve a report that has already been processed.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    BadRequest:
      description: The request was malformed or contained invalid parameters. Check the validationErrors array for field-level details.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  parameters:
    reportId:
      name: reportId
      in: path
      required: true
      description: The unique identifier of the expense report
      schema:
        type: string
    contextType:
      name: contextType
      in: path
      required: true
      description: The access context for the request. TRAVELER for the report owner, MANAGER for an approver, PROXY for a delegate.
      schema:
        type: string
        enum:
        - TRAVELER
        - MANAGER
        - PROXY
    contextTypeWritable:
      name: contextType
      in: path
      required: true
      description: The access context for write operations. TRAVELER for the report owner or PROXY for a delegate acting on behalf of the owner.
      schema:
        type: string
        enum:
        - TRAVELER
        - PROXY
    userID:
      name: userID
      in: path
      required: true
      description: The unique identifier (UUID) of the SAP Concur user. Obtain via the Identity v4 API.
      schema:
        type: string
        format: uuid
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: OAuth 2.0 Bearer token. Obtain tokens via the SAP Concur Authentication API using either Company or User level grants. Required scopes vary by operation.