Documentation

Use the HTTP API and client libraries to write data

Use the /api/v3/write_lp HTTP API endpoint and InfluxDB v3 API clients to write points as line protocol data to InfluxDB 3 Core.

Use the /api/v3/write_lp endpoint

InfluxDB 3 Core adds the /api/v3/write_lp endpoint.

POST /api/v3/write_lp?db=mydb&precision=nanosecond&accept_partial=true&no_sync=false
  • Copy
  • Fill window

This endpoint accepts the same line protocol syntax as previous versions, and supports the following parameters:

  • ?accept_partial=<BOOLEAN>: Accept or reject partial writes (default is true).
  • ?no_sync=<BOOLEAN>: Control when writes are acknowledged:
    • no_sync=true: Acknowledge writes before WAL persistence completes.
    • no_sync=false: Acknowledges writes after WAL persistence completes (default).
  • ?precision=<PRECISION>: Specify the precision of the timestamp. The default is nanosecond precision.

For more information about the parameters, see Write data.

InfluxData provides supported InfluxDB 3 client libraries that you can integrate with your code to construct data as time series points, and then write them as line protocol to an InfluxDB 3 Core database. For more information, see how to use InfluxDB client libraries to write data.

Example: write data using the /api/v3 HTTP API

The following examples show how to write data using curl and the /api/3/write_lp HTTP endpoint. To show the difference between accepting and rejecting partial writes, line 2 in the example contains a string value ("hi") for a float field (temp).

Partial write of line protocol occurred

With accept_partial=true (default):

curl -v "http://localhost:8181/api/v3/write_lp?db=sensors&precision=auto" \
  --data-raw 'home,room=Sunroom temp=96
home,room=Sunroom temp="hi"'
  • Copy
  • Fill window

The response is the following:

< HTTP/1.1 400 Bad Request
...
{
  "error": "partial write of line protocol occurred",
  "data": [
    {
      "original_line": "home,room=Sunroom temp=hi",
      "line_number": 2,
      "error_message": "invalid column type for column 'temp', expected iox::column_type::field::float, got iox::column_type::field::string"
    }
  ]
}
  • Copy
  • Fill window

Line 1 is written and queryable. Line 2 is rejected. The response is an HTTP error (400) status, and the response body contains the error message partial write of line protocol occurred with details about the problem line.

Parsing failed for write_lp endpoint

With accept_partial=false:

curl -v "http://localhost:8181/api/v3/write_lp?db=sensors&precision=auto&accept_partial=false" \
  --data-raw 'home,room=Sunroom temp=96
home,room=Sunroom temp="hi"'
  • Copy
  • Fill window

The response is the following:

< HTTP/1.1 400 Bad Request
...
{
  "error": "parsing failed for write_lp endpoint",
  "data": {
    "original_line": "home,room=Sunroom temp=hi",
    "line_number": 2,
    "error_message": "invalid column type for column 'temp', expected iox::column_type::field::float, got iox::column_type::field::string"
  }
}
  • Copy
  • Fill window

InfluxDB rejects all points in the batch. The response is an HTTP error (400) status, and the response body contains parsing failed for write_lp endpoint and details about the problem line.

For more information about the ingest path and data flow, see Data durability.

Write responses

By default, InfluxDB acknowledges writes after flushing the WAL file to the Object store (occurring every second). For high write throughput, you can send multiple concurrent write requests.

Use no_sync for immediate write responses

To reduce the latency of writes, use the no_sync write option, which acknowledges writes before WAL persistence completes. When no_sync=true, InfluxDB validates the data, writes the data to the WAL, and then immediately responds to the client, without waiting for persistence to the Object store.

Using no_sync=true is best when prioritizing high-throughput writes over absolute durability.

  • Default behavior (no_sync=false): Waits for data to be written to the Object store before acknowledging the write. Reduces the risk of data loss, but increases the latency of the response.
  • With no_sync=true: Reduces write latency, but increases the risk of data loss in case of a crash before WAL persistence.

Immediate write using the HTTP API

The no_sync parameter controls when writes are acknowledged–for example:

curl "http://localhost:8181/api/v3/write_lp?db=sensors&precision=auto&no_sync=true" \
  --data-raw "home,room=Sunroom temp=96"
  • Copy
  • Fill window

Use API client libraries

Use InfluxDB 3 client libraries that integrate with your code to construct data as time series points, and then write them as line protocol to an InfluxDB 3 Core database.

Construct line protocol

With a basic understanding of line protocol, you can construct line protocol data and write it to InfluxDB 3 Core.

All InfluxDB client libraries write data in line protocol format to InfluxDB. Client library write methods let you provide data as raw line protocol or as Point objects that the client library converts to line protocol. If your program creates the data you write to InfluxDB, use the client library Point interface to take advantage of type safety in your program.

Example home schema

Consider a use case where you collect data from sensors in your home. Each sensor collects temperature, humidity, and carbon monoxide readings.

To collect this data, use the following schema:

  • table: home
    • tags
      • room: Living Room or Kitchen
    • fields
      • temp: temperature in °C (float)
      • hum: percent humidity (float)
      • co: carbon monoxide in parts per million (integer)
    • timestamp: Unix timestamp in second precision

