Skip to content
Last updated

Configure a Reporting API request

Configure an extractor using a template

Jumpstart your configuration by creating a custom extractor by uploading the extractor template in Celonis that you can download here. If you do not want to use the extractor template in Celonis and prefer to manully configure your extractor, proceed to the next section.

In the New custom REST API extractor window, select the "Import From File" option and upload the template.

Screenshot showing the New custom REST API Extractor window from the Celonis Platform.

After the extractor is created, you will find that the Endpoint has been configured for you, including "elements", "facets", and an example "hierarchy" for the Processes facet.

Screenshot showing the menu used to configure endpoints for an extractor.

To create the connection with your environment, go to the “Data connection” tab and fill in the empty fields using the values listed below.

Screenshot of the Data connection screen used to set up a new test data connection.
Field NameDetailsExpected Value
NameThe name of your connection.Not prefilled, free-text value.
API URLURL that identifies the API provider.Enter the URL for your specific region:
  • https://api-reporting.symbio.cloud/ - Europe region (default)
  • https://api-reporting.us-1.symbio.cloud/ - U.S. region
  • https://api-reporting.jp-1.symbio.cloud/ - Japan region
Tenant IDThis is a unique ID to identify your data location. Currently it can only be found by opening either the Navigator or Admin App and checking the URL of the page after it has fully loaded.Not prefilled, you can find it via:

the first GUID of the Navigator URL: https://navigator.symbio.cloud/celonis/c592ade4-4a5a-4804-a6e0-267f6a164fc6
or
the “tenant” section of the Admin App URL: https://admin.symbio.cloud/?company=celonis&tenant=c592ade4-4a5a-4804-a6e0-267f6a164fc6
API KeyThe API key can be generated using the Admin App within the “Reporting” section.Format of theAPI key. Not prefilled.

Once your connection is configured, you will need to wait for the fullfetch cycle to run overnight before any data is shown or the nested tables are displayed. See After the connection is created below for more inforation.

For more information on setting up this connection, see Creating a custom REST API extractor / using a pre-built template.

Configure an extractor using an API connection

This section provides an example of how a custom connection would look when using the Reporting API.

In Data integration, the user can go to the Extractor builder and build their own extractor based on an API. Here, we will use our API to set up the connection.

To use the API connection, your configuration should look like this:

Select “API Key Authentication” as the Authentication Method.

Screenshot showing the Authentication screen in the Celonis Platform which is used to select the authentication method for the data source used by this API.Screenshot showing an example of the variables assigned to an API.

In the API URL field, add the applicable value from the table below based on your region.

Available API domains

The server region of the reporting API will match the region of your Admin App URL.

Domain RegionValueDescription
Europehttps://api-reporting.symbio.cloud/For customers deployed to the Europe region.
U.S.https://api-reporting.us-1.symbio.cloud/For customers deployed to the U.S. region.
Japanhttps://api-reporting.jp-1.symbio.cloud/For customers deployed to the Japan region.
Screenshot showing an example of a fully configured data connection.

In the Pagination Method section, enter "skip" as Offset Parameter and "take" as Limit Parameter. Then set a default limit. Note that the maximum limit is 100, which will be applied if no limit is set.

Screenshot showing the Configure Request screen and the values to enter in the Pagination Method section.

After the connection is created

After creating a successful connection, you will initially not see any data and you will not find all the nested tables. Since the API is based on the fullfetch cycle, you will need to wait overnight before you start to see data coming through. Check the extractor after the cycle has been run and then click the Generate Response button to view the nested tables.

Note

Make sure that “items” is selected from the Response root dropdown before generating the response. The default value for this field is “Entire Response (default)” which would cause further nesting of all tables and result in the transformation SQL not working properly.

Screenshot of the Configure Response screen with the location of the Generate Response button highlighted.

Troubleshooting the response

After running the response, you may encounter issues with your results.

Extraction failed

In some cases, you might see that your extraction failed even though your extraction connection test was successful. You might see a warning in your logs that looks like this:

Screenshot showing an example of the error messages that may be included in the extraction logs.

To resolve this issue, add more time to the Socket Timeline field within your extraction configuration. This should allow you to extract the data.

Screenshot showing where to adjust the Socket Timeout setting within a configuration.

Missing properties in the response results

Clicking Generate Response may result in incomplete JSON files being created. For example, the API may return five JSONs for the “automation” facet, which would all be missing properties, such as those from the “processes” facet items. This could result in attributes (such as shortDescription) or even full tables (e.g. elements$versions$related$locations) missing from the files following extraction.

For example, if you fetch all Elements but notice that the Attribute myNewAttribute is missing even though it is present in one or more Elements:

cpm-missing-attribute.png

To resolve this issue, you will need to manually add the missing Attribute. The easiest way to do this is by copying an existing Attribute in the Preview window and then changing its Name and Value to match the missing Attribute:

