Metadata-Version: 2.4
Name: apilinker
Version: 0.7.1
Summary: A universal bridge to connect, map, and automate data transfer between any two REST APIs
Home-page: https://github.com/kkartas/APILinker
Author: K. Kartas
Author-email: "K. Kartas" <kkartas@users.noreply.github.com>
License: MIT
Project-URL: Homepage, https://github.com/kkartas/APILinker
Project-URL: Bug Tracker, https://github.com/kkartas/APILinker/issues
Project-URL: Documentation, https://apilinker.readthedocs.io/
Keywords: api,integration,connector,data transfer,rest
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Requires-Python: >=3.8
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: httpx>=0.23.0
Requires-Dist: pyyaml>=6.0
Requires-Dist: typer>=0.7.0
Requires-Dist: pydantic>=2.0.0
Requires-Dist: croniter>=1.3.8
Requires-Dist: rich>=12.6.0
Requires-Dist: cryptography>=41.0.0
Requires-Dist: jsonschema>=4.18.0
Provides-Extra: dev
Requires-Dist: pytest>=7.0.0; extra == "dev"
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
Requires-Dist: flake8>=6.0.0; extra == "dev"
Requires-Dist: mypy>=1.0.0; extra == "dev"
Requires-Dist: types-croniter; extra == "dev"
Requires-Dist: types-PyYAML; extra == "dev"
Requires-Dist: black==25.1.0; extra == "dev"
Requires-Dist: bump-my-version>=0.18.0; extra == "dev"
Provides-Extra: mq
Requires-Dist: pika>=1.3.0; extra == "mq"
Requires-Dist: redis>=5.0.0; extra == "mq"
Requires-Dist: boto3>=1.28.0; extra == "mq"
Requires-Dist: kafka-python>=2.0.2; extra == "mq"
Provides-Extra: docs
Requires-Dist: mkdocs>=1.5.0; extra == "docs"
Requires-Dist: mkdocs-material>=9.5.0; extra == "docs"
Requires-Dist: mkdocstrings[python]>=0.24.0; extra == "docs"
Requires-Dist: mkdocs-minify-plugin>=0.7.0; extra == "docs"
Requires-Dist: mkdocs-git-revision-date-localized-plugin>=1.2.0; extra == "docs"
Provides-Extra: webhooks
Requires-Dist: fastapi>=0.100.0; extra == "webhooks"
Requires-Dist: uvicorn>=0.23.0; extra == "webhooks"
Requires-Dist: pyjwt>=2.8.0; extra == "webhooks"
Dynamic: author
Dynamic: home-page
Dynamic: license-file

# ApiLinker

[![PyPI version](https://badge.fury.io/py/apilinker.svg)](https://badge.fury.io/py/apilinker)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/kkartas/APILinker/HEAD?labpath=examples%2FApiLinker_Research_Tutorial.ipynb)
[![Documentation](https://img.shields.io/badge/docs-mkdocs-blue)](https://kkartas.github.io/APILinker/)

**A universal bridge to connect, map, and automate data transfer between any two REST APIs.**

---

## 📚 Documentation

Full documentation is available at **[https://kkartas.github.io/APILinker/](https://kkartas.github.io/APILinker/)**.

## 🚀 Quick Install

```bash
pip install apilinker
```

## ⭐ Message Queue Connectors

Message-queue connectors are optional.

```bash
pip install apilinker[mq]
```

Minimal example (worker loop):

```python
from apilinker.core.error_handling import DeadLetterQueue
from apilinker.core.message_queue import MessagePipeline, MessageWorker
from apilinker.core.message_queue_connectors import RabbitMQConnectorPlugin

consumer = RabbitMQConnectorPlugin()
producer = RabbitMQConnectorPlugin()

consumer_conn = consumer.connect(host="localhost")
producer_conn = producer.connect(host="localhost")

pipeline = MessagePipeline(
    consumer=consumer,
    producer=producer,
    dlq=DeadLetterQueue("./dlq"),
)

worker = MessageWorker(
    pipeline,
    consumer_connection=consumer_conn,
    producer_connection=producer_conn,
    source="input_queue",
    default_destination="output_queue",
)

worker.run()
```

## 🌟 Features

- 🔄 **Universal Connectivity** - Connect any two REST APIs.
- 🗺️ **Powerful Mapping** - Transform data with ease.
- 🔗 **Multi-Source Aggregation** (v0.7.1) - Join data from multiple APIs (inner/left/right/outer joins) via the Python API.
- 📥 **Large Download Streaming** (v0.7.1) - Stream HTTP responses to disk with resume and progress callbacks.
- ⭐ **Event-Driven Pipelines** - Optional message queue connectors (RabbitMQ, Redis Pub/Sub, AWS SQS, Kafka).
- **SSE Streaming** - Built-in SSE connector with reconnection, chunked processing, and backpressure controls.
- 🔒 **Secure** - Enterprise secret management (Vault, AWS, Azure, GCP).
- 🧬 **Scientific Connectors** - Built-in support for NCBI, arXiv, and more.

### Multi-source aggregation (v0.7.1)

```python
from apilinker import ApiLinker

linker = ApiLinker()
linker.register_source("crm", crm_connector)
linker.register_source("billing", billing_connector)

rows = linker.aggregate_sources(
    source_requests={
        "crm": {"connector": "crm", "endpoint": "list_users"},
        "billing": {"connector": "billing", "endpoint": "list_plans"},
    },
    aggregation_config={
        "join_type": "inner",
        "merge_strategy": "flat",
        "sources": [
            {"name": "crm", "join_key": "id", "fields": [...]},
            {"name": "billing", "join_key": "customer_id", "fields": [...]},
        ],
    },
)
```

See [Multi-Source Aggregation](docs/user-guide/multi-source-aggregation.md) and `examples/multi_source_aggregation.py`.

## 🤝 Contributing

We welcome contributions! Please see our [Contributing Guide](docs/developer-guide/contributing.md) for details.

## 📄 License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