The following example shows how to construct and write points that follow the home schema.

Set up your project

After setting up InfluxDB 3 Core and your project, you should have the following:

  • InfluxDB 3 Core credentials:

    • Database

    • Authorization token

      While in beta, InfluxDB 3 Core does not require an authorization token.

    • InfluxDB 3 Core URL

  • A directory for your project.

  • Credentials stored as environment variables or in a project configuration file–for example, a .env (“dotenv”) file.

  • Client libraries installed for writing data to InfluxDB 3 Core.

The following examples use InfluxDB 3 client libraries to show how to construct Point objects that follow the example home schema, and then write the data as line protocol to an InfluxDB 3 Core database.

The following steps set up a Go project using the InfluxDB 3 Go client:

  1. Install Go 1.13 or later.

  2. Create a directory for your Go module and change to the directory–for example:

    mkdir iot-starter-go && cd $_
    
    • Copy
    • Fill window
  3. Initialize a Go module–for example:

    go mod init iot-starter
    
    • Copy
    • Fill window
  4. Install influxdb3-go, which provides the InfluxDB influxdb3 Go client library module.

    go get github.com/InfluxCommunity/influxdb3-go/v2
    
    • Copy
    • Fill window

The following steps set up a JavaScript project using the InfluxDB 3 JavaScript client.

  1. Install Node.js.

  2. Create a directory for your JavaScript project and change to the directory–for example:

    mkdir -p iot-starter-js && cd $_
    
    • Copy
    • Fill window
  3. Initialize a project–for example, using npm:

    npm init
    
    • Copy
    • Fill window
  4. Install the @influxdata/influxdb3-client InfluxDB 3 JavaScript client library.

    npm install @influxdata/influxdb3-client
    
    • Copy
    • Fill window

The following steps set up a Python project using the InfluxDB 3 Python client:

  1. Install Python

  2. Inside of your project directory, create a directory for your Python module and change to the module directory–for example:

    mkdir -p iot-starter-py && cd $_
    
    • Copy
    • Fill window
  3. Optional, but recommended: Use venv or conda to activate a virtual environment for installing and executing code–for example, enter the following command using venv to create and activate a virtual environment for the project:

    python3 -m venv envs/iot-starter && source ./envs/iot-starter/bin/activate
    
    • Copy
    • Fill window
  4. Install influxdb3-python, which provides the InfluxDB influxdb_client_3 Python client library module and also installs the pyarrow package for working with Arrow data.

    pip install influxdb3-python
    
    • Copy
    • Fill window

Construct points and write line protocol