cpm-missing-attribute-fix.png

Setting the Primary Key

After generating the response, you may also need to set the Primary Keys for some of your generated extraction tables (see the list below). To set the Primary Keys, expand the table configuration and then select the Primary Key checkbox for each column that you want to assign.

cpm-primary-key.png

Assigning Primary Keys creates an additional property within each Child table that can be used to refer back to the Parent item. For example, selecting id from elements table as a Primary Key will create a new property named elements_id in elements$content and elements$versions.

Primary Keys to assign

The following properties should be assigned as Primary Keys in the corresponding table:

  • “elements”
    • “id”
  • “elements$content”
    • The generated “elements_id”
    • “id”
    • “versionId”
  • “elements$versions”
    • The generated “elements_id”
    • “versionId”
  • “elements$versions$content”
    • The generated “elements$versions_elements_id”
    • The generated “elements$versions_versionId”
    • “id”
    • “versionId”

Sample data transformation

With this data connection, you can then create transformation to make usable data tables. Here is an example transformation script:


CREATE OR REPLACE VIEW `Element` AS
SELECT
  /* Unique ID for the Element */
  CASE
    WHEN `T`.`source_table` = 'elements'
    THEN `T`.`original_id` /* For non-versionable elements */
    WHEN `T`.`source_table` = 'elements$versions'
    THEN `T`.`original_version_id` /* For versionable elements */
    WHEN `T`.`source_table` IN ('elements$content', 'elements$versions$content')
    THEN `T`.`original_id` /* For content items (their own 'id' is unique GUID) */
  END AS `_id`,
  
  `T`.`source_table`, /* Helps identify where the record originated ('elements', 'elements$versions', 'elements$content', 'elements$versions$content') */
  `T`.`original_id`, /* Original 'id' from the source table (PK for elements and content) */
  `T`.`original_version_id`, /* Original 'versionId' from elements$versions (PK for versions) */
  `T`.`parent_fk_id`, /* Original FK from content tables to their parent element/version */
  
  `T`.`supportsVariants`,
  `T`.`supportsVersions`, /* FALSE for content objects */
  `T`.`containerPermaLink`,
  `T`.`facetName`,
  `T`.`permaLink`,
  `T`.`type`,
  `T`.`variantId`,
  `T`.`creationId`,
  /* Common Attributes (renamed for consistency) */
  `T`.`attributes_changedOn`, 
  `T`.`attributes_createdOn`,
  `T`.`attributes_gotoUrl`,
  `T`.`attributes_name`,
  `T`.`attributes_state1`,
  `T`.`attributes_description`,
  
  `T`.`attributes_isReleased`, /* Attributes specific to elements$versions (will be NULL for non-versioned elements and all content) */
  `T`.`attributes_isLastInProcessOrReleased`,
  `T`.`attributes_majorVersion`,
  `T`.`attributes_minorVersion`,
  `T`.`attributes_reviewDate`,
  `T`.`attributes_validFrom`,
  `T`.`attributes_validUntil`,
  `T`.`attributes_version`,
  `T`.`attributes_reasonForRevision`,
  `T`.`attributes_imageUrl`,
  `T`.`attributes_stereotype`,
  `T`.`attributes_id_from_version`, /* The 'id' attribute from versions */
  `T`.`stereotype` /* The 'stereotype' column from elements$versions */
