{"id":47838672,"url":"https://github.com/paloaltodatabases/sequor","last_synced_at":"2026-04-03T20:35:33.561Z","repository":{"id":293526375,"uuid":"952172367","full_name":"paloaltodatabases/sequor","owner":"paloaltodatabases","description":"Sequor is a SQL-centric platform for building API integrations without lock-in and black boxes. Fuses API execution with SQL logic to provide an open, flexible platform for all your data and app integrations.","archived":false,"fork":false,"pushed_at":"2025-06-14T00:48:04.000Z","size":220,"stargazers_count":67,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-14T01:25:38.468Z","etag":null,"topics":["api-integration","app-integration","data-engineering","data-ingestion","data-integration","data-piplines","etl","ipaas","reverse-etl","sequor","sql","workflow-automation"],"latest_commit_sha":null,"homepage":"https://sequor.dev/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/paloaltodatabases.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-03-20T21:08:43.000Z","updated_at":"2025-06-14T00:41:09.000Z","dependencies_parsed_at":"2025-06-08T02:31:44.042Z","dependency_job_id":null,"html_url":"https://github.com/paloaltodatabases/sequor","commit_stats":null,"previous_names":["paloaltodatabases/sequor"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/paloaltodatabases/sequor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paloaltodatabases%2Fsequor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paloaltodatabases%2Fsequor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paloaltodatabases%2Fsequor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paloaltodatabases%2Fsequor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/paloaltodatabases","download_url":"https://codeload.github.com/paloaltodatabases/sequor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paloaltodatabases%2Fsequor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31375770,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-03T17:53:18.093Z","status":"ssl_error","status_checked_at":"2026-04-03T17:53:17.617Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-integration","app-integration","data-engineering","data-ingestion","data-integration","data-piplines","etl","ipaas","reverse-etl","sequor","sql","workflow-automation"],"created_at":"2026-04-03T20:35:32.903Z","updated_at":"2026-04-03T20:35:33.547Z","avatar_url":"https://github.com/paloaltodatabases.png","language":"Python","readme":"# Sequor\nInstead of using rigid SaaS connectors with growing costs, build complete API workflows that connect your database to any API using familiar YAML and SQL. Your requirements fully met with zero per-row costs.\n\nSequor fuses API execution with your database, enabling bidirectional data flow between APIs and database tables. By storing intermediate data in your database, you can leverage the full power of SQL for transformations, analytics, and business logic. This unified execution model eliminates the traditional boundary between iPaaS-style app integration and ETL-style data pipelines.\n\nWith Sequor's code-first approach (YAML for flows, Jinja or Python for dynamic parameters, and SQL for logic), you can apply software engineering best practices to integrations: version control, collaboration, CI/CD, and local development.\n\n# Core capabilities\n* **YAML for clear workflow structure**: Define integration flows in readable YAML. Version control friendly, no vendor lock-in. Built-in reliability: validation, retries, task-level observability.\n\n* **Dynamic expressions for flexible logic**: Use Jinja templates `{{ var() }}` for environment variables. Add `_expression` suffix to any YAML property to compute it with Python. Infinite customization within YAML structure.\n\n* **Built-in database integration**: Iterate over input tables to make API calls per record. Every HTTP response maps to database tables. Seamless data flow without custom glue code.\n\n# Example: Pull Shopify orders → Compute customer metrics in Snowflake → Update Mailchimp\nCreate a Sequor project with the following 3-step flow. You get an end-to-end solution in minutes with just two operations: **transform** for running SQL and **http_request** for API interactions. \n\n## Step 1: Fetch orders from Shopify API\nPull orders data into Snowflake. Jinja for source-level variables. Python for one-line response navigation.\n```yaml\n- op: http_request\n  request:\n    source: \"shopify\"\n    url: \"https://{{ var('store_name') }}.myshopify.com/admin/api/{{ var('api_version') }}/orders.json\"\n    method: GET\n    parameters:\n      status: any\n    headers:\n      \"Accept\": \"application/json\"\n  response:\n    success_status: [200]\n    tables:\n      - source: \"snowflake\"\n        table: \"shopify_orders\"\n        columns: {\n          \"id\": \"text\", \"customer_id\": text, \"email\": \"text\", \n          \"created_at\": \"text\", \"total_price\": \"text\", \"total_items\": \"text\"\n        }\n        data_expression: response.json()['orders']\n```\n\n## Step 2: Compute customer metrics in SQL\nCalculate total spend and order count per customer in Snowflake.\n```yaml\n- op: transform\n  source: \"snowflake\"\n  target_table: \"customer_metrics\"\n  query: |\n    SELECT\n      email,\n      SUM(total_price::decimal) as total_spent,\n      COUNT(*) as order_count\n    FROM shopify_orders\n    WHERE email IS NOT NULL\n    GROUP BY email\n```\n\n## Step 3: Update Mailchimp API\nPush customer metrics to Mailchimp. Python is used for advanced URL construction and flexible body formation.\n```yaml\n- op: http_request\n  for_each:\n    source: \"snowflake\"\n    table: \"customer_metrics\"\n    as: customer\n  request:\n    source: \"mailchimp\"\n    url_expression: |\n      email = var('customer')['email']\n      import hashlib\n      subscriber_hash = hashlib.md5(email.lower().encode()).hexdigest()\n      return \"https://{{ var('dc') }}.api.mailchimp.com/{{ var('api_version') }}/lists/{{ var('mailchimp_list_id') }}/members/\" + subscriber_hash\n    method: PATCH\n    body_format: json\n    body_expression: |\n        customer = var('customer')\n        return {\n          \"merge_fields\": {\n            \"TOTALSPENT\": float(customer['total_spent']),\n            \"ORDERCOUNT\": customer['order_count']\n          }\n        }\n  response:\n    success_status: [200]\n```\n\n\n# Getting started\n* [Install Sequor](https://docs.sequor.dev/getting-started/installation). Easy to get started with `pip install sequor`.\n* [Follow Quickstart](https://docs.sequor.dev/getting-started/quickstart)\n* [Explore examples of real-life integrations](https://github.com/paloaltodatabases/sequor-integrations)\n* [Documentation](https://docs.sequor.dev/)\n\n# Community\n* [Discuss Sequor on GitHub](https://github.com/paloaltodatabases/sequor/discussions) - To get help and participate in discussions about best practices, or any other conversation that would benefit from being searchable\n\n# Stay connected\n* [Subscribe to our newsletter](https://buttondown.com/sequor) -  Updates on new releases and features, guides, and case studies.\n\n\n\n\n\n\n  \n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaloaltodatabases%2Fsequor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpaloaltodatabases%2Fsequor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaloaltodatabases%2Fsequor/lists"}