{"id":50477365,"url":"https://github.com/tnware/source-customer-thermometer","last_synced_at":"2026-06-01T14:30:25.943Z","repository":{"id":357906378,"uuid":"1237481248","full_name":"tnware/source-customer-thermometer","owner":"tnware","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-14T19:14:21.000Z","size":64,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-14T20:35:33.318Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tnware.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-13T08:14:26.000Z","updated_at":"2026-05-14T19:14:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tnware/source-customer-thermometer","commit_stats":null,"previous_names":["tnware/source-customer-thermometer"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/tnware/source-customer-thermometer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tnware%2Fsource-customer-thermometer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tnware%2Fsource-customer-thermometer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tnware%2Fsource-customer-thermometer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tnware%2Fsource-customer-thermometer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tnware","download_url":"https://codeload.github.com/tnware/source-customer-thermometer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tnware%2Fsource-customer-thermometer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33780085,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-01T02:00:06.963Z","response_time":115,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2026-06-01T14:30:23.777Z","updated_at":"2026-06-01T14:30:25.929Z","avatar_url":"https://github.com/tnware.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# source-customer-thermometer\n\nAirbyte custom source connector for the [CustomerThermometer](https://www.customerthermometer.com/) CSAT API.\n\n## Streams\n\n| Stream                  | Sync mode               | Notes                                                                                  |\n| ----------------------- | ----------------------- | -------------------------------------------------------------------------------------- |\n| `thermometer_responses` | incremental + full      | Survey responses. Incremental by `response_date`; sync window is walked in 7-day `fromDate`/`toDate` chunks. |\n\n## Authentication\n\nAPI key, found in **CT admin panel → Account Settings → API**.\n\n## Configuration\n\n| Field        | Required | Description                                                                                                   |\n| ------------ | -------- | ------------------------------------------------------------------------------------------------------------- |\n| `api_key`    | yes      | CustomerThermometer API key. Marked as Airbyte secret.                                                        |\n| `start_date` | yes      | `YYYY-MM-DD`. Earliest response_date to fetch on the first sync. Validated; rejected if in the future or malformed. |\n\n## API behavior worth knowing\n\nThe CustomerThermometer API has no pagination — no offset, no cursor\ntoken, no `next_page` link. The connector works around this by walking\nthe `fromDate` / `toDate` window in 7-day slices, one API call per\nslice, advancing from `start_date` (or the last cursor value, on\nincremental syncs) up to today.\n\nCSAT response volumes are low enough that a weekly slice stays well\nunder any practical per-call cap. Each slice is independent, so syncs\nresume cleanly from wherever the cursor last landed.\n\n## Build + push\n\n```bash\ndocker build -t ghcr.io/tnware/source-customer-thermometer:dev .\n```\n\nCI in `.github/workflows/image.yml` builds and pushes to ghcr.io on\npush to main and on tags.\n\n## Local testing\n\n```bash\n# Spec\npython -m source_customer_thermometer spec\n\n# Connection check\npython -m source_customer_thermometer check --config /path/to/secrets/config.json\n\n# Catalog discovery\npython -m source_customer_thermometer discover --config /path/to/secrets/config.json\n\n# Read records\npython -m source_customer_thermometer read \\\n  --config /path/to/secrets/config.json \\\n  --catalog /path/to/integration_tests/configured_catalog.json\n```\n\nExample `config.json`:\n\n```json\n{\n  \"api_key\": \"...\",\n  \"start_date\": \"2025-07-01\"\n}\n```\n\n## Pointing Airbyte at this connector\n\nIn the Airbyte UI:\n\n1. **Settings → Sources → New connector**\n2. **Add a new Docker connector**\n3. Image name: `ghcr.io/tnware/source-customer-thermometer`\n4. Image tag: a published tag (see [Releases](https://github.com/tnware/source-customer-thermometer/releases))\n\n## Releases \u0026 commit style\n\nReleases are automated by [release-please](https://github.com/googleapis/release-please).\nCommit to `main` using [Conventional Commits](https://www.conventionalcommits.org/):\n\n```\nfeat: add new Foo endpoint        → minor bump (0.4.0 → 0.5.0)\nfix:  handle null api_key         → patch bump (0.4.0 → 0.4.1)\nchore: bump action versions       → no release (hidden from changelog)\nfeat!: drop deprecated cursor     → major bump (note the !)\n```\n\nRelease-please watches `main` and maintains a rolling **Release PR** that:\n- Bumps `pyproject.toml` `version` and `metadata.yaml` `dockerImageTag`\n  in lockstep\n- Appends a categorized entry to `CHANGELOG.md`\n- When merged, cuts a `vX.Y.Z` tag and a GitHub Release. The\n  `image.yml` workflow picks up the tag and builds + pushes the\n  versioned image.\n\nDon't hand-edit versions or the CHANGELOG — release-please owns those.\n\n## CHANGELOG\n\nSee [CHANGELOG.md](CHANGELOG.md).\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftnware%2Fsource-customer-thermometer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftnware%2Fsource-customer-thermometer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftnware%2Fsource-customer-thermometer/lists"}