Client libraries provide one or more Point constructor methods. Some libraries support language-native data structures, such as Go’s struct, for creating points.

  1. Create a file for your module–for example: main.go.

  2. In main.go, enter the following sample code:

    package main
    
    import (
     "context"
     "os"
     "fmt"
     "time"
     "github.com/InfluxCommunity/influxdb3-go/v2/influxdb3"
     "github.com/influxdata/line-protocol/v2/lineprotocol"
    )
    
    func Write() error {
      url := os.Getenv("INFLUX_HOST")
      token := os.Getenv("INFLUX_TOKEN")
      database := os.Getenv("INFLUX_DATABASE")
    
      // To instantiate a client, call New() with InfluxDB credentials.
      client, err := influxdb3.New(influxdb3.ClientConfig{
       Host: url,
       Token: token,
       Database: database,
      })
    
      /** Use a deferred function to ensure the client is closed when the
        * function returns.
       **/
      defer func (client *influxdb3.Client)  {
       err = client.Close()
       if err != nil {
         panic(err)
       }
      }(client)
    
      /** Use the NewPoint method to construct a point.
        * NewPoint(measurement, tags map, fields map, time)
       **/
      point := influxdb3.NewPoint("home",
         map[string]string{
           "room": "Living Room",
         },
         map[string]any{
           "temp": 24.5,
           "hum":  40.5,
           "co":   15i},
         time.Now(),
       )
    
      /** Use the NewPointWithMeasurement method to construct a point with
        * method chaining.
       **/
      point2 := influxdb3.NewPointWithMeasurement("home").
       SetTag("room", "Living Room").
       SetField("temp", 23.5).
       SetField("hum", 38.0).
       SetField("co",  16i).
       SetTimestamp(time.Now())
    
      fmt.Println("Writing points")
      points := []*influxdb3.Point{point, point2}
    
      /** Write points to InfluxDB.
        * You can specify WriteOptions, such as Gzip threshold,
        * default tags, and timestamp precision. Default precision is lineprotocol.Nanosecond
       **/
      err = client.WritePoints(context.Background(), points,
        influxdb3.WithPrecision(lineprotocol.Second))
      return nil
    }
    
    func main() {
      Write()
    }
    
    • Copy
    • Fill window
  3. To run the module and write the data to your InfluxDB 3 Core database, enter the following command in your terminal:

    go run main.go
    
    • Copy
    • Fill window
  1. Create a file for your module–for example: write-points.js.

  2. In write-points.js, enter the following sample code:

    // write-points.js
    import { InfluxDBClient, Point } from '@influxdata/influxdb3-client';
    
    /**
     * Set InfluxDB credentials.
     */
    const host = process.env.INFLUX_HOST ?? '';
    const database = process.env.INFLUX_DATABASE;
    const token = process.env.INFLUX_TOKEN;
    
    /**
     * Write line protocol to InfluxDB using the JavaScript client library.
     */
    export async function writePoints() {
      /**
       * Instantiate an InfluxDBClient.
       * Provide the host URL and the database token.
       */
      const client = new InfluxDBClient({ host, token });
    
      /** Use the fluent interface with chained methods to construct Points. */
      const point = Point.measurement('home')
        .setTag('room', 'Living Room')
        .setFloatField('temp', 22.2)
        .setFloatField('hum', 35.5)
        .setIntegerField('co', 7)
        .setTimestamp(new Date().getTime() / 1000);
    
      const point2 = Point.measurement('home')
        .setTag('room', 'Kitchen')
        .setFloatField('temp', 21.0)
        .setFloatField('hum', 35.9)
        .setIntegerField('co', 0)
        .setTimestamp(new Date().getTime() / 1000);
    
      /** Write points to InfluxDB.
       * The write method accepts an array of points, the target database, and
       * an optional configuration object.
       * You can specify WriteOptions, such as Gzip threshold, default tags,
       * and timestamp precision. Default precision is lineprotocol.Nanosecond
       **/
    
      try {
        await client.write([point, point2], database, '', { precision: 's' });
        console.log('Data has been written successfully!');
      } catch (error) {
        console.error(`Error writing data to InfluxDB: ${error.body}`);
      }
    
      client.close();
    }
    
    writePoints();
    
    • Copy
    • Fill window
  3. To run the module and write the data to your {{< product-name >}} database, enter the following command in your terminal:

    node writePoints.js
    
    • Copy
    • Fill window
  1. Create a file for your module–for example: write-points.py.

  2. In write-points.py, enter the following sample code to write data in batching mode:

    import os
    from influxdb_client_3 import (
      InfluxDBClient3, InfluxDBError, Point, WritePrecision,
      WriteOptions, write_client_options)
    
    host = os.getenv('INFLUX_HOST')
    token = os.getenv('INFLUX_TOKEN')
    database = os.getenv('INFLUX_DATABASE')
    
    # Create an array of points with tags and fields.
    points = [Point("home")
                .tag("room", "Kitchen")
                .field("temp", 25.3)
                .field('hum', 20.2)
                .field('co', 9)]
    
    # With batching mode, define callbacks to execute after a successful or
    # failed write request.
    # Callback methods receive the configuration and data sent in the request.
    def success(self, data: str):
        print(f"Successfully wrote batch: data: {data}")
    
    def error(self, data: str, exception: InfluxDBError):
        print(f"Failed writing batch: config: {self}, data: {data} due: {exception}")
    
    def retry(self, data: str, exception: InfluxDBError):
        print(f"Failed retry writing batch: config: {self}, data: {data} retry: {exception}")
    
    # Configure options for batch writing.
    write_options = WriteOptions(batch_size=500,
                                        flush_interval=10_000,
                                        jitter_interval=2_000,
                                        retry_interval=5_000,
                                        max_retries=5,
                                        max_retry_delay=30_000,
                                        exponential_base=2)
    
    # Create an options dict that sets callbacks and WriteOptions.
    wco = write_client_options(success_callback=success,
                              error_callback=error,
                              retry_callback=retry,
                              write_options=write_options)
    
    # Instantiate a synchronous instance of the client with your
    # InfluxDB credentials and write options, such as Gzip threshold, default tags,
    # and timestamp precision. Default precision is nanosecond ('ns').
    with InfluxDBClient3(host=host,
                            token=token,
                            database=database,
                            write_client_options=wco) as client:
    
          client.write(points, write_precision='s')
    
    • Copy
    • Fill window
  3. To run the module and write the data to your InfluxDB 3 Core database, enter the following command in your terminal:

    python write-points.py
    
    • Copy
    • Fill window

The sample code does the following:

  1. Instantiates a client configured with the InfluxDB URL and API token.
  2. Constructs hometable Point objects.
  3. Sends data as line protocol format to InfluxDB and waits for the response.
  4. If the write succeeds, logs the success message to stdout; otherwise, logs the failure message and error details.
  5. Closes the client to release resources.

Was this page helpful?

Thank you for your feedback!


The future of Flux

Flux is going into maintenance mode. You can continue using it as you currently are without any changes to your code.

Read more

Now Generally Available

InfluxDB 3 Core and Enterprise

Start fast. Scale faster.

Get the Updates

InfluxDB 3 Core is an open source, high-speed, recent-data engine that collects and processes data in real-time and persists it to local disk or object storage. InfluxDB 3 Enterprise builds on Core’s foundation, adding high availability, read replicas, enhanced security, and data compaction for faster queries and optimized storage. A free tier of InfluxDB 3 Enterprise is available for non-commercial at-home or hobbyist use.

For more information, check out: