Work with this as data
Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/lytics-data-upload-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
OpenAPI Specification
openapi: 3.2.0
info:
title: V1 Lytics Data Upload API
version: 1.0.0
description: 'The Lytics API is a _restful_ *JSON* api that includes:
* *Data Collection* api''s for collection, and upload of custom data.'
servers:
- url: https://api.lytics.io
tags:
- name: Data Upload
description: APIs for collecting or uploading data.
paths:
/collect/bulk/{stream}:
post:
responses:
'200':
description: OK
headers: {}
content:
application/json:
schema:
$ref: '#/components/schemas/BulkdCSVUploadModel'
examples:
response:
value:
status: 200
message: success
data:
message_count: 2
rejected_count: 0
content-type: application/json
droperrors: false
dryrun: false
timestamp_field: event_created
filename: myfile.csv
security:
- ApiKeyAuth: []
summary: BulkCSVUpload
operationId: BulkCSVUpload
description: 'Upload CSV files (may be gzipped). They MUST contain headers: either
in first row (by default) OR in **headers** querystring field.
If the file contains a timestamp field you want us to use
see **timestamp_field** querystring parameter for how we extract it.
*Note Domain* this api is on a different domain *https://bulk.lytics.io* because the *api.lytics.io* domain
is limited to 10MB file uploads.
```sh
# the "user_regdata" is the STREAM (ie Type) of data, if there
# is multiple different types of data (userdata, emaildata, events)
# they would have different streams.
# user data
export LIODATAKEY="YOURKEY"
curl -s -H "Authorization: $LIOKEY" \
-H ''Content-type: application/csv'' \
--data-binary @users.csv \
"https://bulk.lytics.io/collect/bulk/user_regdata?timestamp_field=register_date" \
| jq ''.''
# only do a dry-run to see if it is formatted correctly
curl -s "https://bulk.lytics.io/collect/bulk/user_regdata?access_token=$LIODATAKEY×tamp_field=register_date&dryrun=true" \
--data-binary @users.csv -H ''Content-type: application/csv'' | jq ''.''
# append fields to each row
# where append = urlencode({"source":"crm"})
# often used when file-name contains information
curl -s "https://bulk.lytics.io/collect/bulk/user_regdata?append=%7B%22source%22%3A%22crm%22%7D&access_token=$LIODATAKEY" \
--data-binary @users.csv -H ''Content-type: application/csv'' | jq ''.''
# full example uploading gzipped file
echo ''user_id,email,reg_date,item_count
7456,email@email.com,"2012-10-17T17:29:39.738Z",82
1234,email2@email.com,"2012-12-11T19:53:31.547Z",82'' > users.csv
gzip users.csv
curl -s "https://bulk.lytics.io/collect/bulk/user_regdata?access_token=$LIODATAKEY×tamp_field=reg_date&dryrun=true&filename=users.csv" \
--data-binary @users.csv.gz \
-H ''Content-type: application/csv'' | jq ''.''
```'
tags:
- Data Upload
parameters:
- name: account_id
in: query
description: Your Lytics account ID.
required: false
schema:
type: string
- name: stream
in: path
description: The DataType aka Table of type of data being uploaded. See Data, Streams in web admin.
required: true
example: user_db
schema:
type: string
- name: access_token
in: query
description: The Lytics DATA API key. Not the management key. Or use Authorization Header.
required: false
schema:
type: string
- name: dryrun
in: query
description: ''
required: false
schema:
type: boolean
default: 'false'
- name: timestamp_field
in: query
description: The name of the column or field in file that contains event timestamp.
required: false
schema:
type: string
- name: headers
in: query
description: CSV only, Comma delimited list of header columns for csv (if not first row)
required: false
schema:
type: string
- name: delimiter
in: query
description: CSV only, if not the default comma, either t=tab, or | may be accepted
required: false
schema:
type: string
- name: append
in: query
description: CSV only, JSON encoded object of additional name-value pairs to append to each record.
required: false
schema:
type: string
- name: droperrors
in: query
description: ''
required: false
schema:
type: boolean
default: 'false'
- name: filename
in: query
description: Just for record-keeping in our event - stream.
required: false
example: '"myfile.csv"'
schema:
type: string
/collect/bulk/{streamname}:
post:
responses:
'200':
description: OK
headers: {}
content:
application/json:
schema:
$ref: '#/components/schemas/BulkJSONUploadModel'
examples:
response:
value:
status: 200
message: success
data:
message_count: 2
rejected_count: 0
content-type: application/json
droperrors: false
dryrun: false
timestamp_field: event_created
filename: myfile.json
security:
- ApiKeyAuth: []
summary: BulkJSONUpload
operationId: BulkJSONUpload
description: 'JSON formatting info.
This JSON is ok:
```json
{"order_ids":[1,2,3]}
```
This is not valid because it has objects nested inside arrays:
```json
{"orders":[{"id":1,"price":22},{"id":2,"price":23}]}
```'
tags:
- Data Upload
parameters:
- name: account_id
in: query
description: Your Lytics account ID.
required: false
schema:
type: string
- name: streamname
in: path
description: The DataType, or "Table" of type of data being uploaded
required: true
example: user_db
schema:
type: string
- name: access_token
in: query
description: The Lytics DATA API key. Not the management key. Or use Authorization Header.
required: false
schema:
type: string
- name: dryrun
in: query
description: ''
required: false
schema:
type: boolean
default: 'false'
- name: timestamp_field
in: query
description: The name of the column or field in file that contains event timestamp.
required: false
schema:
type: string
- name: filename
in: query
description: Just for record-keeping in our event - stream.
required: false
example: '"myfile.json"'
schema:
type: string
/collect/json/{stream}:
post:
responses:
'200':
description: OK
headers: {}
content:
application/json:
schema:
$ref: '#/components/schemas/DataUploadModel'
examples:
response:
value:
status: 200
message: success
data:
message_count: 2
rejected_count: 0
content-type: application/json
droperrors: false
dryrun: false
timestamp_field: event_created
filename: myfile.json
security:
- ApiKeyAuth: []
summary: Data JSON Upload
operationId: Data JSON Upload
description: ''
tags:
- Data Upload
parameters:
- name: account_id
in: query
description: Your Lytics account ID.
required: false
schema:
type: string
- name: stream
in: path
description: The DataType, or "Table" of type of data being uploaded
required: true
example: user_db
schema:
type: string
- name: access_token
in: query
description: The Lytics DATA API key (not management key)
required: true
schema:
type: string
- name: dryrun
in: query
description: ''
required: false
schema:
type: boolean
default: 'false'
- name: timestamp_field
in: query
description: The name of the column or field in file that contains event timestamp.
required: false
schema:
type: string
- name: filename
in: query
description: Just for record-keeping in our event - stream.
required: false
example: '"myfile.json"'
schema:
type: string
components:
schemas:
BulkJSONUploadModel:
type: object
properties:
status:
type: number
message:
type: string
data:
type: object
properties:
message_count:
type: number
rejected_count:
type: number
content-type:
type: string
droperrors:
type: boolean
dryrun:
type: boolean
timestamp_field:
type: string
filename:
type: string
example:
status: 200
message: success
data:
message_count: 2
rejected_count: 0
content-type: application/json
droperrors: false
dryrun: false
timestamp_field: event_created
filename: myfile.json
BulkdCSVUploadModel:
type: object
properties:
status:
type: number
message:
type: string
data:
type: object
properties:
message_count:
type: number
rejected_count:
type: number
content-type:
type: string
droperrors:
type: boolean
dryrun:
type: boolean
timestamp_field:
type: string
filename:
type: string
example:
status: 200
message: success
data:
message_count: 2
rejected_count: 0
content-type: application/json
droperrors: false
dryrun: false
timestamp_field: event_created
filename: myfile.csv
DataUploadModel:
type: object
properties:
status:
type: number
message:
type: string
data:
type: object
properties:
message_count:
type: number
rejected_count:
type: number
content-type:
type: string
droperrors:
type: boolean
dryrun:
type: boolean
timestamp_field:
type: string
filename:
type: string
example:
status: 200
message: success
data:
message_count: 2
rejected_count: 0
content-type: application/json
droperrors: false
dryrun: false
timestamp_field: event_created
filename: myfile.json
securitySchemes:
ApiKeyAuth:
in: header
name: Authorization
type: apiKey
x-readme:
explorer-enabled: true
proxy-enabled: true