Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
2e25a98
simplecast: clean connector and add sync limitation
apentori Feb 19, 2025
c459472
Blockchain Explorer Custom Connector
nickninov Mar 20, 2025
8a95c16
Production release
nickninov Mar 24, 2025
092a089
Twitter : adding ads_stream
c200bzh Jan 27, 2025
ec909e8
twitter : adding streams from x_ads_api to get engagement on promoted…
c200bzh Jan 29, 2025
db6fa3f
twitter: fix schema file naming and fix config-example
apentori Feb 24, 2025
4021556
twitter: add promoted_tweets in catalog configuration
apentori Feb 24, 2025
aaf8c0a
twitter: updating version
apentori Feb 24, 2025
fc2f5eb
twitter: add space
apentori Feb 27, 2025
6848e46
twitter: update schemas
apentori Mar 24, 2025
859cf88
all: update docker repository
apentori Mar 24, 2025
9bca8f8
google_play_store: new connector (#26)
c200bzh Mar 27, 2025
6473ce1
apple_store: new custom connector (#29)
c200bzh Apr 14, 2025
c46fdd1
Update discord connector to stream messages (#33)
c200bzh May 15, 2025
e3491c7
discord_message: update stream_slice
c200bzh May 29, 2025
de59e67
twitter-ads: init connector to fetch X ads related data
apentori Mar 31, 2025
6824e29
youtube: new custom connector
c200bzh Jun 5, 2025
f8d57aa
discord_message: change start_date (#38)
c200bzh Jun 25, 2025
5cae6b4
twitter_comments: new stream to extract comments (#37)
c200bzh Jul 14, 2025
d49b953
New connector : extract rss feed (#39)
c200bzh Jul 17, 2025
5dac913
ci: disable restart from stage in jenkins
siddarthkay Jul 18, 2025
b5a6a15
twitter : new stream to extract tweets tagging us (#35)
c200bzh Aug 4, 2025
cdb8af1
source-discourse-fetcher: adding new endpoints
apentori Apr 15, 2024
64c5249
bamboohr: expanding connector (#45)
c200bzh Aug 14, 2025
bb281e6
bluesky: new connector (#42)
c200bzh Aug 20, 2025
2a6d7f9
twitter: fix connector (#44)
c200bzh Sep 3, 2025
cef9e70
discourse: update post data
apentori Aug 5, 2025
0c3e21f
discourse: fix group_members
apentori Aug 6, 2025
d0e3593
Mastodon (#46)
nickninov Sep 15, 2025
ba8b438
luma: first version of the connector (#48)
c200bzh Sep 16, 2025
a0f592c
reddit: init connector
nickninov Jul 15, 2025
12ac795
reddit: fix connector
apentori Jul 29, 2025
14c33b3
reddit: fix API reate limit and add multiple subreddits
c200bzh Sep 8, 2025
ea693a0
etherscan: init connector
apentori Sep 4, 2025
c447ddd
Discourse update (#49)
nickninov Sep 17, 2025
b644de4
discourse: fix pagination for topics and users
apentori Sep 24, 2025
0cdd5cc
editorconfig: init
apentori Sep 24, 2025
2bdb4cc
ci: move the build to a container
markoburcul Oct 20, 2025
8104946
twitter: use bearer token for tag stream and get-space-id (#50)
c200bzh Nov 4, 2025
de12759
etherscan: Timeout (#53)
nickninov Dec 22, 2025
19170cc
New Alchemy Source (#55)
c200bzh Dec 31, 2025
7ec0a09
alchemy: replace TokenPrice Stream by HistoricalRate
nickninov Jan 2, 2026
04ad78e
alchemy: Bug fix
nickninov Jan 2, 2026
1b3134a
alchemy: Timeout
nickninov Jan 5, 2026
6b5e912
bitcoin explorer: renaming and adding transactions
apentori Jan 7, 2026
cfe32ef
telegram: new connector (#59)
c200bzh Jan 12, 2026
440da00
discourse: add user_action stream (#61)
c200bzh Jan 12, 2026
b23df54
discord: adding sever member count (#52)
c200bzh Jan 12, 2026
bf093eb
etherscan: transaction extraction
nickninov Jan 14, 2026
58396fd
etherscan: transactions as strings
nickninov Jan 15, 2026
c78944c
ci: add control to metadata version
apentori Jan 19, 2026
8192c62
twitter: update metadata docker variable
apentori Jan 19, 2026
4afd8b8
Discourse: Fixing the user_action stream (#64)
c200bzh Jan 20, 2026
69c3049
etherscan: pagination
nickninov Jan 21, 2026
de47e5b
etherscan: rate limit
nickninov Jan 24, 2026
77a70d3
etherscan: simplify config
nickninov Jan 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# EditorConfig file: http://EditorConfig.org
root = true

[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

[*.py]
indent_size = 4
max_line_length = 88

[*.md]
trim_trailing_whitespace = false
47 changes: 47 additions & 0 deletions .github/workflows/check-docker-tag.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Check Docker Image Tag Update

on:
pull_request:
paths-ignore:
- '**.md'
- '.github/**'
types: [opened, synchronize, reopened]

jobs:
check-docker-tag:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
# Fetch all history for all tags and branches
fetch-depth: 0

- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v44
with:
files: '**/metadata.yaml'

- name: Check for updated dockerImageTag
run: |
for file in ${{ steps.changed-files.outputs.all_changed_files }}; do
dir=$(dirname "$file")
echo "Checking $dir/metadata.yaml..."
if [ -f "$dir/metadata.yaml" ]; then
# Get the previous commit hash for the file
prev_commit=$(git rev-parse HEAD^)
# Get the previous value of dockerImageTag
prev_tag=$(git show "$prev_commit:$file" | grep 'dockerImageTag:' | awk '{print $2}')
# Get the current value of dockerImageTag
curr_tag=$(grep 'dockerImageTag:' "$file" | awk '{print $2}')

if [ "$prev_tag" == "$curr_tag" ]; then
echo "::error file=$file::dockerImageTag has not been updated in $dir/metadata.yaml"
exit 1
else
echo "dockerImageTag updated in $dir/metadata.yaml"
fi
fi
done

9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -158,3 +158,12 @@ cython_debug/
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

# Ignore reports examples with sensitive data
reports_examples/

*.ps1

*/*/config.json
/.vscode
*.ipynb
14 changes: 11 additions & 3 deletions Jenkinsfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
pipeline {
agent { label 'linux' }

agent {
docker {
label 'linuxcontainer'
image 'harbor.status.im/infra/ci-build-containers:linux-base-1.0.0'
args '--volume=/var/run/docker.sock:/var/run/docker.sock ' +
'--user jenkins'
}
}

options {
disableRestartFromStage()
disableConcurrentBuilds()
/* manage how many builds we keep */
buildDiscarder(logRotator(
Expand Down Expand Up @@ -49,7 +57,7 @@ pipeline {
}
}
}
} }
} }
}
}
post {
Expand Down
13 changes: 10 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# Airbyte Custom Connector
# Airbyte Custom Connector

Repository holding the custom Airbyte connector using in Status-im.
Repository holding the custom Airbyte connector using in Status-im.


## Connectors

### Crypto related
### Crypto related

* `wallet-fetcher`: Source connector allowing to wallet data from Ethereum blockchain.
* `source-basic-api-fetcher`: Source connector to call a custom REST endpoint
Expand All @@ -17,3 +17,10 @@ Repository holding the custom Airbyte connector using in Status-im.
* `source-discourse-fetcher`: Source connector to fetch data from Discourse API
* `source-simplecast-fetcher`: Source connector to fetch data from Simplecast API
* `source-twitter-fetcher`: Source connector to fetch data from Twitter API
* `source-twitter-ads`: Source connector to fetch data from Twitter Ads API

### Status Analytics related

* `source-app-store`: Source connector to fetch data from Apple App Store
* `source-google-play`: Source connector to fetch data from Google Play Store

37 changes: 37 additions & 0 deletions flake.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
description = "shell for Airbyte connectors";

inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05";

outputs = { self, nixpkgs }:
let
stableSystems = ["x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin"];
forAllSystems = nixpkgs.lib.genAttrs stableSystems;
pkgsFor = nixpkgs.lib.genAttrs stableSystems (
system: import nixpkgs { inherit system; config.allowUnfree = true; }
);
in rec {
devShells = forAllSystems (system: let
pkgs = pkgsFor.${system};
in {
default = let
pythonPkgs = pkgs.python312.withPackages (
_: with (pkgs.python312Packages); [
ipython pyyaml jinja2 PyGithub
]
);
in pkgs.mkShellNoCC {
packages = with pkgs.buildPackages; [
# misc
git jq silver-searcher direnv
pythonPkgs
ruff
];

shellHook = ''
echo "Good hacking."
'';
};
});
};
}
9 changes: 9 additions & 0 deletions source-alchemy-fetcher/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FROM --platform=linux/amd64 airbyte/python-connector-base:1.1.0

COPY . ./airbyte/integration_code
RUN pip install ./airbyte/integration_code

ENV AIRBYTE_ENTRYPOINT="python /airbyte/integration_code/main.py"
ENTRYPOINT ["python", "/airbyte/integration_code/main.py"]


103 changes: 103 additions & 0 deletions source-alchemy-fetcher/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# Mastodon Source

## Usage

This connector fetches historical prices from [Alchemy](https://www.alchemy.com/).

### Configuration

The connector takes the following input:

- `api_key` - the [Alchemy](https://www.alchemy.com/) API key.
- `tokens` - there are two different `payload` implementations:
- [Symbol](https://www.alchemy.com/docs/data/prices-api/prices-api-endpoints/prices-api-endpoints/get-historical-token-prices#request.body.PricesApiEndpointsGetHistoricalTokenPricesRequest0) - requires `symbol` and `interval`.
- [Address](https://www.alchemy.com/docs/data/prices-api/prices-api-endpoints/prices-api-endpoints/get-historical-token-prices#request.body.PricesApiEndpointsGetHistoricalTokenPricesRequest1) - requires `network`, `address`, `symbol` and `interval`.

#### Token Setup

Symbol example:

```json
{
"symbol": "BTC",
"interval": "5m"
}
```

Address example:

```json
{
"network": "opt-mainnet",
"address": "0x4200000000000000000000000000000000000042",
"symbol": "OP",
"interval": "1d"
}
```

**Notes**:

- `interval` - can be `5m`, `1h`, `1d`. [Range calculations](https://www.alchemy.com/docs/data/prices-api/prices-api-endpoints/prices-api-endpoints/get-historical-token-prices#request.body.PricesApiEndpointsGetHistoricalTokenPricesRequest0.interval) are automatically done in the stream slices.
- `start_date` and `end_date` can be used for backfills. Once a backfill is completed, they can be left blank. The prices for the given `interval` will be fetched for the previous day automatically.

### Output

The connector will return the following:

* [HistoricalRates](./source_alchemy_fetcher/schemas/historical_rates.json)

## Local development

### Prerequisites

#### Activate Virtual Environment and install dependencies

From this connector directory, create a virtual environment:

```
python -m venv .venv
```

```
source .venv/bin/activate
pip install -r requirements.txt
```

### Locally running the connector

```
python main.py spec
python main.py check --config sample_files/config-example.json
python main.py discover --config sample_files/config-example.json
python main.py read --config sample_files/config-example.json --catalog sample_files/configured_catalog.json
```

### Locally running the connector docker image

```bash
docker build -t airbyte/source-alchemy-fetcher:dev .
# Running the spec command against your patched connector
docker run airbyte/source-alchemy-fetcher:dev spec
```

#### Run

Then run any of the connector commands as follows:

#### Linux / MAC OS

```
docker run --rm airbyte/source-alchemy-fetcher:dev spec
docker run --rm -v $(pwd)/sample_files:/sample_files airbyte/source-alchemy-fetcher:dev check --config /sample_files/config-example.json
docker run --rm -v $(pwd)/sample_files:/sample_files airbyte/source-alchemy-fetcher:dev discover --config /sample_files/config-example.json
docker run --rm -v $(pwd)/sample_files:/sample_files airbyte/source-alchemy-fetcher:dev read --config /sample_files/config-example.json --catalog /sample_files/configured_catalog.json
```

#### Windows

```
docker run --rm airbyte/source-alchemy-fetcher:dev spec
docker run --rm -v "$PWD\sample_files:/sample_files" airbyte/source-alchemy-fetcher:dev check --config /sample_files/config-example.json
docker run --rm -v "$PWD\sample_files:/sample_files" airbyte/source-alchemy-fetcher:dev discover --config /sample_files/config-example.json
docker run --rm -v "$PWD\sample_files:/sample_files" airbyte/source-alchemy-fetcher:dev read --config /sample_files/config-example.json --catalog /sample_files/configured_catalog.json
```
8 changes: 8 additions & 0 deletions source-alchemy-fetcher/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#
# Copyright (c) 2025 Airbyte, Inc., all rights reserved.
#

from source_alchemy_fetcher.run import run

if __name__ == "__main__":
run()
25 changes: 25 additions & 0 deletions source-alchemy-fetcher/metadata.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
data:
allowedHosts:
registries:
oss:
enabled: true
cloud:
enabled: false
connectorBuildOptions:
baseImage: docker.io/airbyte/python-connector-base:1.1.0
connectorSubtype: api
connectorType: source
definitionId: 8a3b5f9c-7e2d-4b1a-9c6f-3d8e4a2b1c0d
dockerImageTag: 1.0.3
dockerRepository: harbor.status.im/bi/airbyte/source-alchemy-fetcher
githubIssueLabel: source-alchemy-fetcher
icon: alchemy-fetcher.svg
license: MIT
name: Alchemy Token Price Fetcher
releaseDate: 2025-12-30
supportLevel: community
releaseStage: alpha
documentationUrl: https://docs.alchemy.com/reference/token-api-quickstart
tags:
- language:python
metadataSpecVersion: "1.0"
3 changes: 3 additions & 0 deletions source-alchemy-fetcher/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
requests>=2.25.0
setuptools>=6
airbyte-cdk>=0.51.0
22 changes: 22 additions & 0 deletions source-alchemy-fetcher/sample_files/config-example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"api_key": "",
"tokens": [
{
"network": "opt-mainnet",
"address": "0x4200000000000000000000000000000000000042",
"symbol": "OP",
"start_date": "2025-12-01",
"end_date": "2025-12-31",
"interval": "1d"
},
{
"symbol": "BTC",
"start_date": "2025-11-01",
"interval": "1d"
},
{
"symbol": "SNT",
"interval": "1d"
}
]
}
13 changes: 13 additions & 0 deletions source-alchemy-fetcher/sample_files/configured_catalog.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"streams": [
{
"stream": {
"name": "historical_rates",
"json_schema": {},
"supported_sync_modes": ["full_refresh", "incremental"]
},
"sync_mode": "incremental",
"destination_sync_mode": "append"
}
]
}
25 changes: 25 additions & 0 deletions source-alchemy-fetcher/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
"""
Setup file for the Alchemy Token Price Fetcher Source connector.
"""

from setuptools import setup, find_packages

setup(
name="source_alchemy_fetcher",
description="Source implementation for Alchemy Token Price API.",
author="Claire",
author_email="claire@status.im",
packages=find_packages(),
install_requires=[
"airbyte-cdk>=0.51.0",
"requests>=2.25.0",
],
package_data={
"source_alchemy_fetcher": ["schemas/*.json", "*.yaml"],
},
entry_points={
"console_scripts": [
"source-alchemy-fetcher=source_alchemy_fetcher.run:run",
],
},
)
8 changes: 8 additions & 0 deletions source-alchemy-fetcher/source_alchemy_fetcher/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#
# Copyright (c) 2025 Airbyte, Inc., all rights reserved.
#


from .source import SourceAlchemyFetcher

__all__ = ["SourceAlchemyFetcher"]
Loading
Loading