FROM (
  /* Data from 'elements' table (non-versionable parent elements) */
  SELECT
    'elements' AS `source_table`,
    
    `e`.`id` AS `original_id`,
    '00000000-0000-0000-0000-000000000000' AS `original_version_id`,
    NULL AS `parent_fk_id`,
    
    `e`.`supportsVariants`,
    `e`.`supportsVersions`,
    `e`.`containerPermaLink`,
    `e`.`facetName`,
    `e`.`permaLink`,
    `e`.`type`,
    `e`.`variantId`,
    `e`.`creationId`,
    
    `e`.`attributes$changedOn$127` AS `attributes_changedOn`,
    `e`.`attributes$createdOn$127` AS `attributes_createdOn`,
    `e`.`attributes$gotoUrl$1033` AS `attributes_gotoUrl`,
    `e`.`attributes$name$1033` AS `attributes_name`,
    `e`.`attributes$state1$127` AS `attributes_state1`,
    `e`.`attributes$description$1033` AS `attributes_description`,
    NULL AS `attributes_isReleased`,
    NULL AS `attributes_isLastInProcessOrReleased`,
    NULL AS `attributes_majorVersion`,
    NULL AS `attributes_minorVersion`,
    NULL AS `attributes_reviewDate`,
    NULL AS `attributes_validFrom`,
    NULL AS `attributes_validUntil`,
    NULL AS `attributes_version`,
    NULL AS `attributes_reasonForRevision`,
    NULL AS `attributes_imageUrl`,
    NULL AS `attributes_stereotype`,
    NULL AS `attributes_id_from_version`,
    NULL AS `stereotype`
  FROM `elements` AS `e`
  WHERE
    `e`.`supportsVersions` IS FALSE /* Only non-versionable top-level elements */
  
  UNION ALL
  
  /* Data from 'elements$versions' table (versionable parent elements - specific versions) */
  SELECT
    'elements$versions' AS `source_table`,
    
    `ev`.`id` AS `original_id`, /* This is the FK to elements.id, but versionId is the primary identifier for this record */
    `ev`.`versionId` AS `original_version_id`,
    NULL AS `parent_fk_id`,
    
    NULL AS `supportsVariants`,
    NULL AS `supportsVersions`,
    `ev`.`containerPermaLink`,
    `ev`.`facetName`,
    `ev`.`permaLink`,
    `ev`.`type`,
    `ev`.`variantId`,
    `ev`.`creationId`,
    
    `ev`.`attributes$changedOn$127` AS `attributes_changedOn`,
    `ev`.`attributes$createdOn$127` AS `attributes_createdOn`,
    `ev`.`attributes$gotoUrl$1033` AS `attributes_gotoUrl`,
    `ev`.`attributes$name$1033` AS `attributes_name`,
    `ev`.`attributes$state1$127` AS `attributes_state1`,
    `ev`.`attributes$description$1033` AS `attributes_description`,
    `ev`.`attributes$isReleased$127` AS `attributes_isReleased`,
    `ev`.`attributes$isLastInProcessOrReleased$127` AS `attributes_isLastInProcessOrReleased`,
    `ev`.`attributes$majorVersion$127` AS `attributes_majorVersion`,
    `ev`.`attributes$minorVersion$127` AS `attributes_minorVersion`,
    `ev`.`attributes$reviewDate$127` AS `attributes_reviewDate`,
    `ev`.`attributes$validFrom$127` AS `attributes_validFrom`,
    `ev`.`attributes$validUntil$127` AS `attributes_validUntil`,
    `ev`.`attributes$version$127` AS `attributes_version`,
    `ev`.`attributes$reasonForRevision$127` AS `attributes_reasonForRevision`,
    `ev`.`attributes$imageUrl$127` AS `attributes_imageUrl`,
    `ev`.`attributes$stereotype$127` AS `attributes_stereotype`,
    `ev`.`attributes$id$127` AS `attributes_id_from_version`,
    `ev`.`stereotype`
  FROM `elements$versions` AS `ev`
  WHERE
    `ev`.`versionId` IS NOT NULL /* Only valid versions */
) AS `T`;


CREATE OR REPLACE VIEW `Content` AS
(
  SELECT `ec`.`elements_id` as `parent_id`, '00000000-0000-0000-0000-000000000000' as `parent_version_id`, `e`.`original_id` as `content_id`, 
  case 
    when `e`.`original_version_id` is null then '00000000-0000-0000-0000-000000000000'
    else `e`.`original_version_id`
  end as `content_version_id`, 
  `ec`.`ordering` as `sorting`
  FROM `elements$content` as `ec`
  LEFT JOIN `Element` as `e` 
    ON `ec`.`id` = `e`.`original_id`
    AND (
      (`ec`.`versionId` IS NULL AND (`e`.`original_version_id` IS NULL or `e`.`original_version_id` = '00000000-0000-0000-0000-000000000000'))
      OR
      (`ec`.`versionId` IS NOT NULL AND `ec`.`versionId` = `e`.`original_version_id`)
    )
  WHERE `e`.`original_id` IS NOT NULL
  UNION ALL
  SELECT `evc`.`elements$versions_elements_id` as `parent_id`, `evc`.`elements$versions_versionId` as `parent_version_id`, `e`.`original_id` as `content_id`, 
  case 
    when `e`.`original_version_id` is null then '00000000-0000-0000-0000-000000000000'
    else `e`.`original_version_id`
  end as `content_version_id`, 
  `evc`.`ordering` as `sorting`
  FROM `elements$versions$content` as `evc`
  LEFT JOIN `Element` as `e` 
    ON `evc`.`id` = `e`.`original_id`
    AND (
      (`evc`.`versionId` IS NULL AND (`e`.`original_version_id` IS NULL or `e`.`original_version_id` = '00000000-0000-0000-0000-000000000000'))
      OR
      (`evc`.`versionId` IS NOT NULL AND `evc`.`versionId` = `e`.`original_version_id`)
    )
  WHERE `e`.`original_id` IS NOT NULL
);

Sample report building

With the connection and transformation set up, you then are able to make use of the data within your Analytical tools. Here is an example of how it would look using Celonis Views.

Screenshot showing an example of the type of reports that can be created in a Studio View using your new configuration.