<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->

# Commercial support

As every Apache project, so is `Apache IoTDB` generally available and usable by anyone free of charge.

Also does the `Apache IoTDB Community` offer free support on the official project `Mailinglist`. This support is however, done voluntarily by the community, so there are no service-level-agreements, guaranteed reaction times or guarantee that an issue will be addressed or solved.

If you or your business has higher demands on guaranteed availability and execution of support requests, the following individuals and companies have commercial support offerings.

The information provided here was provided by the entities named, and is not verified (except the `Involvement Level`), updated or endorsed by the `Apache Software Foundation` or the `Apache IoTDB` project.

## Commercial Support Providers for Apache IoTDB

|                                                                                                                                                                                                                                                                                   | Name                                                       | <span style="display:block;min-width:360px;">Description</span>                                                                                                                                                                                                 | Contact Person(s) | Contact Email(s)                  | Contact Phone(s) | Involvement Level |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | ----------------------------------- | ------------------ | ------------------- |
| <span style="display:inline-flex;width:88px;height:34px;align-items:center;justify-content:center;"><img src="/img/commercial-support-timecho.png" alt="Timecho logo" style="max-width:80px;max-height:28px;width:auto;height:auto;object-fit:contain;" /></span> | [Timecho Europe GmbH](https://www.timecho-global.com/)        | <span style="display:block;min-width:360px;line-height:1.55;">Enterprise-grade products and solutions, technical support/ consulting/ training, deployment and migration, performance tuning, training, custom development, protocol/ connector/ driver development, time-series foundation model services, and AI services.</span> | Pengcheng Zheng    | pengcheng.zheng@timecho.com       | -                | Committer         |
| <span style="display:inline-flex;width:88px;height:34px;align-items:center;justify-content:center;"><img src="/img/commercial-support-pragmatic.png" alt="pragmatic industries logo" style="max-width:80px;max-height:28px;width:auto;height:auto;object-fit:contain;" /></span> | [pragmatic industries GmbH](https://pragmaticindustries.com/)| <span style="display:block;min-width:360px;line-height:1.55;">Technical support/ consulting/ training, deployment and migration, custom development</span>                                                                                                                                                                          | Julian Feinauer   | j.feinauer@pragmaticindustries.de | -                | PMC Member        |
| <span style="display:inline-flex;width:88px;height:34px;align-items:center;justify-content:center;"><img src="/img/commercial-support-toddy.png" alt="ToddySoft logo" style="max-width:80px;max-height:28px;width:auto;height:auto;object-fit:contain;" /></span> | [ToddySoft GmbH](https://toddysoft.com/)| <span style="display:block;min-width:360px;line-height:1.55;">Technical support/ consulting/ training, deployment and migration, protocol/ connector/ driver development, custom development</span>                                                                                                                                 | Christofer Dutz   | christofer.dutz@toddysoft.com     | -                | PMC Member        |

If you discover new IoTDB commercial support services and would like them to be included, please [report them to the community](mailto:dev@iotdb.apache.org).

